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 d3eca11..0000000
--- a/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Mon Feb 25 16:17:52 EST 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.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.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 25d9303..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.4.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 8037b93..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManager.java
+++ /dev/null
@@ -1,315 +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 {
-	
-	private static final String DEFER_EVENTS = "org.eclipse.ui.internal.contexts.deferEvents"; //$NON-NLS-1$
-	private static final String SEND_EVENTS = "org.eclipse.ui.internal.contexts.sendEvents"; //$NON-NLS-1$
-
-	/**
-	 * 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;
-
-	/**
-	 * 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 (DEFER_EVENTS.equals(contextId)) {
-			cachingRef++;
-			if (cachingRef==1) {
-				setEventCaching(true);
-			}
-			return;
-		} else if (SEND_EVENTS.equals(contextId)) {
-			cachingRef--;
-			if (cachingRef==0) {
-				setEventCaching(false);
-			}
-			return;
-		}
-		
-		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 f82e908..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/DefaultOperationHistory.java
+++ /dev/null
@@ -1,1382 +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);
-		}
-
-		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);
-		}
-
-		// 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) {
-		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) {
-		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));
-		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 6601ca6..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.1.1.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 bd05b9e..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/BeansObservables.java
+++ /dev/null
@@ -1,554 +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 164268, 171616
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221704
- *     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.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;
-
-/**
- * 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) {
-		PropertyDescriptor descriptor = getPropertyDescriptor(bean.getClass(),
-				propertyName);
-		return new JavaBeanPropertyObservableMap(realm, bean, descriptor);
-	}
-
-	/*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 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 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 a factory for creating obervable values 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 obervable lists 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 obervable sets 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);
-			}
-		};
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableValue observeDetailValue(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-
-		IObservableValue value = MasterDetailObservables.detailValue(master,
-				valueFactory(realm, propertyName), propertyType);
-		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
-				value, master, getValueTypePropertyDescriptor(master,
-						propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableValue observeDetailValue(Realm realm,
-			IObservableValue master, Class masterType, String propertyName, Class propertyType) {
-		Assert.isNotNull(masterType, "masterType cannot be null"); //$NON-NLS-1$
-		IObservableValue value = MasterDetailObservables.detailValue(master,
-				valueFactory(realm, propertyName), propertyType);
-		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
-				value, master, getPropertyDescriptor(masterType,
-						propertyName));
-
-		return decorator;
-	}
-	
-	/**
-	 * 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
-	 */
-	public static IObservableList observeDetailList(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		IObservableList observableList = MasterDetailObservables.detailList(
-				master, listFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableListDecorator decorator = new BeanObservableListDecorator(
-				observableList, master, getValueTypePropertyDescriptor(master,
-						propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableSet observeDetailSet(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-
-		IObservableSet observableSet = MasterDetailObservables.detailSet(
-				master, setFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableSetDecorator decorator = new BeanObservableSetDecorator(
-				observableSet, master, getValueTypePropertyDescriptor(master,
-						propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableMap observeDetailMap(Realm realm,
-			IObservableValue master, String propertyName) {
-		IObservableMap observableMap = MasterDetailObservables.detailMap(
-				master, mapPropertyFactory(realm, propertyName));
-		BeanObservableMapDecorator decorator = new BeanObservableMapDecorator(
-				observableMap, master, getValueTypePropertyDescriptor(master,
-						propertyName));
-		return decorator;
-	}
-
-	/**
-	 * @param realm
-	 * @param bean
-	 * @param propertyName
-	 * @param elementType
-	 *            can be <code>null</code>
-	 * @return an observable set that tracks the current value of the named
-	 *         property for 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);
-	}
-
-	/**
-	 * @param realm
-	 * @param propertyName
-	 * @param elementType
-	 *            can 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 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);
-			}
-		};
-	}
-
-	/**
-	 * @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 cb50822..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/PojoObservables.java
+++ /dev/null
@@ -1,433 +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 221704
- *******************************************************************************/
-
-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) {
-		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
-				pojo.getClass(), propertyName);
-		return new JavaBeanPropertyObservableMap(realm, pojo, descriptor, false);
-	}
-
-	/**
-	 * 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 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 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);
-	}
-
-	/**
-	 * @param realm
-	 * @param pojo
-	 * @param propertyName
-	 * @param elementType
-	 *            can 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 a factory for creating obervable values 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 obervable lists 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 obervable sets 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);
-			}
-		};
-	}
-
-	/**
-	 * @param realm
-	 * @param propertyName
-	 * @param elementType
-	 *            can 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 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);
-			}
-		};
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableValue observeDetailValue(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-
-		IObservableValue value = MasterDetailObservables.detailValue(master,
-				valueFactory(realm, propertyName), propertyType);
-		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
-				value, master, BeansObservables.getValueTypePropertyDescriptor(
-						master, propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableList observeDetailList(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		IObservableList observableList = MasterDetailObservables.detailList(
-				master, listFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableListDecorator decorator = new BeanObservableListDecorator(
-				observableList, master, BeansObservables
-						.getValueTypePropertyDescriptor(master, propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * 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
-	 */
-	public static IObservableSet observeDetailSet(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-
-		IObservableSet observableSet = MasterDetailObservables.detailSet(
-				master, setFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableSetDecorator decorator = new BeanObservableSetDecorator(
-				observableSet, master, BeansObservables
-						.getValueTypePropertyDescriptor(master, propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * 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.
-	 */
-	public static IObservableMap observeDetailMap(Realm realm,
-			IObservableValue master, String propertyName) {
-		IObservableMap observableMap = MasterDetailObservables.detailMap(
-				master, mapPropertyFactory(realm, propertyName));
-		BeanObservableMapDecorator decorator = new BeanObservableMapDecorator(
-				observableMap, master, BeansObservables
-						.getValueTypePropertyDescriptor(master, propertyName));
-		return decorator;
-	}
-}
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 42fd0ae..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableListDecorator.java
+++ /dev/null
@@ -1,229 +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, 245183
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-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.AbstractObservableList;
-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.internal.databinding.Util;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableList}.
- * 
- * @since 3.3
- */
-public class BeanObservableListDecorator extends AbstractObservableList
-		implements IBeanObservable {
-	private IObservableList delegate;
-	private IStaleListener delegateStaleListener;
-	private IListChangeListener delegateListChangeListener;
-
-	private Object observed;
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param delegate
-	 * @param observed
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableListDecorator(IObservableList delegate,
-			Object observed, PropertyDescriptor propertyDescriptor) {
-		super(delegate.getRealm());
-		this.delegate = delegate;
-		this.observed = observed;
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public void add(int index, Object element) {
-		delegate.add(index, element);
-	}
-
-	public boolean add(Object o) {
-		return delegate.add(o);
-	}
-
-	public boolean addAll(Collection c) {
-		return delegate.addAll(c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		return delegate.addAll(index, c);
-	}
-
-	public void clear() {
-		delegate.clear();
-	}
-
-	public void dispose() {
-		delegate.dispose();
-		super.dispose();
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		if (o == this)
-			return true;
-		if (o == null)
-			return true;
-		if (getClass() == o.getClass()) {
-			BeanObservableListDecorator other = (BeanObservableListDecorator) o;
-			return Util.equals(other.delegate, delegate);
-		}
-		return delegate.equals(o);
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		return delegate.get(index);
-	}
-
-	public Object getElementType() {
-		return delegate.getElementType();
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return delegate.hashCode();
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		return delegate.indexOf(o);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return delegate.iterator();
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		return delegate.lastIndexOf(o);
-	}
-
-	public ListIterator listIterator() {
-		getterCalled();
-		return delegate.listIterator();
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		return delegate.listIterator(index);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		return delegate.move(oldIndex, newIndex);
-	}
-
-	public Object remove(int index) {
-		return delegate.remove(index);
-	}
-
-	public boolean remove(Object o) {
-		return delegate.remove(o);
-	}
-
-	public boolean removeAll(Collection c) {
-		return delegate.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		return delegate.retainAll(c);
-	}
-
-	public Object set(int index, Object element) {
-		return delegate.set(index, element);
-	}
-
-	protected int doGetSize() {
-		return delegate.size();
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		getterCalled();
-		return delegate.subList(fromIndex, toIndex);
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return delegate.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		return delegate.toArray(a);
-	}
-
-	protected void firstListenerAdded() {
-		delegateStaleListener = new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				fireStale();
-			}
-		};
-		delegate.addStaleListener(delegateStaleListener);
-
-		delegateListChangeListener = new IListChangeListener() {
-			public void handleListChange(ListChangeEvent event) {
-				fireListChange(event.diff);
-			}
-		};
-		delegate.addListChangeListener(delegateListChangeListener);
-	}
-
-	protected void lastListenerRemoved() {
-		delegate.removeStaleListener(delegateStaleListener);
-		delegateStaleListener = null;
-
-		delegate.removeListChangeListener(delegateListChangeListener);
-		delegateListChangeListener = null;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	/**
-	 * @return list being delegated to
-	 */
-	public IObservableList getDelegate() {
-		return delegate;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getObserved()
-	 */
-	public Object getObserved() {
-		return observed;
-	}
-
-	/*
-	 * (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/BeanObservableMapDecorator.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableMapDecorator.java
deleted file mode 100644
index 33baeac..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableMapDecorator.java
+++ /dev/null
@@ -1,165 +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 245183
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-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.internal.databinding.Util;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableMap}.
- * 
- * @since 3.3
- */
-public class BeanObservableMapDecorator implements IObservableMap, IBeanObservable {
-	private IObservableMap delegate;
-	private Object observed;
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param delegate 
-	 * @param observed 
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableMapDecorator(IObservableMap delegate,
-			Object observed,
-			PropertyDescriptor propertyDescriptor) {
-		
-		this.delegate = delegate;
-		this.observed = observed;
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public Realm getRealm() {
-		return delegate.getRealm();
-	}
-
-	public boolean isStale() {
-		return delegate.isStale();
-	}
-
-	public boolean containsKey(Object key) {
-		return delegate.containsKey(key);
-	}
-
-	public boolean containsValue(Object value) {
-		return delegate.containsValue(value);
-	}
-
-	public Set entrySet() {
-		return delegate.entrySet();
-	}
-
-	public Object get(Object key) {
-		return delegate.get(key);
-	}
-
-	public Set keySet() {
-		return delegate.keySet();
-	}
-
-	public Object put(Object key, Object value) {
-		return delegate.put(key, value);
-	}
-
-	public Object remove(Object key) {
-		return delegate.remove(key);
-	}
-
-	public Collection values() {
-		return delegate.values();
-	}
-
-	public void putAll(Map map) {
-		delegate.putAll(map);
-	}
-
-	public void clear() {
-		delegate.clear();
-	}
-
-	public boolean isEmpty() {
-		return delegate.isEmpty();
-	}
-
-	public int size() {
-		return delegate.size();
-	}
-
-	public Object getObserved() {
-		return observed;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-
-	/**
-	 * @return the wrapped map
-	 */
-	public IObservableMap getDelegate() {
-		return delegate;
-	}	
-	public void dispose() {
-		delegate.dispose();
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-		delegate.addChangeListener(listener);
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-		delegate.removeChangeListener(listener);
-	}
-
-	public void addMapChangeListener(IMapChangeListener listener) {
-		delegate.addMapChangeListener(listener);
-	}
-
-	public void removeMapChangeListener(IMapChangeListener listener) {
-		delegate.removeMapChangeListener(listener);
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-		delegate.addStaleListener(listener);
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-		delegate.removeStaleListener(listener);
-	}
-
-	public boolean equals(Object obj) {
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			BeanObservableMapDecorator other = (BeanObservableMapDecorator) obj;
-			return Util.equals(other.delegate, delegate);
-		}
-		return delegate.equals(obj);
-	}
-
-	public int hashCode() {
-		return delegate.hashCode();
-	}
-}
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 92b88b5..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableSetDecorator.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 245183
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IChangeListener;
-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.internal.databinding.Util;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableSet}.
- * 
- * @since 3.3
- */
-public class BeanObservableSetDecorator implements IObservableSet, IBeanObservable {
-	private IObservableSet delegate;
-	private Object observed;
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param delegate 
-	 * @param observed 
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableSetDecorator(IObservableSet delegate,
-			Object observed,
-			PropertyDescriptor propertyDescriptor) {
-		
-		this.delegate = delegate;
-		this.observed = observed;
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public boolean add(Object o) {
-		return delegate.add(o);
-	}
-
-	public boolean addAll(Collection c) {
-		return delegate.addAll(c);
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-		delegate.addChangeListener(listener);
-	}
-
-	public void addSetChangeListener(ISetChangeListener listener) {
-		delegate.addSetChangeListener(listener);
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-		delegate.addStaleListener(listener);
-	}
-
-	public void clear() {
-		delegate.clear();
-	}
-
-	public boolean contains(Object o) {
-		return delegate.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		return delegate.containsAll(c);
-	}
-
-	public void dispose() {
-		delegate.dispose();
-	}
-
-	public boolean equals(Object obj) {
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			BeanObservableSetDecorator other = (BeanObservableSetDecorator) obj;
-			return Util.equals(other.delegate, delegate);
-		}
-		return delegate.equals(obj);
-	}
-
-	public Object getElementType() {
-		return delegate.getElementType();
-	}
-
-	public Realm getRealm() {
-		return delegate.getRealm();
-	}
-
-	public int hashCode() {
-		return delegate.hashCode();
-	}
-
-	public boolean isEmpty() {
-		return delegate.isEmpty();
-	}
-
-	public boolean isStale() {
-		return delegate.isStale();
-	}
-
-	public Iterator iterator() {
-		return delegate.iterator();
-	}
-
-	public boolean remove(Object o) {
-		return delegate.remove(o);
-	}
-
-	public boolean removeAll(Collection c) {
-		return delegate.removeAll(c);
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-		delegate.removeChangeListener(listener);
-	}
-
-	public void removeSetChangeListener(ISetChangeListener listener) {
-		delegate.removeSetChangeListener(listener);
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-		delegate.removeStaleListener(listener);
-	}
-
-	public boolean retainAll(Collection c) {
-		return delegate.retainAll(c);
-	}
-
-	public int size() {
-		return delegate.size();
-	}
-
-	public Object[] toArray() {
-		return delegate.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		return delegate.toArray(a);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getObserved()
-	 */
-	public Object getObserved() {
-		return observed;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getPropertyDescriptor()
-	 */
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-
-	/**
-	 * @return the wrapped set
-	 */
-	public IObservableSet getDelegate() {
-		return delegate;
-	}	
-}
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 cf43e3c..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableValueDecorator.java
+++ /dev/null
@@ -1,136 +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 245183
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IChangeListener;
-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.core.internal.databinding.Util;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableValue}.
- * 
- * @since 3.3
- */
-public class BeanObservableValueDecorator implements IObservableValue,
-		IBeanObservable {
-	private final IObservableValue delegate;
-	private final PropertyDescriptor descriptor;
-	private final IObservableValue observed;
-
-	/**
-	 * @param delegate
-	 * @param observed 
-	 * @param descriptor
-	 */
-	public BeanObservableValueDecorator(IObservableValue delegate, IObservableValue observed,
-			PropertyDescriptor descriptor) {
-		this.delegate = delegate;
-		this.observed = observed;
-		this.descriptor = descriptor;
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-		delegate.addChangeListener(listener);
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-		delegate.addStaleListener(listener);
-	}
-
-	public void addValueChangeListener(IValueChangeListener listener) {
-		delegate.addValueChangeListener(listener);
-	}
-
-	public void dispose() {
-		delegate.dispose();
-	}
-	
-	public boolean equals(Object obj) {
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			BeanObservableValueDecorator other = (BeanObservableValueDecorator) obj;
-			return Util.equals(other.delegate, delegate);
-		}
-		return delegate.equals(obj);
-	}
-
-	public Realm getRealm() {
-		return delegate.getRealm();
-	}
-
-	public Object getValue() {
-		return delegate.getValue();
-	}
-
-	public Object getValueType() {
-		return delegate.getValueType();
-	}
-	
-	public int hashCode() {
-		return delegate.hashCode();
-	}
-
-	public boolean isStale() {
-		return delegate.isStale();
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-		delegate.removeChangeListener(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);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getObserved()
-	 */
-	public Object getObserved() {
-		return observed.getValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getPropertyDescriptor()
-	 */
-	public PropertyDescriptor getPropertyDescriptor() {
-		return descriptor;
-	}
-	
-	/**
-	 * @return observable value delegate
-	 */
-	public IObservableValue getDelegate() {
-		return delegate;
-	}
-}
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 c41ed3d..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableMap.java
+++ /dev/null
@@ -1,142 +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 - bug 223164
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Method;
-
-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.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() {
-						fireMapChange(Diffs.createMapDiffSingleChange(
-								event.getSource(), event.getOldValue(), event
-								.getNewValue()));
-					}
-				});
-			}
-		}
-	};
-
-	private ListenerSupport listenerSupport;
-
-	private boolean updating = false;
-
-	private boolean attachListeners;
-
-	/**
-	 * @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);
-
-		this.propertyDescriptor = propertyDescriptor;
-		this.attachListeners = attachListeners;
-		if (attachListeners) {
-			this.listenerSupport = new ListenerSupport(elementListener,
-					propertyDescriptor.getName());
-		}
-		init();
-	}
-
-	protected void hookListener(Object domainElement) {
-		if (attachListeners && domainElement != null) {
-			listenerSupport.hookListener(domainElement);
-		}
-	}
-
-	protected void unhookListener(Object domainElement) {
-		if (attachListeners && domainElement != null) {
-			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);
-			propertyDescriptor.getWriteMethod().invoke(key,
-					new Object[] { value });
-			keySet().add(key);
-			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 c2d4810..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableValue.java
+++ /dev/null
@@ -1,190 +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
- *******************************************************************************/
-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.observable.value.ValueDiff;
-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;
-
-	/**
-	 * @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;
-		}
-			
-		PropertyChangeListener listener = new PropertyChangeListener() {
-			public void propertyChange(java.beans.PropertyChangeEvent event) {
-				if (!updating) {
-					final ValueDiff diff = Diffs.createValueDiff(event.getOldValue(),
-											event.getNewValue());
-					getRealm().exec(new Runnable(){
-						public void run() {
-							fireValueChange(diff);
-						}});
-				}
-			}
-		};
-		
-		if (listenerSupport == null) {
-			listenerSupport = new ListenerSupport(listener, propertyDescriptor.getName());
-		}
-		
-		listenerSupport.hookListener(object);
-	}
-
-	public void doSetValue(Object value) {
-		updating = true;
-		try {
-			Object oldValue = doGetValue();
-			
-			if (Util.equals(oldValue, value)) {
-				return;
-			}
-			
-			Method writeMethod = propertyDescriptor.getWriteMethod();
-			if (!writeMethod.isAccessible()) {
-				writeMethod.setAccessible(true);
-			}
-			writeMethod.invoke(object, new Object[] { value });
-			fireValueChange(Diffs.createValueDiff(oldValue, doGetValue()));
-		} 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() {
-		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 e604dbc..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanPropertyObservableMap.java
+++ /dev/null
@@ -1,235 +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 - bugs 223164, 244098
- *******************************************************************************/
-
-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 boolean updating = false;
-
-	private PropertyDescriptor descriptor;
-
-	private ListenerSupport listenerSupport;
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 */
-	public JavaBeanPropertyObservableMap(Realm realm, Object object,
-			PropertyDescriptor descriptor) {
-		this(realm, object, descriptor, true);
-	}
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param attachListeners
-	 */
-	public JavaBeanPropertyObservableMap(Realm realm, Object object,
-			PropertyDescriptor descriptor, boolean attachListeners) {
-		super(realm, new HashMap());
-		this.object = object;
-		this.descriptor = descriptor;
-		if (attachListeners) {
-			PropertyChangeListener listener = new PropertyChangeListener() {
-				public void propertyChange(final PropertyChangeEvent event) {
-					if (!updating) {
-						getRealm().exec(new Runnable() {
-							public void run() {
-								Map oldValue = wrappedMap;
-								Map newValue = (Map) event.getNewValue();
-								wrappedMap = new HashMap(newValue);
-								
-								fireMapChange(Diffs.computeMapDiff(oldValue, newValue));
-							}
-						});
-					}
-				}
-			};
-
-			listenerSupport = new ListenerSupport(listener,
-					descriptor.getName());
-			listenerSupport.hookListener(this.object);
-		}
-
-		wrappedMap.putAll(getMap());
-	}
-
-	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 {
-			Object result = wrappedMap.put(key, value);
-			if (!Util.equals(result, value)) {
-				setMap();
-				if (result == null) {
-					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();
-				Object oldValue = wrappedMap.put(key, newValue);
-				if (oldValue == null) {
-					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();
-		updating = true;
-		try {
-			Object result = wrappedMap.remove(key);
-			if (result!=null) {
-				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/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 90e9b58..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/AbstractObservable.java
+++ /dev/null
@@ -1,74 +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 118516
- *******************************************************************************/
-
-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 {
-	
-	/**
-	 * @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);
-	}
-
-	protected void fireChange() {
-		checkRealm();
-		fireEvent(new ChangeEvent(this));
-	}
-
-	protected void fireStale() {
-		checkRealm();
-		fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void dispose() {
-		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 e91daeb..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeSupport.java
+++ /dev/null
@@ -1,79 +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;
-
-/**
- * @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);
-	}
-	
-}
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/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/IObservable.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservable.java
deleted file mode 100644
index de8e8cd..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservable.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
- *******************************************************************************/
-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>
- * 
- * @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 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();
-
-	/**
-	 * 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 66e669a..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservableCollection.java
+++ /dev/null
@@ -1,43 +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 {
-
-	/**
-	 * @return the element type of this observable value, 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 8e3fca9..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 - Fix NPE, more detailed assert messages (bug 210115)
- *******************************************************************************/
-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) {
-		Realm realm = observable.getRealm();
-		if (realm == null) // observable.isDisposed() would be more appropriate if it existed
-			Assert.isTrue(false, "Getter called on disposed observable " //$NON-NLS-1$
-					+ toString(observable));
-		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 f272080..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Observables.java
+++ /dev/null
@@ -1,514 +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
- *     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.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-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.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.observable.ConstantObservableValue;
-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.ProxyObservableList;
-import org.eclipse.core.internal.databinding.observable.ProxyObservableSet;
-import org.eclipse.core.internal.databinding.observable.StalenessObservableValue;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableList;
-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 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 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 void addChangeListener(IChangeListener listener) {
-			}
-
-			public void addStaleListener(IStaleListener listener) {
-			}
-
-			public void addSetChangeListener(ISetChangeListener listener) {
-			}
-		};
-	}
-
-	/**
-	 * 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 ProxyObservableSet(target);
-	}
-
-	/**
-	 * 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 ProxyObservableList(target);
-	}
-
-	/**
-	 * 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 void addChangeListener(IChangeListener listener) {
-			}
-
-			public void addStaleListener(IStaleListener listener) {
-			}
-
-			public 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.
-	 * @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) {
-		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 27d08ff..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Realm.java
+++ /dev/null
@@ -1,293 +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 168153
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-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;
-
-	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();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	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 658ff7f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java
+++ /dev/null
@@ -1,312 +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 118516
- *     Matthew Hall - bug 208858
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-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.IChangeListener;
-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;
-
-	/**
-	 * @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) {
-		changeSupport.addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(IListChangeListener listener) {
-		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) {
-		changeSupport.addChangeListener(listener);
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		changeSupport.removeChangeListener(listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		changeSupport.addStaleListener(listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		changeSupport.removeStaleListener(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() {
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void 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/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 097d367..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IObservableList.java
+++ /dev/null
@@ -1,198 +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 - bug 208858
- *******************************************************************************/
-
-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.
- * 
- * @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 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 df98632..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiff.java
+++ /dev/null
@@ -1,117 +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
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.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);
-		}
-	}
-
-	/**
-	 * @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/ObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ObservableList.java
deleted file mode 100644
index 7a7eeef..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ObservableList.java
+++ /dev/null
@@ -1,379 +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 208858, 208332, 245183
- *     Tom Schindl - bug 245183
- *******************************************************************************/
-
-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();
-
-		if (o == this)
-			return true;
-		if (o == null)
-			return false;
-		if (getClass() == o.getClass()) {
-			return wrappedList.equals(((ObservableList) o).wrappedList);
-		}
-
-		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 e35f655..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.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
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 118516, 240931
- *******************************************************************************/
-
-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.IChangeListener;
-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 ChangeSupport changeSupport;
-
-	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 ChangeSupport(realm){
-			protected void firstListenerAdded() {
-				AbstractObservableMap.this.firstListenerAdded();
-			}
-			protected void lastListenerRemoved() {
-				AbstractObservableMap.this.lastListenerRemoved();
-			}
-		};
-	}
-
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addListener(MapChangeEvent.TYPE, listener);
-		}
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.removeListener(MapChangeEvent.TYPE, listener);
-		}
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addChangeListener(listener);
-		}
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addStaleListener(listener);
-		}
-	}
-
-	public synchronized void dispose() {
-		if (changeSupport != null) {
-			changeSupport.dispose();
-			changeSupport = null;
-		}
-	}
-
-	public Realm getRealm() {
-		if (changeSupport != null) {
-			return changeSupport.getRealm();
-		}
-		return null;
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return stale;
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.removeChangeListener(listener);
-		}
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		if (changeSupport != null) {
-			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/BidirectionalMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
deleted file mode 100644
index c83f6ee..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
+++ /dev/null
@@ -1,104 +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 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;
-
-/**
- * 
- * <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 BidirectionalMap extends ObservableMap {
-
-	private Map valueToElements = new HashMap();
-
-	private IMapChangeListener mapListener = new IMapChangeListener() {
-
-		public 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));
-			}
-			fireMapChange(diff);
-		}
-	};
-
-	/**
-	 * @param wrappedMap
-	 */
-	public BidirectionalMap(IObservableMap wrappedMap) {
-		super(wrappedMap.getRealm(), wrappedMap);
-		wrappedMap.addMapChangeListener(mapListener);
-		for (Iterator it = wrappedMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			addMapping(entry.getKey(), entry.getValue());
-		}
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	private void addMapping(Object key, Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet == null) {
-			valueToElements.put(value, key);
-			return;
-		}
-		if (!(elementOrSet instanceof Set)) {
-			elementOrSet = new HashSet(Collections.singleton(elementOrSet));
-			valueToElements.put(value, elementOrSet);
-		}
-		Set set = (Set) elementOrSet;
-		set.add(key);
-	}
-
-	/**
-	 * @param functionValue
-	 * @param element
-	 */
-	private void removeMapping(Object functionValue, Object element) {
-		Object elementOrSet = valueToElements.get(functionValue);
-		if (elementOrSet instanceof Set) {
-			Set set = (Set) elementOrSet;
-			set.remove(element);
-			if (set.size() == 0) {
-				valueToElements.remove(functionValue);
-			}
-		} else {
-			valueToElements.remove(functionValue);
-		}
-	}
-
-}
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 8f3bbb6..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/CompositeMap.java
+++ /dev/null
@@ -1,361 +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.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.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 {
-
-	private Map valueToElements = new HashMap();
-
-	// 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);
-				addMapping(addedKey, newValue);
-				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 = removeMapping(changedKey, oldValue);
-				addMapping(changedKey, newValue);
-				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 (removeMapping(removedKey, oldValue)) {
-					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 = getElementsForValue(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 = getElementsForValue(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 IObservableMap 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 = firstMap;
-		firstMap.addMapChangeListener(firstMapListener);
-		for (Iterator it = firstMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			addMapping(entry.getKey(), entry.getValue());
-			rangeSet.add(entry.getValue());
-		}
-		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()));
-		}
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	private void addMapping(Object key, Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet == null) {
-			valueToElements.put(value, key);
-			return;
-		}
-		if (!(elementOrSet instanceof Set)) {
-			elementOrSet = new HashSet(Collections.singleton(elementOrSet));
-			valueToElements.put(value, elementOrSet);
-		}
-		Set set = (Set) elementOrSet;
-		set.add(key);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	private boolean removeMapping(Object key, Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet instanceof Set) {
-			Set set = (Set) elementOrSet;
-			set.remove(key);
-			if (set.size() == 0) {
-				valueToElements.remove(value);
-				return true;
-			}
-			return false;
-		}
-		valueToElements.remove(value);
-		return true;
-	}
-
-	private Set getElementsForValue(Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet instanceof Set) {
-			return (Set) elementOrSet;
-		}
-		return elementOrSet == null ? Collections.EMPTY_SET : Collections
-				.singleton(elementOrSet);
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		firstMap.removeMapChangeListener(firstMapListener);
-		firstMap = null;
-		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 f743892..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java
+++ /dev/null
@@ -1,161 +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 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 final IObservableSet keySet;
-
-	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) {
-		super(keySet.getRealm());
-		this.keySet = keySet;
-		this.keySet.addSetChangeListener(setChangeListener);
-	}
-
-	protected void init() {
-		for (Iterator it = this.keySet.iterator(); it.hasNext();) {
-			Object key = it.next();
-			hookListener(key);
-		}
-	}
-
-	protected final void fireSingleChange(Object key, Object oldValue,
-			Object newValue) {
-		fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue, newValue));
-	}
-
-	public Set entrySet() {
-		return entrySet;
-	}
-	
-	public Set keySet() {
-		return keySet;
-	}
-
-	final public Object get(Object key) {
-		return doGet(key);
-	}
-
-	final public Object put(Object key, Object value) {
-		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);
-}
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 78a0db0..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IObservableMap.java
+++ /dev/null
@@ -1,107 +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
- *******************************************************************************/
-
-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.
- * 
- * @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.
- *              
- * @see AbstractObservableMap
- * @see ObservableMap
- * 
- * @since 1.1
- */
-public interface IObservableMap extends Map, IObservable {
-	
-	/**
-	 * @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 f54c37c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapDiff.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.map;
-
-import java.util.Set;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class MapDiff {
-
-	/**
-	 * @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 b52b3f9..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ObservableMap.java
+++ /dev/null
@@ -1,182 +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 245183
- *******************************************************************************/
-
-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);
-	}
-
-	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();
-	}
-
-	public boolean equals(Object obj) {
-		getterCalled();
-
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			return wrappedMap.equals(((ObservableMap) obj).wrappedMap);
-		}
-
-		return wrappedMap.equals(obj);
-	}
-
-	public int hashCode() {
-		getterCalled();
-
-		return wrappedMap.hashCode();
-	}
-}
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 4e53422..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/WritableMap.java
+++ /dev/null
@@ -1,117 +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 184830
- *******************************************************************************/
-
-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 {
-
-	/**
-	 * Constructs a new WritableMap on the default realm.
-	 */
-	public WritableMap() {
-		this(Realm.getDefault());
-	}
-	
-	/**
-	 * Constructs a new WritableMap on the given realm.
-	 * 
-	 * @param realm
-	 *            the realm
-	 */
-	public WritableMap(Realm realm) {
-		super(realm, new HashMap());
-	}
-
-	/**
-	 * 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();
-		Object result = wrappedMap.put(key, value);
-		if (!Util.equals(result, value)) {
-			if (result==null) {
-				fireMapChange(Diffs.createMapDiffSingleAdd(key, value));
-			} else {
-				fireMapChange(Diffs.createMapDiffSingleChange(key, result,
-						value));
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Removes the value with the provide <code>key</code>.  Must be invoked from the current realm.
-	 */
-	public Object remove(Object key) {
-		checkRealm();
-		Object result = wrappedMap.remove(key);
-		if (result!=null) {
-			fireMapChange(Diffs.createMapDiffSingleRemove(key, result));
-		}
-		return result;
-	}
-
-	/**
-	 * 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();
-			Object previousValue = wrappedMap.put(entry.getKey(), entry.getValue());
-			if (previousValue==null) {
-				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 77832e3..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java
+++ /dev/null
@@ -1,119 +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
- *******************************************************************************/
-
-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 new DetailObservableMap(detailFactory, master);
-	}
-}
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/IObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/IObservableSet.java
deleted file mode 100644
index 0efecf6..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
- *******************************************************************************/
-
-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.
- * 
- * @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.
- * 
- * @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 433a0f8..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ObservableSet.java
+++ /dev/null
@@ -1,217 +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, 245183
- *******************************************************************************/
-
-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();
-
-		if (o == this)
-			return true;
-		if (o == null)
-			return false;
-		if (getClass() == o.getClass()) {
-			return wrappedSet.equals(((ObservableSet) o).wrappedSet);
-		}
-
-		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 d1a2f13..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetDiff.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.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();
-	
-	/**
-	 * @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/IObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IObservableValue.java
deleted file mode 100644
index 630b1c4..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
- *******************************************************************************/
-
-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.
- * 
- * @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.
- * 
- * @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 45467ba..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.getPlugin() + " - " + status.getCode() + " - " + status.getMessage());  //$NON-NLS-1$//$NON-NLS-2$
-				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 f143efb..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java
+++ /dev/null
@@ -1,110 +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
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-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 addStaleListener(IStaleListener listener) {
-		// ignore
-	}
-
-	public void dispose() {
-		// nothing to dispose
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean isStale() {
-		return false;
-	}
-
-	public void removeChangeListener(IChangeListener 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/EmptyObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
deleted file mode 100644
index 1b53b34..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
+++ /dev/null
@@ -1,224 +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
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-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.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 boolean isStale() {
-		checkRealm();
-		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 dab53c4..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java
+++ /dev/null
@@ -1,176 +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.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.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 boolean isStale() {
-		checkRealm();
-		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/ProxyObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ProxyObservableList.java
deleted file mode 100644
index 6d15f2c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ProxyObservableList.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 208332)
- *     IBM Corporation - initial API and implementation
- *         (through ProxyObservableSet.java)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.*;
-
-/**
- * Wraps an observable list. This object acts like an exact copy of the original
- * list, and tracks all the changes in the original. The only difference is that
- * disposing the wrapper will not dispose the original. You can use this
- * whenever you need to return an IObservableList from a method that expects the
- * caller to dispose the list, but you have an IObservableList that you don't
- * want disposed.
- * 
- * @since 1.1
- */
-public class ProxyObservableList extends ObservableList {
-	private IListChangeListener listChangelistener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			fireListChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent event) {
-			fireStale();
-		}
-	};
-
-	private IObservableList wrappedList;
-
-	/**
-	 * Constructs a ProxyObservableList that tracks the state of the given list.
-	 * 
-	 * @param wrappedList
-	 *            the list being wrapped
-	 */
-	public ProxyObservableList(IObservableList wrappedList) {
-		super(wrappedList.getRealm(), wrappedList, wrappedList.getElementType());
-		this.wrappedList = wrappedList;
-		wrappedList.addListChangeListener(listChangelistener);
-		wrappedList.addStaleListener(staleListener);
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedList == null ? false : wrappedList.isStale();
-	}
-
-	public void dispose() {
-		if (wrappedList != null) {
-			wrappedList.removeListChangeListener(listChangelistener);
-			listChangelistener = null;
-			wrappedList.removeStaleListener(staleListener);
-			staleListener = null;
-			wrappedList = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ProxyObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ProxyObservableSet.java
deleted file mode 100644
index 55a0b24..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ProxyObservableSet.java
+++ /dev/null
@@ -1,87 +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.internal.databinding.observable;
-
-import java.util.Collections;
-import java.util.Set;
-
-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;
-
-/**
- * Wraps an observable set. This object acts like an exact copy of the original
- * set, and tracks all the changes in the original. The only difference is that
- * disposing the wrapper will not dispose the original. You can use this
- * whenever you need to return an IObservableSet from a method that expects the
- * caller to dispose the set, but you have an IObservableSet that you don't want
- * disposed.
- */
-public class ProxyObservableSet extends AbstractObservableSet {
-	private IObservableSet wrappedSet;
-	private Object elementType;
-
-	private ISetChangeListener setChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			fireSetChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	/**
-	 * Constructs a ProxyObservableSet that tracks the state of the given set.
-	 * 
-	 * @param wrappedSet
-	 *            the set being wrapped
-	 */
-	public ProxyObservableSet(IObservableSet wrappedSet) {
-		super(wrappedSet.getRealm());
-		this.wrappedSet = wrappedSet;
-		this.elementType = wrappedSet.getElementType();
-		wrappedSet.addSetChangeListener(setChangeListener);
-		wrappedSet.addStaleListener(staleListener);
-	}
-
-	protected Set getWrappedSet() {
-		return wrappedSet == null ? Collections.EMPTY_SET : wrappedSet;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedSet == null ? false : wrappedSet.isStale();
-	}
-
-	public void dispose() {
-		if (wrappedSet != null) {
-			wrappedSet.removeSetChangeListener(setChangeListener);
-			setChangeListener = null;
-			wrappedSet.removeStaleListener(staleListener);
-			staleListener = null;
-			wrappedSet = null;
-		}
-		elementType = null;
-		super.dispose();
-	}
-}
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 6f34e1e..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java
+++ /dev/null
@@ -1,90 +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
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-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.ObservableList;
-
-/**
- * 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
- */
-/*
- * Implementation makes the assumption that the superclass (ObservableList) is
- * unmodifiable and that all modify methods throw an
- * UnsupportedOperationException.
- */
-public class UnmodifiableObservableList extends ObservableList {
-	/**
-	 * List that is being made unmodifiable.
-	 */
-	private IObservableList wrappedList;
-
-	private IListChangeListener listChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			// Fires a Change and then ListChange event.
-			fireListChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent event) {
-			fireStale();
-		}
-	};
-
-	/**
-	 * @param wrappedList
-	 */
-	public UnmodifiableObservableList(IObservableList wrappedList) {
-		super(wrappedList.getRealm(), wrappedList, wrappedList.getElementType());
-		this.wrappedList = wrappedList;
-
-		wrappedList.addListChangeListener(listChangeListener);
-
-		wrappedList.addStaleListener(staleListener);
-	}
-
-	/**
-	 * Because this instance is immutable staleness cannot be changed.
-	 * 
-	 * @throws UnsupportedOperationException
-	 *             because this instance is unmodifiable.
-	 */
-	public void setStale(boolean stale) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedList == null ? false : wrappedList.isStale();
-	}
-
-	public synchronized void dispose() {
-		if (wrappedList != null) {
-			wrappedList.removeListChangeListener(listChangeListener);
-			wrappedList.removeStaleListener(staleListener);
-			wrappedList = null;
-		}
-		listChangeListener = null;
-		staleListener = 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 ee38b25..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java
+++ /dev/null
@@ -1,76 +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)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.*;
-
-/**
- * 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 ObservableSet {
-	private ISetChangeListener setChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			fireSetChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent event) {
-			fireStale();
-		}
-	};
-
-	private IObservableSet wrappedSet;
-
-	/**
-	 * @param wrappedSet
-	 */
-	public UnmodifiableObservableSet(IObservableSet wrappedSet) {
-		super(wrappedSet.getRealm(), wrappedSet, wrappedSet.getElementType());
-
-		this.wrappedSet = wrappedSet;
-
-		wrappedSet.addSetChangeListener(setChangeListener);
-		wrappedSet.addStaleListener(staleListener);
-	}
-
-	/**
-	 * Because this instance is immutable staleness cannot be changed.
-	 */
-	public void setStale(boolean stale) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedSet == null ? false : wrappedSet.isStale();
-	}
-
-	public synchronized void dispose() {
-		if (wrappedSet != null) {
-			wrappedSet.removeSetChangeListener(setChangeListener);
-			wrappedSet.removeStaleListener(staleListener);
-			wrappedSet = null;
-		}
-		setChangeListener = null;
-		staleListener = 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 e35712c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java
+++ /dev/null
@@ -1,63 +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 237884
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-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.ValueChangeEvent;
-
-/**
- * An unmodifiable wrapper class for IObservableValue instances.
- * @since 1.1
- */
-public class UnmodifiableObservableValue extends AbstractObservableValue {
-	private IObservableValue wrappedValue;
-
-	/**
-	 * 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.getRealm());
-
-		this.wrappedValue = wrappedValue;
-		wrappedValue.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				fireValueChange(event.diff);
-			}
-		});
-		wrappedValue.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				fireStale();
-			}
-		});
-	}
-
-	protected Object doGetValue() {
-		return wrappedValue.getValue();
-	}
-
-	public Object getValueType() {
-		return wrappedValue.getValueType();
-	}
-
-	public boolean isStale() {
-		return wrappedValue.isStale();
-	}
-}
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 1261f69..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java
+++ /dev/null
@@ -1,228 +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.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 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/DetailObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
deleted file mode 100755
index 1baec56..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
+++ /dev/null
@@ -1,175 +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
- *******************************************************************************/
-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.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;
-		updateInnerObservableList(outerObservableValue);
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			List oldList = new ArrayList(wrappedList);
-			updateInnerObservableList(outerObservableValue);
-			fireListChange(Diffs.computeListDiff(oldList, wrappedList));
-		}
-	};
-
-	private void updateInnerObservableList(IObservableValue outerObservableValue) {
-		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);
-			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(Object o) {
-		return wrappedList.add(o);
-	}
-
-	public void add(int index, Object element) {
-		wrappedList.add(index, element);
-	}
-
-	public boolean remove(Object o) {
-		return wrappedList.remove(o);
-	}
-
-	public Object set(int index, Object element) {
-		return wrappedList.set(index, element);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		if (innerObservableList != null)
-			return innerObservableList.move(oldIndex, newIndex);
-		return super.move(oldIndex, newIndex);
-	}
-
-	public Object remove(int index) {
-		return wrappedList.remove(index);
-	}
-
-	public boolean addAll(Collection c) {
-		return wrappedList.addAll(c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		return wrappedList.addAll(index, c);
-	}
-
-	public boolean removeAll(Collection c) {
-		return wrappedList.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		return wrappedList.retainAll(c);
-	}
-
-	public void clear() {
-		wrappedList.clear();
-	}
-	
-	public void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-			outerObservableValue.dispose();
-		}
-		if (innerObservableList != null) {
-			innerObservableList.removeListChangeListener(innerChangeListener);
-			innerObservableList.dispose();
-		}
-		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 a57148c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java
+++ /dev/null
@@ -1,126 +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
- ******************************************************************************/
-
-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.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;
-
-/**
- * @since 1.1
- * 
- */
-public class DetailObservableMap extends ObservableMap {
-	private boolean updating = false;
-
-	private IObservableValue master;
-	private IObservableFactory detailFactory;
-
-	private IObservableMap detailMap;
-
-	private IValueChangeListener masterChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			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
-	 * 
-	 */
-	public DetailObservableMap(IObservableFactory detailFactory,
-			IObservableValue master) {
-		super(master.getRealm(), Collections.EMPTY_MAP);
-		this.master = master;
-		this.detailFactory = detailFactory;
-
-		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);
-			wrappedMap = detailMap;
-			detailMap.addMapChangeListener(detailChangeListener);
-		}
-	}
-
-	public Object put(Object key, Object value) {
-		return detailMap.put(key, value);
-	}
-
-	public void putAll(Map map) {
-		detailMap.putAll(map);
-	}
-
-	public Object remove(Object key) {
-		return detailMap.remove(key);
-	}
-
-	public void clear() {
-		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();
-	}
-
-}
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 dc0fc46..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java
+++ /dev/null
@@ -1,158 +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
- *******************************************************************************/
-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.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;
-		updateInnerObservableSet(outerObservableValue);
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			Set oldSet = new HashSet(wrappedSet);
-			updateInnerObservableSet(outerObservableValue);
-			fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet));
-		}
-	};
-
-	private void updateInnerObservableSet(IObservableValue outerObservableValue) {
-		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);
-			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(Object o) {
-		getterCalled();
-		return wrappedSet.add(o);
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		return wrappedSet.remove(o);
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		return wrappedSet.addAll(c);
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		return wrappedSet.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		return wrappedSet.retainAll(c);
-	}
-
-	public void clear() {
-		getterCalled();
-		wrappedSet.clear();
-	}
-
-	public void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-			outerObservableValue.dispose();
-		}
-		if (innerObservableSet != null) {
-			innerObservableSet.removeSetChangeListener(innerChangeListener);
-			innerObservableSet.dispose();
-		}
-		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 c1b1654..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.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
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *******************************************************************************/
-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.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;
-		updateInnerObservableValue(outerObservableValue);
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			Object oldValue = doGetValue();
-			updateInnerObservableValue(outerObservableValue);
-			fireValueChange(Diffs.createValueDiff(oldValue, doGetValue()));
-		}
-	};
-
-	private void updateInnerObservableValue(
-			IObservableValue outerObservableValue) {
-		currentOuterValue = outerObservableValue.getValue();
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		if (currentOuterValue == null) {
-			innerObservableValue = null;
-		} else {
-			this.innerObservableValue = (IObservableValue) factory
-					.createObservable(currentOuterValue);
-			Object innerValueType = innerObservableValue.getValueType();
-
-			if (detailType != null) {
-				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(Object value) {
-		if (innerObservableValue != null)
-			innerObservableValue.setValue(value);
-	}
-
-	public Object doGetValue() {
-		return innerObservableValue == null ? null : innerObservableValue
-				.getValue();
-	}
-
-	public Object getValueType() {
-		return detailType;
-	}
-
-	public void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-			outerObservableValue.dispose();
-		}
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		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/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 b5aaa18..0000000
--- a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,34 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.databinding
-Bundle-Version: 1.1.1.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.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 bbba98e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/AggregateValidationStatus.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
- *     Matt Carter - bug 182822
- *     Boris Bokowski - bug 218269
- *     Matthew Hall - bug 218269
- *******************************************************************************/
-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.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);
-	}
-
-	/**
-	 * @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);
-	}
-
-	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 a1939a4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/Binding.java
+++ /dev/null
@@ -1,163 +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
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.util.Collections;
-
-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;
-	
-	/**
-	 * 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;
-		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;
-		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 f8adb89..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateStrategy.java
+++ /dev/null
@@ -1,710 +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
- *                 - Character support completed (bug 197679)
- *******************************************************************************/
-
-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.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.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 ee9a00b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/NumberToStringConverter.java
+++ /dev/null
@@ -1,189 +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.conversion;
-
-import java.math.BigInteger;
-
-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 fromTypeIsLong;
-	private boolean fromTypeIsDecimalType;
-	private boolean fromTypeIsBigInteger;
-
-	/**
-	 * 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)) {
-			fromTypeIsLong = 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;
-		}
-	}
-
-	/**
-	 * 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 (fromTypeIsLong) {
-			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);
-			}
-		}
-
-		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);
-	}
-}
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 104ec66..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/StringToNumberConverter.java
+++ /dev/null
@@ -1,255 +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.conversion;
-
-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);
-
-	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.MIN_VALUE);
-
-	private static final Float MIN_FLOAT = new Float(-Float.MAX_VALUE);
-	private static final Float MAX_FLOAT = new Float(Float.MAX_VALUE);
-
-	/**
-	 * @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)) {
-			return new BigDecimal(result.getNumber().doubleValue())
-					.toBigInteger();
-		}
-
-		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);
-	}
-}
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 90e9b58..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/AbstractObservable.java
+++ /dev/null
@@ -1,74 +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 118516
- *******************************************************************************/
-
-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 {
-	
-	/**
-	 * @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);
-	}
-
-	protected void fireChange() {
-		checkRealm();
-		fireEvent(new ChangeEvent(this));
-	}
-
-	protected void fireStale() {
-		checkRealm();
-		fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void dispose() {
-		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 e91daeb..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeSupport.java
+++ /dev/null
@@ -1,79 +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;
-
-/**
- * @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);
-	}
-	
-}
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/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/IObservable.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservable.java
deleted file mode 100644
index de8e8cd..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservable.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
- *******************************************************************************/
-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>
- * 
- * @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 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();
-
-	/**
-	 * 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 66e669a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservableCollection.java
+++ /dev/null
@@ -1,43 +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 {
-
-	/**
-	 * @return the element type of this observable value, 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 8e3fca9..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 - Fix NPE, more detailed assert messages (bug 210115)
- *******************************************************************************/
-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) {
-		Realm realm = observable.getRealm();
-		if (realm == null) // observable.isDisposed() would be more appropriate if it existed
-			Assert.isTrue(false, "Getter called on disposed observable " //$NON-NLS-1$
-					+ toString(observable));
-		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 f272080..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Observables.java
+++ /dev/null
@@ -1,514 +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
- *     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.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-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.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.observable.ConstantObservableValue;
-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.ProxyObservableList;
-import org.eclipse.core.internal.databinding.observable.ProxyObservableSet;
-import org.eclipse.core.internal.databinding.observable.StalenessObservableValue;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableList;
-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 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 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 void addChangeListener(IChangeListener listener) {
-			}
-
-			public void addStaleListener(IStaleListener listener) {
-			}
-
-			public void addSetChangeListener(ISetChangeListener listener) {
-			}
-		};
-	}
-
-	/**
-	 * 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 ProxyObservableSet(target);
-	}
-
-	/**
-	 * 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 ProxyObservableList(target);
-	}
-
-	/**
-	 * 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 void addChangeListener(IChangeListener listener) {
-			}
-
-			public void addStaleListener(IStaleListener listener) {
-			}
-
-			public 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.
-	 * @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) {
-		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 27d08ff..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Realm.java
+++ /dev/null
@@ -1,293 +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 168153
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-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;
-
-	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();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	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 658ff7f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java
+++ /dev/null
@@ -1,312 +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 118516
- *     Matthew Hall - bug 208858
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-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.IChangeListener;
-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;
-
-	/**
-	 * @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) {
-		changeSupport.addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(IListChangeListener listener) {
-		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) {
-		changeSupport.addChangeListener(listener);
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		changeSupport.removeChangeListener(listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		changeSupport.addStaleListener(listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		changeSupport.removeStaleListener(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() {
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void 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/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 097d367..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IObservableList.java
+++ /dev/null
@@ -1,198 +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 - bug 208858
- *******************************************************************************/
-
-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.
- * 
- * @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 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 df98632..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiff.java
+++ /dev/null
@@ -1,117 +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
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.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);
-		}
-	}
-
-	/**
-	 * @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/ObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ObservableList.java
deleted file mode 100644
index 7a7eeef..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ObservableList.java
+++ /dev/null
@@ -1,379 +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 208858, 208332, 245183
- *     Tom Schindl - bug 245183
- *******************************************************************************/
-
-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();
-
-		if (o == this)
-			return true;
-		if (o == null)
-			return false;
-		if (getClass() == o.getClass()) {
-			return wrappedList.equals(((ObservableList) o).wrappedList);
-		}
-
-		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 e35f655..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.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
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 118516, 240931
- *******************************************************************************/
-
-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.IChangeListener;
-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 ChangeSupport changeSupport;
-
-	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 ChangeSupport(realm){
-			protected void firstListenerAdded() {
-				AbstractObservableMap.this.firstListenerAdded();
-			}
-			protected void lastListenerRemoved() {
-				AbstractObservableMap.this.lastListenerRemoved();
-			}
-		};
-	}
-
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addListener(MapChangeEvent.TYPE, listener);
-		}
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.removeListener(MapChangeEvent.TYPE, listener);
-		}
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addChangeListener(listener);
-		}
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addStaleListener(listener);
-		}
-	}
-
-	public synchronized void dispose() {
-		if (changeSupport != null) {
-			changeSupport.dispose();
-			changeSupport = null;
-		}
-	}
-
-	public Realm getRealm() {
-		if (changeSupport != null) {
-			return changeSupport.getRealm();
-		}
-		return null;
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return stale;
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.removeChangeListener(listener);
-		}
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		if (changeSupport != null) {
-			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/BidirectionalMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
deleted file mode 100644
index c83f6ee..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
+++ /dev/null
@@ -1,104 +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 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;
-
-/**
- * 
- * <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 BidirectionalMap extends ObservableMap {
-
-	private Map valueToElements = new HashMap();
-
-	private IMapChangeListener mapListener = new IMapChangeListener() {
-
-		public 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));
-			}
-			fireMapChange(diff);
-		}
-	};
-
-	/**
-	 * @param wrappedMap
-	 */
-	public BidirectionalMap(IObservableMap wrappedMap) {
-		super(wrappedMap.getRealm(), wrappedMap);
-		wrappedMap.addMapChangeListener(mapListener);
-		for (Iterator it = wrappedMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			addMapping(entry.getKey(), entry.getValue());
-		}
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	private void addMapping(Object key, Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet == null) {
-			valueToElements.put(value, key);
-			return;
-		}
-		if (!(elementOrSet instanceof Set)) {
-			elementOrSet = new HashSet(Collections.singleton(elementOrSet));
-			valueToElements.put(value, elementOrSet);
-		}
-		Set set = (Set) elementOrSet;
-		set.add(key);
-	}
-
-	/**
-	 * @param functionValue
-	 * @param element
-	 */
-	private void removeMapping(Object functionValue, Object element) {
-		Object elementOrSet = valueToElements.get(functionValue);
-		if (elementOrSet instanceof Set) {
-			Set set = (Set) elementOrSet;
-			set.remove(element);
-			if (set.size() == 0) {
-				valueToElements.remove(functionValue);
-			}
-		} else {
-			valueToElements.remove(functionValue);
-		}
-	}
-
-}
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 8f3bbb6..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/CompositeMap.java
+++ /dev/null
@@ -1,361 +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.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.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 {
-
-	private Map valueToElements = new HashMap();
-
-	// 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);
-				addMapping(addedKey, newValue);
-				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 = removeMapping(changedKey, oldValue);
-				addMapping(changedKey, newValue);
-				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 (removeMapping(removedKey, oldValue)) {
-					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 = getElementsForValue(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 = getElementsForValue(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 IObservableMap 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 = firstMap;
-		firstMap.addMapChangeListener(firstMapListener);
-		for (Iterator it = firstMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			addMapping(entry.getKey(), entry.getValue());
-			rangeSet.add(entry.getValue());
-		}
-		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()));
-		}
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	private void addMapping(Object key, Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet == null) {
-			valueToElements.put(value, key);
-			return;
-		}
-		if (!(elementOrSet instanceof Set)) {
-			elementOrSet = new HashSet(Collections.singleton(elementOrSet));
-			valueToElements.put(value, elementOrSet);
-		}
-		Set set = (Set) elementOrSet;
-		set.add(key);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	private boolean removeMapping(Object key, Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet instanceof Set) {
-			Set set = (Set) elementOrSet;
-			set.remove(key);
-			if (set.size() == 0) {
-				valueToElements.remove(value);
-				return true;
-			}
-			return false;
-		}
-		valueToElements.remove(value);
-		return true;
-	}
-
-	private Set getElementsForValue(Object value) {
-		Object elementOrSet = valueToElements.get(value);
-		if (elementOrSet instanceof Set) {
-			return (Set) elementOrSet;
-		}
-		return elementOrSet == null ? Collections.EMPTY_SET : Collections
-				.singleton(elementOrSet);
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		firstMap.removeMapChangeListener(firstMapListener);
-		firstMap = null;
-		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 f743892..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java
+++ /dev/null
@@ -1,161 +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 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 final IObservableSet keySet;
-
-	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) {
-		super(keySet.getRealm());
-		this.keySet = keySet;
-		this.keySet.addSetChangeListener(setChangeListener);
-	}
-
-	protected void init() {
-		for (Iterator it = this.keySet.iterator(); it.hasNext();) {
-			Object key = it.next();
-			hookListener(key);
-		}
-	}
-
-	protected final void fireSingleChange(Object key, Object oldValue,
-			Object newValue) {
-		fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue, newValue));
-	}
-
-	public Set entrySet() {
-		return entrySet;
-	}
-	
-	public Set keySet() {
-		return keySet;
-	}
-
-	final public Object get(Object key) {
-		return doGet(key);
-	}
-
-	final public Object put(Object key, Object value) {
-		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);
-}
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 78a0db0..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IObservableMap.java
+++ /dev/null
@@ -1,107 +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
- *******************************************************************************/
-
-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.
- * 
- * @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.
- *              
- * @see AbstractObservableMap
- * @see ObservableMap
- * 
- * @since 1.1
- */
-public interface IObservableMap extends Map, IObservable {
-	
-	/**
-	 * @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 f54c37c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapDiff.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.map;
-
-import java.util.Set;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class MapDiff {
-
-	/**
-	 * @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 b52b3f9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ObservableMap.java
+++ /dev/null
@@ -1,182 +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 245183
- *******************************************************************************/
-
-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);
-	}
-
-	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();
-	}
-
-	public boolean equals(Object obj) {
-		getterCalled();
-
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			return wrappedMap.equals(((ObservableMap) obj).wrappedMap);
-		}
-
-		return wrappedMap.equals(obj);
-	}
-
-	public int hashCode() {
-		getterCalled();
-
-		return wrappedMap.hashCode();
-	}
-}
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 4e53422..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/WritableMap.java
+++ /dev/null
@@ -1,117 +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 184830
- *******************************************************************************/
-
-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 {
-
-	/**
-	 * Constructs a new WritableMap on the default realm.
-	 */
-	public WritableMap() {
-		this(Realm.getDefault());
-	}
-	
-	/**
-	 * Constructs a new WritableMap on the given realm.
-	 * 
-	 * @param realm
-	 *            the realm
-	 */
-	public WritableMap(Realm realm) {
-		super(realm, new HashMap());
-	}
-
-	/**
-	 * 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();
-		Object result = wrappedMap.put(key, value);
-		if (!Util.equals(result, value)) {
-			if (result==null) {
-				fireMapChange(Diffs.createMapDiffSingleAdd(key, value));
-			} else {
-				fireMapChange(Diffs.createMapDiffSingleChange(key, result,
-						value));
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Removes the value with the provide <code>key</code>.  Must be invoked from the current realm.
-	 */
-	public Object remove(Object key) {
-		checkRealm();
-		Object result = wrappedMap.remove(key);
-		if (result!=null) {
-			fireMapChange(Diffs.createMapDiffSingleRemove(key, result));
-		}
-		return result;
-	}
-
-	/**
-	 * 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();
-			Object previousValue = wrappedMap.put(entry.getKey(), entry.getValue());
-			if (previousValue==null) {
-				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 77832e3..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java
+++ /dev/null
@@ -1,119 +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
- *******************************************************************************/
-
-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 new DetailObservableMap(detailFactory, master);
-	}
-}
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/IObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/IObservableSet.java
deleted file mode 100644
index 0efecf6..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
- *******************************************************************************/
-
-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.
- * 
- * @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.
- * 
- * @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 433a0f8..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ObservableSet.java
+++ /dev/null
@@ -1,217 +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, 245183
- *******************************************************************************/
-
-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();
-
-		if (o == this)
-			return true;
-		if (o == null)
-			return false;
-		if (getClass() == o.getClass()) {
-			return wrappedSet.equals(((ObservableSet) o).wrappedSet);
-		}
-
-		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 d1a2f13..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetDiff.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.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();
-	
-	/**
-	 * @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/IObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IObservableValue.java
deleted file mode 100644
index 630b1c4..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
- *******************************************************************************/
-
-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.
- * 
- * @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.
- * 
- * @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 45467ba..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.getPlugin() + " - " + status.getCode() + " - " + status.getMessage());  //$NON-NLS-1$//$NON-NLS-2$
-				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 91e24b5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
+++ /dev/null
@@ -1,397 +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
- ******************************************************************************/
-
-package org.eclipse.core.databinding.validation;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-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.ObservableTracker;
-import org.eclipse.core.databinding.observable.Observables;
-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.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.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-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 IObservableValue 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) element)
-							.addChangeListener(dependencyListener);
-				}
-
-				public void handleRemove(int index, Object element) {
-					((IObservable) element)
-							.removeChangeListener(dependencyListener);
-				}
-			});
-		}
-	};
-
-	private IChangeListener dependencyListener = new IChangeListener() {
-		public void handleChange(ChangeEvent event) {
-			revalidate();
-		}
-	};
-
-	/**
-	 * 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 WritableValue(realm, ValidationStatus.ok(),
-				IStatus.class);
-
-		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() {
-		final IObservable[] dependencies = ObservableTracker.runAndMonitor(
-				new Runnable() {
-					public void run() {
-						try {
-							IStatus status = validate();
-							if (status == null)
-								status = ValidationStatus.ok();
-							validationStatus.setValue(status);
-						} catch (RuntimeException e) {
-							// Usually an NPE as dependencies are
-							// init'ed
-							validationStatus.setValue(ValidationStatus.error(e
-									.getMessage(), e));
-						}
-					}
-				}, null, null);
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				List newTargets = new ArrayList(Arrays.asList(dependencies));
-				targets.retainAll(newTargets);
-				newTargets.removeAll(targets);
-
-				// Prevent dependency loop
-				newTargets.remove(validationStatus);
-				newTargets.remove(unmodifiableValidationStatus);
-				newTargets.remove(targets);
-				newTargets.remove(unmodifiableTargets);
-				newTargets.remove(models);
-
-				targets.addAll(newTargets);
-			}
-		});
-	}
-
-	/**
-	 * 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();
-	}
-
-}
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 07efa93..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ValidationStatusMap.java
+++ /dev/null
@@ -1,159 +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;
-
-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);
-	}
-
-	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 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 3e7eafe..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToNumberParser.java
+++ /dev/null
@@ -1,311 +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();
-			/*
-			 * doubleValue == doubleValue is used to check for NaN because NaN !=
-			 * NaN. The only way to check for NaN is to compare that the value
-			 * is equal to itself.
-			 */
-			if (doubleValue == 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();
-
-			/*
-			 * doubleValue == doubleValue is used to check for NaN because NaN !=
-			 * NaN. The only way to check for NaN is to compare that the value
-			 * is equal to itself.
-			 */
-			if (doubleValue == 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 f143efb..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java
+++ /dev/null
@@ -1,110 +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
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-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 addStaleListener(IStaleListener listener) {
-		// ignore
-	}
-
-	public void dispose() {
-		// nothing to dispose
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean isStale() {
-		return false;
-	}
-
-	public void removeChangeListener(IChangeListener 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/EmptyObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
deleted file mode 100644
index 1b53b34..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
+++ /dev/null
@@ -1,224 +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
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-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.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 boolean isStale() {
-		checkRealm();
-		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 dab53c4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java
+++ /dev/null
@@ -1,176 +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.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.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 boolean isStale() {
-		checkRealm();
-		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/ProxyObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ProxyObservableList.java
deleted file mode 100644
index 6d15f2c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ProxyObservableList.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 208332)
- *     IBM Corporation - initial API and implementation
- *         (through ProxyObservableSet.java)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.*;
-
-/**
- * Wraps an observable list. This object acts like an exact copy of the original
- * list, and tracks all the changes in the original. The only difference is that
- * disposing the wrapper will not dispose the original. You can use this
- * whenever you need to return an IObservableList from a method that expects the
- * caller to dispose the list, but you have an IObservableList that you don't
- * want disposed.
- * 
- * @since 1.1
- */
-public class ProxyObservableList extends ObservableList {
-	private IListChangeListener listChangelistener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			fireListChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent event) {
-			fireStale();
-		}
-	};
-
-	private IObservableList wrappedList;
-
-	/**
-	 * Constructs a ProxyObservableList that tracks the state of the given list.
-	 * 
-	 * @param wrappedList
-	 *            the list being wrapped
-	 */
-	public ProxyObservableList(IObservableList wrappedList) {
-		super(wrappedList.getRealm(), wrappedList, wrappedList.getElementType());
-		this.wrappedList = wrappedList;
-		wrappedList.addListChangeListener(listChangelistener);
-		wrappedList.addStaleListener(staleListener);
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedList == null ? false : wrappedList.isStale();
-	}
-
-	public void dispose() {
-		if (wrappedList != null) {
-			wrappedList.removeListChangeListener(listChangelistener);
-			listChangelistener = null;
-			wrappedList.removeStaleListener(staleListener);
-			staleListener = null;
-			wrappedList = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ProxyObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ProxyObservableSet.java
deleted file mode 100644
index 55a0b24..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ProxyObservableSet.java
+++ /dev/null
@@ -1,87 +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.internal.databinding.observable;
-
-import java.util.Collections;
-import java.util.Set;
-
-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;
-
-/**
- * Wraps an observable set. This object acts like an exact copy of the original
- * set, and tracks all the changes in the original. The only difference is that
- * disposing the wrapper will not dispose the original. You can use this
- * whenever you need to return an IObservableSet from a method that expects the
- * caller to dispose the set, but you have an IObservableSet that you don't want
- * disposed.
- */
-public class ProxyObservableSet extends AbstractObservableSet {
-	private IObservableSet wrappedSet;
-	private Object elementType;
-
-	private ISetChangeListener setChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			fireSetChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	/**
-	 * Constructs a ProxyObservableSet that tracks the state of the given set.
-	 * 
-	 * @param wrappedSet
-	 *            the set being wrapped
-	 */
-	public ProxyObservableSet(IObservableSet wrappedSet) {
-		super(wrappedSet.getRealm());
-		this.wrappedSet = wrappedSet;
-		this.elementType = wrappedSet.getElementType();
-		wrappedSet.addSetChangeListener(setChangeListener);
-		wrappedSet.addStaleListener(staleListener);
-	}
-
-	protected Set getWrappedSet() {
-		return wrappedSet == null ? Collections.EMPTY_SET : wrappedSet;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedSet == null ? false : wrappedSet.isStale();
-	}
-
-	public void dispose() {
-		if (wrappedSet != null) {
-			wrappedSet.removeSetChangeListener(setChangeListener);
-			setChangeListener = null;
-			wrappedSet.removeStaleListener(staleListener);
-			staleListener = null;
-			wrappedSet = null;
-		}
-		elementType = null;
-		super.dispose();
-	}
-}
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 6f34e1e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java
+++ /dev/null
@@ -1,90 +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
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-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.ObservableList;
-
-/**
- * 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
- */
-/*
- * Implementation makes the assumption that the superclass (ObservableList) is
- * unmodifiable and that all modify methods throw an
- * UnsupportedOperationException.
- */
-public class UnmodifiableObservableList extends ObservableList {
-	/**
-	 * List that is being made unmodifiable.
-	 */
-	private IObservableList wrappedList;
-
-	private IListChangeListener listChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			// Fires a Change and then ListChange event.
-			fireListChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent event) {
-			fireStale();
-		}
-	};
-
-	/**
-	 * @param wrappedList
-	 */
-	public UnmodifiableObservableList(IObservableList wrappedList) {
-		super(wrappedList.getRealm(), wrappedList, wrappedList.getElementType());
-		this.wrappedList = wrappedList;
-
-		wrappedList.addListChangeListener(listChangeListener);
-
-		wrappedList.addStaleListener(staleListener);
-	}
-
-	/**
-	 * Because this instance is immutable staleness cannot be changed.
-	 * 
-	 * @throws UnsupportedOperationException
-	 *             because this instance is unmodifiable.
-	 */
-	public void setStale(boolean stale) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedList == null ? false : wrappedList.isStale();
-	}
-
-	public synchronized void dispose() {
-		if (wrappedList != null) {
-			wrappedList.removeListChangeListener(listChangeListener);
-			wrappedList.removeStaleListener(staleListener);
-			wrappedList = null;
-		}
-		listChangeListener = null;
-		staleListener = 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 ee38b25..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java
+++ /dev/null
@@ -1,76 +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)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.*;
-
-/**
- * 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 ObservableSet {
-	private ISetChangeListener setChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			fireSetChange(event.diff);
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent event) {
-			fireStale();
-		}
-	};
-
-	private IObservableSet wrappedSet;
-
-	/**
-	 * @param wrappedSet
-	 */
-	public UnmodifiableObservableSet(IObservableSet wrappedSet) {
-		super(wrappedSet.getRealm(), wrappedSet, wrappedSet.getElementType());
-
-		this.wrappedSet = wrappedSet;
-
-		wrappedSet.addSetChangeListener(setChangeListener);
-		wrappedSet.addStaleListener(staleListener);
-	}
-
-	/**
-	 * Because this instance is immutable staleness cannot be changed.
-	 */
-	public void setStale(boolean stale) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return wrappedSet == null ? false : wrappedSet.isStale();
-	}
-
-	public synchronized void dispose() {
-		if (wrappedSet != null) {
-			wrappedSet.removeSetChangeListener(setChangeListener);
-			wrappedSet.removeStaleListener(staleListener);
-			wrappedSet = null;
-		}
-		setChangeListener = null;
-		staleListener = 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 e35712c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java
+++ /dev/null
@@ -1,63 +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 237884
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-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.ValueChangeEvent;
-
-/**
- * An unmodifiable wrapper class for IObservableValue instances.
- * @since 1.1
- */
-public class UnmodifiableObservableValue extends AbstractObservableValue {
-	private IObservableValue wrappedValue;
-
-	/**
-	 * 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.getRealm());
-
-		this.wrappedValue = wrappedValue;
-		wrappedValue.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				fireValueChange(event.diff);
-			}
-		});
-		wrappedValue.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				fireStale();
-			}
-		});
-	}
-
-	protected Object doGetValue() {
-		return wrappedValue.getValue();
-	}
-
-	public Object getValueType() {
-		return wrappedValue.getValueType();
-	}
-
-	public boolean isStale() {
-		return wrappedValue.isStale();
-	}
-}
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 1261f69..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java
+++ /dev/null
@@ -1,228 +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.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 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/DetailObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
deleted file mode 100755
index 1baec56..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
+++ /dev/null
@@ -1,175 +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
- *******************************************************************************/
-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.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;
-		updateInnerObservableList(outerObservableValue);
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			List oldList = new ArrayList(wrappedList);
-			updateInnerObservableList(outerObservableValue);
-			fireListChange(Diffs.computeListDiff(oldList, wrappedList));
-		}
-	};
-
-	private void updateInnerObservableList(IObservableValue outerObservableValue) {
-		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);
-			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(Object o) {
-		return wrappedList.add(o);
-	}
-
-	public void add(int index, Object element) {
-		wrappedList.add(index, element);
-	}
-
-	public boolean remove(Object o) {
-		return wrappedList.remove(o);
-	}
-
-	public Object set(int index, Object element) {
-		return wrappedList.set(index, element);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		if (innerObservableList != null)
-			return innerObservableList.move(oldIndex, newIndex);
-		return super.move(oldIndex, newIndex);
-	}
-
-	public Object remove(int index) {
-		return wrappedList.remove(index);
-	}
-
-	public boolean addAll(Collection c) {
-		return wrappedList.addAll(c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		return wrappedList.addAll(index, c);
-	}
-
-	public boolean removeAll(Collection c) {
-		return wrappedList.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		return wrappedList.retainAll(c);
-	}
-
-	public void clear() {
-		wrappedList.clear();
-	}
-	
-	public void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-			outerObservableValue.dispose();
-		}
-		if (innerObservableList != null) {
-			innerObservableList.removeListChangeListener(innerChangeListener);
-			innerObservableList.dispose();
-		}
-		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 a57148c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java
+++ /dev/null
@@ -1,126 +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
- ******************************************************************************/
-
-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.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;
-
-/**
- * @since 1.1
- * 
- */
-public class DetailObservableMap extends ObservableMap {
-	private boolean updating = false;
-
-	private IObservableValue master;
-	private IObservableFactory detailFactory;
-
-	private IObservableMap detailMap;
-
-	private IValueChangeListener masterChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			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
-	 * 
-	 */
-	public DetailObservableMap(IObservableFactory detailFactory,
-			IObservableValue master) {
-		super(master.getRealm(), Collections.EMPTY_MAP);
-		this.master = master;
-		this.detailFactory = detailFactory;
-
-		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);
-			wrappedMap = detailMap;
-			detailMap.addMapChangeListener(detailChangeListener);
-		}
-	}
-
-	public Object put(Object key, Object value) {
-		return detailMap.put(key, value);
-	}
-
-	public void putAll(Map map) {
-		detailMap.putAll(map);
-	}
-
-	public Object remove(Object key) {
-		return detailMap.remove(key);
-	}
-
-	public void clear() {
-		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();
-	}
-
-}
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 dc0fc46..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java
+++ /dev/null
@@ -1,158 +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
- *******************************************************************************/
-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.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;
-		updateInnerObservableSet(outerObservableValue);
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			Set oldSet = new HashSet(wrappedSet);
-			updateInnerObservableSet(outerObservableValue);
-			fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet));
-		}
-	};
-
-	private void updateInnerObservableSet(IObservableValue outerObservableValue) {
-		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);
-			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(Object o) {
-		getterCalled();
-		return wrappedSet.add(o);
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		return wrappedSet.remove(o);
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		return wrappedSet.addAll(c);
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		return wrappedSet.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		return wrappedSet.retainAll(c);
-	}
-
-	public void clear() {
-		getterCalled();
-		wrappedSet.clear();
-	}
-
-	public void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-			outerObservableValue.dispose();
-		}
-		if (innerObservableSet != null) {
-			innerObservableSet.removeSetChangeListener(innerChangeListener);
-			innerObservableSet.dispose();
-		}
-		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 c1b1654..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.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
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *******************************************************************************/
-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.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;
-		updateInnerObservableValue(outerObservableValue);
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			Object oldValue = doGetValue();
-			updateInnerObservableValue(outerObservableValue);
-			fireValueChange(Diffs.createValueDiff(oldValue, doGetValue()));
-		}
-	};
-
-	private void updateInnerObservableValue(
-			IObservableValue outerObservableValue) {
-		currentOuterValue = outerObservableValue.getValue();
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		if (currentOuterValue == null) {
-			innerObservableValue = null;
-		} else {
-			this.innerObservableValue = (IObservableValue) factory
-					.createObservable(currentOuterValue);
-			Object innerValueType = innerObservableValue.getValueType();
-
-			if (detailType != null) {
-				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(Object value) {
-		if (innerObservableValue != null)
-			innerObservableValue.setValue(value);
-	}
-
-	public Object doGetValue() {
-		return innerObservableValue == null ? null : innerObservableValue
-				.getValue();
-	}
-
-	public Object getValueType() {
-		return detailType;
-	}
-
-	public void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-			outerObservableValue.dispose();
-		}
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		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 ff88e6c..0000000
--- a/bundles/org.eclipse.jface.databinding/.settings/.api_filters
+++ /dev/null
@@ -1,91 +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/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 bc1534a..0000000
--- a/bundles/org.eclipse.jface.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface.databinding
-Bundle-Version: 1.2.1.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: 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/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 5efa5ca..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/SWTObservables.java
+++ /dev/null
@@ -1,448 +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 - bug 180746, bug 207844
- *     Michael Krauter, bug 180223
- *******************************************************************************/
-package org.eclipse.jface.databinding.swt;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-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.internal.swt.LinkObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
-import org.eclipse.jface.internal.databinding.swt.DelayedObservableValue;
-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.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.custom.CCombo;
-import org.eclipse.swt.custom.CLabel;
-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.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.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * 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 passed since the last change event, or until a FocusOut event is
-	 * received from the underlying widget (whichever happens earlier). This
-	 * class helps to delay validation until the user stops typing. 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
-	 * @param observable
-	 * @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.2
-	 */
-	public static ISWTObservableValue observeDelayedValue(int delay, ISWTObservableValue observable) {
-	  return new DelayedObservableValue(delay, observable);
-	}
-
-	/**
-	 * @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);
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the tooltip text of the given
-	 *         control
-	 */
-	public static ISWTObservableValue observeTooltipText(Control control) {
-		return new ControlObservableValue(control, SWTProperties.TOOLTIP_TEXT);
-	}
-
-	/**
-	 * 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>
-	 * 
-	 * <li>org.eclipse.swt.widgets.Label</li>
-	 * @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>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>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeText(Control control) {
-		if (control instanceof Label) {
-			return new LabelObservableValue((Label) control);
-		} else if (control instanceof Link) {
-			return new LinkObservableValue((Link) control);
-		} else if (control instanceof CLabel) {
-			return new CLabelObservableValue((CLabel) control);
-		} else if (control instanceof Combo) {
-			return new ComboObservableValue((Combo) control, SWTProperties.TEXT);
-		} else if (control instanceof CCombo) {
-			return new CComboObservableValue((CCombo) control,
-					SWTProperties.TEXT);
-		} else if (control instanceof Shell) {
-			return new ShellObservableValue((Shell) control);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-	
-	/**
-	 * 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);
-			}
-		}
-
-		/*
-		 * (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 2a5ec40..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java
+++ /dev/null
@@ -1,133 +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
- *******************************************************************************/
-
-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;
-			final Set removals = ViewerElementSet.withComparer(comparer);
-
-			event.diff.accept(new ListDiffVisitor() {
-				public void handleAdd(int index, Object element) {
-					knownElements.add(element);
-					viewerUpdater.insert(element, index);
-				}
-
-				public void handleRemove(int index, Object element) {
-					viewerUpdater.remove(element, index);
-					removals.add(element);
-				}
-
-				public void handleReplace(int index, Object oldElement,
-						Object newElement) {
-					knownElements.add(newElement);
-					viewerUpdater.replace(oldElement, newElement, index);
-					removals.add(oldElement);
-				}
-
-				public void handleMove(int oldIndex, int newIndex,
-						Object element) {
-					viewerUpdater.move(element, oldIndex, newIndex);
-				}
-			});
-
-			// For each removed element, do not remove from known elements if
-			// the element is still present elsewhere in the list.
-			removals.removeAll(event.getObservableList());
-			knownElements.removeAll(removals);
-		}
-	}
-
-	/**
-	 * 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();
-	}
-}
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 71b2db7..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java
+++ /dev/null
@@ -1,186 +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 - bug 226765
- *******************************************************************************/
-
-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;
-
-				final Set removals = ViewerElementSet.withComparer(comparer);
-				event.diff.accept(new ListDiffVisitor() {
-					public void handleAdd(int index, Object child) {
-						// adds to known elements if new element
-						getOrCreateNode(child).addParent(parentElement);
-
-						viewerUpdater.insert(parentElement, child, index);
-					}
-
-					public void handleRemove(int index, Object child) {
-						viewerUpdater.remove(parentElement, child, index);
-
-						removals.add(child);
-					}
-
-					public void handleReplace(int index, Object oldChild,
-							Object newChild) {
-						getOrCreateNode(newChild).addParent(parentElement);
-
-						viewerUpdater.replace(parentElement, oldChild,
-								newChild, index);
-
-						removals.add(oldChild);
-					}
-
-					public void handleMove(int oldIndex, int newIndex,
-							Object child) {
-						viewerUpdater.move(parentElement, child, oldIndex,
-								newIndex);
-					}
-				});
-
-				// For each removed element, do not remove node's parent if the
-				// element is still present elsewhere in the list.
-				removals.removeAll(event.getObservableList());
-				for (Iterator iterator = removals.iterator(); iterator
-						.hasNext();) {
-					TreeNode node = getExistingNode(iterator.next());
-					if (node != null)
-						// removes from known elements if last parent
-						node.removeParent(parentElement);
-				}
-			}
-		}
-
-		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();
-	}
-}
\ 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 6526d7b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java
+++ /dev/null
@@ -1,106 +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
- *******************************************************************************/
-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();
-			viewerUpdater.remove(removals.toArray());
-			knownElements.removeAll(removals);
-
-			Set additions = event.diff.getAdditions();
-			knownElements.addAll(additions);
-			viewerUpdater.add(additions.toArray());
-		}
-	}
-
-	/**
-	 * 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();
-	}
-}
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 f3b8afa..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java
+++ /dev/null
@@ -1,162 +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 - bug 226765
- *******************************************************************************/
-
-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.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 removals = event.diff.getRemovals();
-				if (!removals.isEmpty()) {
-					viewerUpdater.remove(parentElement, removals.toArray());
-					for (Iterator iterator = removals.iterator(); iterator
-							.hasNext();) {
-						Object child = iterator.next();
-						TreeNode childNode = getExistingNode(child);
-						if (childNode != null)
-							childNode.removeParent(parentElement);
-					}
-				}
-
-				Set additions = event.diff.getAdditions();
-				if (!additions.isEmpty()) {
-					for (Iterator iterator = additions.iterator(); iterator
-							.hasNext();) {
-						Object child = iterator.next();
-						getOrCreateNode(child).addParent(parentElement);
-					}
-					viewerUpdater.add(parentElement, additions.toArray());
-				}
-			}
-		}
-
-		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();
-	}
-}
\ 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 567b52f..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ViewersObservables.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 206839
- *     Matthew Hall - bug 124684
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-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.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.ViewerInputObservableValue;
-import org.eclipse.jface.internal.databinding.viewers.ViewerMultipleSelectionObservableList;
-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.Viewer;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Factory methods for creating observables for JFace viewers
- * 
- * @since 1.1
- */
-public class ViewersObservables {
-
-	/**
-	 * 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);
-	}
-}
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 5faf8ac..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/WizardPageSupport.java
+++ /dev/null
@@ -1,300 +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
- *     Ashley Cambrell - bug 199179 
- *     Ovidio Mallo - bug 235195
- *******************************************************************************/
-package org.eclipse.jface.databinding.wizard;
-
-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.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.AssertionFailedException;
-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.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.
- * 
- * @noextend This class is not intended to be subclassed by clients.
- *
- * @since 1.1
- */
-public class WizardPageSupport {
-
-	private WizardPage wizardPage;
-	private DataBindingContext dbc;
-	private AggregateValidationStatus aggregateStatus;
-	private boolean uiChanged = false;
-
-	/**
-	 * 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);
-	}
-
-	private WizardPageSupport(WizardPage wizardPage, DataBindingContext dbc) {
-		this.wizardPage = wizardPage;
-		this.dbc = dbc;
-		init();
-	}
-
-	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;
-
-	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();
-				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);
-			}
-		}
-	}
-
-	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);
-			}
-		}
-	}
-
-	protected void handleStatusChanged() {
-		if (currentStatus != null
-				&& currentStatus.getSeverity() == IStatus.ERROR) {
-			wizardPage.setPageComplete(false);
-			wizardPage.setMessage(null);
-			wizardPage.setErrorMessage(uiChanged ? currentStatus.getMessage()
-					: null);
-			if (currentStatusHasException()) {
-				handleStatusException();
-			}
-		} else if (currentStatus != null
-				&& currentStatus.getSeverity() != IStatus.OK) {
-			int severity = currentStatus.getSeverity();
-			wizardPage.setPageComplete((severity & IStatus.CANCEL) == 0);
-			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:
-				throw new AssertionFailedException(
-						"incomplete switch statement"); //$NON-NLS-1$
-			}
-			wizardPage.setErrorMessage(null);
-			wizardPage.setMessage(currentStatus.getMessage(), type);
-		} else {
-			wizardPage.setPageComplete(true);
-			wizardPage.setMessage(null);
-			wizardPage.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.
-	 */
-	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;
-		wizardPage = null;
-	}
-}
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 5b2d789..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ButtonObservableValue.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.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);		
-	}
-
-	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 11d6d4b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ControlObservableValue.java
+++ /dev/null
@@ -1,106 +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.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-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 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);
-	}
-	
-	/**
-	 * @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();
-		}
-	}
-
-	public void doSetValue(Object value) {
-		Object oldValue = doGetValue();
-		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);
-		}
-		fireValueChange(Diffs.createValueDiff(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();
-		}
-		
-		return null;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/DelayedObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/DelayedObservableValue.java
deleted file mode 100644
index f328dc6..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/DelayedObservableValue.java
+++ /dev/null
@@ -1,237 +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 - bug 212223
- *  	Will Horn - bug 215297
- *  	Matthew Hall - bug 208332
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.swt;
-
-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.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.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * {@link IObservableValue} implementation that wraps any
- * {@link ISWTObservableValue} 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 (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 DelayedObservableValue extends AbstractSWTObservableValue {
-	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 IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			if (!updating)
-				fireStale();
-		}
-	};
-
-	private IValueChangeListener valueChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (!updating)
-				makeDirty();
-		}
-	};
-
-	private Listener focusOutListener = new Listener() {
-		public void handleEvent(Event event) {
-			// Force update on focus out
-			if (dirty)
-				internalFireValueChange(cachedValue);
-		}
-	};
-
-	private final int delay;
-	private ISWTObservableValue observable;
-	private Control control;
-
-	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,
-			ISWTObservableValue observable) {
-		super(observable.getRealm(), observable.getWidget());
-		this.delay = delayMillis;
-		this.observable = observable;
-
-		observable.addValueChangeListener(valueChangeListener);
-		observable.addStaleListener(staleListener);
-		Widget widget = observable.getWidget();
-		if (widget instanceof Control) {
-			control = (Control) widget;
-			control.addListener(SWT.FocusOut, focusOutListener);
-		}
-
-		cachedValue = doGetValue();
-	}
-
-	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 void dispose() {
-		cancelScheduledUpdate();
-		if (observable != null) {
-			observable.dispose();
-			observable.removeValueChangeListener(valueChangeListener);
-			observable.removeStaleListener(staleListener);
-			observable = null;
-		}
-		if (control != null) {
-			control.removeListener(SWT.FocusOut, focusOutListener);
-			control = 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);
-		observable.getWidget().getDisplay().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.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/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/SWTProperties.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTProperties.java
deleted file mode 100644
index 5c0e8e2..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTProperties.java
+++ /dev/null
@@ -1,77 +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$
-
-}
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 dcc516c..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 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 4b4b140..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 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 7daec15..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionContentProvider.java
+++ /dev/null
@@ -1,206 +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.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-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.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 IObservableValue viewerObservable;
-
-	/**
-	 * Element comparer used by the viewer (may be null).
-	 */
-	protected IElementComparer comparer;
-
-	/**
-	 * 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;
-	private IObservableCollection observableCollection;
-
-	/**
-	 * Constructs an ObservableCollectionContentProvider
-	 */
-	protected ObservableCollectionContentProvider() {
-		final Realm realm = SWTObservables.getRealm(Display.getDefault());
-		viewerObservable = new WritableValue(realm);
-		viewerUpdater = null;
-
-		// Known elements is a detail set of viewerObservable, so that when we
-		// get the viewer instance we can swap in a set that uses its
-		// IElementComparer, if any.
-		IObservableFactory knownElementsFactory = new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				IElementComparer comparer = null;
-				if (target instanceof StructuredViewer)
-					comparer = ((StructuredViewer) target).getComparer();
-				return ObservableViewerElementSet.withComparer(realm, null,
-						comparer);
-			}
-		};
-		knownElements = MasterDetailObservables.detailSet(viewerObservable,
-				knownElementsFactory, null);
-		unmodifiableKnownElements = Observables
-				.unmodifiableObservableSet(knownElements);
-
-		observableCollection = null;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		if (observableCollection == null)
-			return new Object[0];
-		return observableCollection.toArray();
-	}
-
-	public void dispose() {
-		if (observableCollection != null)
-			removeCollectionChangeListener(observableCollection);
-
-		if (viewerObservable != null) {
-			viewerObservable.setValue(null);
-			viewerObservable.dispose();
-			viewerObservable = null;
-		}
-		viewerUpdater = null;
-		knownElements = null;
-		unmodifiableKnownElements = 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;
-	}
-}
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 37bb1c9..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java
+++ /dev/null
@@ -1,398 +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
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-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 IObservableValue viewerObservable;
-
-	/**
-	 * Interfaces for sending updates to the viewer.
-	 */
-	protected TreeViewerUpdater viewerUpdater;
-
-	/**
-	 * Element comparer used by the viewer (may be null).
-	 */
-	protected IElementComparer comparer;
-
-	private IObservableSet knownElements;
-	private IObservableSet unmodifiableKnownElements;
-
-	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;
-		realm = SWTObservables.getRealm(Display.getDefault());
-		viewerObservable = new WritableValue(realm);
-		viewerUpdater = null;
-
-		// Known elements is a detail set of viewerObservable, so that when we
-		// get the viewer instance we can swap in a set that uses its
-		// IElementComparer, if any.
-		IObservableFactory knownElementsFactory = new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return ObservableViewerElementSet.withComparer(realm, null,
-						getElementComparer((Viewer) target));
-			}
-		};
-		knownElements = MasterDetailObservables.detailSet(viewerObservable,
-				knownElementsFactory, 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) {
-		Object[] children = getOrCreateNode(element, input).getChildren();
-		for (int i = 0; i < children.length; i++)
-			getOrCreateNode(children[i], false).addParent(element);
-		return children;
-	}
-
-	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;
-	}
-
-	/**
-	 * 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 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 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;
-		}
-
-		private boolean equal(Object left, Object right) {
-			if (comparer == null)
-				return Util.equals(left, right);
-			return comparer.equals(left, right);
-		}
-
-		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 (equal(parent, oldParent)) {
-				if (parentSet == null || parentSet.isEmpty()) {
-					parent = null;
-				} else {
-					Iterator iterator = parentSet.iterator();
-					parent = iterator.next();
-					iterator.remove();
-				}
-			}
-
-			if (parentSet != null && parentSet.isEmpty())
-				parentSet = null;
-
-			if (parent == null) {
-				dispose();
-			}
-		}
-
-		private Object getParent() {
-			return parent;
-		}
-
-		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();
-		}
-
-		Object[] getChildren() {
-			initChildren();
-			return children.toArray();
-		}
-
-		private void dispose() {
-			if (element != null) {
-				elementNodes.remove(element);
-				knownElements.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 ebc08f5..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 - bug 226765
- ******************************************************************************/
-
-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 (viewer.getComparator() == null && viewer.getFilters().length == 0)
-			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 f206fdf..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TreeViewerUpdater.java
+++ /dev/null
@@ -1,176 +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 - bug 226765
- ******************************************************************************/
-
-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 && viewer.getComparator() == null
-				&& viewer.getFilters().length == 0) {
-			treeViewer.replace(parent, position, newElement);
-		} else {
-			remove(parent, oldElement, position);
-			insert(parent, newElement, position);
-		}
-	}
-
-	/**
-	 * 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 (viewer.getComparator() == null && viewer.getFilters().length == 0) {
-
-			ITreeSelection selection = (ITreeSelection) viewer.getSelection();
-
-			remove(parent, element, oldPosition);
-			insert(parent, element, newPosition);
-
-			// Preserve selection
-			if (!selection.isEmpty()) {
-				// If the moved element is selected (or an ancestor of a
-				// selected element), restore the selection.
-				IElementComparer comparer = viewer.getComparer();
-				TreePath[] paths = selection.getPaths();
-				outer: for (int i = 0; i < paths.length; i++) {
-					TreePath path = paths[i];
-					for (int j = 0; j < path.getSegmentCount(); j++) {
-						Object pathElement = path.getSegment(j);
-						if (comparer == null ? Util
-								.equals(element, pathElement) : comparer
-								.equals(element, pathElement)) {
-							viewer.setSelection(selection);
-							break outer;
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 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/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/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 0977ae2..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerUpdater.java
+++ /dev/null
@@ -1,123 +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)
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-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 (viewer.getComparator() == null && viewer.getFilters().length == 0) {
-			IStructuredSelection selection = (IStructuredSelection) viewer
-					.getSelection();
-
-			remove(element, oldPosition);
-			insert(element, newPosition);
-
-			// Preserve selection
-			if (!selection.isEmpty()) {
-				IElementComparer comparer = viewer.getComparer();
-				Object[] selectedElements = selection.toArray();
-				for (int i = 0; i < selectedElements.length; i++) {
-					if (comparer == null ? Util.equals(element,
-							selectedElements[i]) : comparer.equals(element,
-							selectedElements[i])) {
-						viewer.setSelection(selection);
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 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.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 9c9976c..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.201.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-internal:=true,
- 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 e370ec4..0000000
--- a/bundles/org.eclipse.ui.browser/plugin.xml
+++ /dev/null
@@ -1,244 +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>
-      </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 b1729d1..0000000
--- a/bundles/org.eclipse.ui.browser/schema/browsers.exsd
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.browser">
-<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">
-      <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">
-      <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. Only browsers with the correct OS will be used. If the os parameter is empty, the browser will be assumed to work on all OS
-               </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 browser extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.help.base.browser&quot;&gt;
-  &lt;browser 
-   id=&quot;org.eclipse.myPlugin.myBrowserID&quot;
-   factoryClass=&quot;org.eclipse.myPlugin.myPackage.MyFactoryClass&quot;
-   name=&quot;My Browser&quot;&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 64b9b88..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserManager.java
+++ /dev/null
@@ -1,223 +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.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.Preferences;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-/**
- * 
- */
-public class BrowserManager extends Observable {
-	protected List browsers;
-	protected IBrowserDescriptor currentBrowser;
-	
-	private Preferences.IPropertyChangeListener 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 Preferences.IPropertyChangeListener() {
-			public void propertyChange(Preferences.PropertyChangeEvent event) {
-				String property = event.getProperty();
-				if (!ignorePreferenceChanges && property.equals("browsers")) { //$NON-NLS-1$
-					loadBrowsers();
-				}
-				if (!property.equals(WebBrowserPreference.PREF_INTERNAL_WEB_BROWSER_HISTORY)) {
-					setChanged();
-					notifyObservers();
-				}
-			}
-		};
-		
-		WebBrowserUIPlugin.getInstance().getPluginPreferences().addPropertyChangeListener(pcl);
-	}
-
-	protected static void safeDispose() {
-		if (instance == null)
-			return;
-		instance.dispose();
-	}
-
-	protected void dispose() {
-		Preferences prefs = WebBrowserUIPlugin.getInstance().getPluginPreferences();
-		if (prefs != null)
-			prefs.removePropertyChangeListener(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$
-		
-		Preferences prefs = WebBrowserUIPlugin.getInstance().getPluginPreferences();
-		String xmlString = prefs.getString("browsers"); //$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();
-			Preferences prefs = WebBrowserUIPlugin.getInstance().getPluginPreferences();
-			prefs.setValue("browsers", xmlString); //$NON-NLS-1$
-			WebBrowserUIPlugin.getInstance().savePluginPreferences();
-		} 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 a4482e9..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/DefaultBrowserSupport.java
+++ /dev/null
@@ -1,195 +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$
-
-	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
-		if ((style & AS_EXTERNAL) != 0
-				|| WebBrowserPreference.getBrowserChoice() != WebBrowserPreference.INTERNAL) {
-			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();
-			HashMap wmap = (HashMap) browserIdMap.get(baseId);
-			if (wmap != null) {
-				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 dd26c6e..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ExternalBrowserInstance.java
+++ /dev/null
@@ -1,106 +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 && !WebBrowserUtil.isWindows()) {
-			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 = parameters;
-		if (params == null)
-			params = ""; //$NON-NLS-1$
-
-		if (urlText != null) {
-			int urlIndex = params.indexOf(IBrowserDescriptor.URL_PARAMETER);
-			if (urlIndex >= 0)
-				params = params.substring(0, urlIndex)
-						+ " " + urlText + " " + params.substring(urlIndex + IBrowserDescriptor.URL_PARAMETER.length()); //$NON-NLS-1$ //$NON-NLS-2$
-			else {
-				if (!params.endsWith(" ")) //$NON-NLS-1$
-					params += " "; //$NON-NLS-1$ 
-				params += 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 f82d208..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorActionBarContributor.java
+++ /dev/null
@@ -1,279 +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 org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.ActionFactory;
-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;
-			WebBrowserEditorInput input = editor.getWebBrowserEditorInput();
-			
-			if (input == null || input.isLocationBarLocal()) {
-				IActionBars actionBars = getActionBars();
-				actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), editor.getCopyAction());
-				actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), editor.getCutAction());
-				actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), editor.getPasteAction());
-			}
-			
-			//if (input.isToolbarGlobal())
-			//	getWebBrowser().backNextListener = this.updater;
-				
-			//editor.updateActions();
-		} 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 aa7ff6a..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreference.java
+++ /dev/null
@@ -1,163 +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.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * 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$
-			}
-		}
-		getPreferenceStore().setValue(PREF_INTERNAL_WEB_BROWSER_HISTORY,
-				sb.toString());
-		WebBrowserUIPlugin.getInstance().savePluginPreferences();
-	}
-
-	/**
-	 * 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) {
-		getPreferenceStore().setValue(PREF_BROWSER_CHOICE, choice);
-		WebBrowserUIPlugin.getInstance().savePluginPreferences();
-		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 3249300..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUtil.java
+++ /dev/null
@@ -1,296 +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;
-	}
-}
\ 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 1de40be..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaBrowser.java
+++ /dev/null
@@ -1,188 +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.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;
-
-	/**
-	 * Constructor
-	 * 
-	 * @executable executable filename to launch
-	 * @executableName name of the program to display when error occurs
-	 */
-	public MozillaBrowser(String id, String executable) {
-		super(id);
-		this.executable = 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 + " " + url) == 0) //$NON-NLS-1$
-					return;
-				browserFullyOpenedAt = System.currentTimeMillis() + DELAY;
-				return;
-			}
-			if (openBrowser(executable + " -remote openURL(" + url + ")") //$NON-NLS-1$ //$NON-NLS-2$
-					== 0)
-				return;
-			
-			if (exitRequested)
-				return;
-			browserFullyOpenedAt = System.currentTimeMillis() + DELAY;
-			openBrowser(executable + " " + 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 a5dc6eb..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaFactory.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.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 = new MozillaBrowser(id, location);
-		}
-		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 c38f1a7..0000000
--- a/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/CarbonUIEnhancer.java
+++ /dev/null
@@ -1,443 +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;
-
-    /**
-     * 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) {
-            int menu = 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(menu, 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(menu, 0, (short) 1, OS.kMenuItemAttrSeparator, 0);
-
-            // enable pref menu
-            OS.EnableMenuCommand(menu, kHICommandPreferences);
-
-            // disable services menu
-            OS.DisableMenuCommand(menu, 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()) {
-        		action.run();
-        		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.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 bb963b4..0000000
--- a/bundles/org.eclipse.ui.ide.application/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.ide.application;singleton:=true
-Bundle-Version: 1.0.0.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)",
- org.eclipse.update.core;bundle-version="[3.1.100,4.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 0fef2df..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
+++ /dev/null
@@ -1,792 +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.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.update.core.SiteManager;
-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();
-			checkUpdates();
-			((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);
-		}
-	}
-
-	/**
-	 * Checks if the -newUpdates command line argument is present and if so,
-	 * opens the update manager.
-	 */
-	private void checkUpdates() {
-		boolean newUpdates = false;
-		String[] commandLineArgs = Platform.getCommandLineArgs();
-		for (int i = 0; i < commandLineArgs.length; i++) {
-			if (commandLineArgs[i].equalsIgnoreCase("-newUpdates")) { //$NON-NLS-1$
-				newUpdates = true;
-				break;
-			}
-		}
-
-		if (newUpdates) {
-			try {
-				SiteManager.handleNewChanges();
-			} catch (CoreException e) {
-				StatusManager.getManager().handle(e, IDEApplication.PLUGIN_ID);
-			}
-		}
-	}
-
-	/*
-	 * (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 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 91a55d9..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,673 +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();
-			}
-
-			public void pageClosed(IWorkbenchPage page) {
-				updateTitle();
-			}
-
-			public void pageOpened(IWorkbenchPage page) {
-				// do nothing
-			}
-		});
-		configurer.getWindow().addPerspectiveListener(new PerspectiveAdapter() {
-			public void perspectiveActivated(IWorkbenchPage page,
-					IPerspectiveDescriptor perspective) {
-				updateTitle();
-			}
-
-			public void perspectiveSavedAs(IWorkbenchPage page,
-					IPerspectiveDescriptor oldPerspective,
-					IPerspectiveDescriptor newPerspective) {
-				updateTitle();
-			}
-
-			public void perspectiveDeactivated(IWorkbenchPage page,
-					IPerspectiveDescriptor perspective) {
-				updateTitle();
-			}
-		});
-		configurer.getWindow().getPartService().addPartListener(
-				new IPartListener2() {
-					public void partActivated(IWorkbenchPartReference ref) {
-						if (ref instanceof IEditorReference) {
-							updateTitle();
-						}
-					}
-
-					public void partBroughtToTop(IWorkbenchPartReference ref) {
-						if (ref instanceof IEditorReference) {
-							updateTitle();
-						}
-					}
-
-					public void partClosed(IWorkbenchPartReference ref) {
-						updateTitle();
-					}
-
-					public void partDeactivated(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-
-					public void partOpened(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-
-					public void partHidden(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-
-					public void partVisible(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-
-					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 = currentPage.getActiveEditor();
-		}
-
-		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
-	 */
-	private void updateTitle() {
-		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();
-		}
-
-		// 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 44c3901..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/ResourcePerspective.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
- *     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.internal.ide.application;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-
-/**
- */
-public class ResourcePerspective implements IPerspectiveFactory {
-	
-	private static String ID_PROJECT_EXPLORER = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
-    /**
-     * 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(IPageLayout.ID_RES_NAV);
-        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(ID_PROJECT_EXPLORER);
-        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 4377ad6..0000000
--- a/bundles/org.eclipse.ui.ide/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,60 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.ide; singleton:=true
-Bundle-Version: 3.4.1.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.ide.update;x-internal:=true,
- 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.4.0,4.0.0)",
- org.eclipse.ui.views;bundle-version="[3.2.0,4.0.0)";resolution:=optional,
- org.eclipse.update.configurator;bundle-version="[3.1.100,4.0.0)";resolution:=optional,
- org.eclipse.update.core;bundle-version="[3.1.100,4.0.0)";resolution:=optional,
- org.eclipse.update.ui;bundle-version="[3.1.100,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
-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 fe11af1..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/GlobalBuildAction.java
+++ /dev/null
@@ -1,308 +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.IncrementalProjectBuilder;
-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.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-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.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 = Platform.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 087bab8..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenWithMenu.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
- *     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 org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.window.Window;
-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.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;
-
-import com.ibm.icu.text.Collator;
-
-/**
- * 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 editor 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).
-     */
-    private void openEditor(IEditorDescriptor editor, boolean openUsingDescriptor) {
-        IFile file = getFileResource();
-        if (file == null) {
-            return;
-        }
-        try {
-        	if (openUsingDescriptor) {
-        		((WorkbenchPage) page).openEditorFromDescriptor(new FileEditorInput(file), editor, true, null);
-        	} else {
-	            String editorId = editor == null ? IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID
-	                    : editor.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 {
-                        	IEditorDescriptor desc = IDE.getEditorDescriptor(file);
-                            page.openEditor(new FileEditorInput(file), desc.getId(), true, MATCH_BOTH);
-                        } 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 c08408c..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyOperation.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
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-
-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.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-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 = Platform.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 b24e1b4..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFileCreationPage.java
+++ /dev/null
@@ -1,763 +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 {
-					PlatformUI.getWorkbench().getOperationSupport()
-							.getOperationHistory().execute(
-									op,
-									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 248a0ee..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 {
-					PlatformUI.getWorkbench().getOperationSupport()
-							.getOperationHistory().execute(
-									op,
-									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 522f971..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java
+++ /dev/null
@@ -1,308 +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.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.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) {
-			ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-		}
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContentProvider.
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
-		super.inputChanged(viewer, oldInput, newInput);
-		// First time through, setup the listener on the workspace
-		if (this.viewer == null) {
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
-					IResourceChangeEvent.POST_CHANGE);
-		}
-		this.viewer = viewer;
-	}
-	
-
-	/*
-	 * (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 b869433..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInput.java
+++ /dev/null
@@ -1,232 +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;
-
-/**
- * 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$
-	}
-}
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 0c8d82f..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInputFactory.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.part;
-
-import org.eclipse.core.resources.IFile;
-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;
-
-/**
- * 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);
-		} else {
-			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 7cc2152..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileInPlaceEditorInput.java
+++ /dev/null
@@ -1,130 +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.resources.IFile;
-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.core.runtime.IPath;
-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) {
-                    try {
-                        processDelta(affectedElement);
-                    } catch (CoreException exception) {
-                        // Failed so close the receiver
-                        if (embeddedEditor != null) {
-                            embeddedEditor.getSite().getPage().closeEditor(
-                                    embeddedEditor, true);
-                        }
-                    }
-                }
-            }
-        }
-
-        private boolean processDelta(final IResourceDelta delta)
-                throws CoreException {
-            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 b6df899..0000000
--- a/bundles/org.eclipse.ui.ide/plugin.xml
+++ /dev/null
@@ -1,2211 +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>
-   </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 d7eec3f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchMessages.java
+++ /dev/null
@@ -1,807 +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_configurationSites;
-	public static String ConfigurationLogUpdateSection_configurationFeatures;
-	public static String ConfigurationLogUpdateSection_featureIdAndVersion;
-	public static String ConfigurationLogUpdateSection_plugins;
-
-	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 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_taskName;
-	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 162c6cc..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.swt.SWT;
-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(!"carbon".equals(SWT.getPlatform())); //$NON-NLS-1$
-		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(!"carbon".equals(SWT.getPlatform())); //$NON-NLS-1$
-		menu.add(sep);
-        
-        // See the comment for quit in createFileMenu
-        ActionContributionItem openPreferencesItem = new ActionContributionItem(openPreferencesAction);
-        openPreferencesItem.setVisible(!"carbon".equals(SWT.getPlatform())); //$NON-NLS-1$
-        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(!"carbon".equals(SWT.getPlatform())); //$NON-NLS-1$
-        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 66d3a20..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CleanDialog.java
+++ /dev/null
@@ -1,444 +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.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.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-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.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.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(Shell shell, int type, IProject[] projects) {
-            super(shell, 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(IDEWorkbenchMessages.CleanDialog_taskName) {
-            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.getShell(),
-                                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_taskName, 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 f7f21ce..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ConfigurationLogUpdateSection.java
+++ /dev/null
@@ -1,60 +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.ide.dialogs;
-
-import java.io.PrintWriter;
-import java.net.URL;
-import com.ibm.icu.text.DateFormat;
-import java.util.Date;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.about.ISystemSummarySection;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.update.configurator.ConfiguratorUtils;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-import org.eclipse.update.configurator.IPlatformConfiguration.IFeatureEntry;
-import org.eclipse.update.configurator.IPlatformConfiguration.ISiteEntry;
-
-/**
- * Writes information about the update configurer into the system summary.
- * 
- * @since 3.0
- */
-public class ConfigurationLogUpdateSection implements ISystemSummarySection {
-    public void write(PrintWriter writer) {
-    	
-    	IPlatformConfiguration platformConf = ConfiguratorUtils.getCurrentPlatformConfiguration();
-    	writer.println(IDEWorkbenchMessages.ConfigurationLogUpdateSection_installConfiguration); 
-    	writer.println(" " + NLS.bind( IDEWorkbenchMessages.ConfigurationLogUpdateSection_lastChangedOn, DateFormat.getDateInstance().format(new Date(platformConf.getChangeStamp())))); //$NON-NLS-1$
-       	writer.println(" " + NLS.bind( IDEWorkbenchMessages.ConfigurationLogUpdateSection_location, platformConf.getConfigurationLocation()));  //$NON-NLS-1$
-       	
-       	ISiteEntry[] sites = platformConf.getConfiguredSites();
-       	writer.println();
-       	writer.println(" " + IDEWorkbenchMessages.ConfigurationLogUpdateSection_configurationSites);   //$NON-NLS-1$
-       	for(int i = 0; i < sites.length; i++){
-       		writer.println("  " + sites[i].getURL().toExternalForm()); //$NON-NLS-1$
-       	}
-       	
-       	writer.println();
-       	writer.println(" " + IDEWorkbenchMessages.ConfigurationLogUpdateSection_configurationFeatures);  //$NON-NLS-1$
-       	IFeatureEntry[] features = platformConf.getConfiguredFeatureEntries();     
-       	for(int i = 0; i < features.length; i++){
-       		writer.println("  " + NLS.bind( IDEWorkbenchMessages.ConfigurationLogUpdateSection_featureIdAndVersion, features[i].getFeaturePluginIdentifier(), features[i].getFeaturePluginVersion())); //$NON-NLS-1$ 
-       	}
-       	
-       	writer.println();
-  		URL[] urls = platformConf.getPluginPath();
-  		writer.println(" " + IDEWorkbenchMessages.ConfigurationLogUpdateSection_plugins); //$NON-NLS-1$
-   		for(int j = 0; j < urls.length; j++){
-   			writer.println("  " + urls[j].toExternalForm()); //$NON-NLS-1$
-   		}
-    }
-}
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 c35955a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/OpenResourceDialog.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.internal.ide.dialogs;
-
-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.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 {
-
-	/**
-	 * 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);
-	}
-}
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 fc9b59c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariableDialog.java
+++ /dev/null
@@ -1,605 +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> - 19346, 42056
- *******************************************************************************/
-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.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.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);
-
-        FormLayout layout = new FormLayout();
-
-        contents.setLayout(layout);
-        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) {
-        FormData data;
-
-        String nameLabelText = IDEWorkbenchMessages.PathVariableDialog_variableName;
-        String valueLabelText = IDEWorkbenchMessages.PathVariableDialog_variableValue;
-
-        // variable name label
-        variableNameLabel = new Label(contents, SWT.LEFT);
-        variableNameLabel.setText(nameLabelText);
-
-        data = new FormData();
-        data.top = new FormAttachment(0,
-        		convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN));
-        data.left = new FormAttachment(0,
-        		convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN));
-        variableNameLabel.setLayoutData(data);
-     
-        // variable name field.  Attachments done after all widgets created.
-        variableNameField = new Text(contents, SWT.SINGLE | SWT.BORDER);
-        variableNameField.setText(variableName);
-        variableNameField.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent event) {
-                variableNameModified();
-            }
-        });
-        
-        // variable value label
-        variableValueLabel = new Label(contents, SWT.LEFT);
-        variableValueLabel.setText(valueLabelText);
-
-        data = new FormData();
-        data.left = new FormAttachment(0,
-        		convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN));
-        data.top = new FormAttachment(variableNameLabel,
-                convertVerticalDLUsToPixels(5));
-        variableValueLabel.setLayoutData(data);
-
-        // variable value field.  Attachments done after all widgets created.
-        variableValueField = new Text(contents, SWT.SINGLE | SWT.BORDER);
-        variableValueField.setText(variableValue);
-        variableValueField.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent event) {
-                variableValueModified();
-            }
-        });
-
-        // select file path button
-        fileButton = new Button(contents, SWT.PUSH);
-        fileButton.setText(IDEWorkbenchMessages.PathVariableDialog_file);
-        if ((variableType & IResource.FILE) == 0) {
-			fileButton.setEnabled(false);
-		}
-
-        data = setButtonFormLayoutData(fileButton);
-        data.top = new FormAttachment(variableValueLabel, 0, SWT.CENTER);
-        data.right = new FormAttachment(100,
-        		-convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN));        
-        fileButton.setLayoutData(data);
-
-        fileButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectFile();
-            }
-        });
-
-        // select folder path button
-        folderButton = new Button(contents, SWT.PUSH);
-        folderButton.setText(IDEWorkbenchMessages.PathVariableDialog_folder);
-        if ((variableType & IResource.FOLDER) == 0) {
-			folderButton.setEnabled(false);
-		}
-
-        data = setButtonFormLayoutData(folderButton);
-        data.top = new FormAttachment(fileButton, convertVerticalDLUsToPixels(2));
-        data.right = new FormAttachment(100,
-        		-convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN));
-        folderButton.setLayoutData(data);
-
-        folderButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectFolder();
-            }
-        });
-        
-        // Attaching variable name and value fields to file and folder buttons,
-        // so do this now that those buttons have been created.
-        
-        // the larger label will be used in the left attachments for the fields  
-        Label largerLabel = nameLabelText.length() > valueLabelText.length() ? variableNameLabel
-                : variableValueLabel;
- 
-        data = new FormData();
-        data.left = new FormAttachment(largerLabel,
-                convertHorizontalDLUsToPixels(5));
-        data.right = new FormAttachment(fileButton, -convertHorizontalDLUsToPixels(5));
-        data.top = new FormAttachment(variableNameLabel,
-                convertVerticalDLUsToPixels(5), SWT.CENTER);
-        variableNameField.setLayoutData(data);
-        
-
-        data = new FormData();
-        data.left = new FormAttachment(largerLabel,
-                convertHorizontalDLUsToPixels(5));
-        data.right = new FormAttachment(fileButton, -convertHorizontalDLUsToPixels(5));
-        data.top = new FormAttachment(variableValueLabel, 0, SWT.CENTER);
-        variableValueField.setLayoutData(data);
-
-  
- 
-    }
-
-    /**
-     * Sets the <code>FormData</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>FormData</code>
-     * @return the <code>FormData</code> set on the specified button
-     */
-    private FormData setButtonFormLayoutData(Button button) {
-        FormData data = new FormData();
-        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-        data.width = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
-                SWT.DEFAULT, true).x);
-        button.setLayoutData(data);
-        return data;
-    }
-
-    /**
-     * 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 485b7f7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectContentsLocationArea.java
+++ /dev/null
@@ -1,472 +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
- *******************************************************************************/
-
-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.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.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 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;
-	}
-
-	/**
-	 * 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;
-		}
-
-		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);
-	}
-
-	/**
-	 * 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 406fd8f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectReferencePage.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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.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.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.dialogs.PropertyPage;
-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.IIDEHelpContextIds;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * 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;
-
-    private static final int PROJECT_LIST_MULTIPLIER = 30;
-
-    /**
-     * Creates a new ProjectReferencePage.
-     */
-    public ProjectReferencePage() {
-        //Do nothing on creation
-    }
-
-    /**
-     * @see PreferencePage#createContents
-     */
-    protected Control createContents(Composite parent) {
-
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IIDEHelpContextIds.PROJECT_REFERENCE_PROPERTY_PAGE);
-        Font font = parent.getFont();
-
-        Composite composite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        composite.setFont(font);
-
-        initialize();
-
-        Label description = createDescriptionLabel(composite);
-        description.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-
-        listViewer = CheckboxTableViewer.newCheckList(composite, SWT.TOP
-                | SWT.BORDER);
-        listViewer.getTable().setFont(font);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.grabExcessHorizontalSpace = true;
-        
-        if(!project.isOpen())
-        	listViewer.getControl().setEnabled(false);
-
-        //Only set a height hint if it will not result in a cut off dialog
-        if (DialogUtil.inRegularFontMode(parent)) {
-			data.heightHint = getDefaultFontHeight(listViewer.getTable(),
-                    PROJECT_LIST_MULTIPLIER);
-		}
-        listViewer.getTable().setLayoutData(data);
-        listViewer.getTable().setFont(font);
-
-        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;
-            }
-        });
-
-        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();
-            }
-        };
-    }
-
-    /**
-     * 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;
-
-    }
-
-    /**
-     * 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);
-                }
-            }
-        };
-        try {
-            new ProgressMonitorJobsDialog(getControl().getShell()).run(true,
-                    true, 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 26ff680..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceInfoPage.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 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.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) {
-
-		Font font = parent.getFont();
-
-		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);
-		basicInfoComposite.setFont(font);
-
-		// 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);
-		pathLabel.setFont(font);
-
-		// 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.setFont(font);
-		pathValueText.setBackground(pathValueText.getDisplay().getSystemColor(
-				SWT.COLOR_WIDGET_BACKGROUND));
-
-		// The group for types
-		Label typeTitle = new Label(basicInfoComposite, SWT.LEFT);
-		typeTitle.setText(TYPE_TITLE);
-		typeTitle.setFont(font);
-
-		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));
-		typeValue.setFont(font);
-
-		// 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);
-		locationTitle.setFont(font);
-
-		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.setFont(font);
-		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);
-			resolvedLocationTitle.setFont(font);
-
-			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.setFont(font);
-			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);
-			sizeTitle.setFont(font);
-
-			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.setFont(font);
-			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);
-		composite.setFont(parent.getFont());
-
-		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);
-		}
-
-		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);
-		this.editableBox.setFont(composite.getFont());
-		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);
-		this.executableBox.setFont(composite.getFont());
-		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);
-		this.archiveBox.setFont(composite.getFont());
-		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);
-		this.derivedBox.setFont(composite.getFont());
-		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);
-		composite.setFont(font);
-
-		Label timeStampLabel = new Label(composite, SWT.NONE);
-		timeStampLabel.setText(TIMESTAMP_TITLE);
-		timeStampLabel.setFont(font);
-
-		// timeStamp value label
-		Text timeStampValue = new Text(composite, SWT.READ_ONLY);
-		timeStampValue.setText(IDEResourceInfoUtils
-				.getDateStringValue(resource));
-		timeStampValue.setFont(font);
-		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 5976aea..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.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.handlers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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.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.ListenerList;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Shell;
-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 != IDialogConstants.OK_ID) {
-			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 675fb6a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/messages.properties
+++ /dev/null
@@ -1,814 +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_configurationSites=Configured sites:
-ConfigurationLogUpdateSection_configurationFeatures=Configured features:
-ConfigurationLogUpdateSection_featureIdAndVersion=ID: {0}, Version: {1}
-ConfigurationLogUpdateSection_plugins=Configured plug-ins:
-
-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 = Op&en
-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
-
-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_taskName=Cleaning selected 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 7436363..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchMarker.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IMarkerActionFilter;
-import org.eclipse.ui.actions.SimpleWildcardTester;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-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) {
-        IMarker marker = (IMarker) target;
-        if (name.equals(TYPE)) {
-            try {
-                return value.equals(marker.getType());
-            } catch (CoreException e) {
-                return false;
-            }
-        } else if (name.equals(SUPER_TYPE)) {
-            try {
-                return marker.isSubtypeOf(value);
-            } catch (CoreException e) {
-                return false;
-            }
-        } else if (name.equals(PRIORITY)) {
-            return testIntegerAttribute(marker, IMarker.PRIORITY, value);
-        } else if (name.equals(SEVERITY)) {
-            return testIntegerAttribute(marker, IMarker.SEVERITY, value);
-        } else if (name.equals(MESSAGE)) {
-            try {
-                String msg = (String) marker.getAttribute(IMarker.MESSAGE);
-                if (msg == null) {
-					return false;
-				}
-                return SimpleWildcardTester.testWildcardIgnoreCase(value, msg);
-            } catch (CoreException e) {
-                return false;
-            }
-        } else if (name.equals(DONE)) {
-            try {
-                value = value.toLowerCase();
-                Boolean done = (Boolean) marker.getAttribute(IMarker.DONE);
-                if (done == null) {
-					return false;
-				}
-                return (done.booleanValue() == value.equals("true"));//$NON-NLS-1$
-            } catch (CoreException e) {
-                return false;
-            }
-        } else if (name.equals(RESOURCE_TYPE)) {
-            int desiredType = 0;
-
-            try {
-                desiredType = Integer.parseInt(value);
-            } 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;
-    }
-
-    /**
-     * Returns whether the specific integer attribute matches a value.
-     */
-    private 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);
-    }
-}
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 39e91cd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java
+++ /dev/null
@@ -1,144 +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++) {
-				markerDescriptions[i].resource = resource;
-				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 4b4ed0d..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.BACKGROUND_REFRESH,
-					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/ide/update/ConfigurationManagerAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/update/ConfigurationManagerAction.java
deleted file mode 100644
index 3243cfa..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/update/ConfigurationManagerAction.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.internal.ide.update;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.update.ui.UpdateManagerUI;
-
-/**
- * Action to invoke the Update configuration manager.
- * 
- * @since 3.0
- */
-public class ConfigurationManagerAction implements
-        IWorkbenchWindowActionDelegate {
-
-    private IWorkbenchWindow window;
-
-    /**
-     * The constructor.
-     */
-    public ConfigurationManagerAction() {
-        // do nothing
-    }
-
-    /**
-     * Runs the action when selected
-     */
-    public void run(IAction action) {
-        BusyIndicator.showWhile(window.getShell().getDisplay(), new Runnable() {
-            public void run() {
-                UpdateManagerUI.openConfigurationManager(window.getShell());
-            }
-        });
-    }
-
-    /**
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        // do nothing
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#dispose
-     */
-    public void dispose() {
-        // do nothing
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#init
-     */
-    public void init(IWorkbenchWindow window) {
-        this.window = window;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/update/InstallWizardAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/update/InstallWizardAction.java
deleted file mode 100644
index ca5ec9b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/update/InstallWizardAction.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.ui.internal.ide.update;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.update.ui.UpdateManagerUI;
-
-/**
- * Action to invoke the Update install wizard.
- * 
- * @since 3.0
- */
-public class InstallWizardAction extends Action implements
-        IWorkbenchWindowActionDelegate {
-
-    private IWorkbenchWindow window;
-
-    public InstallWizardAction() {
-        // do nothing
-    }
-
-    public void run() {
-        openInstaller(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
-    }
-
-    public void run(IAction action) {
-        openInstaller(window);
-    }
-
-    private void openInstaller(final IWorkbenchWindow window) {
-        BusyIndicator.showWhile(window.getShell().getDisplay(), new Runnable() {
-            public void run() {
-                UpdateManagerUI.openInstaller(window.getShell());
-            }
-        });
-    }
-
-    public void selectionChanged(IAction action, ISelection selection) {
-        // do nothing
-    }
-
-    public void dispose() {
-        // do nothing
-    }
-
-    public void init(IWorkbenchWindow window) {
-        this.window = window;
-    }
-}
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 d1b6bba..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteHandler.java
+++ /dev/null
@@ -1,70 +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.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-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() == Window.CANCEL) {
-			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 b01e09e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java
+++ /dev/null
@@ -1,1846 +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 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.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.help.IContext;
-import org.eclipse.help.IContextProvider;
-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.IOpenListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.OpenEvent;
-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.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.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.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;
-import org.osgi.framework.Bundle;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * 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)) {
-					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());
-
-		viewer.addOpenListener(new IOpenListener() {
-			public void open(OpenEvent event) {
-				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 325a5b7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerContentGenerator.java
+++ /dev/null
@@ -1,685 +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();
-
-		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 74bbd7e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerFieldFilterGroup.java
+++ /dev/null
@@ -1,697 +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;
-
-	/**
-	 * 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;
-
-	}
-
-	/**
-	 * 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 (!getWorkingSetPaths().contains(
-					marker.getResource().getFullPath().toString()))
-				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;
-
-	}
-}
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/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 e465884..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
- */
-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 5e98650..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFile.java
+++ /dev/null
@@ -1,160 +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.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 {
-		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 81051a3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/OpenActionGroup.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.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$
-
-    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 36d935a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigator.java
+++ /dev/null
@@ -1,1503 +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.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.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-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.IOpenListener;
-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.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.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.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.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;
-
-    /**
-     * 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(TreeViewer viewer) {
-        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                handleSelectionChanged(event);
-            }
-        });
-        viewer.addDoubleClickListener(new IDoubleClickListener() {
-            public void doubleClick(DoubleClickEvent event) {
-                handleDoubleClick(event);
-            }
-        });
-        viewer.addOpenListener(new IOpenListener() {
-            public void open(OpenEvent event) {
-                handleOpen(event);
-            }
-        });
-        viewer.getControl().addKeyListener(new KeyListener() {
-            public void keyPressed(KeyEvent event) {
-                handleKeyPressed(event);
-            }
-
-            public void keyReleased(KeyEvent event) {
-                handleKeyReleased(event);
-            }
-        });
-    }
-
-    /* (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
-     */
-    protected void handleOpen(OpenEvent event) {
-        IStructuredSelection selection = (IStructuredSelection) event
-                .getSelection();
-        getActionGroup().runDefaultAction(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;
-        if (isLinkingEnabled() && !linkScheduled) {
-            // Ensure that if another selection change arrives while we're waiting for the *syncExec,
-            // we only do this work once.
-            linkScheduled = true;
-            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) {
-                        ISelection sel = viewer.getSelection();
-                        if (sel instanceof IStructuredSelection) {
-                            IStructuredSelection selection = (IStructuredSelection)sel;
-                        
-                            // only synchronize with editor when the selection is not the result 
-                            // of a drag. Fixes bug 22274.
-                            linkToEditor(selection);
-                        }
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * 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
-     */
-    protected void linkToEditor(IStructuredSelection selection) {
-
-    	if (this != this.getSite().getPage().getActivePart())
-    		return;
-    	
-        Object obj = selection.getFirstElement();
-        if (obj instanceof IFile && selection.size() == 1) {
-            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);
-            }
-        }
-    }
-
-    /**
-     * 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;
-            }
-        };
-    }
-}
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 99453da..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskList.java
+++ /dev/null
@@ -1,1737 +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.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 = "carbon".equals(SWT.getPlatform()); //$NON-NLS-1$
-        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 f70e88d..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 {
-					PlatformUI.getWorkbench().getOperationSupport()
-							.getOperationHistory().execute(
-									op,
-									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 ce73933..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="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.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 20671eb..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Tue Sep 11 09:39:50 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.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 df4c98b..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.101.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 9307c58..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/plugin.properties
+++ /dev/null
@@ -1,25 +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
-###############################################################################
-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
-
-Advanced=Advanced
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 66aa3ab..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/plugin.xml
+++ /dev/null
@@ -1,349 +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="advanced"/>
-       </propertyContributor>
-    </extension>
-    <extension
-          point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-       <propertyTabs contributorId="org.eclipse.ui.navigator.ProjectExplorer">
-          <propertyTab
-                label="%Advanced"
-                category="advanced"
-                id="CommonNavigator.tab.Advanced"/>
-       </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.Advanced"
-                tab="CommonNavigator.tab.Advanced">
-             <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 229afc6..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionGroup.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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
-	 * @param aTree
-	 */
-	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);
- 
-		deleteAction = new DeleteResourceAction(shell);
-		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 dfc98d6..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/QuickMenuAction.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.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.commands.ICommand;
-import org.eclipse.ui.commands.ICommandManager;
-import org.eclipse.ui.commands.IKeySequenceBinding;
-
-/**
- * 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, widget);
-		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() {
-		final ICommandManager commandManager = PlatformUI.getWorkbench().getCommandSupport().getCommandManager();
-		final ICommand command = commandManager.getCommand(getActionDefinitionId());
-		if (command.isDefined()) {
-			List l = command.getKeySequenceBindings();
-			if (!l.isEmpty()) {
-				IKeySequenceBinding binding = (IKeySequenceBinding) l.get(0);
-				return binding.getKeySequence().format();
-			}
-		}
-		return null;  
-	}
-
-	private Point computeMenuLocation(Control focus, Menu menu) {
-		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 73943ff..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.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() {
-
-		moveAction = new MoveResourceAction(shell);
-		moveAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.MOVE);
-		
-		renameAction = new RenameResourceAction(shell, 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 05a823b..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceMgmtActionProvider.java
+++ /dev/null
@@ -1,274 +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.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.ide.StatusUtil;
-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() {
-        //Shell shell = navigator.getSite().getShell();
-        openProjectAction = new OpenResourceAction(shell);
-        
-        closeProjectAction = new CloseResourceAction(shell);
-        
-        closeUnrelatedProjectsAction = new CloseUnrelatedProjectsAction(shell);
-        
-        refreshAction = new RefreshAction(shell) {
-        	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(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$       
-        refreshAction.setActionDefinitionId("org.eclipse.ui.file.refresh"); //$NON-NLS-1$
-        
-        buildAction = new BuildAction(shell,
-                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 775835c..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkManagementActionProvider.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.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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) {
-		Shell shell = aSite.getViewSite().getShell();
-		addBookmarkAction = new AddBookmarkAction(shell);
-		addTaskAction = new AddTaskAction(shell);
-	}
-
-	/*
-	 * (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 1b3cfab..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetRootModeActionGroup.java
+++ /dev/null
@@ -1,244 +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 implements IAction {
-
-		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 structuredViewer
-	 * @param stateModel
-	 */
-	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;
-
-	}
-
-	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 5881571..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/NavigatorUIPluginImages.java
+++ /dev/null
@@ -1,125 +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 String
-	 *            prefix - Icon dir structure.
-	 * @param String
-	 *            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 String
-	 *            prefix - Icon dir structure.
-	 * @param String
-	 *            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 a6f89ab..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorMessages.java
+++ /dev/null
@@ -1,85 +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;
-
-	public static String WorkingSetRootModeActionGroup_Top_Level_Element_;
-
-	public static String WorkingSetRootModeActionGroup_Project_;
-
-	public static String WorkingSetRootModeActionGroup_Working_Set_;
-
-	public static String CopyAction_Cop_;
-
-	public static String CopyAction_Copy_selected_resource_s_;
-
-	public static String PasteAction_Past_;
-
-	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/ResourceComparator.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceComparator.java
deleted file mode 100644
index 4099c1c..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceComparator.java
+++ /dev/null
@@ -1,54 +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.workbench;
-
-import java.util.Comparator;
-
-import org.eclipse.ui.views.navigator.ResourceSorter;
-
-/**
- * 
- * <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 
- *
- */
-class ResourceComparator implements Comparator {
-
-	private ResourceSorter sorter = new ResourceSorter(ResourceSorter.NAME);
-
-	/**
-	 * The following compare will sort items based on their type (in the order of: ROOT, PROJECT,
-	 * FOLDER, FILE) and then based on their String representation
-	 * 
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		return this.sorter.compare(null, o1, o2);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-
-		return obj instanceof ResourceComparator;
-	}
-}
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 70a9c44..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionSorter.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-/**
- * @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 c411680..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsContentProvider.java
+++ /dev/null
@@ -1,193 +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;
-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 52165ec..0000000
--- a/bundles/org.eclipse.ui.navigator/.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.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/.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 9ba836e..0000000
--- a/bundles/org.eclipse.ui.navigator/.settings/.api_filters
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.ui.navigator" version="2">
-    <resource path="META-INF/MANIFEST.MF">
-        <filter id="924844039">
-            <message_arguments>
-                <message_argument value="3.3.101.qualifier"/>
-                <message_argument value="3.3.100.I20080606-1300"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/ui/navigator/NavigatorActionService.java" type="org.eclipse.ui.navigator.NavigatorActionService">
-        <filter id="643846161">
-            <message_arguments>
-                <message_argument value="CommonActionProviderDescriptor"/>
-                <message_argument value="NavigatorActionService"/>
-                <message_argument value="getActionProviderInstance(CommonActionProviderDescriptor)"/>
-            </message_arguments>
-        </filter>
-        <filter id="338944126">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.navigator.NavigatorActionService"/>
-                <message_argument value="getActionProviderInstance(CommonActionProviderDescriptor)"/>
-            </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 2d750da..0000000
--- a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,72 +0,0 @@
-#Mon Feb 06 11:18:56 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.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 71b76c8..0000000
--- a/bundles/org.eclipse.ui.navigator/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; singleton:=true
-Bundle-Version: 3.3.101.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.jface;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.workbench;bundle-version="[3.2.1,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.2.1,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/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 302ccd6..0000000
--- a/bundles/org.eclipse.ui.navigator/schema/navigatorContent.exsd
+++ /dev/null
@@ -1,900 +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">
-      <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 must also 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 d2eb4fa..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorManager.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.ui.internal.navigator;
-
-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.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IOpenListener;
-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.swt.graphics.Image;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchActionConstants;
-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);
-
-		commonNavigator.getCommonViewer().addOpenListener(new IOpenListener() {
-			public void open(OpenEvent event) {
-				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 7e999ac..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.rememberContribution(null, 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 562e9e5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentService.java
+++ /dev/null
@@ -1,1140 +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;
-		}
-		return (INavigatorContentDescriptor[]) boundDescriptors
-				.toArray(new INavigatorContentDescriptor[boundDescriptors
-						.size()]);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.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)
-	 * 
-	 * @see org.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)
-	 * 
-	 * @see org.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++) {
-				getContributionMemory().put(elements[i], source);
-			}
-		}
-	}
-
-	/**
-	 * 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) {
-		if (source != null && element != null) {
-			getContributionMemory().put(element, source);
-		}
-	}
-
-	/**
-	 * 
-	 * @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)
-	 * 
-	 * @see org.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)
-	 * 
-	 * @see org.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 a0addaf..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java
+++ /dev/null
@@ -1,918 +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.internal.navigator.extensions.OverridePolicy;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
-
-/**
- * <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
- * 
- * <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 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 initiailization 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 6186df0..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceDescriptionProvider.java
+++ /dev/null
@@ -1,92 +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;
-
-/**
- * 
- * <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 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 15c5fca..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java
+++ /dev/null
@@ -1,395 +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>
- * <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
- * 
- * @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 45c0b3e..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 assistnat 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 2ea50aa..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSaveablesService.java
+++ /dev/null
@@ -1,599 +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.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/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 0c663c4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CollapseAllAction.java
+++ /dev/null
@@ -1,45 +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.jface.action.IAction;
-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 implements IAction {
-
-	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 67eb25c..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 documenation 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 e35e039..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, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.action.IAction;
-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, IAction, 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()) {
-			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 62c5728..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/Binding.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
- ******************************************************************************/
-
-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;
-
-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);
-				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 5a7ba30..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptor.java
+++ /dev/null
@@ -1,466 +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.Priority;
-
-/**
- * Encapsulates the <code>org.eclipse.ui.navigator.navigatorContent</code>
- * extension point.
- * <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 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 overridding 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 b434e7a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptorManager.java
+++ /dev/null
@@ -1,483 +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.VisibilityAssistant;
-import org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * <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 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);
-		} 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 = addDescriptorsForPossibleChild(
-						anElement, descriptor.getOverriddingExtensions(),
-						aVisibilityAssistant, theFoundDescriptors);
-
-				if (!isOverridden && isApplicable) {
-					theFoundDescriptors.add(descriptor);
-				}
-
-			} 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);
-				} else {
-					overridingDescriptors.add(desc);
-				}
-				allDescriptors.put(desc.getId(), desc);
-				if (desc.hasSaveablesProvider()) {
-					saveablesProviderDescriptors.add(desc);
-				}
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	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) {
-
-					/*
-					 * 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) {
-						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 1622bf5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentExtension.java
+++ /dev/null
@@ -1,415 +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.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;
-
-/**
- * <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 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;
-		}
-		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;
-		}
-		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/OverridePolicy.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/OverridePolicy.java
deleted file mode 100644
index d407e73..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/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.internal.navigator.extensions;
-
-/**
- * <p>
- * Enumeration of the OverridePolicy values supported by the Common Navigator.
- * </p>
- * 
- * @since 3.2
- */
-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/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 3969282..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SelectFiltersAction.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
- *******************************************************************************/
-/*
- * Created on Feb 9, 2004
- *
- */
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-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 implements IAction {
-
-	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 28f4348..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ToggleFilterAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.action.IAction;
-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 implements IAction {
-
-	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 ec5ddb5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapter.java
+++ /dev/null
@@ -1,321 +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);
-
-		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 52af6c6..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 implement this interface.
- * </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 159a038..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 (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>
- * 
- * @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 dc15814..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 need not implement this interface if there is no cause to do so.
- * {@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 009d53a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionStateModel.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.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>
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @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 c2e2e30..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentDescriptor.java
+++ /dev/null
@@ -1,139 +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;
-import org.eclipse.ui.internal.navigator.extensions.OverridePolicy;
-
-/**
- * 
- * The descriptor provides a 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.
- * 
- * 
- * <p>
- * There is one {@link INavigatorContentExtension} for each content service.
- * There is only one {@link INavigatorContentDescriptor} for each extension.
- * </p>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * 
- * @since 3.2
- * 
- */
-public interface INavigatorContentDescriptor {
-
-	/**
-	 * Returns the navgiator content extension id
-	 * 
-	 * @return the navgiator 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.
-	 */
-	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 overridding extensions.
-	 */
-	boolean hasOverridingExtensions();
-
-	/**
-	 * @return The set of overridding 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 f2f1c18..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}.
- * 
- * <p>
- * There is one {@link INavigatorContentExtension} for each content service.
- * There is only one {@link INavigatorContentDescriptor} for each extension.
- * </p>
- *  
- * 
- *<p>
- * This interface is not intended to be implemented by clients.
- *</p>
- * @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 1427529..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 shold 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 51f9ce7..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorDnDService.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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>
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </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>
- * 
- * @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 988bbec..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorFilterService.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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> 
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see INavigatorContentService#getFilterService()
- * @see ViewerFilter
- * @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 816512c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorPipelineService.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.navigator;
-
-/**
- * 
- * Performs calculations that are necessary to determine the correct children to
- * render in the viewer.
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see INavigatorContentService#getPipelineService()
- * @see PipelinedShapeModification
- * @see PipelinedViewerUpdate
- * @see IPipelinedTreeContentProvider
- * @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 e025a4d..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSaveablesService.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.navigator;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.ISaveablesSource;
-import org.eclipse.ui.Saveable;
-
-/**
- * 
- * 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 24a78ae..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSorterService.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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>
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see INavigatorContentService#getSorterService()
- * @see ViewerSorter
- * @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 e7699f4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorViewerDescriptor.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.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.
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @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/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 a8db873..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/WizardActionGroup.java
+++ /dev/null
@@ -1,325 +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>
- * 
- * @noextend This class is not intended to be subclassed by clients.
- * 
- * @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>
-	 */
-	protected 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 3d94031..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolder.java
+++ /dev/null
@@ -1,2575 +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.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;
-        String platform = SWT.getPlatform();
-        if ("photon".equals(platform)) { //$NON-NLS-1$
-			toolbarTrim = 6;
-		}
-        if ("gtk".equals(platform)) { //$NON-NLS-1$
-			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
-        String platform = SWT.getPlatform();
-        if ("gtk".equals(platform)) { //$NON-NLS-1$
-			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 d18f4fb..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Sep 12 08:59:17 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\="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><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.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 4fa4010..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.4.1.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-friends:="org.eclipse.ui.tests.views.properties.tabbed",
- 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 460ec29..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyTabs.exsd
+++ /dev/null
@@ -1,178 +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="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">
-      <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>
-               <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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="image" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </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.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="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/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 b1301ed..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java
+++ /dev/null
@@ -1,1060 +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));
-	}
-
-	public void dispose() {
-		hoverGradientStart.dispose();
-		hoverGradientEnd.dispose();
-		defaultGradientStart.dispose();
-		defaultGradientEnd.dispose();
-		indentedDefaultBackground.dispose();
-		indentedHoverBackground.dispose();
-		navigationElementShadowStroke.dispose();
-		bottomNavigationElementShadowStroke1.dispose();
-		bottomNavigationElementShadowStroke2.dispose();
-		super.dispose();
-	}
-
-	/**
-	 * 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 c790711..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java
+++ /dev/null
@@ -1,187 +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.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;
-					}
-				}
-			}
-		}
-
-		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 b0e3898..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java
+++ /dev/null
@@ -1,162 +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.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;
-	}
-}
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 e61a0d1..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.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 org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-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.swt.widgets.Event;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-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) {
-				// workaround for Bugzilla 140314 since we cannot call
-				// atabbedPropertySheetPage.resizeScrolledComposite();
-				TabbedPropertyComposite composite = (TabbedPropertyComposite)atabbedPropertySheetPage.getControl();
-				ScrolledComposite scrolledComposite = composite.getScrolledComposite();
-				Event event = new Event();
-				event.type = SWT.Resize;
-				event.widget = scrolledComposite;
-				composite.getScrolledComposite().notifyListeners(SWT.Resize, event);
-			}
-		});
-	}
-
-	/**
-	 * @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 509286c..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java
+++ /dev/null
@@ -1,948 +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;
-
-	/**
-	 * 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) {
-		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.
-		 */
-		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 = 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);
-		}
-	}
-
-	private 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());
-        }
-    }
-
-}
\ 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.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/.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 f71b672..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.4.1.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.3.0,4.0.0)";visibility:=reexport,
- org.eclipse.jface;bundle-version="[3.4.0,4.0.0)";visibility:=reexport,
- org.eclipse.ui.workbench;bundle-version="[3.4.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 39ee54d..0000000
--- a/bundles/org.eclipse.ui/buildnotes_workbench.html
+++ /dev/null
@@ -1,4819 +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.3) - JFace and Workbench</title>
-</head>
-
-<body>
-
-<h1>Eclipse Platform Build Notes (3.3)<br>
-JFace and Workbench</h1>
-
-<p>Integration Build (September 09, 2008, 3:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<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>
-  </p>
-
-<p>Integration Build (September 03, 2008, 4:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244631">Bug 244631</a>. [Markers] Problems view cache is too large for very large marker sets (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 27, 2008, 4:38 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245159">Bug 245159</a>. [Preferences] Preference pages not scrollable (accessible) via keyboard (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 27, 2008, 1:49 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240931">Bug 240931</a>. [DataBinding] NPE in JavaBeanObservable(Set|List).firstListenerAdded() (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 27, 2008, 12:46 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198091">Bug 198091</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=202819">Bug 202819</a>. [Workbench] Eclipse process continues to run in background after shutdown (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=235195">Bug 235195</a>. [Wizards] [DataBinding] Non-error statuses not handled correctly by WizardPageSupport class (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235804">Bug 235804</a>. [Wizards] StackOverflowError in WizardsRegistryReader (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236605">Bug 236605</a>. [DataBinding] Duplicate entries in bound list after update (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236795">Bug 236795</a>. [JFace] SWT Exception creates endless cycle (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244098">Bug 244098</a>. [DataBinding] ListBinding does not update from model to target in some cases (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245183">Bug 245183</a>. [Databinding] ObservableList could do a == check before delegating to the wrapped list (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 26, 2008, 4:32 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=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=204700">Bug 204700</a>. [CommonNavigator] ConcurrentModificationException trying to see phys - view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213891">Bug 213891</a>. [CommonNavigator] Project Explorer (in platform - NOT SDK!) is not refreshed on changes (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=235379">Bug 235379</a>. [GlobalActions] GlobalUndoAction / GlobalRedoAction causes NPE by unsafely disposing old delegate (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241632">Bug 241632</a>. [KeyBindings] Emacs Binding not visible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242394">Bug 242394</a>. Arithmetic exception in AbstractColumnLayout (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=243210">Bug 243210</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=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=244013">Bug 244013</a>. [Metadata] Branched org.eclipse.ui should have version 3.4.1 (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=244754">Bug 244754</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=245125">Bug 245125</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=245206">Bug 245206</a>. [CommonNavigator] Add test code for dependsOn with overrides in actionProvider (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 19, 2008, 3:51 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<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=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=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=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=244148">Bug 244148</a>. [About] (maintenance) Looking at Help->Plugins and then closing produces many errors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244171">Bug 244171</a>. [ActivityMgmt] (maintenance) NPE in org.eclipse.ui.internal.activities.Identifer prevents menu contributions from showing up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244428">Bug 244428</a>. [ActivityMgmt] (maintenance) Endless loop in MutableActivityManager.getIdentifier(..) (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 13, 2008, 12:00 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234484">Bug 234484</a>. [DetachedView] Empty DW's can't be closed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238023">Bug 238023</a>. Using relative ID "org.eclipse.ui.editorss" in Perspective Extension gives warning (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 6775edf..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/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 af30a42..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 995a2b7..0000000
--- a/bundles/org.eclipse.ui/plugin.properties
+++ /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
-###############################################################################
-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.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.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
diff --git a/bundles/org.eclipse.ui/plugin.xml b/bundles/org.eclipse.ui/plugin.xml
deleted file mode 100644
index c29c813..0000000
--- a/bundles/org.eclipse.ui/plugin.xml
+++ /dev/null
@@ -1,2188 +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="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"
-			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.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 80188ac..0000000
--- a/bundles/org.eclipse.ui/schema/actionSets.exsd
+++ /dev/null
@@ -1,604 +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>
-                  &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 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>
-                  &lt;b&gt;&lt;font color=&quot;#FF0000&quot;&gt;Deprecated:&lt;/font&gt;&lt;/b&gt; 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 8495129..0000000
--- a/bundles/org.eclipse.ui/schema/commonAction.exsd
+++ /dev/null
@@ -1,173 +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="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>
-      </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="since"/>
-      </appInfo>
-      <documentation>
-         
-      </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) 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 45169a8..0000000
--- a/bundles/org.eclipse.ui/schema/editors.exsd
+++ /dev/null
@@ -1,336 +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="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">
-      <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.runtime.contentTypes&apos; extension point.
-               </documentation>
-            </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 d00ef02..0000000
--- a/bundles/org.eclipse.ui/schema/exportWizards.exsd
+++ /dev/null
@@ -1,255 +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>
-            </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/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 043b8fc..0000000
--- a/bundles/org.eclipse.ui/schema/menus.exsd
+++ /dev/null
@@ -1,958 +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">
-      <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="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="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="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="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="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="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 ee65d4d..0000000
--- a/bundles/org.eclipse.ui/schema/statusHandlers.exsd
+++ /dev/null
@@ -1,267 +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="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">
-      <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.errors.AbstractStatusHandler&lt;/code&gt;.
-&lt;/p&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.errors.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 cb1ce9f..0000000
--- a/bundles/org.eclipse.ui/schema/viewActions.exsd
+++ /dev/null
@@ -1,485 +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">
-      <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="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;/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>
-                  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 0606d43..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 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 492dcdc..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet000HelloWorld.java
+++ /dev/null
@@ -1,121 +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 org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-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), BeansObservables.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/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 2275794..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.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
- *     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.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.swt.SWT;
-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.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;
-
-/**
- * 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$
-
-		ExampleLabelProvider labelProvider= new ExampleLabelProvider();
-		FileSystemContentProvider contentProvider= new FileSystemContentProvider();
-		
-		final TableViewer tableViewer= new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-
-		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 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));
-
-		
-		public ExampleLabelProvider() {
-		}
-		
-		public void update(ViewerCell cell) {
-			Object element= cell.getElement();
-			
-			if (element instanceof File) {
-				File file= (File) element;
-				
-				StyledString styledString= new StyledString(file.getName());
-				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);
-		}
-	}
-
-	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/TableCursor.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/TableCursor.java
deleted file mode 100644
index e3b0c9b..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/TableCursor.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.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.AbstractTableViewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.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.*;
-
-
-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
-			String platform = SWT.getPlatform();
-			if ("win32".equals(platform)) { //$NON-NLS-1$
-				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 89c8f30..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);
-		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 8fc80bd..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 (!"carbon".equals(SWT.getPlatform())) { //$NON-NLS-1$
-              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 6fe533d..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.0.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 29ae8fb..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.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
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 658107c..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="Button"/>
-         <propertyTab
-               afterTab="ButtonTab"
-               category="sample"
-               id="AdvancedTab"
-               label="Advanced"/>
-      </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 74ef0fa..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java
+++ /dev/null
@@ -1,362 +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.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");
-				}
-			}
-		});
-	}
-
-	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 9de269c..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java
+++ /dev/null
@@ -1,504 +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.text.MessageFormat;
-
-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.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);
-		client = toolkit.createComposite(section);
-		section.setClient(client);
-		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;
-		client.setLayout(layout);
-
-		final Button shortMessage = toolkit.createButton(client,
-				"Short message", SWT.RADIO);
-		shortMessage.setSelection(true);
-		gd = new GridData();
-		gd.horizontalSpan = 4;
-		shortMessage.setLayoutData(gd);
-		final Button longMessage = toolkit.createButton(client, "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(client,
-				"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);
-			}
-		});
-
-		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());
-			}
-		});
-
-		Button error = toolkit.createButton(client, "Error", SWT.PUSH);
-		error.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(IMessageProvider.ERROR,
-						longMessage.getSelection()), IMessageProvider.ERROR);
-
-			}
-		});
-		Button warning = toolkit.createButton(client, "Warning", SWT.PUSH);
-		warning.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(IMessageProvider.WARNING,
-						longMessage.getSelection()), IMessageProvider.WARNING);
-			}
-		});
-		Button info = toolkit.createButton(client, "Info", SWT.PUSH);
-		info.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(IMessageProvider.INFORMATION,
-						longMessage.getSelection()),
-						IMessageProvider.INFORMATION);
-			}
-		});
-		Button cancel = toolkit.createButton(client, "Cancel", SWT.PUSH);
-		cancel.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(null, 0);
-			}
-		});
-
-		final Button busy = toolkit.createButton(client, "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 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 6482947..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.0.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 ff013f5..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableContractTest.java
+++ /dev/null
@@ -1,183 +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 208322
- *     Matthew Hall - bug 221351
- *     Matthew Hall - bug 208858
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import junit.framework.Test;
-
-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.jface.databinding.conformance.delegate.IObservableContractDelegate;
-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 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 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/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/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 5d1c724..0000000
--- a/tests/org.eclipse.jface.tests.databinding/JFace-Data Binding Test Suite.launch
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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"/>
-<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"/>
-<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"/>
-<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 1614098..0000000
--- a/tests/org.eclipse.jface.tests.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface.tests.databinding
-Bundle-Version: 1.0.101.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.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/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 a89461b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ObservablesManagerTest.java
+++ /dev/null
@@ -1,222 +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)
- ******************************************************************************/
-
-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.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
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#addStaleListener(org.eclipse.core.databinding.observable.IStaleListener)
-		 */
-		public void addStaleListener(IStaleListener listener) {
-			// dummy
-
-		}
-
-		/*
-		 * (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
-
-		}
-
-		/*
-		 * (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 4e1b652..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/BeansObservablesTest.java
+++ /dev/null
@@ -1,227 +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 - bug 221351
- *******************************************************************************/
-
-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);
-		parent.setValue(new 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", parent.getValue(), beanObservable.getObserved());
-		assertTrue("delegate", beanObservable.getDelegate().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);
-		parent.setValue(new 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", parent, beanObservable.getObserved());
-
-		// DetailObservableList is package level we can do a straight instanceof
-		// check
-		assertTrue("delegate is the observed", beanObservable.getDelegate()
-				.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);
-		parent.setValue(new 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", parent, beanObservable.getObserved());
-
-		// DetailObservableSet is package level we can't do a straight
-		// instanceof check
-		assertTrue("delegate is the observed", beanObservable.getDelegate()
-				.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 4b2f4c3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/NumberToStringConverterTest.java
+++ /dev/null
@@ -1,121 +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.conversion;
-
-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.getInstance();
-		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());
-	}
-
-	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);
-	}
-
-	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 d171fa3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/StringToNumberConverterTest.java
+++ /dev/null
@@ -1,189 +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.conversion;
-
-import java.math.BigInteger;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-//TODO test for ICU4Js BigDecimal
-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.getInstance();
-		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());
-	}
-	
-	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);
-	}
-	
-	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 4aa00d5..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/AbstractObservableListTest.java
+++ /dev/null
@@ -1,210 +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
- ******************************************************************************/
-
-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.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-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 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/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/ObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ObservableListTest.java
deleted file mode 100755
index 7d9dcde..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ObservableListTest.java
+++ /dev/null
@@ -1,216 +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, 245183
- *******************************************************************************/
-
-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 void testEquals_IdentityCheckShortcut() {
-		List wrappedList = new ArrayList() {
-			private static final long serialVersionUID = 1L;
-
-			public boolean equals(Object o) {
-				fail("ObservableList.equals() should return true instead of delegating to wrappedList when this == obj");
-				return false;
-			}
-		};
-		list = new ObservableListStub(wrappedList, null);
-		assertTrue(list.equals(list));
-	}
-
-	public void testEquals_SameClassDelegatesToWrappedLists() {
-		List wrappedList = new ArrayList() {
-			private static final long serialVersionUID = 1L;
-
-			public boolean equals(Object o) {
-				// The observable lists will only be equal if they delegate to
-				// wrappedList.equals(other.wrappedList)
-				return o == this;
-			}
-		};
-		list = new ObservableListStub(wrappedList, null);
-		ObservableListStub otherList = new ObservableListStub(wrappedList, null);
-		assertTrue(list.equals(otherList));
-	}
-
-	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/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/ObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ObservableMapTest.java
deleted file mode 100644
index bff39ab..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ObservableMapTest.java
+++ /dev/null
@@ -1,144 +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 245183
- *******************************************************************************/
-
-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);
-			}
-		});
-	}
-
-	public void testEquals_SingleEntry() {
-		Map reference = new HashMap();
-		Object key = new Object();
-		Object value = new Object();
-		reference.put(key, value);
-
-		map = new ObservableMapStub(reference);
-		assertEquals(reference, map);
-	}
-
-	public void testEquals_IdentityCheckShortcut() {
-		Map wrappedMap = new HashMap() {
-			private static final long serialVersionUID = 1L;
-
-			public boolean equals(Object o) {
-				fail("ObservableMap.equals() should return true instead of delegating to wrappedMap when this == obj");
-				return false;
-			}
-		};
-		map = new ObservableMapStub(wrappedMap);
-		assertTrue(map.equals(map));
-	}
-
-	public void testEquals_SameClassDelegatesToWrappedMaps() {
-		Map wrappedMap = new HashMap() {
-			private static final long serialVersionUID = 1L;
-
-			public boolean equals(Object o) {
-				// The observable maps will only be equal if they delegate to
-				// wrappedMap.equals(other.wrappedMap)
-				return o == this;
-			}
-		};
-		map = new ObservableMapStub(wrappedMap);
-		ObservableMapStub otherMap = new ObservableMapStub(wrappedMap);
-		assertTrue(map.equals(otherMap));
-	}
-
-	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 d3a9870..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/WritableMapTest.java
+++ /dev/null
@@ -1,123 +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 - bug 184830
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.util.Collections;
-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.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);
-		
-	}
-}
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/ObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ObservableSetTest.java
deleted file mode 100755
index 89ef2c9..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ObservableSetTest.java
+++ /dev/null
@@ -1,113 +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 213145, 245183
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.set;
-
-import java.util.HashSet;
-import java.util.Set;
-
-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.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;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class ObservableSetTest extends AbstractDefaultRealmTestCase {
-	public void testEquals_IdentityCheckShortcut() {
-		Set wrappedSet = new HashSet() {
-			private static final long serialVersionUID = 1L;
-
-			public boolean equals(Object o) {
-				fail("ObservableSet.equals() should return true instead of delegating to wrappedSet when this == obj");
-				return false;
-			}
-		};
-		Set set = new ObservableSetStub(Realm.getDefault(), wrappedSet, null);
-		assertTrue(set.equals(set));
-	}
-
-	public void testEquals_SameClassDelegatesToWrappedSets() {
-		Set wrappedSet = new HashSet() {
-			private static final long serialVersionUID = 1L;
-
-			public boolean equals(Object o) {
-				// The observable sets will only be equal if they delegate to
-				// wrappedSet.equals(other.wrappedSet)
-				return o == this;
-			}
-		};
-		Set set = new ObservableSetStub(Realm.getDefault(), wrappedSet, null);
-		Set otherSet = new ObservableSetStub(Realm.getDefault(), wrappedSet,
-				null);
-		assertTrue(set.equals(otherSet));
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ObservableSetTest.class.getName());
-		suite.addTestSuite(ObservableSetTest.class);
-		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/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/validation/MultiValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
deleted file mode 100644
index be1e4aa..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
+++ /dev/null
@@ -1,196 +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
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.validation;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-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.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.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class MultiValidatorTest extends AbstractDefaultRealmTestCase {
-	private WritableValue dependency;
-	private MultiValidator validator;
-	private IObservableValue validationStatus;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		dependency = new WritableValue(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 WritableValue(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));
-	}
-}
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/Bean.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/Bean.java
deleted file mode 100644
index 0922410..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 - bugs 221351, 245183
- ******************************************************************************/
-
-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 {
-	/* package */PropertyChangeSupport changeSupport = new PropertyChangeSupport(
-			this);
-	private String value;
-	private Object[] array;
-	private List list;
-	private Set set;
-	private 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 c923d28..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableListDecoratorTest.java
+++ /dev/null
@@ -1,125 +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, 245183
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-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.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-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.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- */
-public class BeanObservableListDecoratorTest extends AbstractDefaultRealmTestCase {
-	private PropertyDescriptor propertyDescriptor;
-	private JavaBeanObservableList observableList;
-	private BeanObservableListDecorator decorator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		Bean 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, observableList, propertyDescriptor);
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableList, decorator.getDelegate());
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(observableList, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-
-	public void testEquals_IdentityCheckShortcut() {
-		IObservableList delegate = new WritableList() {
-			public boolean equals(Object obj) {
-				fail("ObservableList.equals() should return true instead of delegating to wrappedList when this == obj");
-				return false;
-			}
-		};
-		decorator = new BeanObservableListDecorator(delegate,
-				new WritableValue(new Bean(), Object.class), propertyDescriptor);
-		assertTrue(decorator.equals(decorator));
-	}
-
-	public void testEquals_SameClassDelegatesToDelegateObservables() {
-		IObservableList delegate = new WritableList() {
-			public boolean equals(Object o) {
-				return o == this;
-			}
-		};
-		Bean bean = new Bean();
-		decorator = new BeanObservableListDecorator(delegate, new WritableValue(
-				bean, Object.class), propertyDescriptor);
-		BeanObservableListDecorator otherDecorator = new BeanObservableListDecorator(
-				delegate, new WritableValue(bean, Object.class),
-				propertyDescriptor);
-		assertTrue(decorator.equals(otherDecorator));
-	}
-
-	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, 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/BeanObservableMapDecoratorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableMapDecoratorTest.java
deleted file mode 100644
index 514c29a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableMapDecoratorTest.java
+++ /dev/null
@@ -1,87 +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 245183)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-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.WritableValue;
-import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
-import org.eclipse.core.internal.databinding.beans.JavaBeanPropertyObservableMap;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.3
- */
-public class BeanObservableMapDecoratorTest extends
-		AbstractDefaultRealmTestCase {
-	private PropertyDescriptor propertyDescriptor;
-	private JavaBeanPropertyObservableMap observableMap;
-	private BeanObservableMapDecorator decorator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		Bean bean = new Bean();
-		propertyDescriptor = new PropertyDescriptor("map", Bean.class,
-				"getMap", "setMap");
-		observableMap = new JavaBeanPropertyObservableMap(Realm.getDefault(),
-				bean, propertyDescriptor);
-		decorator = new BeanObservableMapDecorator(observableMap,
-				observableMap, propertyDescriptor);
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableMap, decorator.getDelegate());
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(observableMap, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-
-	public void testEquals_IdentityCheckShortcut() {
-		IObservableMap delegate = new WritableMap() {
-			public boolean equals(Object obj) {
-				fail("ObservableList.equals() should return true instead of delegating to wrappedList when this == obj");
-				return false;
-			}
-		};
-		decorator = new BeanObservableMapDecorator(delegate, new WritableValue(
-				new Bean(), Object.class), propertyDescriptor);
-		assertTrue(decorator.equals(decorator));
-	}
-
-	public void testEquals_SameClassDelegatesToDelegateObservables() {
-		IObservableMap delegate = new WritableMap() {
-			public boolean equals(Object o) {
-				return o == this;
-			}
-		};
-		Bean bean = new Bean();
-		decorator = new BeanObservableMapDecorator(delegate, bean,
-				propertyDescriptor);
-		BeanObservableMapDecorator otherDecorator = new BeanObservableMapDecorator(
-				delegate, bean, propertyDescriptor);
-		assertTrue(decorator.equals(otherDecorator));
-	}
-}
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 924b139..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableSetDecoratorTest.java
+++ /dev/null
@@ -1,89 +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 245183
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-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.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- */
-public class BeanObservableSetDecoratorTest extends AbstractDefaultRealmTestCase {
-	private PropertyDescriptor propertyDescriptor;
-	private JavaBeanObservableSet observableSet;
-	private BeanObservableSetDecorator decorator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		Bean bean = new Bean();
-		propertyDescriptor = new PropertyDescriptor("set",
-				Bean.class);
-		observableSet = new JavaBeanObservableSet(
-				SWTObservables.getRealm(Display.getDefault()), bean,
-				propertyDescriptor, String.class);
-		decorator = new BeanObservableSetDecorator(
-				observableSet, observableSet, propertyDescriptor);
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableSet, decorator.getDelegate());
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(observableSet, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-
-	public void testEquals_IdentityCheckShortcut() {
-		IObservableSet delegate = new WritableSet() {
-			public boolean equals(Object obj) {
-				fail("ObservableList.equals() should return true instead of delegating to wrappedList when this == obj");
-				return false;
-			}
-		};
-		decorator = new BeanObservableSetDecorator(delegate, new WritableValue(
-				new Bean(), Object.class), propertyDescriptor);
-		assertTrue(decorator.equals(decorator));
-	}
-
-	public void testEquals_SameClassDelegatesToDelegateObservables() {
-		IObservableSet delegate = new WritableSet() {
-			public boolean equals(Object o) {
-				return o == this;
-			}
-		};
-		Bean bean = new Bean();
-		decorator = new BeanObservableSetDecorator(delegate, bean,
-				propertyDescriptor);
-		BeanObservableSetDecorator otherDecorator = new BeanObservableSetDecorator(
-				delegate, bean, propertyDescriptor);
-		assertTrue(decorator.equals(otherDecorator));
-	}
-}
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 718688d..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableValueDecoratorTest.java
+++ /dev/null
@@ -1,89 +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 245183
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-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, new WritableValue(bean, Object.class), observableValue
-						.getPropertyDescriptor());
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableValue, decorator.getDelegate());
-	}
-	
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-
-	public void testEquals_IdentityCheckShortcut() {
-		IObservableValue delegate = new WritableValue() {
-			public boolean equals(Object obj) {
-				fail("ObservableList.equals() should return true instead of delegating to wrappedList when this == obj");
-				return false;
-			}
-		};
-		decorator = new BeanObservableValueDecorator(delegate, new WritableValue(bean, Object.class), propertyDescriptor);
-		assertTrue(decorator.equals(decorator));
-	}
-
-	public void testEquals_SameClassDelegatesToDelegateObservables() {
-		IObservableValue delegate = new WritableValue() {
-			public boolean equals(Object o) {
-				return o == this;
-			}
-		};
-		decorator = new BeanObservableValueDecorator(delegate,
-				new WritableValue(bean, Object.class), propertyDescriptor);
-		BeanObservableValueDecorator otherDecorator = new BeanObservableValueDecorator(
-				delegate, new WritableValue(bean, Object.class),
-				propertyDescriptor);
-		assertTrue(decorator.equals(otherDecorator));
-	}
-}
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 c2d183f..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedListTest.java
+++ /dev/null
@@ -1,530 +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
- ******************************************************************************/
-
-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.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.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.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);
-	}
-
-	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 8f897d4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedSetTest.java
+++ /dev/null
@@ -1,349 +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
- ******************************************************************************/
-
-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.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.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 testRemoveListChangeEvent() 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 testAddAllListChangEvent() 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 testRemoveAllListChangeEvent() 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 testRetainAllListChangeEvent() 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 testListChangeEventFiresWhenNewListIsSet() 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);
-	}
-
-	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(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 list = new JavaBeanObservableSet(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) {
-			IObservableSet list = (IObservableSet) observable;
-			list.add(createElement(list));
-		}
-	}
-}
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 e91cf7e..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableListTest.java
+++ /dev/null
@@ -1,577 +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, 240931
- ******************************************************************************/
-
-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.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.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;
-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.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 testFirstListenerAdded_AfterLastListenerRemoved() throws Exception {
-		IListChangeListener listener = new IListChangeListener() {
-			public void handleListChange(ListChangeEvent event) {
-				// noop
-			}
-		};
-		list.addListChangeListener(listener);
-		list.removeListChangeListener(listener);
-		list.addListChangeListener(listener);
-	}
-
-	public void testDispose_DoubleInvocation() throws Exception {
-		list.dispose();
-		list.dispose();
-	}
-
-	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 fbdc3a2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableMapTest.java
+++ /dev/null
@@ -1,196 +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, 240931
- *******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-import java.util.HashSet;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Realm;
-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.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;
-
-/**
- * @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 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 testFirstListenerAdded_AfterLastListenerRemoved()
-			throws Exception {
-		IMapChangeListener listener = new IMapChangeListener() {
-			public void handleMapChange(MapChangeEvent event) {
-				// noop
-			}
-		};
-		map.addMapChangeListener(listener);
-		map.removeMapChangeListener(listener);
-		map.addMapChangeListener(listener);
-	}
-
-	public void testDispose_DoubleInvocation() throws Exception {
-		map.dispose();
-		map.dispose();
-	}
-
-	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 5bc4e44..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableSetTest.java
+++ /dev/null
@@ -1,173 +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, 240931
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyDescriptor;
-import java.util.Arrays;
-import java.util.HashSet;
-
-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.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.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 testFirstListenerAdded_AfterLastListenerRemoved() throws Exception {
-		ISetChangeListener listener = new ISetChangeListener() {
-			public void handleSetChange(SetChangeEvent event) {
-				// noop
-			}
-		};
-		observableSet.addSetChangeListener(listener);
-		observableSet.removeSetChangeListener(listener);
-		observableSet.addSetChangeListener(listener);
-	}
-
-	public void testDispose_DoubleInvocation() throws Exception {
-		observableSet.dispose();
-		observableSet.dispose();
-	}
-
-	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 6765e7d..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableValueTest.java
+++ /dev/null
@@ -1,196 +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
- ******************************************************************************/
-
-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.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 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 ddcfc9a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanPropertyObservableMapTest.java
+++ /dev/null
@@ -1,74 +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 240931)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-import java.util.HashMap;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.internal.databinding.beans.JavaBeanPropertyObservableMap;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class JavaBeanPropertyObservableMapTest extends
-		AbstractDefaultRealmTestCase {
-	private JavaBeanPropertyObservableMap map;
-
-	private PropertyDescriptor propertyDescriptor;
-
-	private Bean bean;
-
-	private String propertyName;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		propertyName = "map";
-		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
-		bean = new Bean(new HashMap());
-
-		map = new JavaBeanPropertyObservableMap(Realm.getDefault(), bean,
-				propertyDescriptor);
-	}
-
-	public void testFirstListenerAdded_AfterLastListenerRemoved()
-			throws Exception {
-		IMapChangeListener listener = new IMapChangeListener() {
-			public void handleMapChange(MapChangeEvent event) {
-				// noop
-			}
-		};
-		map.addMapChangeListener(listener);
-		map.removeMapChangeListener(listener);
-		map.addMapChangeListener(listener);
-	}
-
-	public void testDispose_DoubleInvocation() throws Exception {
-		map.dispose();
-		map.dispose();
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanPropertyObservableMapTest.class
-				.getName());
-		suite.addTestSuite(JavaBeanPropertyObservableMapTest.class);
-		return suite;
-	}
-}
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 918d990..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ConstantObservableValueTest.java
+++ /dev/null
@@ -1,125 +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)
- ******************************************************************************/
-
-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 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/EmptyObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableListTest.java
deleted file mode 100644
index 8548240..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableListTest.java
+++ /dev/null
@@ -1,153 +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
- ******************************************************************************/
-
-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
-		}
-	}
-
-	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 2fa464e..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableSetTest.java
+++ /dev/null
@@ -1,128 +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
- ******************************************************************************/
-
-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
-		}
-	}
-
-	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/ProxyObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ProxyObservableListTest.java
deleted file mode 100644
index a1ceaa3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ProxyObservableListTest.java
+++ /dev/null
@@ -1,74 +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
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-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.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.internal.databinding.observable.ProxyObservableList;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- * @since 3.2
- * 
- */
-public class ProxyObservableListTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ProxyObservableListTest.class.getName());
-		suite.addTest(ObservableListContractTest.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 ProxyObservableListStub(wrappedList);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			((ProxyObservableListStub) observable).wrappedList
-					.add(new Object());
-		}
-	}
-
-	static class ProxyObservableListStub extends ProxyObservableList {
-		IObservableList wrappedList;
-
-		ProxyObservableListStub(IObservableList wrappedList) {
-			super(wrappedList);
-			this.wrappedList = wrappedList;
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ProxyObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ProxyObservableSetTest.java
deleted file mode 100644
index 1be56d2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ProxyObservableSetTest.java
+++ /dev/null
@@ -1,74 +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
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-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.core.internal.databinding.observable.ProxyObservableSet;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- * @since 3.2
- * 
- */
-public class ProxyObservableSetTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ProxyObservableSetTest.class.getName());
-		suite.addTest(ObservableCollectionContractTest.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 ProxyObservableSetStub(wrappedSet);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			ProxyObservableSetStub set = (ProxyObservableSetStub) observable;
-			set.wrappedSet.add(createElement(set));
-		}
-	}
-
-	static class ProxyObservableSetStub extends ProxyObservableSet {
-		IObservableSet wrappedSet;
-
-		ProxyObservableSetStub(IObservableSet wrappedSet) {
-			super(wrappedSet);
-			this.wrappedSet = wrappedSet;
-		}
-	}
-}
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 13e5703..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableListTest.java
+++ /dev/null
@@ -1,239 +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
- ******************************************************************************/
-
-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 {
-	ObservableList 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 = (ObservableList) 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());
-	}
-
-	public void testSetStaleOnUnmodifiableList() throws Exception {
-		try {
-			unmodifiable.setStale(true);
-			fail("UnsupportedOperationException should have been thrown");
-		} catch (UnsupportedOperationException e) {
-		}
-	}
-
-	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 2ae7ef1..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableSetTest.java
+++ /dev/null
@@ -1,237 +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
- ******************************************************************************/
-
-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());
-	}
-
-	public void testSetStaleOnUnmodifiableList() throws Exception {
-		try {
-			unmodifiable.setStale(true);
-			fail("UnsupportedOperationException should have been thrown");
-		} catch (UnsupportedOperationException e) {
-		}
-	}
-
-	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 630d4ce..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableValueTest.java
+++ /dev/null
@@ -1,69 +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
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-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.core.internal.databinding.observable.UnmodifiableObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.2
- * 
- */
-public class UnmodifiableObservableValueTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UnmodifiableObservableValueTest.class.getName());
-		suite.addTest(ObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Object valueType = new Object();
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new UnmodifiableObservableValueStub(new WritableValue(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));
-		}
-	}
-
-	private static class UnmodifiableObservableValueStub extends
-			UnmodifiableObservableValue {
-		IObservableValue wrappedValue;
-
-		UnmodifiableObservableValueStub(IObservableValue wrappedValue) {
-			super(wrappedValue);
-			this.wrappedValue = wrappedValue;
-		}
-	}
-}
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 264ba34..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java
+++ /dev/null
@@ -1,158 +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
- ******************************************************************************/
-
-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);
-
-		class Factory implements IObservableFactory {
-			Object type = Object.class;
-
-			public IObservable createObservable(Object target) {
-				return new WritableList(new ArrayList(), type);
-			}
-		}
-
-		Factory factory = new Factory();
-		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);
-
-		class Factory implements IObservableFactory {
-			Object type = Object.class;
-
-			public IObservable createObservable(Object target) {
-				return new WritableList(new ArrayList(), type);
-			}
-		}
-
-		Factory factory = new Factory();
-		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) {
-		}
-	}
-
-	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 b4edbd4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java
+++ /dev/null
@@ -1,170 +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.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);
-
-		class Factory implements IObservableFactory {
-			Object type;
-
-			public IObservable createObservable(Object target) {
-				return new WritableSet(new HashSet(), type);
-			}
-		}
-
-		Factory factory = new Factory();
-		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);
-
-		class Factory implements IObservableFactory {
-			Object type = Object.class;
-
-			public IObservable createObservable(Object target) {
-				return new WritableSet(new HashSet(), type);
-			}
-		}
-
-		Factory factory = new Factory();
-		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) {
-		}
-	}
-
-	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 35abc20..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java
+++ /dev/null
@@ -1,157 +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
- ******************************************************************************/
-
-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());
-	}
-	
-	/**
-	 * 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 7efe795..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java
+++ /dev/null
@@ -1,419 +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,
- *                    245183
- *     Ovidio Mallo - 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.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.ListDiffTest;
-import org.eclipse.core.tests.databinding.observable.list.ListDiffVisitorTest;
-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.CompositeMapTest;
-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.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.WritableValueTest;
-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.BeanObservableMapDecoratorTest;
-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.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.ProxyObservableListTest;
-import org.eclipse.core.tests.internal.databinding.observable.ProxyObservableSetTest;
-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.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.DelayedObservableValueTest;
-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.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(DatabindingContextTest.class);
-		addTestSuite(ListBindingTest.class);
-		addTestSuite(UpdateStrategyTest.class);
-		addTestSuite(UpdateValueStrategyTest.class);
-		addTestSuite(ValueBindingTest.class);
-		addTestSuite(ObservablesManagerTest.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());
-		addTestSuite(ListDiffTest.class);
-		addTestSuite(ListDiffVisitorTest.class);
-		addTest(ObservableListTest.suite());
-		addTest(WritableListTest.suite());
-
-		// org.eclipse.core.tests.databinding.observable.map
-		addTestSuite(AbstractObservableMapTest.class);
-		addTestSuite(ObservableMapTest.class);
-		addTestSuite(WritableMapTest.class);
-		addTestSuite(CompositeMapTest.class);
-
-		// org.eclipse.core.tests.databinding.observable.set
-		addTest(AbstractObservableSetTest.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(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(BeanObservableMapDecoratorTest.class);
-		addTestSuite(BeanObservableSetDecoratorTest.class);
-		addTestSuite(BeanObservableValueDecoratorTest.class);
-		addTest(JavaBeanObservableArrayBasedListTest.suite());
-		addTest(JavaBeanObservableArrayBasedSetTest.suite());
-		addTest(JavaBeanObservableListTest.suite());
-		addTest(JavaBeanObservableMapTest.suite());
-        addTest(JavaBeanPropertyObservableMapTest.suite());
-		addTest(JavaBeanObservableSetTest.suite());
-		addTest(JavaBeanObservableValueTest.suite());
-		addTestSuite(ListenerSupportTest.class);
-		
-		//org.eclipse.core.tests.internal.databinding.observable
-		addTest(ConstantObservableValueTest.suite());
-		addTest(EmptyObservableListTest.suite());
-		addTest(EmptyObservableSetTest.suite());
-		addTest(MapEntryObservableValueTest.suite());
-		addTest(ProxyObservableListTest.suite());
-		addTest(ProxyObservableSetTest.suite());
-		addTest(StalenessObservableValueTest.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(DelayedObservableValueTest.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 eab532f..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/swt/SWTObservablesTest.java
+++ /dev/null
@@ -1,335 +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.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.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.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.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.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 testObserveTextOfText() 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 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 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 a0f2856..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableValueEditingSupportTest.java
+++ /dev/null
@@ -1,302 +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.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.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 synchronized void dispose() {
-			disposed++;
-			delegate.dispose();
-		}
-
-		public void addChangeListener(IChangeListener listener) {
-			delegate.addChangeListener(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 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 b83c232..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/wizard/WizardPageSupportTest.java
+++ /dev/null
@@ -1,104 +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)
- ******************************************************************************/
-
-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.Observables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-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.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);
-	}
-
-	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 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/DelayedObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/DelayedObservableValueTest.java
deleted file mode 100644
index 1cc0243..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/DelayedObservableValueTest.java
+++ /dev/null
@@ -1,272 +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
- ******************************************************************************/
-
-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.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.jface.internal.databinding.swt.DelayedObservableValue;
-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 DelayedObservableValueTest extends AbstractDefaultRealmTestCase {
-	private Display display;
-	private Shell shell;
-	private Object oldValue;
-	private Object newValue;
-	private SWTObservableValueStub target;
-	private DelayedObservableValue 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 = new DelayedObservableValue(1, target);
-	}
-
-	protected void tearDown() throws Exception {
-		target.dispose();
-		target = null;
-		shell.dispose();
-		shell = null;
-		display = 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 testFocusOut_FiresPendingValueChange() {
-		assertFiresPendingValueChange(new Runnable() {
-			public void run() {
-				// simulate focus-out event
-				shell.notifyListeners(SWT.FocusOut, new Event());
-			}
-		});
-	}
-
-	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) {
-					throw new RuntimeException(e);
-				}
-			}
-
-			private void processDisplayEvents() {
-				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 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(DelayedObservableValueTest.class.getName());
-		suite.addTestSuite(DelayedObservableValueTest.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 DelayedObservableValue(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/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/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 fec1b32..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/AllUtilityTests.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.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);
-	}
-}
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 bc998f9..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormFontsTests.java
+++ /dev/null
@@ -1,82 +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.util;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.jface.resource.JFaceResources;
-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 systemFont = display.getSystemFont();
-		Font bannerFont = JFaceResources.getBannerFont();
-		if (systemFont.equals(bannerFont)) return;  // Skip test in unlikely event these are the same font
-		Font boldSystemFont = FormFonts.getInstance().getBoldFont(display, systemFont);
-		Font boldBannerFont = FormFonts.getInstance().getBoldFont(display, bannerFont);
-		assertFalse(boldSystemFont.equals(boldBannerFont));
-		FormFonts.getInstance().markFinished(boldSystemFont);
-		assertTrue(boldSystemFont.isDisposed());
-		assertFalse(boldBannerFont.isDisposed());
-		FormFonts.getInstance().markFinished(boldBannerFont);
-		assertTrue(boldBannerFont.isDisposed());
-	}
-	
-	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 316b3b4..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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, new Color(display, 1, 0, 0), new Color(display, 100, 100, 100), 25, 23, 1);
-		images[1] = FormImages.getInstance().getGradient(display, new Color(display, 0, 1, 0), new Color(display, 100, 100, 100), 25, 23, 1);
-		images[2] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 1), new Color(display, 100, 100, 100), 25, 23, 1);
-		images[3] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 0), new Color(display, 101, 100, 100), 25, 23, 1);
-		images[4] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 0), new Color(display, 100, 101, 100), 25, 23, 1);
-		images[5] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 0), new Color(display, 100, 100, 101), 25, 23, 1);
-		images[6] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 0), new Color(display, 100, 100, 100), 20, 23, 1);
-		images[7] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 0), new Color(display, 100, 100, 100), 25, 10, 1);
-		images[8] = FormImages.getInstance().getGradient(display, new Color(display, 0, 0, 0), new Color(display, 100, 100, 100), 25, 23, 2);
-		images[9] = FormImages.getInstance().getGradient(display, new Color(display, 1, 1, 1), new Color(display, 101, 101, 101), 20, 10, 2);
-		images[10] = FormImages.getInstance().getGradient(display, new Color[]{new Color(display,0,0,0)}, new int[] {}, 31, true, null);
-		images[11] = FormImages.getInstance().getGradient(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, 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(display, kit1.getColors().getColor(blueKey), kit1.getColors().getColor(redKey), 21, 21, 0);
-		Image image2 = FormImages.getInstance().getGradient(display, 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(display, 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 fc1ca93..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/PlatformUtil.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.tests.harness.util;
-
-import org.eclipse.swt.SWT;
-
-/**
- * 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() {
-        String platform = SWT.getPlatform();
-        return platform.equals("carbon");
-    }
-}
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 9bcdc26..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/UITestCase.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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())
-                ;
-    }
-
-    /** 
-     * 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 8fb7895..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/VerifyDialog.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.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.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(SWT.getPlatform())
-                .append(" platform:\n");
-
-        String failureMessages[] = test.failureTexts();
-        for (int i = 0; i < test.checkListTexts().size(); i++) {
-            if (!_checkList[i].getSelection()) {
-                text.append("- ").append(failureMessages[i]).append("\n");
-            }
-        }
-        FailureDialog dialog = new FailureDialog(getShell());
-        dialog.create();
-        dialog.setText(text.toString());
-        if (dialog.open() == IDialogConstants.OK_ID) {
-            _failureText = dialog.toString();
-            setReturnCode(IDialogConstants.NO_ID);
-            if (_testDialog.getShell() != null) {
-                _testDialog.close();
-            }
-            close();
-        }
-    }
-
-    /*
-     * In case the shell was closed by a means other than
-     * the NO button.
-     */
-    protected void handleShellCloseEvent() {
-        handleFailure();
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests.navigator/.classpath b/tests/org.eclipse.ui.tests.navigator/.classpath
deleted file mode 100644
index 117bd34..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 ceb6e65..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Sat Aug 16 12:54:53 PDT 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.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.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.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/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.navigator/META-INF/MANIFEST.MF
deleted file mode 100644
index 4f31131..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.101.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 23f1573..0000000
--- a/tests/org.eclipse.ui.tests.navigator/Navigator Test Suite.launch
+++ /dev/null
@@ -1,37 +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"/>
-<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"/>
-<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"/>
-<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.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 d592e25..0000000
--- a/tests/org.eclipse.ui.tests.navigator/plugin.properties
+++ /dev/null
@@ -1,16 +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.pipelineViewName=Test Pipline 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 180aea8..0000000
--- a/tests/org.eclipse.ui.tests.navigator/plugin.xml
+++ /dev/null
@@ -1,417 +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.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.TestLabelProvider"
-            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.TestLabelProvider"
-            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.TestLabelProvider"
-            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>      
-   </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"/>      
-   </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 67804c1..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/EditorTestHelper.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.Platform;
-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 {
-				Platform.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= Platform.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 99ddca8..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("Parent", 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 1b699d2..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestBase.java
+++ /dev/null
@@ -1,103 +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$
-
-	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);
-		}
-	}
-
-}
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 443d7f1..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestSuite.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.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(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/PipelineTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/PipelineTest.java
deleted file mode 100644
index 3761af0..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 eb6ae86..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ProgrammaticOpenTest.java
+++ /dev/null
@@ -1,99 +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 {
-
-		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 100987d..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/WorkingSetTest.java
+++ /dev/null
@@ -1,139 +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.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.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));
-	}
-
-}
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 c3549b0..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DatContentProvider.java
+++ /dev/null
@@ -1,44 +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.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-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) { 
-
-	}
-
-}
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 4915d01..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProvider.java
+++ /dev/null
@@ -1,126 +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.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 class TestLabelProvider extends LabelProvider implements
-		ICommonLabelProvider, IDescriptionProvider, IColorProvider,
-		IFontProvider {
-
-	private FontData boldFontData = new FontData();
-
-	private Font boldFont;
-	
-	private Color backgroundColor;
-
-	public void init(ICommonContentExtensionSite aSite) {
-
-		boldFontData.setStyle(SWT.BOLD);
-
-		boldFont = new Font(Display.getDefault(), boldFontData);
-
-		backgroundColor = new Color(Display.getDefault(), 100, 149, 237);
-	}
-
-	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 data.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) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		return backgroundColor;
-	}
-
-	/*
-	 * (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 = backgroundColor;
-		boldFont = null;
-		backgroundColor = 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/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 84591cf..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/ProjectUnzipUtil.java
+++ /dev/null
@@ -1,169 +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.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.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 = NavigatorTestsPlugin.getDefault().find(zipFilePath);
-		try {
-			url = Platform.asLocalURL(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/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 7896d33..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/JFacePerformanceSuite.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.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"));
-
-	}
-}
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 057c94d..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.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-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;
-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(SWT.getPlatform().equals("gtk"))
-			return ITERATIONS / 5;
-		return ITERATIONS;
-	}
-	
-	
-	/**
-	 * Return the number of iterations for tests that are slow on Linux
-	 * @return int
-	 */
-	public int slowWindowsIterations(){
-		if(SWT.getPlatform().equals("win32"))
-			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 17f7a4f..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.swt.SWT;
-
-/**
- * <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 = SWT.getPlatform();
-
-		// 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 d2abb56..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 (!"carbon".equals(SWT.getPlatform()))
-// 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 303cbf2..0000000
--- a/tests/org.eclipse.ui.tests.rcp/RCP Test Suite.launch
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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"/>
-<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"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<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"/>
-<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 0215967..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="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.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 513c4da..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +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.4.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
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 55f7c36..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/Tabbed Properties View-All Tests.launch
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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"/>
-<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"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<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"/>
-<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 43cae03..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageDynamicTest.java
+++ /dev/null
@@ -1,412 +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;
-
-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.Control;
-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.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyList;
-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;
-
-/**
- * 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);
-	}
-
-	/**
-	 * Get the list of tabs from the tabbed properties view.
-	 * 
-	 * @return the tab list.
-	 */
-	private TabbedPropertyList getTabbedPropertyList() {
-		Control control = dynamicTestsView.getTabbedPropertySheetPage()
-				.getControl();
-		assertTrue(control instanceof TabbedPropertyComposite);
-		TabbedPropertyComposite tabbedPropertyComposite = (TabbedPropertyComposite) control;
-		return tabbedPropertyComposite.getList();
-	}
-
-	/**
-	 * 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);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Element");//$NON-NLS-1$
-		/**
-		 * Second tab is Color
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Color");//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(2));
-	}
-
-	/**
-	 * 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);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Element");//$NON-NLS-1$
-		/**
-		 * Second tab is Shape
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Shape");//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(2));
-	}
-
-	/**
-	 * When the black triangle is selected, three tabs display.
-	 */
-	public void test_BlackTriangleStaticContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_STATIC);
-		select_blackTriangle();
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * Only three tabs displayed for static contribution.
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-	}
-
-	/**
-	 * When the black triangle is selected, four tabs display.
-	 */
-	public void test_BlackTriangleDynamicTabContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_TABS);
-		select_blackTriangle();
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * Fourth tab is Black
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(3).toString(), "Black");//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(4));
-	}
-
-	/**
-	 * When the black triangle is selected, three tabs display.
-	 */
-	public void test_BlackTriangleDynamicSectionContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS);
-		select_blackTriangle();
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * Only three tabs displayed for dynamic section contribution.
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-	}
-
-	/**
-	 * When the black triangle is selected, four 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 });
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Element");//$NON-NLS-1$
-		/**
-		 * Second tab is Shape
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Shape");//$NON-NLS-1$
-		/**
-		 * Third tab is Advanced
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Advanced");//$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();
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * Third tab is Advanced
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Advanced");//$NON-NLS-1$
-		/**
-		 * Only three tabs displayed for static contribution.
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-	}
-
-	/**
-	 * When the red star is selected, four tabs display.
-	 */
-	public void test_RedStarDynamicTabContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_TABS);
-		select_RedStar();
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * Third tab is Advanced
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Advanced");//$NON-NLS-1$
-		/**
-		 * Only three tabs displayed for dynamic tab contribution.
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-	}
-
-	/**
-	 * When the red star is selected, three tabs display.
-	 */
-	public void test_RedStarDynamicSectionContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS);
-		select_RedStar();
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * Third tab is Star
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Star");//$NON-NLS-1$
-		/**
-		 * Fourth tab is Advanced
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(3).toString(), "Advanced");//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(4));
-	}
-
-	/**
-	 * 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 });
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Element");//$NON-NLS-1$
-		/**
-		 * Second tab is Color
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Color");//$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 d94a988..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageOverrideTest.java
+++ /dev/null
@@ -1,288 +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;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Control;
-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.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyList;
-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;
-
-/**
- * Tests for the override tabs support.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class TabbedPropertySheetPageOverrideTest extends TestCase {
-
-	private OverrideTestsView overrideTestsView;
-
-	/**
-	 * Get the list of tabs from the tabbed properties view.
-	 * 
-	 * @return the tab list.
-	 */
-	private TabbedPropertyList getTabbedPropertyList() {
-		Control control = overrideTestsView.getTabbedPropertySheetPage()
-				.getControl();
-		assertTrue(control instanceof TabbedPropertyComposite);
-		TabbedPropertyComposite tabbedPropertyComposite = (TabbedPropertyComposite) control;
-		return tabbedPropertyComposite.getList();
-	}
-
-	/*
-	 * (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);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is "Empty Item"
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(),
-				"Empty Item");//$NON-NLS-1$
-		/**
-		 * No second tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(1));
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Error element is
-	 * selected.
-	 */
-	public void test_tabForError() {
-		/**
-		 * select "Error"
-		 */
-		overrideTestsView.setSelection(Error.class);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is "Information".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(),
-				"Information");//$NON-NLS-1$
-
-		/**
-		 * Second tab is "Warning".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Warning");//$NON-NLS-1$
-
-		/**
-		 * Third tab is "Error" and is selected.
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Error");//$NON-NLS-1$
-		assertTrue(tabbedPropertyList.getSelectionIndex() == 2);
-
-		/**
-		 * No fourth tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the File element is
-	 * selected.
-	 */
-	public void test_tabForFile() {
-		/**
-		 * select "File"
-		 */
-		overrideTestsView.setSelection(File.class);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is "File" and is selected.
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(), "File");//$NON-NLS-1$
-		assertTrue(tabbedPropertyList.getSelectionIndex() == 0);
-
-		/**
-		 * Second tab is "Folder".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Folder");//$NON-NLS-1$
-
-		/**
-		 * No third tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(2));
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Folder element
-	 * is selected.
-	 */
-	public void test_tabForFolder() {
-		/**
-		 * select "Folder"
-		 */
-		overrideTestsView.setSelection(Folder.class);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is "File".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(), "File");//$NON-NLS-1$
-
-		/**
-		 * Second tab is "Folder" and is selected.
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Folder");//$NON-NLS-1$
-		assertTrue(tabbedPropertyList.getSelectionIndex() == 1);
-
-		/**
-		 * No third tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(2));
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Information
-	 * element is selected.
-	 */
-	public void test_tabForInformation() {
-		/**
-		 * select "Information"
-		 */
-		overrideTestsView.setSelection(Information.class);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is "Information" and is selected.
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(),
-				"Information");//$NON-NLS-1$
-		assertTrue(tabbedPropertyList.getSelectionIndex() == 0);
-
-		/**
-		 * Second tab is "Warning".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Warning");//$NON-NLS-1$
-
-		/**
-		 * Third tab is "Error".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Error");//$NON-NLS-1$
-
-		/**
-		 * No fourth tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Warning element
-	 * is selected.
-	 */
-	public void test_tabForWarning() {
-		/**
-		 * select "Warning"
-		 */
-		overrideTestsView.setSelection(Warning.class);
-
-		TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-		/**
-		 * First tab is "Information".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(0).toString(),
-				"Information");//$NON-NLS-1$
-
-		/**
-		 * Second tab is "Warning" and is selected.
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Warning");//$NON-NLS-1$
-		assertTrue(tabbedPropertyList.getSelectionIndex() == 1);
-
-		/**
-		 * Third tab is "Error".
-		 */
-		assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Error");//$NON-NLS-1$
-
-		/**
-		 * No fourth tab
-		 */
-		assertNull(tabbedPropertyList.getElementAt(3));
-
-	}
-
-}
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 90749bf..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTest.java
+++ /dev/null
@@ -1,250 +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.TestCase;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.swt.widgets.Control;
-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.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyList;
-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.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);
-    }
-
-    /**
-     * Get the list of tabs from the tabbed properties view.
-     * 
-     * @return the tab list.
-     */
-    private TabbedPropertyList getTabbedPropertyList() {
-        Control control = testsView.getTabbedPropertySheetPage().getControl();
-        assertTrue(control instanceof TabbedPropertyComposite);
-        TabbedPropertyComposite tabbedPropertyComposite = (TabbedPropertyComposite) control;
-        return tabbedPropertyComposite.getList();
-    }
-
-    /**
-     * 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]});
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        /**
-         * First tab is Name
-         */
-        assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Name");//$NON-NLS-1$
-        /**
-         * Second tab is Information
-         */
-        assertEquals(tabbedPropertyList.getElementAt(1).toString(),
-            "Information");//$NON-NLS-1$
-        /**
-         * Third tab is Message
-         */
-        assertEquals(tabbedPropertyList.getElementAt(2).toString(), "Message");//$NON-NLS-1$
-        /**
-         * No fourth tab
-         */
-        assertNull(tabbedPropertyList.getElementAt(3));
-    }
-
-    /**
-     * 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]});
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        /**
-         * First tab is Information
-         */
-        assertEquals(tabbedPropertyList.getElementAt(0).toString(),
-            "Information");//$NON-NLS-1$
-        /**
-         * Second tab is Message
-         */
-        assertEquals(tabbedPropertyList.getElementAt(1).toString(), "Message");//$NON-NLS-1$
-        /**
-         * No other tab
-         */
-        assertNull(tabbedPropertyList.getElementAt(2));
-    }
-
-    /**
-     * 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]});
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        /**
-         * First tab is Information
-         */
-        assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Name");//$NON-NLS-1$
-        TabContents tabContents = testsView.getTabbedPropertySheetPage().getCurrentTab();
-        /**
-         * the tab has two sections.
-         */
-        ISection[] sections = tabContents.getSections();
-        assertEquals(sections.length, 2);
-        assertEquals(sections[0].getClass(), NameSection.class);
-        assertEquals(sections[1].getClass(), InformationTwoSection.class);
-    }
-
-    /**
-     * 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],});
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        /**
-         * Only tab is Message
-         */
-        assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Message");//$NON-NLS-1$
-        /**
-         * No other tab
-         */
-        assertNull(tabbedPropertyList.getElementAt(1));
-    }
-
-    /**
-     * 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],});
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        /**
-         * Only tab is Resource
-         */
-        assertEquals(tabbedPropertyList.getElementAt(0).toString(), "Resource");//$NON-NLS-1$
-        /**
-         * No other tab
-         */
-        assertNull(tabbedPropertyList.getElementAt(1));
-    }
-
-    /**
-     * 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);
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        assertNull(tabbedPropertyList.getElementAt(0));
-    }
-
-}
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 176b6bc..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTextTest.java
+++ /dev/null
@@ -1,126 +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;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.widgets.Control;
-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.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyList;
-import org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective;
-
-/**
- * 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()) {
-			//
-		}
-
-	}
-
-	/**
-	 * Get the list of tabs from the tabbed properties view.
-	 * 
-	 * @return the tab list.
-	 */
-	private TabbedPropertyList getTabbedPropertyList() {
-		Control control = textTestsView.getTabbedPropertySheetPage()
-				.getControl();
-		assertTrue(control instanceof TabbedPropertyComposite);
-		TabbedPropertyComposite tabbedPropertyComposite = (TabbedPropertyComposite) control;
-		return tabbedPropertyComposite.getList();
-	}
-	
-    /**
-     * When text is selected, there is one tab for each selected word.
-     */
-    public void test_tabForSelectedTextDisplay() {
-        /**
-         * select node 0 which is an Information
-         */
-        IDocument document = textTestsView.getViewer().getDocument();
-        document.set("This is a test");
-        textTestsView.getViewer().setSelectedRange(0, 14);
-        
-        TabbedPropertyList tabbedPropertyList = getTabbedPropertyList();
-        /**
-         * First tab is "This"
-         */
-        assertEquals(tabbedPropertyList.getElementAt(0).toString(), "This");//$NON-NLS-1$
-        /**
-         * Second tab is "is"
-         */
-        assertEquals(tabbedPropertyList.getElementAt(1).toString(),
-            "is");//$NON-NLS-1$
-        /**
-         * Third tab is "a"
-         */
-        assertEquals(tabbedPropertyList.getElementAt(2).toString(), "a");//$NON-NLS-1$
-        /**
-         * Third tab is "test"
-         */
-        assertEquals(tabbedPropertyList.getElementAt(3).toString(), "test");//$NON-NLS-1$
-        /**
-         * No fifth tab
-         */
-        assertNull(tabbedPropertyList.getElementAt(4));
-    }
-
-}
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 7fb2833..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelection.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.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() {
-		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 5c61859..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor.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.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;
-
-	public TextTestsSectionDescriptor(String aWord) {
-		super(null);
-		this.word = aWord;
-	}
-
-	public String getId() {
-		return word;
-	}
-
-	public ISection getSectionClass() {
-		return new TextTestsLabelSection(word);
-	}
-
-	public String getTargetTab() {
-		return word;
-	}
-
-}
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 29f4bcf..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptor.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.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));
-	}
-
-	public String getCategory() {
-		return "default"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return word;
-	}
-
-	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 f951a6a..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"/>
-	<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 1df15b6..0000000
--- a/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Wed Oct 17 16:19:53 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.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/.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 720adcb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/AllTests.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.jface.tests;
-
-import org.eclipse.jface.tests.labelProviders.DecoratingLabelProviderTests;
-
-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 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/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 5530808..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java
+++ /dev/null
@@ -1,65 +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);
-	}
-}
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/CheckboxTableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTableViewerTest.java
deleted file mode 100644
index e181651..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTableViewerTest.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.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-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.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;
-
-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);
-    }
-}
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 661cf0c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerTest.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.tests.viewers;
-
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-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);
-    }
-}
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 95905bf..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.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.SWT;
-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 ("carbon".equals(SWT.getPlatform())) {
-    		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/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 9508a64..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyVirtualTableView.java
+++ /dev/null
@@ -1,65 +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.ILazyContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The LazyVirtualTableView is the VirtualTableView with
- * lazy content.
- */
-public class LazyVirtualTableView extends VirtualTableView {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public LazyVirtualTableView() {
-		super();
-	}
-
-	/* (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("Element " + String.valueOf(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#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/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 5d5800d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/VirtualTableView.java
+++ /dev/null
@@ -1,144 +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) {
-
-				viewer.remove(((IStructuredSelection) viewer.getSelection()).toArray());
-			}
-		});
-
-	}
-
-	/**
-	 * 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/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 9b72de9..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);
-            assertTrue(label.equals(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 44bc31b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPageTest.java
+++ /dev/null
@@ -1,2226 +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.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.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.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.part.FileEditorInput;
-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;
-
-public class IWorkbenchPageTest extends UITestCase {
-
-	private IWorkbenchPage fActivePage;
-
-	private IWorkbenchWindow fWin;
-
-	private IProject proj;
-
-	public IWorkbenchPageTest(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 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(IPageLayout.ID_RES_NAV));
-		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));
-	}
-}
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 22fc317..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ConcurrencyTestSuite.java
+++ /dev/null
@@ -1,42 +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(NestedSyncExecDeadlockTest.class);
-        addTestSuite(TestBug98621.class);
-        addTestSuite(TestBug108162.class);
-        addTestSuite(TestBug138695.class);
-        addTestSuite(TransferRuleTest.class);
-        addTestSuite(ModalContextCrashTest.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/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/DynamicPluginsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicPluginsTestSuite.java
deleted file mode 100644
index 91fa7af..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicPluginsTestSuite.java
+++ /dev/null
@@ -1,60 +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));
-	}
-}
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/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 56516bb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/InternalTestSuite.java
+++ /dev/null
@@ -1,55 +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.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(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));
-    }
-}
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/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 56cd8bc..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.swt.SWT;
-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, SWT
-				.getPlatform(), Binding.SYSTEM, null);
-		bindingManager.addBinding(deletion);
-		final Binding platformSpecific = new TestBinding("platformSpecific",
-				na, na, null, SWT.getPlatform(), 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, SWT
-				.getPlatform(), Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		final Binding binding3 = new TestBinding("platform-specific", "na",
-				"na", null, SWT.getPlatform(), 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 e6e8d7b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingManagerTest.java
+++ /dev/null
@@ -1,957 +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());
-	}
-
-	/**
-	 * 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 695c04f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingPersistenceTest.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.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.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));
-    }
-}
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/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 cd831ca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersTestMarkersView.java
+++ /dev/null
@@ -1,149 +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();
-		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/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/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 386f968..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBaseTests.java
+++ /dev/null
@@ -1,141 +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;
-
-/**
- * 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
-		};
-		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.actions.CompoundContributionItem.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
-		};
-		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"
-		};
-
-	/**
-	 * @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 c2b9628..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenusTestSuite.java
+++ /dev/null
@@ -1,39 +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.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));
-    }
-}
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/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 b808872..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageEditor.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.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;
-	}
-
-	/**
-	 * 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 f2ff980..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageTest.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.ide.IDE;
-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 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.
-		IEditorPart part = openMultivarFile();
-
-		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.
-		IEditorPart part = openMultivarFile();
-
-		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.
-		// Create and open a blurb file.
-		IEditorPart part = openMultivarFile();
-
-		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() throws CoreException,
-			PartInitException {
-		IWorkbenchPage page = openTestWindow().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(MTEST01_FILE);
-		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.
-		IEditorPart part = openMultivarFile();
-
-		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));
-	}
-}
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 cadbf68..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkspaceOperationsTests.java
+++ /dev/null
@@ -1,2129 +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 {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testProject }, "testProjectDelete", false);
-		execute(op);
-		assertFalse("Project delete failed", testProject.exists());
-		undo();
-		assertTrue("Project recreation failed", testProject.exists());
-		// Ideally we could run this test everytime, but it fails intermittently
-		// because opening the recreated project occurs in the background, and
-		// the creation of the workspace representation for the disk contents
-		// may not have happened yet. This test always passes under debug where
-		// timing can be controlled.
-		// ***********
-		// 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 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/QuickAccessTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessTestSuite.java
deleted file mode 100644
index 6dc3909..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessTestSuite.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.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));
-    }
-}
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 e52e339..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java
+++ /dev/null
@@ -1,107 +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;
-
-/**
- * @since 3.1
- */
-public class SessionTests extends TestSuite {
-
-	/**
-	 * @return
-	 */
-	public static Test suite() {
-		return new SessionTests();
-	}
-
-	/**
-	 * 
-	 */
-	public SessionTests() {
-		addTweakletCheck();
-		addHandlerStateTests();
-		addIntroTests();
-		addEditorTests();
-		addViewStateTests();
-		addThemeTests();
-	}
-
-	/**
-	 * 
-	 */
-	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/StatusDialogManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogManagerTest.java
deleted file mode 100644
index b737bdd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogManagerTest.java
+++ /dev/null
@@ -1,587 +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.osgi.util.NLS;
-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;
-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);
-	}
-
-	/**
-	 * 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]);
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * 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 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());
-		}
-	}
-
-	/**
-	 * 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/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 e71a698..0000000
--- a/tests/org.eclipse.ui.tests/JFace-All Tests.launch
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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"/>
-<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"/>
-<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"/>
-<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 e3f8b7b..0000000
--- a/tests/org.eclipse.ui.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +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.1.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
-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 7480793..0000000
--- a/tests/org.eclipse.ui.tests/UI Test Suite.launch
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><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"/>
-<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"/>
-<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>
\ No newline at end of file
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 9b84fd3..0000000
--- a/tests/org.eclipse.ui.tests/UI-Parts References Test Suite.launch
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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"/>
-<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"/>
-<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"/>
-<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-Session Tests.launch b/tests/org.eclipse.ui.tests/UI-Session Tests.launch
deleted file mode 100644
index 2fd5f0e..0000000
--- a/tests/org.eclipse.ui.tests/UI-Session Tests.launch
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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"/>
-<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"/>
-<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"/>
-<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 a9e25c7..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes.txt
+++ /dev/null
@@ -1 +0,0 @@
-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 44defc3..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/.classpath
+++ /dev/null
@@ -1,23 +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="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 37a5b30..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/build.properties
+++ /dev/null
@@ -1,29 +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/,\
-           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 0b27609..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/build.xml
+++ /dev/null
@@ -1,124 +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, 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="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/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.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 d1a2db3..0000000
--- a/tests/org.eclipse.ui.tests/plugin.xml
+++ /dev/null
@@ -1,3952 +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>
-   </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
-            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>   
-</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
-
