diff --git a/org.eclipse.core.variables/.classpath b/org.eclipse.core.variables/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/org.eclipse.core.variables/.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/org.eclipse.core.variables/.cvsignore b/org.eclipse.core.variables/.cvsignore
deleted file mode 100644
index 6938697..0000000
--- a/org.eclipse.core.variables/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-doc
diff --git a/org.eclipse.core.variables/.project b/org.eclipse.core.variables/.project
deleted file mode 100644
index efb82a1..0000000
--- a/org.eclipse.core.variables/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.variables</name>
-	<comment></comment>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.core.variables/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.core.variables/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 12c548f..0000000
--- a/org.eclipse.core.variables/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,69 +0,0 @@
-#Tue Sep 26 09:45:11 CDT 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=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.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-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=ignore
-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=public
-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=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-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=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-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=disabled
-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/org.eclipse.core.variables/.settings/org.eclipse.pde.prefs b/org.eclipse.core.variables/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 7eebeb8..0000000
--- a/org.eclipse.core.variables/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,17 +0,0 @@
-#Tue Jan 30 11:38:48 CST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.missing-packages=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=0
-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/org.eclipse.core.variables/META-INF/MANIFEST.MF b/org.eclipse.core.variables/META-INF/MANIFEST.MF
deleted file mode 100644
index 2144a0d..0000000
--- a/org.eclipse.core.variables/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.variables; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-Activator: org.eclipse.core.variables.VariablesPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.internal.variables;x-internal:=true,
- org.eclipse.core.variables
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.3.0,4.0.0)"
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/org.eclipse.core.variables/about.html b/org.eclipse.core.variables/about.html
deleted file mode 100644
index 4602330..0000000
--- a/org.eclipse.core.variables/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/org.eclipse.core.variables/build.properties b/org.eclipse.core.variables/build.properties
deleted file mode 100644
index bcf8553..0000000
--- a/org.eclipse.core.variables/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               .,\
-               about.html,\
-               META-INF/
-source.. = src/
-src.includes = about.html,\
-               schema/
diff --git a/org.eclipse.core.variables/component.xml b/org.eclipse.core.variables/component.xml
deleted file mode 100644
index e68c3cd..0000000
--- a/org.eclipse.core.variables/component.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/component"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://eclipse.org/component ../component.xsd "
-   name="Eclipse Platform Core Variables">
- <plugin id="org.eclipse.core.variables" />
-
- <package name="org.eclipse.core.variables">
- 	<type name="IDynamicVariable" implement="false" />
- 	<type name="IDynamicVariableResolver" />
- 	<type name="IStringVariable" implement="false" />
- 	<type name="IStringVariableManager" implement="false" />
- 	<type name="IValueVariable" implement="false" />
- 	<type name="IValueVariableInitializer" />
- 	<type name="IValueVariableListener" />
- 	<type name="VariablesPlugin" instantiate="false" subclass="false" />
- </package>
- 
- <component-depends unrestricted="true"/>
-
-</component>
\ No newline at end of file
diff --git a/org.eclipse.core.variables/plugin.properties b/org.eclipse.core.variables/plugin.properties
deleted file mode 100644
index 88108aa..0000000
--- a/org.eclipse.core.variables/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-pluginName=Core Variables
-providerName=Eclipse.org
-valueVariablesExtensionPointName=Value Variables
-dynamicVariablesExtensionPointName=Dynamic Variables
-eclipse_home.description=The location of the base installation for the running platform
diff --git a/org.eclipse.core.variables/plugin.xml b/org.eclipse.core.variables/plugin.xml
deleted file mode 100644
index 97246bb..0000000
--- a/org.eclipse.core.variables/plugin.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    <extension-point id="valueVariables" name="%valueVariablesExtensionPointName" schema="schema/valueVariables.exsd"/>
-   <extension-point id="dynamicVariables" name="%dynamicVariablesExtensionPointName" schema="schema/dynamicVariables.exsd"/>
-   <extension
-         point="org.eclipse.core.variables.dynamicVariables">
-      <variable
-            description="%eclipse_home.description"
-            name="eclipse_home"
-            resolver="org.eclipse.core.internal.variables.EclipseHomeVariableResolver"
-            supportsArgument="false"/>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.core.variables/schema/dynamicVariables.exsd b/org.eclipse.core.variables/schema/dynamicVariables.exsd
deleted file mode 100644
index 5168a89..0000000
--- a/org.eclipse.core.variables/schema/dynamicVariables.exsd
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.variables">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.variables" id="dynamicVariables" name="Dynamic String Substitution Variables"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for defining dynamic variables used in string substitution. The value of a dynamic variable is resolved at the time a string substitution is performed, with an optional argument.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="variable" 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="variable">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique name for this variable.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="resolver" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a Java class which implements &lt;code&gt;org.eclipse.core.variables.IDynamicVariableResolver&lt;/code&gt;, which is used to determine the value of the variable
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.variables.IDynamicVariableResolver"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a human-readable description of this variable
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="supportsArgument" type="boolean">
-            <annotation>
-               <documentation>
-                  Whether this variable supports an argument. When unspecified, the implied value is &lt;code&gt;true&lt;/code&gt;.
-               </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 a definition of a dynamic variable that resolves to the name of the selected resource:
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.core.variables.dynamicVariables&quot;&gt;
-   &lt;variable 
-      name=&quot;resource_name&quot;
-      expanderClass=&quot;com.example.ResourceNameExpander&quot;
-      description=&quot;The name of the selected resource&quot;&gt;
-   &lt;/variable&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;resolver&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.core.variables.IDynamicVariableResolver&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2003, 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/org.eclipse.core.variables/schema/valueVariables.exsd b/org.eclipse.core.variables/schema/valueVariables.exsd
deleted file mode 100644
index 7dd314c..0000000
--- a/org.eclipse.core.variables/schema/valueVariables.exsd
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.variables">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.variables" id="valueVariables" name="Value Variables"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for defining variables used for string substitution. A value variable has a static value.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="variable" 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="variable">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique name for this variable.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="readOnly" type="boolean">
-            <annotation>
-               <documentation>
-                  Specifies whether this variable is read only. When true, this variable&apos;s value will always be derived from the extension and cannot be edited by the user. When false, this variable&apos;s value will be initialized from any &lt;code&gt;initialValue&lt;/code&gt; attribtue or initializer class, and can be modified by the user. Once a read-write variable is modified, it&apos;s value is persisted and overrides any value specified by an extension&apos;s &lt;code&gt;initialValue&lt;/code&gt; or initializer class. When unspecified, the value of this attribute is &lt;code&gt;false&lt;/code&gt;. This attribute was added in the 3.3 release.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="initialValue" type="string">
-            <annotation>
-               <documentation>
-                  specifies the initial value for this variable. When specified, an &lt;code&gt;initializerClass&lt;/code&gt; attribute must not be specified.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="initializerClass" type="string">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;org.eclipse.core.variables.IValueVariableInitializer&lt;/code&gt;. When specified, an &lt;code&gt;initialValue&lt;/code&gt; attribute must not be specified.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.variables.IValueVariableInitializer"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  specifies a human-readable description of this variable.
-               </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 value variable contribution with an initial value:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.core.variables.valueVariables&quot;&gt;
-  &lt;variable
-   name=&quot;FOO_HOME&quot;
-   initialValue=&quot;/usr/local/foo&quot;&gt;
-  &lt;/variable&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified variable is created with the initial value &quot;/usr/local/foo&quot;.
-
-         The following is an example of a value variable contribution with an initializer class:
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.core.variables.valueVariables&quot;&gt;
-  &lt;variable
-   name=&quot;FOO_HOME&quot;
-   initializerClass=&quot;com.example.FooLocator&quot;&gt;
-  &lt;/variable&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the variable FOO_HOME is created and the class &quot;com.example.FooLocator&quot; will be
-used to initialize the value the first time it&apos;s requested.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;initializerClass&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.core.variables.IValueVariableInitializer&lt;/b&gt;.
-      </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/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/ContributedValueVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/ContributedValueVariable.java
deleted file mode 100644
index f53bf67..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/ContributedValueVariable.java
+++ /dev/null
@@ -1,142 +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.internal.variables;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.IValueVariableInitializer;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Implementation of a value variable.
- */
-public class ContributedValueVariable extends StringVariable implements IValueVariable {
-	
-	/**
-	 * Variable value or <code>null</code> if none 
-	 */
-	private String fValue;
-	
-	/**
-	 * Whether this variable's value has been initialized
-	 */
-	private boolean fInitialized = false;
-	
-	/**
-	 * Whether this variable is read only.  If true, users cannot change the value.
-	 */
-	private boolean fReadOnly;
-	
-	/**
-	 * Constructs a new value variable with the given name, description, read only
-	 * property and associated configuration element.  The value will be initialized
-	 * from the configuration element the first time getValue() is called.
-	 * 
-	 * @param name variable name
-	 * @param description variable description or <code>null</code>
-	 * @param readOnly whether the variable should be a read only variable
-	 * @param configurationElement configuration element
-	 */
-	public ContributedValueVariable(String name, String description, boolean readOnly, IConfigurationElement configurationElement) {
-		super(name, description, configurationElement);
-		fReadOnly = readOnly;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		if (!isReadOnly() || !isInitialized()){
-			fValue = value;
-			setInitialized(true);
-			StringVariableManager.getDefault().notifyChanged(this);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#getValue()
-	 */
-	public String getValue() {
-		if (!isInitialized()) {
-			initialize();
-		}
-		return fValue;
-	}
-
-	/**
-	 * Initialize this variable's value from the configuration element.
-	 */
-	private void initialize() {
-		if (getConfigurationElement() != null) {
-			// check for a explicit value specified in plug-in XML
-			String value = getConfigurationElement().getAttribute("initialValue"); //$NON-NLS-1$
-			if (value == null) {
-				// check for initializer
-				String className = getConfigurationElement().getAttribute("initializerClass"); //$NON-NLS-1$
-				if (className != null) {
-					try {
-						Object object = getConfigurationElement().createExecutableExtension("initializerClass"); //$NON-NLS-1$
-						if (object instanceof IValueVariableInitializer) {
-							IValueVariableInitializer initializer = (IValueVariableInitializer)object;
-							initializer.initialize(this);
-						} else {
-							VariablesPlugin.logMessage(NLS.bind("Unable to initialize variable {0} - initializer must be an instance of IValueVariableInitializer.", new String[]{getName()}), null); //$NON-NLS-1$
-						}
-					} catch (CoreException e) {
-						VariablesPlugin.logMessage(NLS.bind("Unable to initialize variable {0}",new String[]{getName()}), e); //$NON-NLS-1$
-					}
-				}
-			} else {
-				setValue(value);
-			}
-		}
-		setInitialized(true);
-	}
-
-	/**
-	 * Returns whether this variable has been initialized with a value by one of:
-	 * <ul>
-	 * <li><code>setValue(String)</code></li>
-	 * <li>its configuration element's <code>initialValue</code> attribute</li>
-	 * <li>its configuration element's initializer</li>
-	 * </ul>
-	 * @return whether this variable has been initialized with a value
-	 */	
-	protected boolean isInitialized() {
-		return fInitialized;
-	} 
-	
-	/**
-	 * Sets whether this variable has been initialized with a value.
-	 *  
-	 * @param initialized whether this variable has been initialized
-	 */
-	protected void setInitialized(boolean initialized) {
-		fInitialized = initialized;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#isReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return fReadOnly;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#isContributed()
-	 */
-	public boolean isContributed() {
-		return getConfigurationElement() != null;
-	}
-
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/DynamicVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/DynamicVariable.java
deleted file mode 100644
index f2d48d8..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/DynamicVariable.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.core.internal.variables;
-
-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.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Dynamic variable
- */
-public class DynamicVariable extends StringVariable implements IDynamicVariable {
-	
-	/**
-	 * Resolver, or <code>null</code> until needed
-	 */
-	private IDynamicVariableResolver fResolver;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IContextVariable#getValue(java.lang.String)
-	 */
-	public String getValue(String argument) throws CoreException {
-		if (!supportsArgument()) {
-			// check for an argument - not supported
-			if (argument != null && argument.length() > 0) {
-				throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind(VariablesMessages.DynamicVariable_0, new String[]{argument, getName()}), null)); 
-			}
-		}
-		if (fResolver == null) {
-			String name = getConfigurationElement().getAttribute("resolver"); //$NON-NLS-1$
-			if (name == null) {
-				throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind("Contributed context variable {0} must specify a resolver.",new String[]{getName()}), null)); //$NON-NLS-1$
-			}
-			Object object = getConfigurationElement().createExecutableExtension("resolver"); //$NON-NLS-1$
-			if (object instanceof IDynamicVariableResolver) {
-				fResolver = (IDynamicVariableResolver)object;
-			} else {
-				throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind("Contributed context variable resolver for {0} must be an instance of IContextVariableResolver.",new String[]{getName()}), null)); //$NON-NLS-1$
-			}
-		}
-		return fResolver.resolveValue(this, argument);
-	}
-
-	/**
-	 * Constructs a new context variable.
-	 * 
-	 * @param name variable name
-	 * @param description variable description or <code>null</code>
-	 * @param configurationElement configuration element
-	 */
-	public DynamicVariable(String name, String description, IConfigurationElement configurationElement) {
-		super(name, description, configurationElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IDynamicVariable#supportsArgument()
-	 */
-	public boolean supportsArgument() {
-		String arg = getConfigurationElement().getAttribute("supportsArgument"); //$NON-NLS-1$
-		return arg == null || Boolean.valueOf(arg).booleanValue();
-	}
-	
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/EclipseHomeVariableResolver.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/EclipseHomeVariableResolver.java
deleted file mode 100644
index 17ca4a1..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/EclipseHomeVariableResolver.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
- *     Bjorn Freeman-Benson - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.variables;
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.osgi.service.datalocation.Location;
-
-/**
- * Resolver for ${eclipse_home}
- * 
- * @since 3.2
- */
-public class EclipseHomeVariableResolver implements IDynamicVariableResolver {
-
-    public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-        Location installLocation = Platform.getInstallLocation();
-        if (installLocation != null) {
-            URL url = installLocation.getURL();
-            if (url != null) {
-                String file = url.getFile();
-                if (file.length() != 0) {
-                    return file;
-                }
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringSubstitutionEngine.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringSubstitutionEngine.java
deleted file mode 100644
index 94bd5d7..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringSubstitutionEngine.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.variables;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Stack;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Performs string substitution for context and value variables.
- */
-public class StringSubstitutionEngine {
-	
-	// delimiters
-	private static final String VARIABLE_START = "${"; //$NON-NLS-1$
-	private static final char VARIABLE_END = '}'; 
-	private static final char VARIABLE_ARG = ':'; 
-	// parsing states
-	private static final int SCAN_FOR_START = 0;
-	private static final int SCAN_FOR_END = 1;
-	
-	/**
-	 * Resulting string
-	 */
-	private StringBuffer fResult;
-	
-	/**
-	 * Whether substitutions were performed
-	 */
-	private boolean fSubs;
-	
-	/**
-	 * Stack of variables to resolve
-	 */
-	private Stack fStack;
-	
-	class VariableReference {
-		
-		// the text inside the variable reference
-		private StringBuffer fText;
-		
-		public VariableReference() {
-			fText = new StringBuffer();
-		}
-		
-		public void append(String text) {
-			fText.append(text);
-		}
-		
-		public String getText() {
-			return fText.toString();
-		}
-	
-	}
-	
-	/**
-	 * Performs recursive string substitution and returns the resulting string.
-	 * 
-	 * @param expression expression to resolve
-	 * @param reportUndefinedVariables whether to report undefined variables as an error
-	 * @param manager registry of variables
-	 * @return the resulting string with all variables recursively
-	 *  substituted
-	 * @exception CoreException if unable to resolve a referenced variable or if a cycle exists
-	 *  in referenced variables
-	 */
-	public String performStringSubstitution(String expression, boolean reportUndefinedVariables, boolean resolveVariables, IStringVariableManager manager) throws CoreException {
-		substitute(expression, reportUndefinedVariables, resolveVariables, manager);
-		List resolvedVariableSets = new ArrayList();
-		while (fSubs) {
-			HashSet resolved = substitute(fResult.toString(), reportUndefinedVariables, true, manager);			
-			
-			for(int i=resolvedVariableSets.size()-1; i>=0; i--) {
-				
-				HashSet prevSet = (HashSet)resolvedVariableSets.get(i);
-
-				if (prevSet.equals(resolved)) {
-					HashSet conflictingSet = new HashSet();
-					for (; i<resolvedVariableSets.size(); i++)
-						conflictingSet.addAll((HashSet)resolvedVariableSets.get(i));
-					
-					StringBuffer problemVariableList = new StringBuffer();
-					for (Iterator it=conflictingSet.iterator(); it.hasNext(); ) {
-						problemVariableList.append(it.next().toString());
-						problemVariableList.append(", "); //$NON-NLS-1$
-					}
-					problemVariableList.setLength(problemVariableList.length()-2); //truncate the last ", "
-					throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.REFERENCE_CYCLE_ERROR, NLS.bind(VariablesMessages.StringSubstitutionEngine_4, new String[]{problemVariableList.toString()}), null)); 
-				}				
-			}		
-			
-			resolvedVariableSets.add(resolved);			
-		}
-		return fResult.toString();
-	}
-	
-	/**
-	 * Performs recursive string validation to ensure that all of the variables
-	 * contained in the expression exist
-	 * @param expression expression to validate
-	 * @param manager registry of variables
-	 * @exception CoreException if a referenced variable does not exist or if a cycle exists
-	 *  in referenced variables
-	 */
-	public void validateStringVariables(String expression, IStringVariableManager manager) throws CoreException {
-		performStringSubstitution(expression, true, false, manager);
-	}
-	
-	/**
-	 * Makes a substitution pass of the given expression returns a Set of the variables that were resolved in this
-	 *  pass
-	 *  
-	 * @param expression source expression
-	 * @param reportUndefinedVariables whether to report undefined variables as an error
-	 * @param resolveVariables whether to resolve the value of any variables
-	 * @exception CoreException if unable to resolve a variable
-	 */
-	private HashSet substitute(String expression, boolean reportUndefinedVariables, boolean resolveVariables, IStringVariableManager manager) throws CoreException {
-		fResult = new StringBuffer(expression.length());
-		fStack = new Stack();
-		fSubs = false;
-		
-		HashSet resolvedVariables = new HashSet();
-
-		int pos = 0;
-		int state = SCAN_FOR_START;
-		while (pos < expression.length()) {
-			switch (state) {
-				case SCAN_FOR_START:
-					int start = expression.indexOf(VARIABLE_START, pos);
-					if (start >= 0) {
-						int length = start - pos;
-						// copy non-variable text to the result
-						if (length > 0) {
-							fResult.append(expression.substring(pos, start));
-						}
-						pos = start + 2;
-						state = SCAN_FOR_END;
-
-						fStack.push(new VariableReference());						
-					} else {
-						// done - no more variables
-						fResult.append(expression.substring(pos));
-						pos = expression.length();
-					}
-					break;
-				case SCAN_FOR_END:
-					// be careful of nested variables
-					start = expression.indexOf(VARIABLE_START, pos);
-					int end = expression.indexOf(VARIABLE_END, pos);
-					if (end < 0) {
-						// variables are not completed
-						VariableReference tos = (VariableReference)fStack.peek();
-						tos.append(expression.substring(pos));
-						pos = expression.length();
-					} else {
-						if (start >= 0 && start < end) {
-							// start of a nested variable
-							int length = start - pos;
-							if (length > 0) {
-								VariableReference tos = (VariableReference)fStack.peek();
-								tos.append(expression.substring(pos, start));
-							}
-							pos = start + 2;
-							fStack.push(new VariableReference());	
-						} else {
-							// end of variable reference
-							VariableReference tos = (VariableReference)fStack.pop();
-							String substring = expression.substring(pos, end);							
-							tos.append(substring);
-							resolvedVariables.add(substring);
-							
-							pos = end + 1;
-							String value= resolve(tos, reportUndefinedVariables, resolveVariables, manager);
-							if (value == null) {
-								value = ""; //$NON-NLS-1$
-							}
-							if (fStack.isEmpty()) {
-								// append to result
-								fResult.append(value);
-								state = SCAN_FOR_START;
-							} else {
-								// append to previous variable
-								tos = (VariableReference)fStack.peek();
-								tos.append(value);
-							}
-						}
-					}
-					break;
-			}
-		}
-		// process incomplete variable references
-		while (!fStack.isEmpty()) {
-			VariableReference tos = (VariableReference)fStack.pop();
-			if (fStack.isEmpty()) {
-				fResult.append(VARIABLE_START);
-				fResult.append(tos.getText());
-			} else {
-				VariableReference var = (VariableReference)fStack.peek();
-				var.append(VARIABLE_START);
-				var.append(tos.getText());
-			}
-		}
-		
-
-		return resolvedVariables;
-	}
-
-	/**
-	 * Resolve and return the value of the given variable reference,
-	 * possibly <code>null</code>. 
-	 * 
-	 * @param var
-	 * @param reportUndefinedVariables whether to report undefined variables as
-	 *  an error
-	 * @param resolveVariables whether to resolve the variables value or just to validate that this variable is valid
-	 * @param manager variable registry
-	 * @return variable value, possibly <code>null</code>
-	 * @exception CoreException if unable to resolve a value
-	 */
-	private String resolve(VariableReference var, boolean reportUndefinedVariables, boolean resolveVariables, IStringVariableManager manager) throws CoreException {
-		String text = var.getText();
-		int pos = text.indexOf(VARIABLE_ARG);
-		String name = null;
-		String arg = null;
-		if (pos > 0) {
-			name = text.substring(0, pos);
-			pos++;
-			if (pos < text.length()) {
-				arg = text.substring(pos);
-			} 
-		} else {
-			name = text;
-		}
-		IValueVariable valueVariable = manager.getValueVariable(name);
-		if (valueVariable == null) {
-			IDynamicVariable dynamicVariable = manager.getDynamicVariable(name);
-			if (dynamicVariable == null) {
-				// no variables with the given name
-				if (reportUndefinedVariables) {
-					throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind(VariablesMessages.StringSubstitutionEngine_3, new String[]{name}), null)); 
-				} 
-				// leave as is
-				return getOriginalVarText(var);
-			} 
-			
-			if (resolveVariables) {
-				fSubs = true;
-				return dynamicVariable.getValue(arg);
-			} 
-			//leave as is
-			return getOriginalVarText(var);
-		} 
-		
-		if (arg == null) {
-			if (resolveVariables) {
-				fSubs = true;
-				return valueVariable.getValue();
-			} 
-			//leave as is
-			return getOriginalVarText(var);
-		} 
-		// error - an argument specified for a value variable
-		throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind(VariablesMessages.StringSubstitutionEngine_4, new String[]{valueVariable.getName()}), null)); 
-	}
-
-	private String getOriginalVarText(VariableReference var) {
-		StringBuffer res = new StringBuffer(var.getText());
-		res.insert(0, VARIABLE_START);
-		res.append(VARIABLE_END);
-		return res.toString();
-	}
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringVariable.java
deleted file mode 100644
index 498b411..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringVariable.java
+++ /dev/null
@@ -1,81 +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.internal.variables;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.variables.IStringVariable;
-
-/**
- * Common implementation of context and value variables
- */
-public abstract class StringVariable implements IStringVariable {
-	
-	/**
-	 * Variable name
-	 */
-	private String fName;
-	
-	/**
-	 * Variable description, or <code>null</code>
-	 */
-	private String fDescription;
-	
-	/**
-	 * Configuration element associated with this variable, or <code>null</code>
-	 */
-	private IConfigurationElement fConfigurationElement;
-
-	/**
-	 * Constructs a new variable with the given name, description and configuration element.
-	 * 
-	 * @param name variable name
-	 * @param description variable description, or <code>null</code>
-	 * @param configurationElement configuration element or <code>null</code>
-	 */
-	public StringVariable(String name, String description, IConfigurationElement configurationElement) {
-		fName = name;
-		fDescription = description;
-		fConfigurationElement = configurationElement;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariable#getName()
-	 */
-	public String getName() {
-		return fName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariable#getDescription()
-	 */
-	public String getDescription() {
-		return fDescription;
-	}
-	
-	/**
-	 * Returns the configuration element associated with this variable, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return configuration element or <code>null</code>
-	 */
-	protected IConfigurationElement getConfigurationElement() {
-		return fConfigurationElement;
-	}
-	
-	/**
-	 * @see IValueVariable#setDescription(String)
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		fDescription = description;
-	}
-
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringVariableManager.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringVariableManager.java
deleted file mode 100644
index 6338cda..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/StringVariableManager.java
+++ /dev/null
@@ -1,601 +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.internal.variables;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.IValueVariableListener;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.osgi.util.NLS;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Singleton string variable manager. 
- */
-public class StringVariableManager implements IStringVariableManager, IPropertyChangeListener {
-	
-	/**
-	 * Dynamic variables - maps variable names to variables.
-	 */
-	private Map fDynamicVariables;
-	
-	/**
-	 * Value variables - maps variable names to variables.
-	 */
-	private Map fValueVariables;
-	
-	/**
-	 * Variable listeners
-	 */
-	private ListenerList fListeners;
-	
-	// notifications
-	private static final int ADDED = 0;
-	private static final int CHANGED = 1;
-	private static final int REMOVED = 2;
-	
-	/**
-	 * Singleton variable manager.
-	 */
-	private static StringVariableManager fgManager; 
-	
-	// true during internal updates indicates that change notification
-	// should be suppressed/ignored.
-	private boolean fInternalChange = false;
-	
-	// Variable extension point constants
-	private static final String ATTR_NAME= "name"; //$NON-NLS-1$
-	private static final String ATTR_DESCRIPTION="description"; //$NON-NLS-1$
-	private static final String ATTR_READ_ONLY="readOnly"; //$NON-NLS-1$	
-	// Persisted variable XML constants
-	private static final String VALUE_VARIABLES_TAG= "valueVariables"; //$NON-NLS-1$
-	private static final String VALUE_VARIABLE_TAG= "valueVariable"; //$NON-NLS-1$
-	private static final String NAME_TAG= "name"; //$NON-NLS-1$
-	private static final String VALUE_TAG= "value"; //$NON-NLS-1$
-	private static final String DESCRIPTION_TAG="description"; //$NON-NLS-1$
-	private static final String READ_ONLY_TAG="readOnly"; //$NON-NLS-1$
-	// XML values
-	private static final String TRUE_VALUE= "true"; //$NON-NLS-1$
-	private static final String FALSE_VALUE= "false"; //$NON-NLS-1$
-	// preference store key for value variables
-	private static final String PREF_VALUE_VARIABLES= VariablesPlugin.getUniqueIdentifier() + ".valueVariables"; //$NON-NLS-1$	
-		
-	/**
-	 * Notifies a string variable listener in a safe runnable to handle
-	 * exceptions.
-	 */
-	class StringVariableNotifier implements ISafeRunnable {
-		
-		private IValueVariableListener fListener;
-		private int fType;
-		private IValueVariable[] fVariables;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, "An exception occurred during string variable change notification", exception); //$NON-NLS-1$
-			VariablesPlugin.log(status);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.variablesAdded(fVariables);
-					break;
-				case REMOVED:
-					fListener.variablesRemoved(fVariables);
-					break;
-				case CHANGED:
-					fListener.variablesChanged(fVariables);
-					break;
-			}			
-		}
-
-		/**
-		 * Notifies the given listener of the add/change/remove
-		 * 
-		 * @param listener the listener to notify
-		 * @param launch the launch that has changed
-		 * @param update the type of change
-		 */
-		public void notify(IValueVariable[] variables, int update) {
-			fVariables = variables;
-			fType = update;
-			Object[] copiedListeners= fListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IValueVariableListener)copiedListeners[i];
-				SafeRunner.run(this);
-			}	
-			fVariables = null;
-			fListener = null;
-			// persist variables whenever there is an add/change/remove	
-			storeValueVariables();	
-		}
-	}	
-	
-	/**
-	 * Returns a new notifier.
-	 * 
-	 * @return a new notifier
-	 */
-	private StringVariableNotifier getNotifier() {
-		return new StringVariableNotifier();
-	}
-	
-	/**
-	 * Returns the default string variable manager
-	 * 
-	 * @return string variable manager
-	 */
-	public static StringVariableManager getDefault() {
-		if (fgManager == null) {
-			fgManager = new StringVariableManager();
-		}
-		return fgManager;
-	}
-	
-	/**
-	 * Constructs a new string variable manager. 
-	 */
-	private StringVariableManager() {
-		fListeners = new ListenerList();
-	}	
-
-	/**
-	 * Load contributed variables and persisted variables
-	 */
-	private synchronized void initialize() {
-		if (fDynamicVariables == null) {
-			fInternalChange = true;
-			fDynamicVariables = new HashMap(5);
-			fValueVariables = new HashMap(5);
-			loadContributedValueVariables();
-			loadPersistedValueVariables();
-			loadDynamicVariables();
-			VariablesPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(this);
-			fInternalChange = false;
-		}
-	}
-	
-	/**
-	 * Loads contributed dynamic variables
-	 */
-	private void loadDynamicVariables() {
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(VariablesPlugin.PI_CORE_VARIABLES, EXTENSION_POINT_DYNAMIC_VARIABLES);
-		IConfigurationElement elements[]= point.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			String name= element.getAttribute(ATTR_NAME);
-			if (name == null) {
-				VariablesPlugin.logMessage(NLS.bind("Variable extension missing required 'name' attribute: {0}", new String[] {element.getDeclaringExtension().getLabel()}), null); //$NON-NLS-1$
-				continue;
-			}
-			String description= element.getAttribute(ATTR_DESCRIPTION);
-			DynamicVariable variable= new DynamicVariable(name, description, element);
-			fDynamicVariables.put(variable.getName(), variable);
-		}
-	}
-
-	/**
-	 * Loads contributed value variables. This is done before loading persisted values.
-	 */
-	private void loadContributedValueVariables() {
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(VariablesPlugin.PI_CORE_VARIABLES, EXTENSION_POINT_VALUE_VARIABLES);
-		IConfigurationElement elements[]= point.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			String name= element.getAttribute(ATTR_NAME);
-			if (name == null) {
-				VariablesPlugin.logMessage(NLS.bind("Variable extension missing required 'name' attribute: {0}", new String[] {element.getDeclaringExtension().getLabel()}), null); //$NON-NLS-1$
-				continue;
-			}
-			String description= element.getAttribute(ATTR_DESCRIPTION);
-			boolean isReadOnly = TRUE_VALUE.equals(element.getAttribute(ATTR_READ_ONLY));
-			
-			IValueVariable variable = new ContributedValueVariable(name, description, isReadOnly, element);
-			fValueVariables.put(name, variable);		
-		}		
-	}
-
-	/**
-	 * Loads persisted value variables from the preference store.  This is done after
-	 * loading value variables from the extension point.  If a persisted variable has the 
-	 * same name as a extension contributed variable the variable's value will be set to
-	 * the persisted value unless either a) The persisted value is <code>null</code>, or
-	 * b) the variable is read-only.
-	 */
-	private void loadPersistedValueVariables() {
-		String variablesString= VariablesPlugin.getDefault().getPluginPreferences().getString(PREF_VALUE_VARIABLES);
-		if (variablesString.length() == 0) {
-			return;
-		}
-		Element root= null;
-		Throwable ex = null;
-		try {
-			ByteArrayInputStream stream = new ByteArrayInputStream(variablesString.getBytes("UTF-8")); //$NON-NLS-1$
-			DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-			parser.setErrorHandler(new DefaultHandler());
-			root = parser.parse(stream).getDocumentElement();
-		} catch (UnsupportedEncodingException e) {
-			ex = e;
-		} catch (ParserConfigurationException e) {
-			ex = e;
-		} catch (FactoryConfigurationError e) {
-			ex = e;
-		} catch (SAXException e) {
-			ex = e;
-		} catch (IOException e) {
-			ex = e;
-		}
-		if (ex != null) {
-			VariablesPlugin.logMessage("An exception occurred while loading persisted value variables.", ex); //$NON-NLS-1$
-			return;
-		}
-		if (!root.getNodeName().equals(VALUE_VARIABLES_TAG)) {
-			VariablesPlugin.logMessage("Invalid format encountered while loading persisted value variables.", null); //$NON-NLS-1$
-			return;
-		}
-		NodeList list= root.getChildNodes();
-		for (int i= 0, numItems= list.getLength(); i < numItems; i++) {
-			Node node= list.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element element= (Element) node;
-				if (!element.getNodeName().equals(VALUE_VARIABLE_TAG)) {
-					VariablesPlugin.logMessage(NLS.bind("Invalid XML element encountered while loading value variables: {0}", new String[] {node.getNodeName()}), null); //$NON-NLS-1$
-					continue;
-				}
-				String name= element.getAttribute(NAME_TAG);
-				if (name.length() > 0) {
-					String value= element.getAttribute(VALUE_TAG);
-					String description= element.getAttribute(DESCRIPTION_TAG);
-					boolean readOnly= TRUE_VALUE.equals(element.getAttribute(READ_ONLY_TAG));
-				
-					IValueVariable existing = getValueVariable(name);
-					if (existing == null){
-						ValueVariable variable = new ValueVariable(name, description, readOnly, value);
-						fValueVariables.put(name, variable);
-					} else if (!existing.isReadOnly() && value != null){
-						existing.setValue(value);
-					}
-				} else {
-					VariablesPlugin.logMessage("Invalid variable entry encountered while loading value variables. Variable name is null.", null); //$NON-NLS-1$
-				}
-			}
-		}		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#getVariables()
-	 */
-	public synchronized IStringVariable[] getVariables() {
-		initialize();
-		List list = new ArrayList(fDynamicVariables.size() + fValueVariables.size());
-		list.addAll(fDynamicVariables.values());
-		list.addAll(fValueVariables.values());
-		return (IStringVariable[]) list.toArray(new IStringVariable[list.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#getValueVariables()
-	 */
-	public synchronized IValueVariable[] getValueVariables() {
-		initialize();
-		return (IValueVariable[]) fValueVariables.values().toArray(new IValueVariable[fValueVariables.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#getDynamicVariables()
-	 */
-	public synchronized IDynamicVariable[] getDynamicVariables() {
-		initialize();
-		return (IDynamicVariable[]) fDynamicVariables.values().toArray(new IDynamicVariable[fDynamicVariables.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#performStringSubstitution(java.lang.String)
-	 */
-	public String performStringSubstitution(String expression) throws CoreException {
-		return performStringSubstitution(expression, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#newValueVariable(java.lang.String, java.lang.String)
-	 */
-	public IValueVariable newValueVariable(String name, String description) {
-		return newValueVariable(name, description, false, null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IStringVariableManager#newValueVariable(java.lang.String, java.lang.String, boolean, java.lang.String)
-	 */
-	public IValueVariable newValueVariable(String name, String description, boolean readOnly, String value) {
-		return new ValueVariable(name, description, readOnly, value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#addVariables(org.eclipse.debug.internal.core.stringsubstitution.IValueVariable[])
-	 */
-	public synchronized void addVariables(IValueVariable[] variables) throws CoreException {
-		initialize();
-		MultiStatus status = new MultiStatus(VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, VariablesMessages.StringVariableManager_26, null); 
-		for (int i = 0; i < variables.length; i++) {
-			IValueVariable variable = variables[i];
-			if (getValueVariable(variable.getName()) != null) {
-				status.add(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind(VariablesMessages.StringVariableManager_27, new String[]{variable.getName()}), null)); 
-			}			
-		}
-		if (status.isOK()) {
-			for (int i = 0; i < variables.length; i++) {
-				IValueVariable variable = variables[i];
-				fValueVariables.put(variable.getName(), variable);
-			}
-			IValueVariable[] copy = new IValueVariable[variables.length];
-			System.arraycopy(variables, 0, copy, 0, variables.length);
-			getNotifier().notify(copy, ADDED);
-			return;
-		}
-		throw new CoreException(status);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#removeVariables(org.eclipse.debug.internal.core.stringsubstitution.IValueVariable[])
-	 */
-	public synchronized void removeVariables(IValueVariable[] variables) {
-		initialize();
-		List removed = new ArrayList(variables.length);
-		for (int i = 0; i < variables.length; i++) {
-			IValueVariable variable = variables[i];
-			if (fValueVariables.remove(variable.getName()) != null) {
-				removed.add(variable);
-			}
-		}
-		if (removed.size() > 0) {
-			getNotifier().notify((IValueVariable[])removed.toArray(new IValueVariable[removed.size()]), REMOVED);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#getDynamicVariable(java.lang.String)
-	 */
-	public synchronized IDynamicVariable getDynamicVariable(String name) {
-		initialize();
-		return (IDynamicVariable) fDynamicVariables.get(name);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#getValueVariable(java.lang.String)
-	 */
-	public synchronized IValueVariable getValueVariable(String name) {
-		initialize();
-		return (IValueVariable) fValueVariables.get(name);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#addValueVariableListener(org.eclipse.debug.internal.core.stringsubstitution.IValueVariableListener)
-	 */
-	public void addValueVariableListener(IValueVariableListener listener) {
-		fListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#removeValueVariableListener(org.eclipse.debug.internal.core.stringsubstitution.IValueVariableListener)
-	 */
-	public void removeValueVariableListener(IValueVariableListener listener) {
-		fListeners.remove(listener);
-	}
-	
-	/**
-	 * Returns a memento representing the value variables currently registered.
-	 * 
-	 * @return memento representing the value variables currently registered
-	 * @throws IOException if an I/O exception occurs while creating the XML.
-	 */
-	private String getValueVariablesAsXML() throws IOException, ParserConfigurationException, TransformerException {
-		IValueVariable[] variables = getValueVariables();
-
-		Document document= getDocument();
-		Element rootElement= document.createElement(VALUE_VARIABLES_TAG);
-		document.appendChild(rootElement);
-		for (int i = 0; i < variables.length; i++) {
-			IValueVariable variable = variables[i];
-			if (!variable.isReadOnly()){
-				// don't persist read-only variables or un-initialized contributed variables 
-				if (!variable.isContributed() || ((ContributedValueVariable)variable).isInitialized()) {
-					Element element= document.createElement(VALUE_VARIABLE_TAG);
-					element.setAttribute(NAME_TAG, variable.getName());
-					String value= variable.getValue();
-					if (value != null) {
-						element.setAttribute(VALUE_TAG, value);
-					}
-					element.setAttribute(READ_ONLY_TAG, variable.isReadOnly() ? TRUE_VALUE : FALSE_VALUE);
-					String description= variable.getDescription();
-					if (description != null) {
-						element.setAttribute(DESCRIPTION_TAG, description);
-					}
-					rootElement.appendChild(element);
-				}
-			}
-		}
-		return serializeDocument(document);
-	}
-	
-	private Document getDocument() throws ParserConfigurationException {
-		DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-		DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
-		Document doc =docBuilder.newDocument();
-		return doc;
-	}
-	
-	/**
-	 * Serializes a XML document into a string - encoded in UTF8 format,
-	 * with platform line separators.
-	 * 
-	 * @param doc document to serialize
-	 * @return the document as a string
-	 * @throws TransformerException if an unrecoverable error occurs during the serialization
-	 * @throws IOException if the encoding attempted to be used is not supported
-	 */
-	private String serializeDocument(Document doc) throws TransformerException, UnsupportedEncodingException {
-		ByteArrayOutputStream s= new ByteArrayOutputStream();
-		
-		TransformerFactory factory= TransformerFactory.newInstance();
-		Transformer transformer= factory.newTransformer();
-		transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
-		transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-		
-		DOMSource source= new DOMSource(doc);
-		StreamResult outputTarget= new StreamResult(s);
-		transformer.transform(source, outputTarget);
-		
-		return s.toString("UTF8"); //$NON-NLS-1$			
-	}
-	
-	/**
-	 * Saves the value variables currently registered in the
-	 * preference store. 
-	 */
-	private synchronized void storeValueVariables() {
-		Preferences prefs= VariablesPlugin.getDefault().getPluginPreferences();
-		String variableString= ""; //$NON-NLS-1$
-		if (!fValueVariables.isEmpty()) {
-			try {
-				variableString= getValueVariablesAsXML();
-			} catch (IOException e) {
-				VariablesPlugin.log(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), IStatus.ERROR, "An exception occurred while storing launch configuration variables.", e)); //$NON-NLS-1$
-				return;
-			} catch (ParserConfigurationException e) {
-				VariablesPlugin.log(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), IStatus.ERROR, "An exception occurred while storing launch configuration variables.", e)); //$NON-NLS-1$
-				return;
-			} catch (TransformerException e) {
-				VariablesPlugin.log(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), IStatus.ERROR, "An exception occurred while storing launch configuration variables.", e)); //$NON-NLS-1$
-				return;
-			}
-		}
-		fInternalChange = true;
-		prefs.setValue(PREF_VALUE_VARIABLES, variableString);
-		VariablesPlugin.getDefault().savePluginPreferences();
-		fInternalChange = false;
-	}
-
-	/**
-	 * Fire a change notification for the given variable.
-	 * 
-	 * @param variable the variable that has changed
-	 */
-	protected void notifyChanged(IValueVariable variable) {
-		if (!fInternalChange) {
-			IValueVariable existing = getValueVariable(variable.getName());
-			if (variable.equals(existing)) {
-				// do not do change notification for unregistered variables
-				getNotifier().notify(new IValueVariable[]{variable}, CHANGED);
-			}
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#generateVariableExpression(java.lang.String, java.lang.String)
-	 */
-	public String generateVariableExpression(String varName, String arg) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("${"); //$NON-NLS-1$
-		buffer.append(varName);
-		if (arg != null) {
-			buffer.append(":"); //$NON-NLS-1$
-			buffer.append(arg);
-		}
-		buffer.append("}"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IStringVariableManager#performStringSubstitution(java.lang.String, boolean)
-	 */
-	public String performStringSubstitution(String expression,	boolean reportUndefinedVariables) throws CoreException {
-		return new StringSubstitutionEngine().performStringSubstitution(expression, reportUndefinedVariables, true, this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IStringVariableManager#validateStringVariables(java.lang.String)
-	 */
-	public void validateStringVariables(String expression) throws CoreException {
-		new StringSubstitutionEngine().validateStringVariables(expression, this);
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.variables.IStringVariableManager#getContributingPluginId(org.eclipse.core.variables.IStringVariable)
-     */
-    public String getContributingPluginId(IStringVariable variable) {
-        if (variable instanceof StringVariable) {
-            return ((StringVariable) variable).getConfigurationElement().getContributor().getName();
-        }
-        return null;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Preferences.IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (PREF_VALUE_VARIABLES.equals(event.getProperty())) {
-			synchronized (this) {
-				if (!fInternalChange) {
-					fValueVariables.clear();
-					loadPersistedValueVariables();
-					loadContributedValueVariables();
-				}
-			}
-		}
-	}
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/ValueVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/ValueVariable.java
deleted file mode 100644
index 3bac3d0..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/ValueVariable.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.variables;
-
-import org.eclipse.core.variables.IValueVariable;
-
-/**
- * Implementation of a value variable.
- */
-public class ValueVariable extends StringVariable implements IValueVariable {
-	
-	/**
-	 * Variable value or <code>null</code> if none 
-	 */
-	private String fValue;
-	
-	/**
-	 * Whether this variable is read only.  If true, users cannot change the value.
-	 */
-	private boolean fReadOnly;
-	
-	/**
-	 * Constructs a new value variable with the given name, description, read only
-	 * property and string value.  Value can be null.
-	 * 
-	 * @param name variable name
-	 * @param description variable description or <code>null</code>
-	 * @param readOnly whether the variable should be a read only variable
-	 * @param value the initial value of the variable or <code>null</code>
-	 */
-	public ValueVariable(String name, String description, boolean readOnly, String value) {
-		super(name, description, null);
-		fReadOnly = readOnly;
-		fValue = value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		if (!isReadOnly()){
-			fValue = value;
-			StringVariableManager.getDefault().notifyChanged(this);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#getValue()
-	 */
-	public String getValue() {
-		return fValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#isReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return fReadOnly;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IValueVariable#isContributed()
-	 */
-	public boolean isContributed() {
-		return false;
-	}
-
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/VariablesMessages.java b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/VariablesMessages.java
deleted file mode 100644
index 27378a6..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/VariablesMessages.java
+++ /dev/null
@@ -1,39 +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 - Initial API and implementation
- **********************************************************************/
-package org.eclipse.core.internal.variables;
-
-import org.eclipse.osgi.util.NLS;
-
-public class VariablesMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.core.internal.variables.VariablesMessages";//$NON-NLS-1$
-	//
-	// 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
-	//
-
-	public static String StringSubstitutionEngine_3;
-	public static String StringSubstitutionEngine_4;
-
-	public static String StringVariableManager_26;
-	public static String StringVariableManager_27;
-
-	public static String DynamicVariable_0;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, VariablesMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/VariablesMessages.properties b/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/VariablesMessages.properties
deleted file mode 100644
index 945dbd3..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/internal/variables/VariablesMessages.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-StringSubstitutionEngine_3=Reference to undefined variable {0}
-StringSubstitutionEngine_4=Variable {0} does not accept arguments
-
-StringVariableManager_26=Variables with the specified names are already registered.
-StringVariableManager_27=Variable named {0} already registered
-
-DynamicVariable_0=Unsupported argument {0} specified for variable {1}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IDynamicVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IDynamicVariable.java
deleted file mode 100644
index 9bdda6e..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IDynamicVariable.java
+++ /dev/null
@@ -1,59 +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.variables;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A dynamic variable is a variable whose value is computed dynamically
- * by a resolver at the time a string substitution is performed. A dynamic
- * variable is contributed by an extension.
- * <p>
- * The following is a definition of a dynamic variable that resolves to the name of the selected resource:
- * <pre>
- *  &lt;extension point="org.eclipse.core.variables.dynamicVariables"&gt;
- *    &lt;variable 
- *       name="resource_name"
- *       resolver="com.example.ResourceNameResolver"
- *       description="The name of the selected resource"
- *       supportsArgument="false"&gt;
- *    &lt;/variable&gt;
- *  &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * Clients are not intended to implement this interface. Instead, clients contributing
- * a dynamic variable provide an implementation of {@link org.eclipse.core.variables.IDynamicVariableResolver}.
- * </p>
- * @since 3.0
- */
-public interface IDynamicVariable extends IStringVariable {
-
-	/**
-	 * Returns the value of this variable when referenced with the given
-	 * argument, possibly <code>null</code>.
-	 * 
-	 * @param argument argument present in variable expression or <code>null</code>
-	 *   if none
-	 * @return value of this variable when referenced with the given argument, possibly
-	 *   <code>null</code>
-	 * @throws CoreException if unable to resolve a value for this variable
-	 */
-	public String getValue(String argument) throws CoreException;
-	
-	/**
-	 * Returns whether this variable supports an argument, as specified
-	 * by this variable's extension definition in plug-in XML.
-	 * 
-	 * @return whether this variable supports an argument
-	 */
-	public boolean supportsArgument();
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IDynamicVariableResolver.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IDynamicVariableResolver.java
deleted file mode 100644
index b5cefaa..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IDynamicVariableResolver.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.variables;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Resolves the value for a dynamic variable. A dynamic variable extension
- * contributes a resolver which must implement this interface.
- * <p>
- * Clients contributing a dynamic variable are intended to provide an implementation
- * of this interface.
- * </p>
- * @since 3.0
- */
-public interface IDynamicVariableResolver {
-
-	/**
-	 * Resolves and returns a value for the specified variable when referenced
-	 * with the given argument, possibly <code>null</code>
-	 *  
-	 * @param variable variable to resolve a value for
-	 * @param argument argument present in expression or <code>null</code> if none
-	 * @return variable value, possibly <code>null</code>
-	 * @throws CoreException if unable to resolve a value for the given variable
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException;
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IStringVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IStringVariable.java
deleted file mode 100644
index 6bf9832..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IStringVariable.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.core.variables;
-
-
-/**
- * A variable that can be referenced in an expression, which resolves to a string
- * value. Variables are referenced in expressions via their name, in the following
- * format.
- * <pre>
- * ${varname} or ${varname:argument}
- * </pre>
- * <p>
- * A variable is identified by its name, and optionally accepts an argument. When an
- * argument is present, a colon separates the variable name from its argument.
- * </p>
- * <p>
- * Variables can be contributed by extensions or programmatically. There are two
- * kinds of variables.
- * <ul>
- * <li><code>IValueVariable</code> - variables that have a value (with getter and setter), and
- *       accept no arguments. The value of this type of variable is resolved at the time
- *       its value is set via its setter API.</li>
- * <li><code>IDynamicVariable</code> - variables whose value is resolved at the time
- * 		a string substitution is performed by a contributed resolver. Dynamic variables
- * 		may accept an argument.</li>
- * </ul>
- * </p>
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IStringVariable {
-
-	/**
-	 * Returns the name of this variable. A variable is uniquely identified by
-	 * its name.
-	 * 
-	 * @return variable name
-	 */
-	public String getName();
-	
-	/**
-	 * Returns a human readable description of this variable, possibly <code>null</code>
-	 * 
-	 * @return a description of this variable, or <code>null</code> if none
-	 */
-	public String getDescription();
-	
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IStringVariableManager.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IStringVariableManager.java
deleted file mode 100644
index 8f2434a..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IStringVariableManager.java
+++ /dev/null
@@ -1,193 +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.variables;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Registry for string variables.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IStringVariableManager {
-
-	/**
-	 * Simple identifier constant (value <code>"dynamicVariables"</code>) for the
-	 * dynamic variables extension point.
-	 */
-	public static final String EXTENSION_POINT_DYNAMIC_VARIABLES = "dynamicVariables"; //$NON-NLS-1$
-	
-	/**
-	 * Simple identifier constant (value <code>"valueVariables"</code>) for the
-	 * value variables extension point.
-	 */
-	public static final String EXTENSION_POINT_VALUE_VARIABLES = "valueVariables"; //$NON-NLS-1$
-	
-	/**
-	 * Returns all registered variables.
-	 * 
-	 * @return a collection of all registered variables
-	 */
-	public IStringVariable[] getVariables();
-	
-	/**
-	 * Returns all registered value variables.
-	 * 
-	 * @return a collection of all registered value variables
-	 */
-	public IValueVariable[] getValueVariables();
-	
-	/**
-	 * Returns the value variable with the given name, or <code>null</code>
-	 * if none.
-	 * 
-	 * @param name variable name
-	 * @return the value variable with the given name, or <code>null</code>
-	 * if none
-	 */
-	public IValueVariable getValueVariable(String name);
-	
-	/**
-	 * Returns all registered dynamic variables.
-	 * 
-	 * @return a collection of all registered dynamic variables
-	 */
-	public IDynamicVariable[] getDynamicVariables();	
-	
-	/**
-	 * Returns the dynamic variable with the given name or <code>null</code>
-	 * if none.
-	 * 
-	 * @param name variable name
-	 * @return the dynamic variable with the given name or <code>null</code>
-	 * if none
-	 */
-	public IDynamicVariable getDynamicVariable(String name);
-    
-    /**
-     * Returns the plug-in identifier of the plug-in that contributed the
-     * given variable via extension or <code>null</code> if the given
-     * variable wasn't contributed via extension.
-     * 
-     * @param variable the variable
-     * @return the plug-in identifier of the plug-in that contributed the
-     *  given variable or <code>null</code>
-     * @since 3.1
-     */
-    public String getContributingPluginId(IStringVariable variable);
-	
-	/**
-	 * Recursively resolves and replaces all variable references in the given
-	 * expression with their corresponding values. Reports errors for references
-	 * to undefined variables (equivalent to calling
-	 * <code>performStringSubstitution(expression, true)</code>).
-	 * 
-	 * @param expression expression referencing variables
-	 * @return expression with variable references replaced with variable values
-	 * @throws CoreException if unable to resolve the value of one or more variables
-	 */
-	public String performStringSubstitution(String expression) throws CoreException;
-	
-	/**
-	 * Recursively resolves and replaces all variable references in the given
-	 * expression with their corresponding values. Allows the client to control
-	 * whether references to undefined variables are reported as an error (i.e.
-	 * an exception is thrown).  
-	 * 
-	 * @param expression expression referencing variables
-	 * @param reportUndefinedVariables whether a reference to an undefined variable
-	 *  is to be considered an error (i.e. throw an exception)
-	 * @return expression with variable references replaced with variable values
-	 * @throws CoreException if unable to resolve the value of one or more variables
-	 */
-	public String performStringSubstitution(String expression, boolean reportUndefinedVariables) throws CoreException;	
-	
-	/**
-	 * Validates variables references in the given expression and reports errors
-	 * for references to undefined variables.
-	 * 
-	 * @param expression expression referencing variables
-	 * @throws CoreException if one or more referenced variables do not exist
-	 */
-	public void validateStringVariables(String expression) throws CoreException;
-	
-	/**
-	 * Returns a new read-write value variable with the given name and description
-	 * with a <code>null</code> value.
-	 * 
-	 * @param name variable name, cannot be <code>null</code>
-	 * @param description variable description, possibly <code>null</code>
-	 * @return a new value variable
-	 */
-	public IValueVariable newValueVariable(String name, String description);
-
-	/**
-	 * Returns a new value variable with the given properties.
-	 * 
-	 * @param name variable name, cannot be <code>null</code>
-	 * @param description variable description, possibly <code>null</code>
-	 * @param readOnly whether this variable is to be a read only variable
-	 * @param value the string value to initialize this variable to - should
-	 * 	not be <code>null</code> for read-only variables
-	 * @return a new value variable
-	 * @since 3.3
-	 */
-	public IValueVariable newValueVariable(String name, String description, boolean readOnly, String value);
-	
-	/**
-	 * Adds the given variables to the variable registry.
-	 * 
-	 * @param variables the variables to add
-	 * @throws CoreException if one or more variables to add has a name collision with
-	 *  an existing variable 
-	 */
-	public void addVariables(IValueVariable[] variables) throws CoreException;
-	
-	/**
-	 * Removes the given variables from the registry. Has no effect for unregistered
-	 * variables.
-	 * 
-	 * @param variables variables to remove
-	 */
-	public void removeVariables(IValueVariable[] variables);
-	
-	/**
-	 * Registers the given listener for value variable notifications. Has no effect
-	 * if an identical listener is already registered.
-	 *   
-	 * @param listener value variable listener to add
-	 */
-	public void addValueVariableListener(IValueVariableListener listener);
-	
-	/**
-	 * Removes the given listener from the list of registered value variable
-	 * listeners. Has no effect if an identical listener is not already registered.
-	 * 
-	 * @param listener value variable listener to remove
-	 */
-	public void removeValueVariableListener(IValueVariableListener listener);
-	
-	/**
-	 * Convenience method that returns an expression referencing the given
-	 * variable and optional argument. For example, calling the method with
-	 * a <code>varName</code> of <code>my_var</code> and an <code>argument</code>
-	 * of <code>my_arg</code> results in the string <code>$(my_var:my_arg}</code>.
-	 * 
-	 * @param varName variable name
-	 * @param arg argument text or <code>null</code>
-	 * @return an expression referencing the given variable and
-	 *  optional argument
-	 */
-	public String generateVariableExpression(String varName, String arg);
-	
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariable.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariable.java
deleted file mode 100644
index d9cd25e..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariable.java
+++ /dev/null
@@ -1,93 +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.variables;
-
-/**
- * A variable with a value that can be set and retrieved. The context in which
- * a value variable is referenced does not effect the value of the variable.
- * A value variable can be contributed by an extension or created programmatically.
- * A contributor may optionally specify an initial value for a variable, or
- * provide a delegate that will initialize the variable with a value.
- * <p>
- * Since 3.3, a variable can be specified as a "read only" preventing users from changing
- * the value after it has been initialized.  Furthermore, a read only variable that is
- * contributed by an extension will always load the value from the extension.
- * </p>
- * <p>
- * Example of a value variable contribution with an initial value, the specified
- * variable is created with the initial value "/usr/local/foo".
- * <pre>
- *  &lt;extension point="org.eclipse.core.variables.valueVariables"&gt;
- *   &lt;variable
- *    name="FOO_HOME"
- *    initialValue="/usr/local/foo"&gt;
- *   &lt;/variable&gt;
- *  &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * Example of a value variable contribution with an initializer class, the class
- * "com.example.FooLocator" will be used to initialize the value the first time
- * it's requested.
- * <pre>
- *  &lt;extension point="org.eclipse.core.variables.valueVariables"&gt;
- *   &lt;variable
- *    name="FOO_HOME"
- *    initializerClass="com.example.FooLocator"&gt;
- *   &lt;/variable&gt;
- *  &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IValueVariable extends IStringVariable {
-
-	/**
-	 * Sets the value of this variable to the given value.
-	 * Since 3.3, this has no effect if this variable is read only.
-	 *
-	 * @param value variable value
-	 */
-	public void setValue(String value);
-	
-	/**
-	 * Returns the value of this variable, or <code>null</code> if none.
-	 * 
-	 * @return the value of this variable, or <code>null</code> if none
-	 */
-	public String getValue();
-	
-	/**
-	 * Returns whether this variable was contributed by an extension.
-	 * 
-	 * @return whether this variable was contributed by an extension
-	 */
-	public boolean isContributed();
-	
-	/**
-	 * Returns whether this variable is read only.
-	 * 
-	 * @return whether this variable is read only
-	 * @since 3.3
-	 */
-	public boolean isReadOnly();
-	
-	/**
-	 * Sets the description of this variable to the given value.
-	 * 
-	 * @param description variable description, possibly <code>null</code>
-	 */
-	public void setDescription(String description);	
-	
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariableInitializer.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariableInitializer.java
deleted file mode 100644
index 035a907..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariableInitializer.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.core.variables;
-
-/**
- * Value variable initializers compute an initial value for a value
- * variable contributed by an extension, which is not defined with an initial
- * value. This provides a mechanism for programmatically computing the initial
- * value of a value variable.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IValueVariableInitializer {
-	/**
-	 * Initializes the specified variable. 
-	 * 
-	 * @param variable variable to initialize
-	 */
-	public void initialize(IValueVariable variable);
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariableListener.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariableListener.java
deleted file mode 100644
index 37dac25..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/IValueVariableListener.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.variables;
-
-/**
- * A string variable listener is notified of variables as they are added
- * and removed from the string variable manager. As well, listeners are
- * notified when a value variable changes value.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IValueVariableListener {
-	
-	/**
-	 * Notification the given variables have been added to the variable
-	 * manager.
-	 * 
-	 * @param variables added variables
-	 */
-	public void variablesAdded(IValueVariable[] variables);
-	
-	/**
-	 * Notification the given variables have been removed from the variable
-	 * manager.
-	 * 
-	 * @param variables removed variables
-	 */
-	public void variablesRemoved(IValueVariable[] variables);
-	
-	/**
-	 * Notification the given variables have been changed value.
-	 * 
-	 * @param variables changed variables
-	 */
-	public void variablesChanged(IValueVariable[] variables);
-
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/VariablesPlugin.java b/org.eclipse.core.variables/src/org/eclipse/core/variables/VariablesPlugin.java
deleted file mode 100644
index 114b01d..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/VariablesPlugin.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.core.variables;
-
-import org.eclipse.core.internal.variables.StringVariableManager;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-
-/**
- * The plug-in runtime class for the Core Variables plug-in.
- * @since 3.0
- */
-public class VariablesPlugin extends Plugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;		
-	
-	/**
-	 * Status code indicating a variable reference cycle error.
-	 */
-	public static final int REFERENCE_CYCLE_ERROR = 130;
-	
-	/**
-	 * The single instance of this plug-in runtime class.
-	 */
-	private static VariablesPlugin plugin;
-
-	/**
-	 * Unique identifier constant (value <code>"org.eclipse.core.variables"</code>)
-	 * for the Core Variables plug-in.
-	 */
-	public static final String PI_CORE_VARIABLES = "org.eclipse.core.variables"; //$NON-NLS-1$
-
-
-	/** 
-	 * Constructs an instance of this plug-in runtime class.
-	 * <p>
-	 * An instance of this plug-in runtime class is automatically created 
-	 * when the facilities provided by the Variables plug-in are required.
-	 * <b>Clients must never explicitly instantiate a plug-in runtime class.</b>
-	 * </p>
-	 */
-	public VariablesPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * Returns this plug-in instance.
-	 *
-	 * @return the single instance of this plug-in runtime class
-	 */
-	public static VariablesPlugin getDefault() {
-		return plugin;
-	}
-	
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(new Status(IStatus.ERROR, PI_CORE_VARIABLES, INTERNAL_ERROR, "Error logged from Core Variables: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs the given message with this plug-in's log and the given
-	 * throwable or <code>null</code> if none.
-	 * @param message the message to log
-	 * @param throwable the exception that occurred or <code>null</code> if none
-	 */
-	public static void logMessage(String message, Throwable throwable) {
-		log(new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, message, throwable));
-	}
-	
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-	
-	/**
-	 * Convenience method which returns the unique identifier of this plug-in.
-	 */
-	public static String getUniqueIdentifier() {
-		return PI_CORE_VARIABLES;
-	}
-	
-	/**
-	 * Returns the string variable manager.
-	 * 
-	 * @return the string variable manager
-	 */
-	public IStringVariableManager getStringVariableManager() {
-		return StringVariableManager.getDefault();
-	}
-}
diff --git a/org.eclipse.core.variables/src/org/eclipse/core/variables/package.html b/org.eclipse.core.variables/src/org/eclipse/core/variables/package.html
deleted file mode 100644
index 0d27de0..0000000
--- a/org.eclipse.core.variables/src/org/eclipse/core/variables/package.html
+++ /dev/null
@@ -1,45 +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>Eclipse Debug Platform</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides support for defining and contributing variables for the purpose of 
-  string substitution.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package provides classes and interfaces to support the definition and 
-  contribution of variables for the purpose of string substitution. The plug-in 
-  supports the recursive replacement of variables referenced by name in arbitrary 
-  strings with the value of the variable. Two types of variables are provided 
-  - value variables (<code>IValueVariable</code>) and dynamic variables (<code>IDynamicVariable</code>). 
-  A value variable has a simple setter and getter for its current value. A dynamic 
-  variable has an associated resolver that provides a variable's value each time 
-  it is referenced (replaced) in a string substitution. A dynamic variable may 
-  also provide an argument in its reference that can be used by its resolver to 
-  determine its substitution value.</p>
-<p>A variable manager (<code>IStringVariableManager</code>) is provided to manage 
-  the set of defined variables. Value variables may be created via API on the 
-  variable manager, or contributed via the <code>valueVariables</code> extension 
-  point. Dynamic variables must be contributed via the <code>dynamicVariables</code> 
-  extension point. The variable manager also provides change notification for 
-  value variables. The variable manager also provides an API for performing string 
-  substitution, which accepts a string, and returns a string with all variable 
-  references replaced by associated variable values.</p>
-<p>Variables are referenced in strings by enclosing them in braces, preceded with 
-  a dollar sign. For example, consider a variable defined with the name <code>foo</code>, 
-  and referenced in the following string: <code>&quot;abc${foo}ghi&quot;</code>. 
-  If the value of <code>foo</code> is <code>&quot;def&quot;</code>, the result 
-  of a string substitution would be <code>&quot;abcdefghi&quot;</code>. In the 
-  case of a dynamic variable, an (optional) argument is supplied by appending 
-  a colon and argument value after the variable name. For example <code>&quot;${foo:bar}&quot;</code>. 
-  In this case, the resolver associated with <code>foo</code> would be provided 
-  with the referenced argument (<code>bar</code>) when asked to resolve a value 
-  for the variable <code>foo</code>. </p>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/.classpath b/org.eclipse.debug.core/.classpath
deleted file mode 100644
index 3138d4b..0000000
--- a/org.eclipse.debug.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="core"/>
-	<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/org.eclipse.debug.core/.cvsignore b/org.eclipse.debug.core/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/org.eclipse.debug.core/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/org.eclipse.debug.core/.options b/org.eclipse.debug.core/.options
deleted file mode 100644
index 47e1551..0000000
--- a/org.eclipse.debug.core/.options
+++ /dev/null
@@ -1,3 +0,0 @@
-org.eclipse.debug.core/debug=false
-org.eclipse.debug.core/debug/commands=false
-org.eclipse.debug.core/debug/events=false
\ No newline at end of file
diff --git a/org.eclipse.debug.core/.project b/org.eclipse.debug.core/.project
deleted file mode 100644
index 394ef93..0000000
--- a/org.eclipse.debug.core/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.debug.core</name>
-	<comment></comment>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.debug.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.debug.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 03a607e..0000000
--- a/org.eclipse.debug.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,73 +0,0 @@
-#Wed Jan 17 13:24:06 CST 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=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.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-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=ignore
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-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=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-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=disabled
-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.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,HIGH,HIGH
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,EXPERIMENTAL,CONTEXTLAUNCHING
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/org.eclipse.debug.core/.settings/org.eclipse.pde.prefs b/org.eclipse.debug.core/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e3108cb..0000000
--- a/org.eclipse.debug.core/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,17 +0,0 @@
-#Tue Jan 30 11:38:38 CST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=1
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-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/org.eclipse.debug.core/META-INF/MANIFEST.MF b/org.eclipse.debug.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 3d0361d..0000000
--- a/org.eclipse.debug.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,25 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.debug.core; singleton:=true
-Bundle-Version: 3.3.100.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.debug.core.DebugPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.debug.core,
- org.eclipse.debug.core.commands,
- org.eclipse.debug.core.model,
- org.eclipse.debug.core.sourcelookup,
- org.eclipse.debug.core.sourcelookup.containers,
- org.eclipse.debug.internal.core;x-friends:="org.eclipse.debug.ui",
- org.eclipse.debug.internal.core.commands;x-friends:="org.eclipse.debug.ui",
- org.eclipse.debug.internal.core.sourcelookup;x-friends:="org.eclipse.debug.ui",
- org.eclipse.debug.internal.core.sourcelookup.containers;x-friends:="org.eclipse.debug.ui"
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.3.0,4.0.0)";visibility:=reexport,
- org.eclipse.core.variables;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.filesystem;bundle-version="[1.1.0,2.0.0)"
-Eclipse-LazyStart: true
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/org.eclipse.debug.core/about.html b/org.eclipse.debug.core/about.html
deleted file mode 100644
index 4602330..0000000
--- a/org.eclipse.debug.core/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/org.eclipse.debug.core/build.properties b/org.eclipse.debug.core/build.properties
deleted file mode 100644
index 826d036..0000000
--- a/org.eclipse.debug.core/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .options,\
-               plugin.xml,\
-               plugin.properties,\
-               .,\
-               about.html,\
-               META-INF/
-source.. = core/
-src.includes = about.html,\
-               schema/
diff --git a/org.eclipse.debug.core/buildnotes_platform-debug.html b/org.eclipse.debug.core/buildnotes_platform-debug.html
deleted file mode 100644
index 9c2934f..0000000
--- a/org.eclipse.debug.core/buildnotes_platform-debug.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes</title>
-</head>
-<body>
-<h1> Eclipse 3.4 Debug Platform Build Notes&nbsp;</h1>
-
-<h2>Summary of API changes in 3.4</h2>
-
-<h2>July 31, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197998">197998</a>: Workbench refuses to show Run or Debug dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197834">197834</a>: Expression Evaluation Failure with Generics<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197145">197145</a>: [launching] Changing AutoSelect in LaunchConfigurationViewer from a LaunchConfigurationTab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197645">197645</a>: [launching] selection of encoding does twice as much work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197532">197532</a>: NPE in DefaultWatchExpressionModelProxy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185196">185196</a>: Debug selection dialogs should subclass AbstractDebugSelectionDialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=194598">194598</a>: 44% of time closing projects spent in LaunchManager#resourceChanged<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=194303">194303</a>: [launching] CME during &quot;Compute launch button tooltip&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197000">197000</a>: [launching] Auto Launch Configuration deletion should be resource specific<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174020">174020</a>: Background colour makes variable value unreadable in variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=197698">197698</a>: [launching] Deleting launch config from LCD does not remove config<br>
-
-<h2>July 17, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=191515">191515</a>: Some run menu actions are missing help context ids<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=193175">193175</a>: inconsistent action names for &quot;Open Run/Debug/Profile Dialog...&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177554">177554</a>: [messages] remove internal error messages from translations<br>
-
-<h2>July 10, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175584">175584</a>: [expressions] Allow re-ordering of expressions in the Expressions View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=195232">195232</a>: Outdated Run Toolbar tool tip<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=191723">191723</a>: A lot more classes being loaded than in 3.1<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=195461">195461</a>: calling dispose on LaunchConfigurationTabGroupWrapper can get a NullPointerException<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48197">48197</a>: [Dialogs] Add Folders Selection Dialog should not list closed projects.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=191071">191071</a>: Delete Unused Debug Help Context ID Constants<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=194458">194458</a>: CCE when dragging to Breakpoints View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=193595">193595</a>: ProcessConsole is internal API but states that &quot;Clients may instantiate this class.&quot; in the javadocs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47931">47931</a>: Copies of serializeDocument(Document)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=66983">66983</a>: [evaluation] EmptyStackException from invalid condition<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=192212">192212</a>: Screenshots out of date in isv doc<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=193179">193179</a>: Should there be an 'add' button in the expression view toolbar?<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=191974">191974</a>: Concurrent modification exception<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=191636">191636</a>: [breakpoints] import breakpoints causes excpetion<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189328">189328</a>: [Accessibility] Run dialog (Common tab) - controls do not provide labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=191388">191388</a>: TVT33:TCT635: pl: truncations in Perspective preferences panel<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=193432">193432</a>: Clicking link in Ant console should ensure resulting editor is visible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184057">184057</a>: Add drag and drop to expression view.<br>
-
-<p>&nbsp;</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/component.xml b/org.eclipse.debug.core/component.xml
deleted file mode 100644
index d5a77c7..0000000
--- a/org.eclipse.debug.core/component.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/component"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://eclipse.org/component ../component.xsd "
-   name="Eclipse Platform Debug">
- <plugin id="org.eclipse.debug.core" />
-
- <package name="org.eclipse.debug.core">
- 	<type name="DebugEvent" subclass="false" />
- 	<type name="DebugException" subclass="false" />
- 	<type name="DebugPlugin" subclass="false" instantiate="false" />
- 	<type name="IBreakpointListener" />
- 	<type name="IBreakpointManager" implement="false" />
- 	<type name="IBreakpointManagerListener" />
- 	<type name="IBreakpointsListener" />
- 	<type name="IDebugEventFilter" />
- 	<type name="IDebugEventSetListener" />
- 	<type name="IExpressionListener" />
- 	<type name="IExpressionManager" implement="false" />
- 	<type name="IExpressionsListener" />
- 	<type name="ILaunch" />
- 	<type name="ILaunchConfiguration" implement="false" />
- 	<type name="ILaunchConfigurationListener" />
- 	<teyp name="ILaunchConfigurationMigrationDelegate" />
- 	<type name="ILaunchConfigurationType" implement="false" />
- 	<type name="ILaunchConfigurationWorkingCopy" implement="false" />
- 	<type name="ILaunchDelegate" implement="false" />
- 	<type name="ILaunchesListener" />
- 	<type name="ILaunchesListener2" />
- 	<type name="ILaunchListener" />
- 	<type name="ILaunchManager" implement="false" />
- 	<type name="ILaunchMode" implement="false" />
- 	<type name="ILogicalStructureProvider" />
- 	<type name="ILogicalStructureType" />
- 	<type name="IMemoryBlockListener" />
- 	<type name="IMemoryBlockManager" implement="false" />
- 	<type name="IProcessFactory" />
- 	<type name="IStatusHandler" />
- 	<type name="IStreamListener" />
- 	<type name="Launch" />
- </package>
- <package name="org.eclipse.debug.core.commands">
- 	<type name="IBooleanCollector" implement="false" />
- 	<type name="IDebugCommand" />
- 	<type name="IDisconnectCommand" />
- 	<type name="IDropToFrameCommand" />
- 	<type name="IResumeCommand" />
- 	<type name="IStatusCollector"  implement="false" />
- 	<type name="IStepFiltersCommand" />
- 	<type name="IStepIntoCommand" />
- 	<type name="IStepOverCommand" />
- 	<type name="IStepReturnCommand" />
- 	<type name="ISuspendCommand" />
- 	<type name="ITerminateCommand" />
- </package>
- <package name="org.eclipse.debug.core.model">
- 	<type name="Breakpoint" />
- 	<type name="DebugElement" />
- 	<type name="IBreakpoint" />
- 	<type name="IDebugElement" />
- 	<type name="IDebugModelProvider" />
- 	<type name="IDebugTarget" />
- 	<type name="IDisconnect" />
- 	<type name="IDropToFrame" />
- 	<type name="IErrorReportingExpression" />
- 	<type name="IExpression" />
- 	<type name="IFilteredStep" />
- 	<type name="IFlushableStreamMonitor" />
- 	<type name="IIndexedValue" />
- 	<type name="ILaunchConfigurationDelegate" />
- 	<type name="ILaunchConfigurationDelegate2" />
- 	<type name="ILineBreakpoint" />
- 	<type name="ILogicalStructureTypeDelegate" />
- 	<type name="ILogicalStructureTypeDelegate2" />
- 	<type name="IMemoryBlock" />
- 	<type name="IMemoryBlockExtension" />
- 	<type name="IMemoryBlockRetrieval" />
- 	<type name="IMemoryBlockRetrievalExtension" />
- 	<type name="IPersistableSourceLocator" />
- 	<type name="IProcess" />
- 	<type name="IRegister" />
- 	<type name="IRegisterGroup" />
- 	<type name="ISourceLocator" />
- 	<type name="IStackFrame" />
- 	<type name="IStep" />
- 	<type name="IStepFilters" />
- 	<type name="IStreamMonitor" />
- 	<type name="IStreamsProxy" />
- 	<type name="IStreamsProxy2" />
- 	<type name="ISuspendResume" />
- 	<type name="ITerminate" />
- 	<type name="IThread" />
- 	<type name="IValue" />
- 	<type name="IValueModification" />
- 	<type name="IVariable" />
- 	<type name="IWatchExpression" implement="false" />
- 	<type name="IWatchExpressionDelegate" />
- 	<type name="IWatchExpressionListener" />
- 	<type name="IWatchExpressionResult" />
- 	<type name="IWatchpoint" />
- 	<type name="LaunchConfigurationDelegate" />
- 	<type name="LineBreakpoint" />
- 	<type name="MemoryByte" />
- 	<type name="RuntimeProcess" /> 	
- </package>
- <package name="org.eclipse.debug.core.sourcelookup">
- 	<type name="AbstractSourceLookupDirector" />
- 	<type name="AbstractSourceLookupParticipant" />
- 	<type name="IPersistableSourceLocator2" />
- 	<type name="ISourceContainer" />
- 	<type name="ISourceContainerType" implement="false" />
- 	<type name="ISourceContainerTypeDelegate" />
- 	<type name="ISourceLookupDirector" />
- 	<type name="ISourceLookupParticipant" />
- 	<type name="ISourcePathComputer" implement="false" />
- 	<type name="ISourcePathComputerDelegate" />
- </package>
- <package name="org.eclipse.debug.core.sourcelookup.containers">
- 	<type name="AbstractSourceContainer" />
- 	<type name="AbstractSourceContainerTypeDelegate" />
- 	<type name="ArchiveSourceContainer" subclass="false" />
- 	<type name="CompositeSourceContainer" />
- 	<type name="ContainerSourceContainer" subclass="false" instantiate="false"/>
- 	<type name="DefaultSourceContainer" subclass="false" />
- 	<type name="DirectorySourceContainer" subclass="false" />
- 	<type name="ExternalArchiveSourceContainer" subclass="false" />
- 	<type name="FolderSourceContainer" subclass="false" />
- 	<type name="LocalFileStorage" subclass="false" />
- 	<type name="ProjectSourceContainer" subclass="false" />
- 	<type name="WorkspaceSourceContainer" subclass="false" />
- 	<type name="ZipEntryStorage" subclass="false" />
- </package>
- 
- <component-depends unrestricted="true"/>
-
-</component>
\ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java
deleted file mode 100644
index f4f5cf3..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java
+++ /dev/null
@@ -1,460 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core;
-
-
-import java.util.EventObject;
-
-import org.eclipse.debug.internal.core.DebugCoreMessages;
-
-/**
- * A debug event describes an event in a program being debugged or
- * in a running process. Debug models and process implementations
- * are required to generate debug events as specified by this class.
- * <p>
- * The following list defines the events generated for each debug
- * model element.
- * The <code>getSource()</code> method of a debug event
- * returns the element associated with the event.
- * Creation events are guaranteed to occur in a top
- * down order - that is, parents are created before children.
- * Termination events are guaranteed to occur in a bottom up order -
- * that is, children before parents. However, termination events are not guaranteed
- * for all  elements that are created. That is, terminate events can be coalesced - a 
- * terminate event for a parent signals that all children have been terminated.
- * </p>
- * <p>
- * A debug model may define model specific events by specifying a debug event
- * kind of <code>MODEL_SPECIFIC</code>. A model specific event is identified by the
- * event source (i.e. by the debug model that generated the event). The detail of
- * a model specific event is client defined. Note that model specific events are
- * not understood by the debug platform, and are thus ignored.
- * </p>
- * <p>
- * The generic <code>CHANGE</code> event can be fired at any time by any element.
- * Generally, a client of a debug model, such as as a UI, can get sufficient
- * information to update by listening/responding to the other event kinds. However,
- * if a debug model needs to inform clients of a change that is not specified
- * by create/terminate/suspend/resume, the <code>CHANGE</code> event may be used.
- * For example, generally, the only way a thread or any of its children can change
- * state between a suspend and resume operation, is if the thread or owning debug
- * target is terminated. However, if a debug model supports some other operation
- * that would allow a debug element to change state while suspended, the debug model
- * would fire a change event for that element. The valid detail codes for a
- * change event are:<ul>
- * <li><code>STATE</code> - indicates the state of an element has changed, but its
- *  children are not affected. A client would use a state change event to update
- *  a label of the affected element, but would not update any children.</li>
- * <li><code>CONTENT</code> - indicates that a debug element's value or contents have
- *  changed in some way. For example, when the value of a variable is changed
- *  explicitly, the variable should fire a content change event.</li>
- * </ul>
- * </p>
- * <ul>
- * <li><code>IProcess</code>
- *	<ul>
- *	<li><code>CREATE</code> - a process has been created and is executing.</li>
- *	<li><code>TERMINATE</code> - a process has terminated.</li>
- *  </ul>
- * <li><code>IDebugTarget</code>
- *	<ul>
- *	<li><code>CREATE</code> - a debug target has been created and is ready
- *		to begin a debug session.</li>
- *	<li><code>TERMINATE</code> - a debug target has terminated and the debug
- *		session has ended.</li>
- *  <li><code>SUSPEND</code> - a debug target has suspended. Event detail provides
- *		the reason for the suspension:<ul>
- *		<li><code>STEP_END</code> - a request to step has completed</li>
- *		<li><code>BREAKPOINT</code> - a breakpoint has been hit</li>
- *		<li><code>CLIENT_REQUEST</code> - a client request has caused the target to suspend
- * 			(i.e. an explicit call to <code>suspend()</code>)</li>
- * 		<li><code>UNSPECIFIED</code> - the reason for the suspend is not specified</li>
- *		</ul>
- *	</li>
- *  <li><code>RESUME</code> - a debug target has resumed. Event detail provides
- *		the reason for the resume:<ul>
- *		<li><code>STEP_INTO</code> - a target is being resumed because of a request to step into</li>
- * 		<li><code>STEP_OVER</code> - a target is being resumed because of a request to step over</li>
- * 		<li><code>STEP_RETURN</code> - a target is being resumed because of a request to step return</li>
- *		<li><code>CLIENT_REQUEST</code> - a client request has caused the target to be resumed
- * 			(i.e. an explicit call to <code>resume()</code>)</li>
- * 		<li><code>UNSPECIFIED</code> - The reason for the resume is not specified</li>
- *		</ul>
- *	</li>
- *	</ul>
- * </li>
- * <li><code>IThread</code>
- *	<ul>
- *	<li><code>CREATE</code> - a thread has been created in a debug target.</li>
- *	<li><code>TERMINATE</code> - a thread has terminated.</li>
- *	<li><code>SUSPEND</code> - a thread has suspended execution. Event detail provides
- *		the reason for the suspension:<ul>
- *		<li><code>STEP_END</code> - a request to step has completed</li>
- *		<li><code>BREAKPOINT</code> - a breakpoint has been hit</li>
- *		<li><code>CLIENT_REQUEST</code> - a client request has caused the thread to suspend
- * 			(i.e. an explicit call to <code>suspend()</code>)</li>
- * 		<li><code>EVALUATION</code> - an expression evaluation has ended that may
- * 			have had side effects in the debug target.</li>
- * 		<li><code>EVALUATION_IMPLICIT</code> - an expression evaluation has ended that
- * 			had no side effects in the debug target.</li>
- * 		<li><code>UNSPECIFIED</code> - the reason for the suspend is not specified</li>
- *		</ul>
- *	</li>
- *	<li><code>RESUME</code> - a thread has resumed execution. Event detail provides
- *		the reason for the resume:<ul>
- *		<li><code>STEP_INTO</code> - a thread is being resumed because of a request to step into</li>
- * 		<li><code>STEP_OVER</code> - a thread is being resumed because of a request to step over</li>
- * 		<li><code>STEP_RETURN</code> - a thread is being resumed because of a request to step return</li>
- *		<li><code>CLIENT_REQUEST</code> - a client request has caused the thread to be resumed
- * 			(i.e. an explicit call to <code>resume()</code>)</li>
- * 		<li><code>EVALUATION</code> - an expression evaluation has started that may
- * 			have side effects in the debug target.</li>
- * 		<li><code>EVALUATION_IMPLICIT</code> - an expression evaluation has started that
- * 			will have no side effects in the debug target.</li>
- * 		<li><code>UNSPECIFIED</code> - The reason for the resume is not specified</li>
- *		</ul>
- *	</li>
- *    </ul>
- * </li>
- * <li><code>IStackFrame</code> - no events are specified for stack frames.
- *	When a thread is suspended, it has stack frames. When a thread resumes,
- *	stack frames are unavailable.
- * </li>
- * <li><code>IVariable</code> - no events are specified for variables.
- *	When a thread is suspended, stack frames have variables. When a thread resumes,
- *	variables are unavailable.
- * </li>
- * <li><code>IValue</code> - no events are specified for values.
- * </li>
- * </ul>
- * <p>
- * Clients may instantiate this class. Clients are not intended to subclass this class.
- * </p>
- * 
- */
-public final class DebugEvent extends EventObject {
-	
-    /**
-     * All objects that can be serialized should have a stable serialVersionUID
-     */
-    private static final long serialVersionUID = 1L;
-    
-	/**
-	 * Resume event kind.
-	 */
-	public static final int RESUME= 0x0001;
-
-	/**
-	 * Suspend event kind.
-	 */
-	public static final int SUSPEND= 0x0002;
-
-	/**
-	 * Create event kind.
-	 */
-	public static final int CREATE= 0x0004;
-
-	/**
-	 * Terminate event kind.
-	 */
-	public static final int TERMINATE= 0x0008;
-	
-	/**
-	 * Change event kind.
-	 */
-	public static final int CHANGE= 0x0010;
-	
-	/**
-	 * Model specific event kind. The detail codes
-	 * for a model specific event are client defined.
-	 * 
-	 * @since 2.1.2
-	 */
-	public static final int MODEL_SPECIFIC= 0x0020;	
-
-	/**
-	 * Step start detail. Indicates a thread was resumed by a step
-	 * into action.
-	 * @since 2.0
-	 */
-	public static final int STEP_INTO= 0x0001;
-	
-	/**
-	 * Step start detail. Indicates a thread was resumed by a step
-	 * over action.
-	 * @since 2.0
-	 */
-	public static final int STEP_OVER= 0x0002;
-	
-	/**
-	 * Step start detail. Indicates a thread was resumed by a step
-	 * return action.
-	 * @since 2.0
-	 */
-	public static final int STEP_RETURN= 0x0004;		
-
-	/**
-	 * Step end detail. Indicates a thread was suspended due
-	 * to the completion of a step action.
-	 */
-	public static final int STEP_END= 0x0008;
-	
-	/**
-	 * Breakpoint detail. Indicates a thread was suspended by
-	 * a breakpoint.
-	 */
-	public static final int BREAKPOINT= 0x0010;
-	
-	/**
-	 * Client request detail. Indicates a thread was suspended due
-	 * to a client request.
-	 */
-	public static final int CLIENT_REQUEST= 0x0020;
-	
-	/**
-	 * Evaluation detail. Indicates that a thread was resumed or
-	 * suspended to perform an expression evaluation.
-	 * 
-	 * @since 2.0
-	 */
-	public static final int EVALUATION = 0x0040;
-	
-	/**
-	 * Evaluation detail. Indicates that a thread was resumed or
-	 * suspended to perform an implicit expression evaluation.
-	 * An implicit evaluation is an evaluation that is performed
-	 * as an indirect result of a user action.
-	 * Clients may use this detail event to decide whether or not
-	 * to alert the user that an evaluation is taking place..
-	 * 
-	 * @since 2.0
-	 */
-	public static final int EVALUATION_IMPLICIT = 0x0080;
-
-	/**
-	 * State change detail. Indicates the state of a single 
-	 * debug element has changed. Only valid for <code>CHANGE</code>
-	 * events.
-	 * 
-	 * @since 2.0
-	 */
-	public static final int STATE = 0x0100;
-	
-	/**
-	 * Content change detail. Indicates the content of a debug element
-	 * (and potentially its children) has changed. Only valid for
-	 * <code>CHANGE</code> events.
-	 * 
-	 * @since 2.0
-	 */
-	public static final int CONTENT = 0x0200;	
-			
-	/**
-	 * Constant indicating that the kind or detail of a debug
-	 * event is unspecified.
-	 */
-	public static final int UNSPECIFIED = 0;
-	
-	/**
-	 * The kind of event - one of the kind constants defined by
-	 * this class.
-	 */
-	private int fKind= UNSPECIFIED;
-
-	/**
-	 * The detail of the event - one of the detail constants defined by
-	 * this class.
-	 */
-	private int fDetail= UNSPECIFIED;
-	
-	/**
-	 * Client defined data field.
-	 * 
-	 * @since 2.1.2
-	 */
-	private Object fData = null;
-	
-	/**
-	 * Constructs a new debug event of the given kind with a detail code of
-	 * <code>UNSPECIFIED</code>.
-	 *
-	 * @param eventSource the object associated with the event
-	 * @param kind the kind of debug event (one of the
-	 *	kind constants defined by this class)
-	 */
-	public DebugEvent(Object eventSource, int kind) {
-		this(eventSource, kind, UNSPECIFIED);
-	}
-
-	/**
-	 * Constructs a new debug event of the given kind with the given detail.
-	 *
-	 * @param eventSource the object associated with the event
-	 * @param kind the kind of debug event (one of the
-	 *	kind constants defined by this class)
-	 * @param detail extra information about the event (one of the
-	 *	detail constants defined by this class or a client defined detail if this is a model specific event)
-	 */
-	public DebugEvent(Object eventSource, int kind, int detail) {
-		super(eventSource);
-		if ((kind & (RESUME | SUSPEND | CREATE | TERMINATE | CHANGE | MODEL_SPECIFIC)) == 0)
-			throw new IllegalArgumentException(DebugCoreMessages.DebugEvent_illegal_kind); 
-		if (kind != MODEL_SPECIFIC && detail != UNSPECIFIED && (detail & (STEP_END | STEP_INTO | STEP_OVER | STEP_RETURN | BREAKPOINT | CLIENT_REQUEST |EVALUATION | EVALUATION_IMPLICIT | STATE | CONTENT)) == 0)
-			throw new IllegalArgumentException(DebugCoreMessages.DebugEvent_illegal_detail); 
-		fKind= kind;
-		fDetail= detail;
-	}
-
-	/**
-	 * Returns a constant describing extra detail about the event - either one
-	 * of the detail constants defined by this class, possibly
-	 * <code>UNSPECIFIED</code>, or a client defined detail if this is a model specific event.
-	 *
-	 * @return the detail code
-	 */
-	public int getDetail() {
-		return fDetail;
-	}
-
-	/**
-	 * Returns this event's kind - one of the kind constants defined by this class.
-	 * 
-	 * @return the kind code
-	 */
-	public int getKind() {
-		return fKind;
-	}
-	
-	/**
-	 * Returns whether this event's detail indicates the
-	 * beginning of a step event. This event's detail is one
-	 * of <code>STEP_INTO</code>, <code>STEP_OVER</code>, or
-	 * <code>STEP_RETURN</code>.
-	 * 
-	 * @return whether this event's detail indicates the beginning
-	 *  of a step event.
-	 * @since 2.0
-	 */
-	public boolean isStepStart() {
-		return (getDetail() & (STEP_INTO | STEP_OVER | STEP_RETURN)) > 0;
-	}
-	
-	/**
-	 * Returns whether this event's detail indicates an
-	 * evaluation. This event's detail is one
-	 * of <code>EVALUATION</code>, or <code>EVALUATION_IMPLICIT</code>.
-	 * 
-	 * @return whether this event's detail indicates an evaluation.
-	 * @since 2.0
-	 */
-	public boolean isEvaluation() {
-		return (getDetail() & (EVALUATION | EVALUATION_IMPLICIT)) > 0;
-	}	
-	
-	/**
-	 * Sets this event's application defined data.
-	 * 
-	 * @param data application defined data
-	 * @since 2.1.2
-	 */
-	public void setData(Object data) {
-		fData = data;
-	}
-	
-	/**
-	 * Returns this event's application defined data, or <code>null</code> if none
-	 * 
-	 * @return application defined data, or <code>null</code> if none
-	 * @since 2.1.2
-	 */
-	public Object getData() {
-		return fData;
-	}
-	
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buf = new StringBuffer("DebugEvent["); //$NON-NLS-1$
-		if (getSource() != null) {
-			buf.append(getSource().toString());
-		} else {
-			buf.append("null"); //$NON-NLS-1$
-		}
-		buf.append(", "); //$NON-NLS-1$
-		switch (getKind()) {
-			case CREATE:
-				buf.append("CREATE"); //$NON-NLS-1$
-				break;
-			case TERMINATE:
-				buf.append("TERMINATE"); //$NON-NLS-1$
-				break;
-			case RESUME:
-				buf.append("RESUME"); //$NON-NLS-1$
-				break;
-			case SUSPEND:
-				buf.append("SUSPEND"); //$NON-NLS-1$
-				break;				
-			case CHANGE:
-				buf.append("CHANGE"); //$NON-NLS-1$
-				break;
-			case UNSPECIFIED:
-				buf.append("UNSPECIFIED"); //$NON-NLS-1$
-				break;
-			case MODEL_SPECIFIC:
-				buf.append("MODEL_SPECIFIC"); //$NON-NLS-1$
-				break;
-		}
-		buf.append(", "); //$NON-NLS-1$
-		switch (getDetail()) {
-			case BREAKPOINT:
-				buf.append("BREAKPOINT"); //$NON-NLS-1$
-				break;
-			case CLIENT_REQUEST:
-				buf.append("CLIENT_REQUEST"); //$NON-NLS-1$
-				break;
-			case STEP_END:
-				buf.append("STEP_END"); //$NON-NLS-1$
-				break;
-			case STEP_INTO:
-				buf.append("STEP_INTO"); //$NON-NLS-1$
-				break;
-			case STEP_OVER:
-				buf.append("STEP_OVER"); //$NON-NLS-1$
-				break;
-			case STEP_RETURN:
-				buf.append("STEP_RETURN"); //$NON-NLS-1$
-				break;
-			case EVALUATION:
-				buf.append("EVALUATION"); //$NON-NLS-1$
-				break;
-			case EVALUATION_IMPLICIT:
-				buf.append("EVALUATION_IMPLICIT"); //$NON-NLS-1$
-				break;								
-			case STATE:
-				buf.append("STATE"); //$NON-NLS-1$
-				break;			
-			case CONTENT:
-				buf.append("CONTENT"); //$NON-NLS-1$
-				break;					
-			case UNSPECIFIED:
-				buf.append("UNSPECIFIED"); //$NON-NLS-1$
-				break;
-			default:
-				// model specific
-				buf.append(getDetail());
-				break;
-		}
-		buf.append("]"); //$NON-NLS-1$
-		return buf.toString();
-	}
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.java
deleted file mode 100644
index e027e1f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.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.debug.core;
-
-
- 
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-
-
-/**
- * A checked exception representing a failure.
- * <p>
- * Defines status codes relevant to the debug plug-in. When a 
- * debug exception is thrown, it contains a status object describing
- * the cause of the exception. The status objects originating from the
- * debug plug-in use the codes defined in this class.
- * </p>
- * <p>
- * Clients may instantiate this class. Clients are not intended to subclass this class.
- * </p>
- * @see IStatus
- */
-public class DebugException extends CoreException {	
-    
-    /**
-     * All objects that can be serialized should have a stable serialVersionUID
-     */
-    private static final long serialVersionUID = 1L;
-    
-	/**
-	 * Indicates a request made of a debug element has failed
-	 * on the target side.
-	 */
-	public static final int TARGET_REQUEST_FAILED = 5010;
-	 
-	/**
-	 * Indicates a request is not supported by the capabilities of a debug element.
-	 * For example, a request was made to terminate an element that does not
-	 * support termination.
-	 */
-	public static final int NOT_SUPPORTED = 5011;
-
-	/**
-	 * Indicates that a request made of manager has failed, or a request made of a
-	 * debug element has failed on the client side (that is, before the request was
-	 * sent to the debug target).
-	 */
-	public static final int REQUEST_FAILED = 5012;
-
-	/**
-	 * Indicates an internal error. This is an unexpected state.
-	 */
-	public static final int INTERNAL_ERROR = 5013;
-	
-	/** 
-	 * Indicates an improperly configured breakpoint. Breakpoints have a minimal
-	 * set of required attributes as defined by the breakpoint manager.
-	 *
-	 * @see IBreakpointManager
-	 */
-	public static final int CONFIGURATION_INVALID = 5014;
-	
-	/**
-	 * Indicates a launch configuration could not be restored because its
-	 * launch configuration type definition is missing.
-	 * 
-	 * @since 3.0
-	 */
-	public static final int MISSING_LAUNCH_CONFIGURATION_TYPE = 5020;
-	
-	/**
-	 * Constructs a new debug exception with the given status object.
-	 *
-	 * @param status the status object describing this exception
-	 * @see IStatus
-	 */
-	public DebugException(IStatus status) {
-		super(status);
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
deleted file mode 100644
index 224a928..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
+++ /dev/null
@@ -1,1366 +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.debug.core;
-
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-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.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IDropToFrame;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStep;
-import org.eclipse.debug.core.model.IStepFilters;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.RuntimeProcess;
-import org.eclipse.debug.internal.core.BreakpointManager;
-import org.eclipse.debug.internal.core.DebugCoreMessages;
-import org.eclipse.debug.internal.core.DebugOptions;
-import org.eclipse.debug.internal.core.ExpressionManager;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.core.LogicalStructureManager;
-import org.eclipse.debug.internal.core.MemoryBlockManager;
-import org.eclipse.debug.internal.core.StepFilterManager;
-import org.eclipse.debug.internal.core.commands.CommandAdapterFactory;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupUtils;
-import org.eclipse.osgi.service.environment.Constants;
-import org.osgi.framework.BundleContext;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * There is one instance of the debug plug-in available from
- * <code>DebugPlugin.getDefault()</code>. The debug plug-in provides:
- * <ul>
- * <li>access to the breakpoint manager</li>
- * <li>access to the launch manager</li>
- * <li>access to the expression manager</li>
- * <li>access to the registered launcher extensions</li>
- * <li>access to the memory block manager</li>
- * <li>debug event notification</li>
- * <li>status handlers</li>
- * </ul>
- * <p>
- * Clients may not instantiate or subclass this class.
- * </p>
- */
-public class DebugPlugin extends Plugin {
-	
-	/**
-	 * Unique identifier constant (value <code>"org.eclipse.debug.core"</code>)
-	 * for the Debug Core plug-in.
-	 */
-	private static final String PI_DEBUG_CORE = "org.eclipse.debug.core"; //$NON-NLS-1$
-
-	/**
-	 * Simple identifier constant (value <code>"launchConfigurationTypes"</code>)
-	 * for the launch configuration types extension point.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_CONFIGURATION_TYPES= "launchConfigurationTypes"; //$NON-NLS-1$	
-	
-	/**
-	 * Simple identifier constant (value <code>"launchConfigurationComparators"</code>)
-	 * for the launch configuration comparators extension point.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_CONFIGURATION_COMPARATORS= "launchConfigurationComparators"; //$NON-NLS-1$		
-	
-	/**
-	 * Simple identifier constant (value <code>"breakpoints"</code>) for the
-	 * breakpoints extension point.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_BREAKPOINTS= "breakpoints";	 //$NON-NLS-1$
-	
-	/**
-	 * Simple identifier constant (value <code>"statusHandlers"</code>) for the
-	 * status handlers extension point.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_STATUS_HANDLERS= "statusHandlers";	 //$NON-NLS-1$	
-
-	/**
-	 * Simple identifier constant (value <code>"sourceLocators"</code>) for the
-	 * source locators extension point.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_SOURCE_LOCATORS= "sourceLocators";	 //$NON-NLS-1$	
-	
-	/**
-	 * Simple identifier constant (value <code>"launchModes"</code>) for the
-	 * source modes extension point.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_MODES= "launchModes";	 //$NON-NLS-1$	
-	
-	/**
-	 * Simple identifier constant (value <code>"launchDelegates"</code>) for the
-	 * launch delegates extension point.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_DELEGATES= "launchDelegates";	 //$NON-NLS-1$
-	
-	/**
-	 * Simple identifier constant (value <code>"processFactories"</code>) for the
-	 * process factories extension point.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String EXTENSION_POINT_PROCESS_FACTORIES = "processFactories"; //$NON-NLS-1$
-
-	/**
-	 * Simple identifier constant (value <code>"logicalStructureTypes"</code>) for the
-	 * logical structure types extension point.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String EXTENSION_POINT_LOGICAL_STRUCTURE_TYPES = "logicalStructureTypes"; //$NON-NLS-1$
-	
-	/**
-	 * Simple identifier constant (value <code>"logicalStructureProviders"</code>) for the
-	 * logical structure types extension point.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String EXTENSION_POINT_LOGICAL_STRUCTURE_PROVIDERS = "logicalStructureProviders"; //$NON-NLS-1$
-	
-	/**
-	 * Simple identifier constant (value <code>"sourceContainerTypes"</code>) for the
-	 * source container types extension point.
-	 * 
-	 * @since 3.0
-	 */	
-	public static final String EXTENSION_POINT_SOURCE_CONTAINER_TYPES = "sourceContainerTypes";	 //$NON-NLS-1$
-
-	/**
-	 * Simple identifier constant (value <code>"sourcePathComputers"</code>) for the
-	 * source path computers extension point.
-	 * 
-	 * @since 3.0
-	 */		
-	public static final String EXTENSION_POINT_SOURCE_PATH_COMPUTERS = "sourcePathComputers"; //$NON-NLS-1$
-	
-	/**
-	 * Simple identifier constant for the launch options extension point
-	 * 
-	 * @since 3.3
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_OPTIONS = "launchOptions"; //$NON-NLS-1$
-	
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;		
-
-	/**
-	 * Status code indicating that the Eclipse runtime does not support
-	 * launching a program with a working directory. This feature is only
-	 * available if Eclipse is run on a 1.3 runtime or higher.
-	 * <p>
-	 * A status handler may be registered for this error condition,
-	 * and should return a <code>Boolean</code> indicating whether the program
-	 * should be re-launched with the default working directory.
-	 * </p>
-	 */
-	public static final int ERR_WORKING_DIRECTORY_NOT_SUPPORTED = 115;
-	
-	/**
-	 * The launch configuration attribute that designates the process factory ID
-	 * for the process factory to be used when creating a new process as a result of launching
-	 * the launch configuration.
-	 * @since 3.0
-	 */
-	public static final String ATTR_PROCESS_FACTORY_ID = "process_factory_id"; //$NON-NLS-1$
-	
-	/**
-	 * The launch attribute that designates whether or not it's associated
-	 * launch should capture output. Value is a string representing a boolean -
-	 * <code>true</code> or <code>false</code>. When unspecified, the default
-	 * value is considered <code>true</code>.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ATTR_CAPTURE_OUTPUT = PI_DEBUG_CORE + ".capture_output"; //$NON-NLS-1$
-	
-	
-    /**
-     * This launch attribute designates the encoding to be used by the console
-     * associated with the launch. When unspecified, the platform's default
-     * encoding will be used.
-     * <p>
-     * Value of this constant is the same as the value of the old 
-     * <code>IDebugUIConstants.ATTR_CONSOLE_ENCODING</code> constant for backward
-     * compatibility.
-     * </p>
-     * @since 3.3
-     */
-	public static final String ATTR_CONSOLE_ENCODING = "org.eclipse.debug.ui.ATTR_CONSOLE_ENCODING"; //$NON-NLS-1$
-	
-	/**
-	 * The singleton debug plug-in instance.
-	 */
-	private static DebugPlugin fgDebugPlugin= null;
-
-	/**
-	 * The singleton breakpoint manager.
-	 */
-	private BreakpointManager fBreakpointManager;
-	
-	/**
-	 * The singleton expression manager.
-	 */
-	private ExpressionManager fExpressionManager;	
-
-	/**
-	 * The singleton launch manager.
-	 */
-	private LaunchManager fLaunchManager;
-
-	/**
-	 * The singleton memory block manager.
-	 * @since 3.1
-	 */
-	private MemoryBlockManager fMemoryBlockManager;
-	
-	/**
-	 * The collection of debug event listeners.
-	 */
-	private ListenerList fEventListeners = new ListenerList();
-	
-	/**
-	 * Event filters, or <code>null</code> if none.
-	 */
-	private ListenerList fEventFilters = null;
-
-	/**
-	 * Whether this plug-in is in the process of shutting
-	 * down.
-	 */
-	private boolean fShuttingDown= false;
-	
-	/**
-	 * Table of status handlers. Keys are {plug-in identifier, status code}
-	 * pairs, and values are associated <code>IConfigurationElement</code>s.
-	 */
-	private HashMap fStatusHandlers = null;
-	
-	/**
-	 * Map of process factories. Keys are process factory IDs
-	 * and values are associated <code>IConfigurationElement</code>s.
-	 * @since 3.0
-	 */
-	private HashMap fProcessFactories = null;
-	
-	/**
-	 * Mode constants for the event notifier
-	 */
-	private static final int NOTIFY_FILTERS = 0;
-	private static final int NOTIFY_EVENTS = 1;
-
-		
-	/**
-	 * Queue of debug events to fire to listeners and asynchronous runnables to execute
-	 * in the order received.
-	 * 
-	 * @since 3.1
-	 */
-	private List fEventQueue = new ArrayList();
-	
-	/**
-	 * Job to fire events to listeners.
-	 * @since 3.1
-	 */
-	private EventDispatchJob fEventDispatchJob = new EventDispatchJob();
-	
-	/**
-	 * Event dispatch job. Processes event queue of debug events and runnables.
-	 * 
-	 * @since 3.1
-	 */
-	class EventDispatchJob extends Job {
-		
-		EventNotifier fNotifier = new EventNotifier();
-		AsynchRunner fRunner = new AsynchRunner();
-
-	    /**
-         * Creates a new event dispatch job.
-         */
-        public EventDispatchJob() {
-            super(DebugCoreMessages.DebugPlugin_1); 
-            setPriority(Job.INTERACTIVE);
-            setSystem(true);
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-         */
-        protected IStatus run(IProgressMonitor monitor) {
-            
-            while (!fEventQueue.isEmpty()) {
-                Object next = null;
-	            synchronized (fEventQueue) {
-	                if (!fEventQueue.isEmpty()) {
-	                	next = fEventQueue.remove(0);
-	                }
-	            }
-	            if (next instanceof Runnable) {
-	            	fRunner.async((Runnable) next);
-	            } else if (next != null) {
-	                fNotifier.dispatch((DebugEvent[]) next);
-	            }
-            }
-            return Status.OK_STATUS;
-        }
-	    
-        /* (non-Javadoc)
-         * @see org.eclipse.core.runtime.jobs.Job#shouldRun()
-         */
-        public boolean shouldRun() {
-            return shouldSchedule();
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.core.internal.jobs.InternalJob#shouldSchedule()
-         */
-        public boolean shouldSchedule() {
-            return !(isShuttingDown() || fEventListeners.isEmpty());
-        }
-        
-	}
-
-	/**
-	 * Returns the singleton instance of the debug plug-in.
-	 * 
-	 * @return the debug plug-in
-	 */
-	public static DebugPlugin getDefault() {
-		return fgDebugPlugin;
-	}
-	
-	/**
-	 * Sets the singleton instance of the debug plug-in.
-	 * 
-	 * @param plugin the debug plug-in, or <code>null</code>
-	 *  when shutting down
-	 */
-	private static void setDefault(DebugPlugin plugin) {
-		fgDebugPlugin = plugin;
-	}
-	
-	/**
-	 * Convenience method which returns the unique identifier of this plug-in.
-	 * 
-	 * @return debug plug-in identifier
-	 */
-	public static String getUniqueIdentifier() {
-		return PI_DEBUG_CORE;
-	}
-
-	/**
-	 * Constructs the debug plug-in.
-	 * <p>
-	 * An instance of this plug-in runtime class is automatically created 
-	 * when the facilities provided by this plug-in are required.
-	 * <b>Clients must never explicitly instantiate a plug-in runtime class.</b>
-	 * </p>
-	 */
-	public DebugPlugin() {
-		super();
-		setDefault(this);
-	}
-	
-	/**
-	 * Adds the given listener to the collection of registered debug
-	 * event listeners. Has no effect if an identical listener is already
-	 * registered.
-	 *
-	 * @param listener the listener to add
-	 * @since 2.0
-	 */
-	public void addDebugEventListener(IDebugEventSetListener listener) {
-		fEventListeners.add(listener);
-	}	
-	
-	/**
-	 * Notifies all registered debug event set listeners of the given
-	 * debug events. Events which are filtered by a registered debug event
-	 * filter are not fired.
-	 * 
-	 * @param events array of debug events to fire
-	 * @see IDebugEventFilter
-	 * @see IDebugEventSetListener
-	 * @since 2.0
-	 */
-	public void fireDebugEventSet(DebugEvent[] events) {
-		if (isShuttingDown() || events == null || fEventListeners.isEmpty())
-			return;
-		synchronized (fEventQueue) {
-			fEventQueue.add(events);
-		}
-		fEventDispatchJob.schedule();
-	}
-	
-	/**
-	 * Asynchronously executes the given runnable in a separate
-	 * thread, after debug event dispatch has completed. If debug
-	 * events are not currently being dispatched, the runnable is
-	 * scheduled to run in a separate thread immediately.
-	 * 
-	 * @param r runnable to execute asynchronously
-	 * @since 2.1
-	 */
-	public void asyncExec(Runnable r) {
-		synchronized (fEventQueue) {
-			fEventQueue.add(r);
-		}
-		fEventDispatchJob.schedule();
-	}
-	
-	/**
-	 * Returns the breakpoint manager.
-	 *
-	 * @return the breakpoint manager
-	 * @see IBreakpointManager
-	 */
-	public IBreakpointManager getBreakpointManager() {
-		if (fBreakpointManager == null) {
-			fBreakpointManager = new BreakpointManager();
-		}
-		return fBreakpointManager;
-	}
-	
-	/**
-	 * Returns the launch manager.
-	 *
-	 * @return the launch manager
-	 * @see ILaunchManager
-	 */
-	public ILaunchManager getLaunchManager() {
-		if (fLaunchManager == null) {
-			fLaunchManager = new LaunchManager();
-		}
-		return fLaunchManager;
-	}
-	
-	/**
-	 * Returns the memory block manager.
-	 * @return the memory block manager.
-	 * @see IMemoryBlockManager
-	 * @since 3.1
-	 */
-	public IMemoryBlockManager getMemoryBlockManager(){
-		if (fMemoryBlockManager == null) {
-			fMemoryBlockManager = new MemoryBlockManager();
-		}
-		return fMemoryBlockManager;
-	}
-	
-	/**
-	 * Returns the status handler registered for the given
-	 * status, or <code>null</code> if none.
-	 *
-	 * @param status status for which a status handler has been requested
-	 * @return the status handler registered for the given
-	 *  status, or <code>null</code> if none
-	 * @since 2.0
-	 */
-	public IStatusHandler getStatusHandler(IStatus status) {
-		StatusHandlerKey key = new StatusHandlerKey(status.getPlugin(), status.getCode());
-		if (fStatusHandlers == null) {
-			initializeStatusHandlers();
-		}
-		IConfigurationElement config = (IConfigurationElement)fStatusHandlers.get(key);
-		if (config != null) {
-			try {
-				Object handler = config.createExecutableExtension(IConfigurationElementConstants.CLASS);
-				if (handler instanceof IStatusHandler) {
-					return (IStatusHandler)handler;
-				}
-				invalidStatusHandler(null, MessageFormat.format("Registered status handler {0} does not implement required interface IStatusHandler.", new String[] {config.getDeclaringExtension().getUniqueIdentifier()}));  //$NON-NLS-1$
-			} catch (CoreException e) {
-				log(e);
-			}
-		}
-		return null;
-	}	
-	
-	/**
-	 * Returns the expression manager.
-	 *
-	 * @return the expression manager
-	 * @see IExpressionManager
-	 * @since 2.0
-	 */
-	public IExpressionManager getExpressionManager() {
-		if (fExpressionManager == null) {
-			fExpressionManager = new ExpressionManager();
-		}
-		return fExpressionManager;
-	}	
-		
-	/**
-	 * Removes the given listener from the collection of registered debug
-	 * event listeners. Has no effect if an identical listener is not already
-	 * registered.
-	 *
-	 * @param listener the listener to remove
-	 * @since 2.0
-	 */
-	public void removeDebugEventListener(IDebugEventSetListener listener) {
-		fEventListeners.remove(listener);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		try {
-			setShuttingDown(true);
-			
-			if (fLaunchManager != null) {
-				fLaunchManager.shutdown();
-			}
-			if (fBreakpointManager != null) {
-				fBreakpointManager.shutdown();
-			}
-			if (fMemoryBlockManager != null)  {
-				fMemoryBlockManager.shutdown();
-			}
-			
-			fEventListeners.clear();
-            
-            if (fEventFilters != null) {
-                fEventFilters = null;
-            }
-			SourceLookupUtils.shutdown();
-			setDefault(null);
-			ResourcesPlugin.getWorkspace().removeSaveParticipant(this);
-			savePluginPreferences();
-		} finally {
-			super.stop(context);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		DebugOptions.initDebugOptions();
-		ResourcesPlugin.getWorkspace().addSaveParticipant(this,
-				new ISaveParticipant() {
-					public void saving(ISaveContext saveContext) throws CoreException {
-						savePluginPreferences();
-					}				
-					public void rollback(ISaveContext saveContext) {}
-					public void prepareToSave(ISaveContext saveContext) throws CoreException {}
-					public void doneSaving(ISaveContext saveContext) {}
-				});
-		//command adapters
-		IAdapterManager manager= Platform.getAdapterManager();
-		CommandAdapterFactory actionFactory = new CommandAdapterFactory();
-		manager.registerAdapters(actionFactory, IDisconnect.class);
-		manager.registerAdapters(actionFactory, IDropToFrame.class);
-		manager.registerAdapters(actionFactory, IStep.class);
-		manager.registerAdapters(actionFactory, IStepFilters.class);
-		manager.registerAdapters(actionFactory, ISuspendResume.class);
-		manager.registerAdapters(actionFactory, ITerminate.class);
-		manager.registerAdapters(actionFactory, ILaunch.class);
-		manager.registerAdapters(actionFactory, IProcess.class);
-		manager.registerAdapters(actionFactory, IDebugElement.class);		
-	}
-
-	/**
-	 * Creates and returns a new process representing the given
-	 * <code>java.lang.Process</code>. A streams proxy is created
-	 * for the I/O streams in the system process. The process
-	 * is added to the given launch.
-	 * <p>
-	 * If the launch configuration associated with the given launch
-	 * specifies a process factory, it will be used to instantiate
-	 * the new process.
-	 * </p>
-	 * @param launch the launch the process is contained in
-	 * @param process the system process to wrap
-	 * @param label the label assigned to the process
-	 * @return the process
-	 * @see IProcess
-	 * @see IProcessFactory
-	 */
-	public static IProcess newProcess(ILaunch launch, Process process, String label) {
-		return newProcess(launch, process, label, null);
-	}
-	
-	/**
-	 * Creates and returns a new process representing the given
-	 * <code>java.lang.Process</code>. A streams proxy is created
-	 * for the I/O streams in the system process. The process
-	 * is added to the given launch, and the process is initialized
-	 * with the given attribute map.
-	 * <p>
-	 * If the launch configuration associated with the given launch
-	 * specifies a process factory, it will be used to instantiate
-	 * the new process.
-	 * </p>
-	 * @param launch the launch the process is contained in
-	 * @param process the system process to wrap
-	 * @param label the label assigned to the process
-	 * @param attributes initial values for the attribute map
-	 * @return the process <code>null</code> can be returned if errors occur dealing with the process factory
-	 * designated to create the process.
-	 * @see IProcess
-	 * @see IProcessFactory
-	 * @since 2.1
-	 */
-	public static IProcess newProcess(ILaunch launch, Process process, String label, Map attributes) {
-		ILaunchConfiguration config= launch.getLaunchConfiguration();
-		String processFactoryID= null;
-		if (config != null) {
-			try {
-				processFactoryID= config.getAttribute(ATTR_PROCESS_FACTORY_ID, (String)null);
-			} catch (CoreException e) {
-			}
-		}
-		if (processFactoryID != null) {
-			DebugPlugin plugin= DebugPlugin.getDefault();
-			if (plugin.fProcessFactories == null) {
-				plugin.initializeProcessFactories();
-			}
-			IConfigurationElement element= (IConfigurationElement) plugin.fProcessFactories.get(processFactoryID);
-			if (element == null) {
-				return null;
-			}
-			IProcessFactory processFactory= null;
-			try {
-				processFactory = (IProcessFactory)element.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			} catch (CoreException exception) {
-				log(exception);
-				return null;
-			}
-			return processFactory.newProcess(launch, process, label, attributes);
-		} 
-		return new RuntimeProcess(launch, process, label, attributes);
-	}	
-	
-	/**
-	 * Returns any logical structure types that have been contributed for the given
-	 * value.
-	 * 
-	 * @param value the value for which logical structure types have been requested
-	 * @return logical structure types that have been contributed for the given
-	 * value, possibly an empty collection
-	 * 
-	 * @since 3.0
-	 */
-	public static ILogicalStructureType[] getLogicalStructureTypes(IValue value) {
-		return LogicalStructureManager.getDefault().getLogicalStructureTypes(value);
-	}
-    
-    /**
-     * Returns the default logical structure type among the given combination of
-     * logical structure types, or <code>null</code> if none. When the given combination
-     * of logical structure type is applicable for a value, the default logical structure
-     * type is used to display a value.
-     * 
-     * @param types a combination of structures applicable to a value
-     * @return the default structure that should be used to display the value
-     * or <code>null</code> if none
-     *  
-     * @since 3.1
-     */
-    public static ILogicalStructureType getDefaultStructureType(ILogicalStructureType[] types) {
-        return LogicalStructureManager.getDefault().getSelectedStructureType(types);
-    }
-    
-    /**
-     * Sets the default logical structure type among the given combination of logical structure
-     * types. The logical structure types provided should all be applicable to a single
-     * value. Specifying <code>null</code> indicates there is no default logical structure
-     * for the given combination of types.
-     * 
-     * @param types a combination of logical structure types applicable to a value
-     * @param def the default logical structure among the given combination of types
-     * or <code>null</code> if none
-     *  
-     * @since 3.1
-     */
-    public static void setDefaultStructureType(ILogicalStructureType[] types, ILogicalStructureType def) {
-        LogicalStructureManager.getDefault().setEnabledType(types, def);
-    }
-	
-	/**
-	 * Convenience method that performs a runtime exec on the given command line
-	 * in the context of the specified working directory, and returns the
-	 * resulting process. If the current runtime does not support the
-	 * specification of a working directory, the status handler for error code
-	 * <code>ERR_WORKING_DIRECTORY_NOT_SUPPORTED</code> is queried to see if the
-	 * exec should be re-executed without specifying a working directory.
-	 * 
-	 * @param cmdLine the command line
-	 * @param workingDirectory the working directory, or <code>null</code>
-	 * @return the resulting process or <code>null</code> if the exec is
-	 *  cancelled
-	 * @exception CoreException if the exec fails
-	 * @see Runtime
-	 * 
-	 * @since 2.1
-	 */
-	public static Process exec(String[] cmdLine, File workingDirectory) throws CoreException {
-		return exec(cmdLine, workingDirectory, null);
-	}
-
-	/**
-	 * Convenience method that performs a runtime exec on the given command line
-	 * in the context of the specified working directory, and returns the
-	 * resulting process. If the current runtime does not support the
-	 * specification of a working directory, the status handler for error code
-	 * <code>ERR_WORKING_DIRECTORY_NOT_SUPPORTED</code> is queried to see if the
-	 * exec should be re-executed without specifying a working directory.
-	 * 
-	 * @param cmdLine the command line
-	 * @param workingDirectory the working directory, or <code>null</code>
-	 * @param envp the environment variables set in the process, or <code>null</code>
-	 * @return the resulting process or <code>null</code> if the exec is
-	 *  canceled
-	 * @exception CoreException if the exec fails
-	 * @see Runtime
-	 * 
-	 * @since 3.0
-	 */
-	public static Process exec(String[] cmdLine, File workingDirectory, String[] envp) throws CoreException {
-		Process p= null;
-		try {
-			if (workingDirectory == null) {
-				p= Runtime.getRuntime().exec(cmdLine, envp);
-			} else {
-				p= Runtime.getRuntime().exec(cmdLine, envp, workingDirectory);
-			}
-		} catch (IOException e) {
-		    Status status = new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, DebugCoreMessages.DebugPlugin_0, e); 
-		    throw new CoreException(status);
-		} catch (NoSuchMethodError e) {
-			//attempting launches on 1.2.* - no ability to set working directory			
-			IStatus status = new Status(IStatus.ERROR, getUniqueIdentifier(), ERR_WORKING_DIRECTORY_NOT_SUPPORTED, DebugCoreMessages.DebugPlugin_Eclipse_runtime_does_not_support_working_directory_2, e); 
-			IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status);
-			
-			if (handler != null) {
-				Object result = handler.handleStatus(status, null);
-				if (result instanceof Boolean && ((Boolean)result).booleanValue()) {
-					p= exec(cmdLine, null);
-				}
-			}
-		}
-		return p;
-	}	
-	
-	/**
-	 * Returns whether this plug-in is in the process of 
-	 * being shutdown.
-	 * 
-	 * @return whether this plug-in is in the process of 
-	 *  being shutdown
-	 */
-	private boolean isShuttingDown() {
-		return fShuttingDown;
-	}
-	
-	/**
-	 * Sets whether this plug-in is in the process of 
-	 * being shutdown.
-	 * 
-	 * @param value whether this plug-in is in the process of 
-	 *  being shutdown
-	 */
-	private void setShuttingDown(boolean value) {
-		fShuttingDown = value;
-	}
-	
-	/**
-	 * Returns the collection of debug event listeners registered
-	 * with this plug-in.
-	 * 
-	 * @return list of registered debug event listeners, instances
-	 *  of <code>IDebugEventSetListeners</code>
-	 */
-	private Object[] getEventListeners() {
-		return fEventListeners.getListeners();
-	}
-	
-	/**
-	 * Adds the given debug event filter to the registered
-	 * event filters. Has no effect if an identical filter
-	 * is already registered.
-	 * 
-	 * @param filter debug event filter
-	 * @since 2.0
-	 */
-	public void addDebugEventFilter(IDebugEventFilter filter) {
-		if (fEventFilters == null) {
-			fEventFilters = new ListenerList();
-		}
-		fEventFilters.add(filter);
-	}
-	
-	/**
-	 * Removes the given debug event filter from the registered
-	 * event filters. Has no effect if an identical filter
-	 * is not already registered.
-	 * 
-	 * @param filter debug event filter
-	 * @since 2.0
-	 */
-	public void removeDebugEventFilter(IDebugEventFilter filter) {
-		if (fEventFilters != null) {
-			fEventFilters.remove(filter);
-			if (fEventFilters.size() == 0) {
-				fEventFilters = null;
-			}
-		}
-	}	
-	
-	/**
-	 * Logs the given message if in debug mode.
-	 * 
-	 * @param message the message to log
-	 * @since 2.0
-	 */
-	public static void logDebugMessage(String message) {
-		if (getDefault().isDebugging()) {
-			// this message is intentionally not externalized, as an exception may
-			// be due to the resource bundle itself
-			log(new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, MessageFormat.format(DebugCoreMessages.DebugPlugin_2, new String[] {message}), null)); 
-		}
-	}
-	
-	/**
-	 * Logs the given message with this plug-in's log and the given
-	 * throwable or <code>null</code> if none.
-	 * @param message the message to log
-	 * @param throwable the exception that occurred or <code>null</code> if none
-	 */
-	public static void logMessage(String message, Throwable throwable) {
-		log(new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, message, throwable));
-	}
-	
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 * @since 2.0
-	 */
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-	
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 * @since 2.0
-	 */
-	public static void log(Throwable t) {
-		IStatus status= new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, DebugCoreMessages.DebugPlugin_3, t);
-		log(status);
-	}
-	
-	/**
-	 * Register status handlers.
-	 * 
-	 */
-	private void initializeStatusHandlers() {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.PI_DEBUG_CORE, EXTENSION_POINT_STATUS_HANDLERS);
-		IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-		fStatusHandlers = new HashMap(infos.length);
-		for (int i= 0; i < infos.length; i++) {
-			IConfigurationElement configurationElement = infos[i];
-			String id = configurationElement.getAttribute("plugin"); //$NON-NLS-1$
-			String code = configurationElement.getAttribute("code"); //$NON-NLS-1$
-			
-			if (id != null && code != null) {
-				try {
-					StatusHandlerKey key = new StatusHandlerKey(id, Integer.parseInt(code));
-					fStatusHandlers.put(key, configurationElement);
-				} catch (NumberFormatException e) {
-					// invalid status handler
-					invalidStatusHandler(e, configurationElement.getAttribute("id")); //$NON-NLS-1$
-				}
-			} else {
-				// invalid status handler
-				invalidStatusHandler(null, configurationElement.getAttribute("id")); //$NON-NLS-1$
-			}
-		}			
-	}
-	
-	/**
-	 * Register process factories.
-	 * 
-	 */
-	private void initializeProcessFactories() {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.PI_DEBUG_CORE, EXTENSION_POINT_PROCESS_FACTORIES);
-		IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-		fProcessFactories = new HashMap(infos.length);
-		for (int i= 0; i < infos.length; i++) {
-			IConfigurationElement configurationElement = infos[i];
-			String id = configurationElement.getAttribute("id"); //$NON-NLS-1$
-			String clss = configurationElement.getAttribute("class"); //$NON-NLS-1$
-			if (id != null && clss != null) {
-					fProcessFactories.put(id, configurationElement);
-			} else {
-				// invalid process factory
-				String badDefiner= infos[i].getContributor().getName();
-				log(new Status(IStatus.ERROR, DebugPlugin.PI_DEBUG_CORE, INTERNAL_ERROR, MessageFormat.format(DebugCoreMessages.DebugPlugin_4, new String[] {badDefiner, id}), null)); 
-			}
-		}			
-	}
-	
-	private void invalidStatusHandler(Exception e, String id) {
-		log(new Status(IStatus.ERROR, DebugPlugin.PI_DEBUG_CORE, INTERNAL_ERROR, MessageFormat.format(DebugCoreMessages.DebugPlugin_5, new String[] {id}), e));
-	}
-	
-	/**
-	 * Key for status handler extensions - a plug-in identifier/code pair
-	 */
-	class StatusHandlerKey {
-		
-		String fPluginId;
-		int fCode;
-		
-		StatusHandlerKey(String pluginId, int code) {
-			fPluginId = pluginId;
-			fCode = code;
-		}
-		
-		public int hashCode() {
-			return fPluginId.hashCode() + fCode;
-		}
-		
-		public boolean equals(Object obj) {
-			if (obj instanceof StatusHandlerKey) {
-				StatusHandlerKey s = (StatusHandlerKey)obj;
-				return fCode == s.fCode && fPluginId.equals(s.fPluginId);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * Returns whether any event filters are registered
-	 * 
-	 * @return whether any event filters are registered
-	 */
-	private boolean hasEventFilters() {
-		return fEventFilters != null && fEventFilters.size() > 0;
-	}
-	
-	/**
-	 * Executes runnables after event dispatch is complete.
-	 * 
-	 * @since 3.0
-	 */
-	class AsynchRunner implements ISafeRunnable {
-		
-		private Runnable fRunnable = null;
-		
-		void async(Runnable runnable) {
-			fRunnable = runnable;
-			SafeRunner.run(this);
-			fRunnable = null;
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, DebugCoreMessages.DebugPlugin_6, exception); 
-			log(status);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			fRunnable.run();
-		}
-
-	}
-	
-	/**
-	 * Filters and dispatches events in a safe runnable to handle any
-	 * exceptions.
-	 */
-	class EventNotifier implements ISafeRunnable {
-		
-		private DebugEvent[] fEvents;
-		private IDebugEventSetListener fListener;
-		private IDebugEventFilter fFilter;
-		private int fMode;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			switch (fMode) {
-				case NOTIFY_FILTERS:
-					IStatus status = new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, DebugCoreMessages.DebugPlugin_7, exception); 
-					log(status);
-					break;
-				case NOTIFY_EVENTS:				
-					status = new Status(IStatus.ERROR, getUniqueIdentifier(), INTERNAL_ERROR, DebugCoreMessages.DebugPlugin_8, exception); 
-					log(status);
-					break;
-			}
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fMode) {
-				case NOTIFY_FILTERS:
-					fEvents = fFilter.filterDebugEvents(fEvents);
-					break;
-				case NOTIFY_EVENTS:
-					fListener.handleDebugEvents(fEvents);
-					break;
-			}
-		}
-		
-		/**
-		 * Filter and dispatch the given events. If an exception occurs in one
-		 * listener, events are still fired to subsequent listeners.
-		 * 
-		 * @param events debug events
-		 */
-		void dispatch(DebugEvent[] events) {
-			fEvents = events;
-			if (hasEventFilters()) {
-				fMode = NOTIFY_FILTERS;
-				Object[] filters = fEventFilters.getListeners();
-				for (int i = 0; i < filters.length; i++) {
-					fFilter = (IDebugEventFilter)filters[i];
-                    SafeRunner.run(this);
-					if (fEvents == null || fEvents.length == 0) {
-						return;
-					}
-				}	
-			}				
-			
-			fMode = NOTIFY_EVENTS;
-			Object[] listeners= getEventListeners();
-			if (DebugOptions.DEBUG_EVENTS) {
-				for (int i = 0; i < fEvents.length; i++) {
-					System.out.println(fEvents[i]);
-				}
-			}
-			for (int i= 0; i < listeners.length; i++) {
-				fListener = (IDebugEventSetListener)listeners[i]; 
-                SafeRunner.run(this);
-			}
-			fEvents = null;
-			fFilter = null;
-			fListener = null;			
-		}
-
-	}
-
-	/**
-	 * Creates and returns a new XML document.
-	 * 
-	 * @return a new XML document
-	 * @throws CoreException if unable to create a new document
-	 * @since 3.0
-	 */
-	public static Document newDocument()throws CoreException {
-		try {
-			return LaunchManager.getDocument();
-		} catch (ParserConfigurationException e) {
-			abort("Unable to create new XML document.", e);  //$NON-NLS-1$
-		}		
-		return null;
-	}	
-	
-	/**
-	 * Serializes the given XML document into a string.
-	 * 
-	 * @param document XML document to serialize
-	 * @return a string representing the given document
-	 * @throws CoreException if unable to serialize the document
-	 * @since 3.0
-	 */
-	public static String serializeDocument(Document document) throws CoreException {
-		try {
-			return LaunchManager.serializeDocument(document);
-		} catch (TransformerException e) {
-			abort("Unable to serialize XML document.", e);  //$NON-NLS-1$
-		} catch (IOException e) {
-			abort("Unable to serialize XML document.",e);  //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * Parses the given string representing an XML document, returning its
-	 * root element.
-	 * 
-	 * @param document XML document as a string
-	 * @return the document's root element
-	 * @throws CoreException if unable to parse the document
-	 * @since 3.0
-	 */
-	public static Element parseDocument(String document) throws CoreException {
-		Element root = null;
-		InputStream stream = null;
-		try{		
-			DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-			parser.setErrorHandler(new DefaultHandler());
-			stream = new ByteArrayInputStream(document.getBytes());
-			root = parser.parse(stream).getDocumentElement();
-		} catch (ParserConfigurationException e) {
-			abort("Unable to parse XML document.", e);  //$NON-NLS-1$
-		} catch (FactoryConfigurationError e) {
-			abort("Unable to parse XML document.", e);  //$NON-NLS-1$
-		} catch (SAXException e) {
-			abort("Unable to parse XML document.", e);  //$NON-NLS-1$
-		} catch (IOException e) {
-			abort("Unable to parse XML document.", e);  //$NON-NLS-1$
-		} finally { 
-			try{
-                if (stream != null) {
-                    stream.close();
-                }
-			} catch(IOException e) {
-				abort("Unable to parse XML document.", e);  //$NON-NLS-1$
-			}
-		}		
-		return root;
-	}	
-	
-	/**
-	 * Throws an exception with the given message and underlying exception.
-	 * 
-	 * @param message error message
-	 * @param exception underlying exception, or <code>null</code>
-	 * @throws CoreException
-	 */
-	private static void abort(String message, Throwable exception) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, message, exception);
-		throw new CoreException(status);
-	}
-	
-	/**
-	 * Utility class to parse command line arguments.
-	 * 
-	 * @since 3.1
-	 */
-	private static class ArgumentParser {
-		private String fArgs;
-		private int fIndex= 0;
-		private int ch= -1;
-		
-		public ArgumentParser(String args) {
-			fArgs= args;
-		}
-		
-		public String[] parseArguments() {
-			List v= new ArrayList();
-			
-			ch= getNext();
-			while (ch > 0) {
-				if (Character.isWhitespace((char)ch)) {
-					ch= getNext();	
-				} else {
-					if (ch == '"') {
-					    StringBuffer buf = new StringBuffer();
-						buf.append(parseString());
-						if (buf.length() == 0 && Platform.getOS().equals(Constants.OS_WIN32)) {
-							// empty string on windows platform
-							buf.append("\"\""); //$NON-NLS-1$
-						}
-						v.add(buf.toString());
-					} else {
-						v.add(parseToken());
-					}
-				}
-			}
-	
-			String[] result= new String[v.size()];
-			v.toArray(result);
-			return result;
-		}
-		
-		private int getNext() {
-			if (fIndex < fArgs.length())
-				return fArgs.charAt(fIndex++);
-			return -1;
-		}
-		
-		private String parseString() {
-			ch= getNext();
-			if (ch == '"') {
-				ch= getNext();
-				return ""; //$NON-NLS-1$
-			}
-			StringBuffer buf= new StringBuffer();
-			while (ch > 0 && ch != '"') {
-				if (ch == '\\') {
-					ch= getNext();
-					if (ch != '"') {           // Only escape double quotes
-						buf.append('\\');
-					} else {
-						if (Platform.getOS().equals(Constants.OS_WIN32)) {
-							// @see Bug 26870. Windows requires an extra escape for embedded strings
-							buf.append('\\');
-						}
-					}
-				}
-				if (ch > 0) {
-					buf.append((char)ch);
-					ch= getNext();
-				}
-			}
-			ch= getNext();
-			return buf.toString();
-		}
-		
-		private String parseToken() {
-			StringBuffer buf= new StringBuffer();
-			
-			while (ch > 0 && !Character.isWhitespace((char)ch)) {
-				if (ch == '\\') {
-					ch= getNext();
-					if (Character.isWhitespace((char)ch)) {
-						// end of token, don't lose trailing backslash
-						buf.append('\\');
-						return buf.toString();
-					}
-					if (ch > 0) {
-						if (ch != '"') {           // Only escape double quotes
-							buf.append('\\');
-						} else {
-							if (Platform.getOS().equals(Constants.OS_WIN32)) {
-								// @see Bug 26870. Windows requires an extra escape for embedded strings
-								buf.append('\\');
-							}
-						}
-						buf.append((char)ch);
-						ch= getNext();
-					} else if (ch == -1) {     // Don't lose a trailing backslash
-						buf.append('\\');
-					}
-				} else if (ch == '"') {
-					buf.append(parseString());
-				} else {
-					buf.append((char)ch);
-					ch= getNext();
-				}
-			}
-			return buf.toString();
-		}
-	}
-	
-	/**
-	 * Parses the given command line into separate arguments that can be passed to
-	 * <code>DebugPlugin.exec(String[], File)</code>. Embedded quotes and slashes
-	 * are escaped.
-	 * 
-	 * @param args command line arguments as a single string
-	 * @return individual arguments
-	 * @since 3.1
-	 */
-	public static String[] parseArguments(String args) {
-		if (args == null)
-			return new String[0];
-		ArgumentParser parser= new ArgumentParser(args);
-		String[] res= parser.parseArguments();
-		
-		return res;
-	}	
-	
-	/**
-	 * Sets whether step filters should be applied to step commands. This
-	 * setting is a global option applied to all registered debug targets. 
-	 * 
-	 * @param useStepFilters whether step filters should be applied to step
-	 *  commands
-	 * @since 3.3
-	 * @see org.eclipse.debug.core.model.IStepFilters
-	 */
-	public static void setUseStepFilters(boolean useStepFilters) {
-		getStepFilterManager().setUseStepFilters(useStepFilters);
-	}
-		
-	/**
-	 * Returns whether step filters are applied to step commands.
-	 * 
-	 * @return whether step filters are applied to step commands
-	 * @since 3.3
-	 * @see org.eclipse.debug.core.model.IStepFilters
-	 * @see org.eclipse.debug.core.commands.IStepFiltersHandler
-	 */
-	public static boolean isUseStepFilters() {
-		return getStepFilterManager().isUseStepFilters();
-	}	
-	
-	/**
-	 * Returns the step filter manager.
-	 * 
-	 * @return step filter manager
-	 */
-	private static StepFilterManager getStepFilterManager() {
-		return ((LaunchManager)getDefault().getLaunchManager()).getStepFilterManager();
-	}
-	
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.java
deleted file mode 100644
index 49e4bef..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.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.debug.core;
-
-
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.debug.core.model.IBreakpoint;
-
-/**
- * A breakpoint listener is notified of breakpoint additions,
- * removals, and changes. Listeners register and unregister with the
- * breakpoint manager.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IBreakpointManager
- */
-
-public interface IBreakpointListener {
-
-	/**
-	 * Notifies this listener that the given breakpoint has been added
-	 * to the breakpoint manager.
-	 *
-	 * @param breakpoint the added breakpoint
-	 * @since 2.0
-	 */
-	public void breakpointAdded(IBreakpoint breakpoint);
-	/**
-	 * Notifies this listener that the given breakpoint has been removed
-	 * from the breakpoint manager.
-	 * If the given breakpoint has been removed because it has been deleted,
-	 * the associated marker delta is also provided.
-	 *
-	 * @param breakpoint the removed breakpoint
-	 * @param delta the associated marker delta, or  <code>null</code> when
-	 * 	the breakpoint is removed from the breakpoint manager without
-	 *	being deleted
-	 *
-	 * @see org.eclipse.core.resources.IMarkerDelta
-	 * @since 2.0
-	 */
-	public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta);
-	
-	/**
-	 * Notifies this listener that an attribute of the given breakpoint has
-	 * changed, as described by the delta.
-	 *
-	 * @param breakpoint the changed breakpoint
-	 * @param delta the marker delta that describes the changes
-	 *  with the marker associated with the given breakpoint, or
-	 *  <code>null</code> when the breakpoint change does not generate
-	 *  a marker delta
-	 *
-	 * @see org.eclipse.core.resources.IMarkerDelta
-	 * @since 2.0
-	 */
-	public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java
deleted file mode 100644
index 8bd9bd5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java
+++ /dev/null
@@ -1,254 +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.debug.core;
-
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-
-/**
- * The breakpoint manager manages the collection of breakpoints
- * in the workspace. A breakpoint suspends the execution of a
- * program being debugged. The kinds of breakpoints supported by each
- * debug architecture and the information required to create those
- * breakpoints is defined by each debug architecture.
- * Breakpoint creation is a client responsibility.
- * <p>
- * Clients interested in breakpoint change notification may
- * register with the breakpoint manager - see
- * <code>IBreakpointListener</code> and <code>IBreakpointsListener</code>
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see org.eclipse.debug.core.IBreakpointListener
- * @see org.eclipse.debug.core.IBreakpointsListener
- */
-public interface IBreakpointManager {
-	/**
-	 * Adds the given breakpoint to the collection of registered breakpoints
-	 * in the workspace and notifies all registered listeners. This has no effect
-	 * if the given breakpoint is already registered.
-	 *
-	 * @param breakpoint the breakpoint to add
-	 *
-	 * @exception CoreException if adding fails. Reasons include:<ul>
-	 * <li>CONFIGURATION_INVALID - the required <code>MODEL_IDENTIFIER</code> attribute
-	 * 	is not set on the breakpoint marker.</li>
-	 * <li>A <code>CoreException</code> occurred while verifying the <code>MODEL_IDENTIFIER</code>
-	 *	attribute.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public void addBreakpoint(IBreakpoint breakpoint) throws CoreException;
-	
-	/**
-	 * Adds the given breakpoints to the collection of registered breakpoints
-	 * in the workspace and notifies all registered listeners. Has no effect
-	 * on breakpoints that are already registered.
-	 *
-	 * @param breakpoints the breakpoints to add
-	 *
-	 * @exception CoreException if adding fails. Reasons include:<ul>
-	 * <li>CONFIGURATION_INVALID - the required <code>MODEL_IDENTIFIER</code> attribute
-	 * 	is not set on a breakpoint marker.</li>
-	 * <li>A <code>CoreException</code> occurred while verifying a <code>MODEL_IDENTIFIER</code>
-	 *	attribute.</li>
-	 * </ul>
-	 * @since 2.1
-	 */
-	public void addBreakpoints(IBreakpoint[] breakpoints) throws CoreException;	
-	
-	/**
-	 * Returns the breakpoint associated with the given marker or
-	 * <code>null</code> if no such breakpoint exists
-	 * 
-	 * @param marker the marker
-	 * @return the breakpoint associated with the marker
-	 * 	or <code>null</code> if none exists
-	 * @since 2.0
-	 */
-	public IBreakpoint getBreakpoint(IMarker marker);	
-	
-	/**
-	 * Returns a collection of all registered breakpoints.
-	 * Returns an empty array if no breakpoints are registered.
-	 *
-	 * @return an array of breakpoints
-	 * @since 2.0
-	 */
-	public IBreakpoint[] getBreakpoints();
-	
-	/**
-	 * Returns whether there are any registered breakpoints.
-	 * 
-	 * @return whether there are any registered breakpoints
-	 * @since 2.0
-	 */
-	public boolean hasBreakpoints();
-	
-	/**
-	 * Returns a collection of all breakpoints registered for the
-	 * given debug model. Answers an empty array if no breakpoints are registered
-	 * for the given debug model.
-	 *
-	 * @param modelIdentifier identifier of a debug model plug-in
-	 * @return an array of breakpoints
-	 * @since 2.0
-	 */
-	public IBreakpoint[] getBreakpoints(String modelIdentifier);
-		
-	/**
-	 * Returns whether the given breakpoint is currently
-	 * registered with this breakpoint manager.
-	 *
-	 * @param breakpoint a breakpoint
-	 * @return whether the breakpoint is registered
-	 * @since 2.0
-	 */
-	public boolean isRegistered(IBreakpoint breakpoint);
-	
-	/**
-	 * Notifies all registered listeners that the given
-	 * breakpoint has changed. Has no effect if the given
-	 * breakpoint is not currently registered.
-	 * 
-	 * This method is intended to be used when a breakpoint
-	 * attribute is changed that does not alter the breakpoint's
-	 * underlying marker, that is, when notification will not occur
-	 * via the marker delta mechanism.
-	 * 
-	 * @param breakpoint the breakpoint that has changed.
-	 * @since 2.0
-	 */
-	public void fireBreakpointChanged(IBreakpoint breakpoint);
-	
-	/**
-	 * Removes the given breakpoint from the breakpoint manager, deletes
-	 * the marker associated with the breakpoint if the <code>delete</code> flag
-	 * is <code>true</code>, and notifies all registered
-	 * listeners. Has no effect if the given breakpoint is not currently
-	 * registered.
-	 *
-	 * @param breakpoint the breakpoint to remove
-	 * @param delete whether to delete the marker associated with the
-	 *  breakpoint
-	 * @exception CoreException if an exception occurs while deleting the
-	 * 	underlying marker.
-	 * @since 2.0
-	 */
-	public void removeBreakpoint(IBreakpoint breakpoint, boolean delete) throws CoreException;
-	
-	/**
-	 * Removes the given breakpoints from the breakpoint manager, deletes
-	 * the markers associated with the breakpoints if the <code>delete</code> flag
-	 * is <code>true</code>, and notifies all registered
-	 * listeners. Has no effect on breakpoints not currently
-	 * registered.
-	 *
-	 * @param breakpoints the breakpoints to remove
-	 * @param delete whether to delete the markers associated with the
-	 *  breakpoints
-	 * @exception CoreException if an exception occurs while deleting an
-	 * 	underlying marker.
-	 * @since 2.1
-	 */
-	public void removeBreakpoints(IBreakpoint[] breakpoints, boolean delete) throws CoreException;	
-
-	/**
-	 * Adds the given listener to the collection of registered breakpoint listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to add
-	 */
-	public void addBreakpointListener(IBreakpointListener listener);
-
-	/**
-	 * Removes the given listener from the collection of registered breakpoint listeners.
-	 * Has no effect if an identical listener is not already registered.
-	 *
-	 * @param listener the listener to remove	
-	 */
-	public void removeBreakpointListener(IBreakpointListener listener);
-	
-	/**
-	 * Adds the given listener to the collection of registered breakpoint listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to add
-	 * @since 2.1
-	 */
-	public void addBreakpointListener(IBreakpointsListener listener);
-
-	/**
-	 * Removes the given listener from the collection of registered breakpoint listeners.
-	 * Has no effect if an identical listener is not already registered.
-	 *
-	 * @param listener the listener to remove	
-	 * @since 2.1
-	 */
-	public void removeBreakpointListener(IBreakpointsListener listener);
-	
-	/**
-	 * Adds the given listener to the collection of registered breakpoint manager
-	 * listeners. Has no effect if an identical listener is already registered.
-	 * 
-	 * @param listener the listener to add
-	 * @since 3.0
-	 */
-	public void addBreakpointManagerListener(IBreakpointManagerListener listener);
-	
-	/**
-	 * Removes the given listener from the collection of registered breakpoint manager
-	 * listeners. Has no effect if an identical listener is not already registered.
-	 * 
-	 * @param listener the listener to remove
-	 * @since 3.0
-	 */
-	public void removeBreakpointManagerListener(IBreakpointManagerListener listener);
-	
-	/**
-	 * Returns whether or not this breakpoint manager is enabled.
-	 * When a breakpoint manager is enabled, all breakpoints
-	 * should be honored. When it is disabled, breakpoints should
-	 * not be honored, regardless of each breakpoint's enabled state.
-	 * 
-	 * @return whether or not this breakpoint manager is enabled
-	 * @since 3.0
-	 */
-	public boolean isEnabled();
-	
-	/**
-	 * Sets the enabled state of this breakpoint manager. When
-	 * enabled, breakpoints should be honored. When disabled, all
-	 * breakpoints should be ignored.
-	 * 
-	 * @param enabled whether this breakpoint manager should be
-	 *  enabled
-	 * @since 3.0
-	 */
-	public void setEnabled(boolean enabled);
-
-    /**
-     * Returns the name (user readable String) of the given
-     * breakpoint's type or <code>null</code> if none has been
-     * specified.
-     * 
-     * @param breakpoint the breakpoint
-     * @return the name of the given breakpoint's type or <code>null</code>
-     * @since 3.1
-     */
-    public String getTypeName(IBreakpoint breakpoint);
-	
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManagerListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManagerListener.java
deleted file mode 100644
index 7047e3f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManagerListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core;
-
-/**
- * A breakpoint manager listener is notified when the breakpoint manager's
- * enablement changes. When the breakpoint manager is disabled, no breakpoints
- * should be honored. When the breakpoint manager is enabled, breakpoints should
- * be honored as usual.
- * <p>
- * Clients are intended to implement this interface.
- * </p>
- * @see IBreakpointManager
- * @since 3.0
- */
-public interface IBreakpointManagerListener {
-	
-	/**
-	 * Notifies the listener that the breakpoint manager's enablement
-	 * has changed.
-	 * 
-	 * @param enabled whether or not the breakpoint manager is enabled
-	 */
-	public void breakpointManagerEnablementChanged(boolean enabled);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointsListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointsListener.java
deleted file mode 100644
index 6e0aa6e..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointsListener.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.debug.core;
-
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.debug.core.model.IBreakpoint;
-
-/**
- * A breakpoints listener is notified of breakpoint additions,
- * removals, and changes. Listeners register and unregister with the
- * breakpoint manager.
- * <p>
- * This interface is analogous to <code>IBreakpointListener</code> except
- * notifications are batched for more than one breakpoint when possible.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IBreakpointManager
- * @since 2.1
- */
-
-public interface IBreakpointsListener {
-
-	/**
-	 * Notifies this listener that the given breakpoints have been added
-	 * to the breakpoint manager.
-	 *
-	 * @param breakpoints the added breakpoints
-	 */
-	public void breakpointsAdded(IBreakpoint[] breakpoints);
-	/**
-	 * Notifies this listener that the given breakpoints have been removed
-	 * from the breakpoint manager.
-	 * If a breakpoint has been removed because it has been deleted,
-	 * the associated marker delta is also provided.
-	 *
-	 * @param breakpoints the removed breakpoints
-	 * @param deltas the associated marker deltas. Entries may be
-	 *  <code>null</code> when a breakpoint is removed from the breakpoint
-	 *  manager without being deleted
-	 *
-	 * @see org.eclipse.core.resources.IMarkerDelta
-	 */
-	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas);
-	
-	/**
-	 * Notifies this listener that the given breakpoints have
-	 * changed, as described by the corresponding deltas.
-	 *
-	 * @param breakpoints the changed breakpoints
-	 * @param deltas the marker deltas that describe the changes
-	 *  with the markers associated with the given breakpoints. Entries
-	 *  may be <code>null</code> when a breakpoint change does not generate
-	 *  a marker delta
-	 *
-	 * @see org.eclipse.core.resources.IMarkerDelta
-	 */
-	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventFilter.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventFilter.java
deleted file mode 100644
index ece27fe..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventFilter.java
+++ /dev/null
@@ -1,38 +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.debug.core;
-
-
-/**
- * An event filter allows clients to intercept debug events.
- * Event filters are registered with the debug plug-in.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see DebugPlugin
- * @since 2.0
- */
-public interface IDebugEventFilter {
-
-	/**
-	 * Filters the given set of debug events, and returns the set of debug
-	 * events that should be fired to registered listeners - <code>null</code>
-	 * or an empty collection if no debug events should be fired.
-	 * <p>
-	 * When multiple event filters are registered, events are passed through
-	 * all filters. That is, the events returned from the first filter are
-	 * passed through the second filter, and so on.
-	 * </p>
-	 * @param events set of debug events to filter
-	 * @return  the set of debug events to fire
-	 */
-	public DebugEvent[] filterDebugEvents(DebugEvent[] events);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventSetListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventSetListener.java
deleted file mode 100644
index 683270b..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventSetListener.java
+++ /dev/null
@@ -1,39 +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.debug.core;
-
-
-/**
- * A debug event set listener registers with the debug plug-in
- * to receive event notification from programs being run or debugged.
- * <p>
- * When more than one event is reported, each event has occurred at the
- * same location in a target program. For example, a breakpoint may
- * reside at the same location at which a step request completes. In 
- * this case the breakpoint event and step end event are reported together
- * in the same event set.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see DebugEvent
- * @since 2.0
- */
-public interface IDebugEventSetListener {
-	/**
-	 * Notifies this listener of the given debug events.
-	 * All of the events in the given event collection occurred
-	 * at the same location the program be run or debugged.
-	 *
-	 * @param events the debug events
-	 */
-	public void handleDebugEvents(DebugEvent[] events);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionListener.java
deleted file mode 100644
index d82e6bf..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionListener.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.debug.core;
-
-
-
-import org.eclipse.debug.core.model.IExpression;
-
-/**
- * An expression listener is notified of expression additions,
- * removals, and changes. Listeners register and unregister with the
- * expression manager.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IExpressionManager
- * @since 2.0
- */
-
-public interface IExpressionListener {
-
-	/**
-	 * Notifies this listener that the given expression has been added
-	 * to the expression manager.
-	 *
-	 * @param expression the added expression
-	 */
-	public void expressionAdded(IExpression expression);
-	/**
-	 * Notifies this listener that the given expression has been removed
-	 * from the expression manager.
-	 *
-	 * @param expression the removed expression
-	 */
-	public void expressionRemoved(IExpression expression);
-	
-	/**
-	 * Notifies this listener that the given expression has
-	 * changed.
-	 *
-	 * @param expression the changed expression
-	 */
-	public void expressionChanged(IExpression expression);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java
deleted file mode 100644
index fa3cc9d..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionManager.java
+++ /dev/null
@@ -1,170 +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.debug.core;
-
-
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.core.model.IWatchExpressionDelegate;
-
-/**
- * The expression manager manages the collection of registered
- * expressions in the workspace. An expression is a snippet of code
- * that can be evaluated to produce a value. Expression creation
- * and evaluation are client responsibilities.
- * <p>
- * Clients interested in expression change notification may
- * register with the expression manager - see
- * <code>IExpressionListener</code> and <code>IExpressionsListener</code>.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see org.eclipse.debug.core.model.IExpression
- * @see org.eclipse.debug.core.IExpressionListener
- * @see org.eclipse.debug.core.IExpressionsListener
- * @since 2.0
- */
-public interface IExpressionManager {
-	/**
-	 * Adds the given expression to the collection of registered expressions
-	 * in the workspace and notifies all registered listeners. This has no effect
-	 * if the given expression is already registered.
-	 *
-	 * @param expression the expression to add
-	 */
-	public void addExpression(IExpression expression);
-	
-	/**
-	 * Adds the given expressions to the collection of registered expressions
-	 * in the workspace and notifies all registered listeners. Has no effect
-	 * on expressions already registered.
-	 *
-	 * @param expressions the expressions to add
-	 * @since 2.1
-	 */
-	public void addExpressions(IExpression[] expressions);
-	
-	/**
-	 * Creates and returns a new watch expression with the
-	 * given text. The returned expression is <b>not</b> added to
-	 * this manager.
-	 * 
-	 * @return new watch expression
-	 * @param expressionText the text for the new expression
-	 * @since 3.0
-	 */
-	public IWatchExpression newWatchExpression(String expressionText);
-		
-	/**
-	 * Returns a collection of all registered expressions, 
-	 * possibly empty.
-	 *
-	 * @return an array of expressions
-	 */
-	public IExpression[] getExpressions();
-	
-	/**
-	 * Returns whether there are any registered expressions
-	 * 
-	 * @return whether there are any registered expressions
-	 */
-	public boolean hasExpressions();
-	
-	/**
-	 * Returns a collection of all expressions registered for the
-	 * given debug model,possibly empty.
-	 *
-	 * @param modelIdentifier identifier of a debug model plug-in
-	 * @return an array of expressions
-	 */
-	public IExpression[] getExpressions(String modelIdentifier);
-		
-	/**
-	 * Removes the given expression from the expression manager,
-	 * and notifies all registered listeners. Has no effect if the
-	 * given expression is not currently registered.
-	 *
-	 * @param expression the expression to remove
-	 */
-	public void removeExpression(IExpression expression);
-	
-	/**
-	 * Removes the given expressions from the collection of registered expressions
-	 * in the workspace and notifies all registered listeners. Has no effect
-	 * on expressions not already registered.
-	 *
-	 * @param expressions the expressions to remove
-	 * @since 2.1
-	 */
-	public void removeExpressions(IExpression[] expressions);		
-
-	/**
-	 * Adds the given listener to the collection of registered expression listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to add
-	 */
-	public void addExpressionListener(IExpressionListener listener);
-
-	/**
-	 * Removes the given listener from the collection of registered expression listeners.
-	 * Has no effect if an identical listener is not already registered.
-	 *
-	 * @param listener the listener to remove	
-	 */
-	public void removeExpressionListener(IExpressionListener listener);
-	
-	/**
-	 * Adds the given listener to the collection of registered expression listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to add
-	 * @since 2.1
-	 */
-	public void addExpressionListener(IExpressionsListener listener);
-
-	/**
-	 * Removes the given listener from the collection of registered expression listeners.
-	 * Has no effect if an identical listener is not already registered.
-	 *
-	 * @param listener the listener to remove	
-	 * @since 2.1
-	 */
-	public void removeExpressionListener(IExpressionsListener listener);
-	
-	/**
-	 * Returns a new watch expression delegate for the given debug
-	 * model or <code>null</code> if no delegate is available.
-	 * 
-	 * @param id the unique identifier of a debug model for which a
-	 *  watch expression delegate has been contributed
-	 * @return a watch expression delegate associated with the given model
-	 * 		or <code>null</code> if none
-	 * @since 3.0
-	 * @see IWatchExpressionDelegate
-	 */
-	public IWatchExpressionDelegate newWatchExpressionDelegate(String id);
-    
-    /**
-     * Returns whether a watch expression delegate has been contributed for
-     * the given debug model.
-     * 
-     * @param id the unique identifier of a debug model
-     * @return whether a watch expression delegate has been contributed for
-     *    the given debug model
-     * @since 3.1
-     * @see IWatchExpressionDelegate
-     */    
-    public boolean hasWatchExpressionDelegate(String id);
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionsListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionsListener.java
deleted file mode 100644
index a73a72e..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IExpressionsListener.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.debug.core;
-
-
-import org.eclipse.debug.core.model.IExpression;
-
-/**
- * An expression listener is notified of expression additions,
- * removals, and changes. Listeners register and unregister with the
- * expression manager.
- * <p>
- * This interface is analogous to <code>IExpressionListener</code>, except
- * notifications are batched for more than when expression when possible.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IExpressionManager
- * @since 2.1
- */
-
-public interface IExpressionsListener {
-
-	/**
-	 * Notifies this listener that the given expressions have been added
-	 * to the expression manager.
-	 *
-	 * @param expressions the added expressions
-	 */
-	public void expressionsAdded(IExpression[] expressions);
-	/**
-	 * Notifies this listener that the given expressions has been removed
-	 * from the expression manager.
-	 *
-	 * @param expressions the removed expressions
-	 */
-	public void expressionsRemoved(IExpression[] expressions);
-	
-	/**
-	 * Notifies this listener that the given expressions have
-	 * changed.
-	 *
-	 * @param expressions the changed expressions
-	 */
-	public void expressionsChanged(IExpression[] expressions);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java
deleted file mode 100644
index fe0e3b8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java
+++ /dev/null
@@ -1,178 +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.debug.core;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.core.model.ITerminate;
-
-/**
- * A launch is the result of launching a debug session
- * and/or one or more system processes.
- * <p>
- * This interface is not intended to be implemented by clients. Clients
- * should create instances of this interface by using the implementation
- * provided by the class <code>Launch</code>.
- * </p>
- * @see Launch
- * @see org.eclipse.debug.core.IProcessFactory
- */
-public interface ILaunch extends ITerminate, IAdaptable {
-	/**
-	 * Returns the children of this launch - a collection
-	 * of one or more debug targets and processes, possibly empty.
-	 *
-	 * @return an array (element type:<code>IDebugTarget</code> or <code>IProcess</code>),
-	 * 	or an empty array
-	 */
-	public Object[] getChildren();
-	/**
-	 * Returns the primary (first) debug target associated with this launch, or <code>null</code>
-	 * if no debug target is associated with this launch. All debug targets 
-	 * associated with this launch may be retrieved by
-	 * <code>getDebugTargets()</code>.
-	 *
-	 * @return the primary debug target associated with this launch, or <code>null</code>
-	 */
-	public IDebugTarget getDebugTarget();
-
-	/**
-	 * Returns the processes that were launched,
-	 * or an empty collection if no processes were launched.
-	 *
-	 * @return array of processes
-	 */
-	public IProcess[] getProcesses();
-	
-	/**
-	 * Returns all the debug targets associated with this launch,
-	 * or an empty collection if no debug targets are associated
-	 * with this launch. The primary debug target is the first
-	 * in the collection (if any).
-	 *
-	 * @return array of debug targets
-	 * @since 2.0
-	 */
-	public IDebugTarget[] getDebugTargets();
-	
-	/**
-	 * Adds the given debug target to this launch. Has no effect
-	 * if the given debug target is already associated with this
-	 * launch. Registered listeners are notified that this launch
-	 * has changed.
-	 *
-	 * @param target debug target to add to this launch
-	 * @since 2.0
-	 */
-	public void addDebugTarget(IDebugTarget target);	
-	
-	/**
-	 * Removes the given debug target from this launch. Has no effect
-	 * if the given debug target is not already associated with this
-	 * launch. Registered listeners are notified that this launch
-	 * has changed.
-	 *
-	 * @param target debug target to remove from this launch
-	 * @since 2.0
-	 */
-	public void removeDebugTarget(IDebugTarget target);	
-	
-	/**
-	 * Adds the given process to this launch. Has no effect
-	 * if the given process is already associated with this
-	 * launch. Registered listeners are notified that this launch
-	 * has changed.
-	 *
-	 * @param process the process to add to this launch
-	 * @since 2.0
-	 */
-	public void addProcess(IProcess process);		
-	
-	/**
-	 * Removes the given process from this launch. Has no effect
-	 * if the given process is not already associated with this
-	 * launch. Registered listeners are notified that this launch
-	 * has changed.
-	 *
-	 * @param process the process to remove from this launch
-	 * @since 2.0
-	 */
-	public void removeProcess(IProcess process);			
-		
-	/**
-	 * Returns the source locator to use for locating source elements for
-	 * the debug target associated with this launch, or <code>null</code>
-	 * if source lookup is not supported.
-	 *
-	 * @return the source locator
-	 */
-	public ISourceLocator getSourceLocator();
-	
-	/**
-	 * Sets the source locator to use for locating source elements for
-	 * the debug target associated with this launch, or <code>null</code>
-	 * if source lookup is not supported.
-	 *
-	 * @param sourceLocator source locator or <code>null</code>
-	 * @since 2.0
-	 */
-	public void setSourceLocator(ISourceLocator sourceLocator);
-		
-	/**
-	 * Returns the mode of this launch - one of the mode constants defined by
-	 * the launch manager.
-	 *
-	 * @return the launch mode
-	 * @see ILaunchManager
-	 */
-	public String getLaunchMode();
-	
-	/**
-	 * Returns the configuration that was launched, or <code>null</code>
-	 * if no configuration was launched.
-	 * 
-	 * @return the launched configuration or <code>null</code>
-	 * @since 2.0
-	 */
-	public ILaunchConfiguration getLaunchConfiguration();
-	
-	/**
-	 * Sets the value of a client defined attribute.
-	 *
-	 * @param key the attribute key
-	 * @param value the attribute value
-	 * @since 2.0
-	 */
-	public void setAttribute(String key, String value);
-	
-	/**
-	 * Returns the value of a client defined attribute.
-	 *
-	 * @param key the attribute key
-	 * @return value the attribute value, or <code>null</code> if undefined
-	 * @since 2.0
-	 */
-	public String getAttribute(String key);	
-	
-	/**
-	 * Returns whether this launch contains at least one process
-	 * or debug target.
-	 * 
-	 * @return whether this launch contains at least one process
-	 * or debug target
-	 * @since 2.0
-	 */
-	public boolean hasChildren();
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java
deleted file mode 100644
index e3c6bc3..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java
+++ /dev/null
@@ -1,570 +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.debug.core;
-
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-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.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * A launch configuration describes how to launch an application.
- * Each launch configuration is an instance of a type of launch
- * configuration as described by a launch configuration type 
- * extension. Each launch configuration has a launch configuration
- * delegate which performs the actual launching of a
- * configuration.
- * <p>
- * A launch configuration may be shared in a repository via
- * standard VCM mechanisms, or may be stored locally, essentially
- * making the launch configuration private for a single user.
- * Thus, a launch configuration may stored as a file in the
- * workspace (shared), or as a file in the debug plug-in's state
- * location.
- * </p>
- * A launch configuration is a handle to its underlying storage.
- * Methods annotated as "handle-only" do not require a configuration
- * to exist. Methods that require an underlying configuration to exist
- * throw a <code>CoreException</code> when an underlying configuration
- * is missing.
- * </p>
- * <p>
- * A launch configuration is modified by obtaining a working copy
- * of a launch configuration, modifying the working copy, and then
- * saving the working copy.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients. Clients
- * that define a launch configuration delegate extension implement the
- * <code>ILaunchConfigurationDelegate</code> interface.
- * </p>
- * @see ILaunchConfigurationType
- * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate
- * @see ILaunchConfigurationWorkingCopy
- * @since 2.0
- */
-public interface ILaunchConfiguration extends IAdaptable {
-	
-	/**
-	 * The file extension for launch configuration files
-	 * (value <code>"launch"</code>).
-	 */
-	public static final String LAUNCH_CONFIGURATION_FILE_EXTENSION = "launch"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute storing an identifier of
-	 * a persistable source locator extension. When this attribute is
-	 * specified, a new source locator will be created automatically and
-	 * associated with the launch for this configuration.
-	 * 
-	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator
-	 */
-	public static final String ATTR_SOURCE_LOCATOR_ID = DebugPlugin.getUniqueIdentifier() + ".source_locator_id"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute storing a memento of a 
-	 * source locator. When this attribute is specified in
-	 * conjunction with a source locator id, the source locator
-	 * created for a launch will be initialized with this memento.
-	 * When not specified, but a source locator id is specified,
-	 * the source locator will be initialized to default values.
-	 * 
-	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator
-	 */
-	public static final String ATTR_SOURCE_LOCATOR_MEMENTO = DebugPlugin.getUniqueIdentifier() + ".source_locator_memento"; //$NON-NLS-1$
-	
-	/**
-	 * Returns whether the contents of this launch configuration are 
-	 * equal to the contents of the given launch configuration.
-	 * 
-	 * @param configuration launch configuration
-	 * @return whether the contents of this launch configuration are equal to the contents
-	 * of the specified launch configuration.
-	 */
-	public boolean contentsEqual(ILaunchConfiguration configuration);
-	
-	/**
-	 * Returns a copy of this launch configuration, as a
-	 * working copy, with the specified name. The new
-	 * working copy does not refer back to this configuration
-	 * as its original launch configuration (the working copy
-	 * will return <code>null</code> for <code>getOriginal()</code>).
-	 * When the working copy is saved it will not effect this
-	 * launch configuration.
-	 * 
-	 * @param name the name of the copy
-	 * @return a copy of this launch configuration
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while initializing the contents of the
-	 * working copy from this configuration's underlying storage.</li>
-	 * </ul>
-	 * @see ILaunchConfigurationWorkingCopy#getOriginal()
-	 */
-	public ILaunchConfigurationWorkingCopy copy(String name) throws CoreException;
-	
-	/**
-	 * Deletes this launch configuration. This configuration's underlying
-	 * storage is deleted. Has no effect if this configuration
-	 * does not exist.
-	 * 
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while deleting this configuration's
-	 *  underlying storage.</li>
-	 * </ul>
-	 */
-	public void delete() throws CoreException;
-	
-	/**
-	 * Returns whether this launch configuration's underlying
-	 * storage exists. This is a handle-only method.
-	 * 
-	 * @return whether this launch configuration's underlying
-	 *  storage exists
-	 */
-	public boolean exists();
-	
-	/**
-	 * Returns the boolean-valued attribute with the given name.  
-	 * Returns the given default value if the attribute is undefined.
-	 *
-	 * @param attributeName the name of the attribute
-	 * @param defaultValue the value to use if no value is found
-	 * @return the value or the default value if no value was found.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while retrieving the attribute from
-	 *  underlying storage.</li>
-	 * <li>An attribute with the given name exists, but does not
-	 *  have a boolean value</li>
-	 * </ul>
-	 */
-	public boolean getAttribute(String attributeName, boolean defaultValue) throws CoreException;
-		
-	/**
-	 * Returns the integer-valued attribute with the given name.  
-	 * Returns the given default value if the attribute is undefined.
-	 *
-	 * @param attributeName the name of the attribute
-	 * @param defaultValue the value to use if no value is found
-	 * @return the value or the default value if no value was found.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while retrieving the attribute from
-	 *  underlying storage.</li>
-	 * <li>An attribute with the given name exists, but does not
-	 *  have an integer value</li>
-	 * </ul>
-	 */
-	public int getAttribute(String attributeName, int defaultValue) throws CoreException;
-	
-	/**
-	 * Returns the <code>java.util.List</code>-valued attribute with the given name.  
-	 * Returns the given default value if the attribute is undefined.
-	 *
-	 * @param attributeName the name of the attribute
-	 * @param defaultValue the value to use if no value is found
-	 * @return the value or the default value if no value was found.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while retrieving the attribute from
-	 *  underlying storage.</li>
-	 * <li>An attribute with the given name exists, but does not
-	 *  have a List value</li>
-	 * </ul>
-	 */
-	public List getAttribute(String attributeName, List defaultValue) throws CoreException;
-	
-	/**
-	 * Returns the <code>java.util.Set</code>-valued attribute with the given name.  
-	 * Returns the given default value if the attribute is undefined.
-	 *
-	 * @param attributeName the name of the attribute
-	 * @param defaultValue the value to use if no value is found
-	 * @return the value or the default value if no value was found.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while retrieving the attribute from
-	 *  underlying storage.</li>
-	 * <li>An attribute with the given name exists, but does not
-	 *  have a List value</li>
-	 * </ul>
-	 * 
-	 * @since 3.3
-	 */
-	public Set getAttribute(String attributeName, Set defaultValue) throws CoreException;
-	
-	/**
-	 * Returns the <code>java.util.Map</code>-valued attribute with the given name.  
-	 * Returns the given default value if the attribute is undefined.
-	 *
-	 * @param attributeName the name of the attribute
-	 * @param defaultValue the value to use if no value is found
-	 * @return the value or the default value if no value was found.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while retrieving the attribute from
-	 *  underlying storage.</li>
-	 * <li>An attribute with the given name exists, but does not
-	 *  have a Map value</li>
-	 * </ul>
-	 */
-	public Map getAttribute(String attributeName, Map defaultValue) throws CoreException;
-	
-	/**
-	 * Returns the string-valued attribute with the given name.  
-	 * Returns the given default value if the attribute is undefined.
-	 *
-	 * @param attributeName the name of the attribute
-	 * @param defaultValue the value to use if no value is found
-	 * @return the value or the default value if no value was found.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while retrieving the attribute from
-	 *  underlying storage.</li>
-	 * <li>An attribute with the given name exists, but does not
-	 *  have a String value</li>
-	 * </ul>
-	 */
-	public String getAttribute(String attributeName, String defaultValue) throws CoreException;
-	
-	/**
-	 * Returns a map containing the attributes in this launch configuration.
-	 * Returns an empty map if this configuration has no attributes.
-	 * <p>
-	 * Modifying the map does not affect this launch configuration's attributes.
-	 * A launch configuration is modified by obtaining a working copy of that
-	 * launch configuration, modifying the working copy, and then saving the working
-	 * copy.
-	 * </p>
-	 * @return a map of attribute keys and values
-	 * @exception CoreException unable to generate/retrieve an attribute map
-	 * @since 2.1
-	 */
-	public Map getAttributes() throws CoreException;
-	
-	/**
-	 * Returns this launch configuration's type's category, or <code>null</code>
-	 * if unspecified. This is a handle-only method.
-	 * 
-	 * @return this launch configuration's type's category, or <code>null</code>
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>Unable to retrieve or instantiate this launch configuration's type.</li>
-	 * </ul>
-	 * @since 2.1
-	 */
-	public String getCategory() throws CoreException;
-	
-	/**
-	 * Returns the file this launch configuration is stored
-	 * in, or <code>null</code> if this configuration is stored
-	 * locally with the workspace. This is a handle-only method.
-	 * 
-	 * @return the file this launch configuration is stored
-	 *  in, or <code>null</code> if this configuration is stored
-	 *  locally with the workspace
-	 */
-	public IFile getFile();
-		
-	/**
-	 * Returns the location of this launch configuration as a
-	 * path. This is a handle-only method.
-	 * 
-	 * @return the location of this launch configuration as a
-	 *  path
-	 */
-	public IPath getLocation();
-	
-	/**
-	 * Returns the resources this launch configuration is associated with or <code>null</code>
-	 * if none. Clients contributing launch configuration types are responsible for maintaining
-	 * resource mappings as appropriate.
-	 * 
-	 * @return the resources this launch configuration is associated with or <code>null</code>
-	 * @throws CoreException unable to get the mapped resource
-	 * @since 3.2
-	 */
-	public IResource[] getMappedResources() throws CoreException;
-		
-	/**
-	 * Returns a memento for this launch configuration, or <code>null</code>
-	 * if unable to generate a memento for this configuration. A memento
-	 * can be used to re-create a launch configuration, via the
-	 * launch manager.
-	 * 
-	 * @return a memento for this configuration
-	 * @see ILaunchManager#getLaunchConfiguration(String)
-	 * @exception CoreException if an exception occurs generating this
-	 *  launch configuration's memento 
-	 */
-	public String getMemento() throws CoreException;
-	
-	/**
-	 * Returns the name of this launch configuration. This is
-	 * a handle-only method.
-	 * 
-	 * @return the name of this launch configuration
-	 */
-	public String getName();		
-	
-	/**
-	 * Returns the launch modes that have been set on this configuration.
-	 * An empty set is returned if no specific launch modes have been set
-	 * on a launch configuration. 
-	 * <p>
-	 * Setting launch modes on a configuration allows a launch to be
-	 * performed in mixed mode - for example, debug and profile at the
-	 * same time.
-	 * </p>
-	 * @return this configuration's launch modes, possibly an empty set
-	 * @exception CoreException if an exception occurs retrieving modes
-	 * @since 3.3
-	 */
-	public Set getModes() throws CoreException;
-	
-	/**
-	 * Returns the preferred launch delegate that has been set on this
-	 * configuration or <code>null</code> if one is not specified.
-	 * 
-	 * @param modes mode set for which a preferred delegate has been requested
-	 * @return this configuration's preferred launch delegate for the specified mode set, or  
-	 * 	<code>null</code> if one is not specified
-	 * @exception CoreException if an exception occurs retrieving preferred delegate
-	 * @since 3.3
-	 */
-	public ILaunchDelegate getPreferredDelegate(Set modes) throws CoreException;
-	
-	/**
-	 * Returns the type of this launch configuration. This is a
-	 * handle-only method.
-	 * 
-	 * @return the type of this launch configuration
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>Unable to retrieve or instantiate this launch configuration's type.</li>
-	 * </ul>
-	 * @see ILaunchConfigurationType
-	 */
-	public ILaunchConfigurationType getType() throws CoreException;	
-	
-	/**
-	 * Returns a working copy of this launch configuration.
-	 * Since 3.3, if this method is called on a working copy, a nested working 
-	 * copy is created (a working copy of a working copy).
-	 * Changes to the working copy will be applied to this
-	 * launch configuration when saved, or to the parent working copy. 
-	 * The working copy will refer to this launch configuration as its original
-	 * launch configuration, or the working copy it was created from.
-	 * <p>
-	 * When a working copy (B) is created from a working copy (A), the newly
-	 * created working copy (B) is initialized with the attributes from
-	 * the first working copy (A). Whenever a working copy is saved, it is written
-	 * back to the working copy from which it was created: in this example working 
-	 * copy B will write back to working copy A, and A will write back to the 
-	 * original launch configuration.
-	 * </p>
-	 * @return a working copy of this launch configuration, or a nested working copy if called
-	 * on an instance of <code>ILaunchConfigurationWorkingCopy</code>
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while initializing the contents of the
-	 * working copy from this configuration's underlying storage.</li>
-	 * </ul>
-	 * @see ILaunchConfigurationWorkingCopy#getOriginal()
-	 */
-	public ILaunchConfigurationWorkingCopy getWorkingCopy() throws CoreException;
-	
-	/**
-	 * Returns whether this launch configuration is stored
-	 * locally within the workspace. This is a handle-only method.
-	 * 
-	 * @return whether this launch configuration is stored
-	 *  locally with the workspace
-	 */
-	public boolean isLocal();
-	
-	/**
-	 * Returns whether this launch configuration is a candidate for migration.
-	 * 
-	 * @return whether this launch configuration is a candidate for migration
-	 * @throws CoreException
-	 * @see ILaunchConfigurationMigrationDelegate
-	 * @since 3.2
-	 */
-	public boolean isMigrationCandidate() throws CoreException ;
-	
-	/**
-	 * Returns whether this launch configuration is a working
-	 * copy. Launch configurations which return <code>true</code>
-	 * to this method can be safely cast to 
-	 * <code>org.eclipse.debug.core.ILaunchConfigurationWorkingCopy</code>.
-	 * This is a handle-only method.
-	 * 
-	 * @return whether this launch configuration is a working
-	 *  copy
-	 */
-	public boolean isWorkingCopy();
-	
-	/**
-	 * Launches this configuration in the specified mode by delegating to
-	 * this configuration's launch configuration delegate, and returns the
-	 * resulting launch.
-	 * <p>
-	 * Equivalent to calling <code>launch(String, IProgressMontitor, boolean)</code>
-	 * with a <code>build</code> flag of <code>false</code>.
-	 * </p>
-	 * @param mode the mode in which to launch, one of the mode constants
-	 *  defined by <code>ILaunchManager</code> - <code>RUN_MODE</code> or <code>DEBUG_MODE</code>.
-	 * @param monitor progress monitor, or <code>null</code>. Since 3.0, this
-	 *  parameter is ignored. A cancelable progress monitor is provided by the Job
-	 *  framework.
-	 * @return the resulting launch
-	 * @exception CoreException if this method fails. Reasons include:<ul>
-	 * <li>unable to instantiate the underlying launch configuration delegate</li>
-	 * <li>the launch fails (in the delegate)</code>
-	 * </ul>
-	 */
-	public ILaunch launch(String mode, IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Launches this configuration in the specified mode by delegating to
-	 * this configuration's launch configuration delegate, and returns the
-	 * resulting launch.
-	 * <p>
-	 * If this configuration's launch delegate implements
-	 * <code>ILaunchConfigurationDelegate2</code>, the launch delegate will
-	 * be consulted to provide a launch object for the launch,
-	 * perform pre-launch checks, and build before the launch.
-	 * If <code>build</code> is <code>true</code> and the associated launch
-	 * delegate does not implement <code>ILaunchConfigurationDelegate2</code>
-	 * an incremental workspace build will be performed before the launch
-	 * by the debug platform.
-	 * </p>
-	 * <p>
-	 * The resulting launch object is registered with the launch manager
-	 * before passing it to this configuration's delegate launch method, for
-	 * contributions (debug targets and processes).
-	 * </p>
-	 * <p>
-	 * If the delegate contributes a source locator to the launch, that
-	 * source locator is used. Otherwise an appropriate source locator is
-	 * contributed to the launch  based on the values of
-	 * <code>ATTR_SOURCE_LOCATOR_ID</code> and
-	 * <code>ATTR_SOURCE_LOCATOR_MEMENTO</code>. If the launch is canceled (via
-	 * the given progress monitor), the launch is removed from the launch
-	 * manager. The launch is returned whether canceled or not. Invoking this
-	 * method causes the underlying launch configuration delegate to be
-	 * instantiated (if not already).
-	 * </p>
-	 * @param mode the mode in which to launch, one of the mode constants
-	 *  defined by <code>ILaunchManager</code> - <code>RUN_MODE</code> or <code>DEBUG_MODE</code>.
-	 * @param monitor progress monitor, or <code>null</code>. Since 3.0, this
-	 *  parameter is ignored. A cancelable progress monitor is provided by the Job
-	 *  framework.
-	 * @param build whether the workspace should be built before the launch
-	 * @return resulting launch
-	 * @throws CoreException if an exception occurs during the launch sequence
-	 * @since 3.0
-	 */
-	public ILaunch launch(String mode, IProgressMonitor monitor, boolean build) throws CoreException;	
-	
-	/**
-	 * Launches this configuration in the specified mode by delegating to
-	 * this configuration's launch configuration delegate, and returns the
-	 * resulting launch.
-	 * <p>
-	 * If this configuration's launch delegate implements
-	 * <code>ILaunchConfigurationDelegate2</code>, the launch delegate will
-	 * be consulted to provide a launch object for the launch,
-	 * perform pre-launch checks, and build before the launch.
-	 * If <code>build</code> is <code>true</code> and the associated launch
-	 * delegate does not implement <code>ILaunchConfigurationDelegate2</code>
-	 * an incremental workspace build will be performed before the launch
-	 * by the debug platform.
-	 * </p>
-	 * <p>
-	 * When <code>register</code> is <code>true</code>, the resulting launch object
-	 * is registered with the launch manager before passing it to this configuration's delegate
-	 * launch method, for contributions (debug targets and processes). When
-	 * <code>register</code> is <code>false</code>, the launch is not registered with
-	 * the launch manager. Clients that launch configurations without registering
-	 * a launch should register appropriate debug event filters to intercept events
-	 * from unregistered launches.
-	 * </p>
-	 * <p>
-	 * If the delegate contributes a source locator to the launch, that
-	 * source locator is used. Otherwise an appropriate source locator is
-	 * contributed to the launch  based on the values of
-	 * <code>ATTR_SOURCE_LOCATOR_ID</code> and
-	 * <code>ATTR_SOURCE_LOCATOR_MEMENTO</code>. If the launch is canceled (via
-	 * the given progress monitor), the launch is removed from the launch
-	 * manager. The launch is returned whether canceled or not. Invoking this
-	 * method causes the underlying launch configuration delegate to be
-	 * instantiated (if not already).
-	 * </p>
-	 * @param mode the mode in which to launch, one of the mode constants
-	 *  defined by <code>ILaunchManager</code> - <code>RUN_MODE</code> or <code>DEBUG_MODE</code>.
-	 * @param monitor progress monitor, or <code>null</code>. Since 3.0, this
-	 *  parameter is ignored. A cancelable progress monitor is provided by the Job
-	 *  framework.
-	 * @param build whether the workspace should be built before the launch
-	 * @param register whether to register the resulting launch with the launch manager
-	 * @return resulting launch
-	 * @throws CoreException if an exception occurs during the launch sequence
-	 * @since 3.1
-	 */
-	public ILaunch launch(String mode, IProgressMonitor monitor, boolean build, boolean register) throws CoreException;
-	
-	/**
-	 * Migrates this launch configuration to be compatible with current tooling.
-	 * Has no effect if this configuration is not a candidate for migration.
-	 * Migration is performed by a launch configuration migration delegate.
-	 * @throws CoreException if migration fails
-	 * @since 3.2
-	 * @see ILaunchConfigurationMigrationDelegate
-	 */
-	public void migrate() throws CoreException;
-	
-	/**
-	 * Returns whether this launch configuration supports the
-	 * specified mode. This is a handle-only method.
-	 * 
-	 * @param mode a mode in which a configuration can be launched, one of
-	 *  the mode constants defined by <code>ILaunchManager</code> - <code>RUN_MODE</code> or
-	 *  <code>DEBUG_MODE</code>.
-	 * @return whether this launch configuration supports the
-	 *  specified mode
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>Unable to retrieve this launch configuration's type.</li>
-	 * </ul>
-	 */
-	public boolean supportsMode(String mode) throws CoreException;
-	
-	/**
-	 * Returns whether this launch configuration is read-only.
-	 * A read-only configuration cannot be modified.
-	 * 
-	 * @return whether this configuration is read-only
-	 * 
-	 * @since 3.3
-	 */
-	public boolean isReadOnly();	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationListener.java
deleted file mode 100644
index 0db5e61..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationListener.java
+++ /dev/null
@@ -1,53 +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.debug.core;
-
- 
-/**
- * Notified when a launch configuration is created,
- * deleted, or changed.
- * <p>
- * This interface is intended to be implemented by clients.
- * </p>
- * @since 2.0
- */
-public interface ILaunchConfigurationListener {
-	
-	/**
-	 * The given launch configuration has been created.
-	 * 
-	 * @param configuration the newly created launch configuration
-	 */
-	public void launchConfigurationAdded(ILaunchConfiguration configuration);
-	
-	/**
-	 * The given launch configuration has changed in some way.
-	 * The configuration may be a working copy.
-	 * 
-	 * @param configuration the launch configuration that has
-	 *  changed
-	 */
-	public void launchConfigurationChanged(ILaunchConfiguration configuration);
-	
-	/**
-	 * The given launch configuration has been deleted.
-	 * <p>
-	 * The launch configuration no longer exists. Data stored 
-	 * in the configuration can no longer be accessed, however
-	 * handle-only attributes of the launch configuration
-	 * can be retrieved.
-	 * </p>
-	 * 
-	 * @param configuration the deleted launch configuration
-	 */
-	public void launchConfigurationRemoved(ILaunchConfiguration configuration);	
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationMigrationDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationMigrationDelegate.java
deleted file mode 100644
index 404340e..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationMigrationDelegate.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.debug.core;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Responsible for migrating launch configurations between different versions of Eclipse.
- * A migration delegate is contributed as an optional attribute of a 
- * <code>launchConfigurationType</code> extension and is responsible for identifying
- * migration candidates and migrating launch configurations of that type.
- * <p> 
- * For example, since 3.2 launch configurations may have resources mapped to them. A migration
- * delegate could assign appropriate resources to a launch configuration create in an earlier
- * version.
- * </p>
- * @since 3.2
- */
-public interface ILaunchConfigurationMigrationDelegate {
-
-	/**
-	 * Returns whether the given launch configuration requires migration.  
-	 * 
-	 * @param candidate potential migration candidate 
-	 * @return whether the given launch configuration requires migration
-	 * @throws CoreException if an exception occurs determining the status of the
-	 *  given configuration
-	 */
-	public boolean isCandidate(ILaunchConfiguration candidate) throws CoreException;
-	
-	/**
-	 * Migrates the given launch configuration to be compatible with the current tooling.
-	 * 
-	 * @param candidate the candidate to be migrated, which can be a launch configuration
-	 *  or working copy
-	 * @throws CoreException if an exception occurs during migration
-	 */
-	public void migrate(ILaunchConfiguration candidate) throws CoreException;
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java
deleted file mode 100644
index 6ad7de4..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java
+++ /dev/null
@@ -1,310 +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.debug.core;
-
- 
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputer;
-
-/**
- * Describes and creates instances of a specific type of
- * launch configuration. Launch configuration types are
- * defined by extensions.
- * <p>
- * A launch configuration type extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a launch configuration
- * type extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.core.launchConfigurationTypes"&gt;
- *   &lt;launchConfigurationType 
- *      id="com.example.ExampleIdentifier"
- *      delegate="com.example.ExampleLaunchConfigurationDelegate"
- *      modes="run, debug"
- *      name="Example Application"&gt;
- *      sourceLocatorId="com.example.SourceLocator"&gt;
- *      sourcePathComputerId="com.example.SourcePathComputer"&gt;
- *   &lt;/launchConfigurationType&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this launch configuration
- *  type.</li>
- * <li><code>delegate</code> specifies the fully qualified name of the java class
- *   that implements <code>ILaunchConfigurationDelegate</code>. Launch configuration
- *   instances of this type will delegate to instances of this class
- *   to perform launching.</li>
- * <li><code>modes</code> specifies a comma separated list of the modes this
- *    type of launch configuration supports - <code>"run"</code> and/or <code>"debug"</code>.</li>
- * <li><code>name</code> specifies a human readable name for this type
- *    of launch configuration.</li>
- * <li><code>category</code> is an optional attribute that specifies a category
- * for this launch configuration type. Categories are client defined. This
- * attribute was added in the 2.1 release.</li>
- * <li><code>sourceLocatorId</code> an optional unique identifier of a sourceLocator extension that
- * is used to create the source locator for sessions launched using launch configurations
- * of this type. This attribute was added in the 3.0 release.</li>
- * <li><code>sourcePathComputerId</code> an optional unique identifier of a sourcePathComputer extension
- * that is used to compute a default source lookup path for launch configurations of this type.
- * This attribute was added in the 3.0 release.</li>
- * </ul>
- * </p>
- * <p>
- * The <code>category</code> attribute has been added in release 2.1, such that other
- * tools may re-use the launch configuration framework for purposes other than
- * the standard running and debugging of programs under development. Such that
- * clients may access arbitrary attributes specified in launch configuration type
- * extension definitions, the method <code>getAttribute</code> has also been
- * added. Launch configurations that are to be recognized as standard run/debug
- * launch configurations should not specify the <code>category</code> attribute.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients. Clients
- * that define a launch configuration delegate extension implement the
- * <code>ILaunchConfigurationDelegate</code> interface.
- * </p>
- * @see ILaunchConfiguration
- * @since 2.0
- */
-public interface ILaunchConfigurationType extends IAdaptable {
-		
-	/**
-	 * Returns the attribute with the given name, as specified by this launch
-	 * configuration type's extension definition, or <code>null</code> if
-	 * unspecified.
-	 * 
-	 * @param attributeName attribute name
-	 * @return the specified extension attribute, or <code>null</code>
-	 * @since 2.1
-	 */
-	public String getAttribute(String attributeName);
-	
-	/**
-	 * Returns this launch configuration type's category, or <code>null</code>
-	 * if unspecified. This corresponds to the category attribute specified in
-	 * the extension definition.
-	 * 
-	 * @return this launch configuration type's category, or <code>null</code>
-	 * @since 2.1
-	 */
-	public String getCategory();
-	
-	/**
-	 * Returns the launch configuration delegate for launch
-	 * configurations of this type, for <code>run</code> mode.
-	 * The first time this method is called, the delegate is instantiated.
-	 * 
-	 * @return launch configuration delegate
-	 * @exception CoreException if unable to instantiate the
-	 *  delegate
-	 * @deprecated use <code>getDelegate(String)</code> to specify mode
-	 */	
-	public ILaunchConfigurationDelegate getDelegate() throws CoreException;
-	
-	/**
-	 * Returns the launch configuration delegate for launch
-	 * configurations of this type, for the specified mode. The first time
-	 * this method is called for a mode, the delegate is instantiated.
-	 * Launch delegates may be contributed to a launch configuration type
-	 * via the extension point <code>org.eclipse.debug.core.launchDelegates</code>
-	 * 
-	 * @param mode launch mode
-	 * @return launch configuration delegate
-	 * @exception CoreException if unable to instantiate the
-	 *  delegate
-	 * @since 3.0
-	 * @deprecated since 3.3, the method <code>getDelegates(Set)</code> should be used
-	 *  instead, as there can be more than one capable delegate per mode or combination
-	 *  of modes 
-	 */	
-	public ILaunchConfigurationDelegate getDelegate(String mode) throws CoreException;
-	
-	/**
-	 * Returns the delegates capable of launching in the specified modes, possibly
-	 * an empty set.
-	 * 
-	 * @param modes set of launch modes
-	 * @return the <code>ILaunchDelegate</code>s capable of launching
-	 * 		in the specified modes or an empty collection if none
-	 * @throws CoreException
-	 * @since 3.3
-	 */
-	public ILaunchDelegate[] getDelegates(Set modes) throws CoreException;
-	
-	/**
-	 * Returns the preferred launch delegate for this type in the specified mode combination
-	 * or <code>null</code> if there is no preferred delegate.
-	 * 
-	 * @param modes the set of modes to support
-	 * @return the preferred delegate or <code>null</code> if none
-	 * @throws CoreException
-	 * 
-	 * @since 3.3
-	 */
-	public ILaunchDelegate getPreferredDelegate(Set modes) throws CoreException;
-	
-	/**
-	 * Sets the preferred launch delegate for this type in the specified mode combination.
-	 * Specify <code>null</code> as a preferred delegate to remove any preferred delegate
-	 * setting for this launch configuration type.
-	 * 
-	 * @param modes launch mode combination
-	 * @param delegate preferred launch delegate or <code>null</code>
-	 * @throws CoreException
-	 * 
-	 * @since 3.3
-	 */
-	public void setPreferredDelegate(Set modes, ILaunchDelegate delegate) throws CoreException;
-	
-	/**
-	 * Returns whether this launch configuration supports the specified launch
-	 * mode combination.
-	 * 
-	 * @param modes launch mode combination
-	 * @return whether the launch mode combination is supported
-	 * @since 3.3
-	 */
-	public boolean supportsModeCombination(Set modes);
-	
-	/**
-	 * Returns the unique identifier for this type of launch configuration
-	 * 
-	 * @return the unique identifier for this type of launch configuration
-	 */
-	public String getIdentifier();
-	
-	/**
-	 * Returns the name of this type of launch configuration.
-	 * 
-	 * @return the name of this type of launch configuration
-	 */
-	public String getName();
-	
-	/**
-	 * Returns the identifier of the plug-in that contributes this launch configuration type.
-	 * 
-	 * @return the identifier of the plug-in that contributes this launch configuration type
-	 * @since 3.0
-	 */
-	public String getPluginIdentifier();
-	
-	/**
-	 * Returns the identifier of the persistable source locator registered with
-	 * this launch configurations type, or <code>null</code> if unspecified.
-	 * A source locator can be specified by a launch configuration type or
-	 * launch delegate extension's <code>sourceLocatorId</code> attribute.  
-	 * <p>
-	 * Only one source locator should be provided per launch configuration type
-	 * and its launch delegates.
-	 * </p>
-	 * @return the identifier of the persistable source locator registered with
-	 *  this launch configurations type, or <code>null</code> if unspecified
-	 * @since 3.0
-	 */
-	public String getSourceLocatorId();
-	
-	/**
-	 * Returns the source path computer registered with this launch configuration
-	 * type or <code>null</code> if unspecified. A source path computer can be
-	 * specified by a launch configuration type or launch delegate extension's
-	 * <code>sourcePathComputerId</code> attribute.
-	 * <p>
-	 * Only one source path computer should be provided per launch configuration type
-	 * and its launch delegates. 
-	 * </p>
-	 * @return the source path computer registered with this launch configuration
-	 * type or <code>null</code> if unspecified
-	 * @since 3.0
-	 */
-	public ISourcePathComputer getSourcePathComputer();	
-	
-	/**
-	 * Returns all of the registered supported modes for this launch configuration type.
-	 * This method does not return null.
-	 * 
-	 * <p>
-	 * The returned set does not convey any mode combination capability nor does it describe how or what the type can launch, all this method does is return
-	 * a set of strings of all the modes in some way associated with this type 
-	 * </p>
-	 * 
-	 * @return the set of all supported modes
-	 * @since 3.2
-	 * 
-	 * @deprecated Since 3.3 all modes are provided as sets and not individual strings. The method <code>getSupportedModeCombinations</code>
-	 * should be used instead to retrieve the complete listing of supported modes and their allowable combinations.
-	 */
-	public Set getSupportedModes();
-	
-	/**
-	 * Returns a <code>java.util.Set</code> of <code>java.util.Set</code>s containing all of the
-	 * supported launch mode combinations for this type.
-	 * 
-	 * @return a set of sets of all the supported mode combinations supported by this type
-	 * 
-	 * @since 3.3
-	 */
-	public Set getSupportedModeCombinations();
-	
-	/**
-	 * Returns whether this launch configuration type is public.  Public configuration
-	 * types are available for use by the user, for example, the user can create new
-	 * configurations based on public types through the UI.  Private types are not
-	 * accessible in this way, but are still available through the methods on 
-	 * <code>ILaunchManager</code>.
-	 * 
-	 * @return whether this launch configuration type is public.
-	 */
-	public boolean isPublic();
-	
-	/**
-	 * Returns a new launch configuration working copy of this type,
-	 * that resides in the specified container, with the given name.
-	 * When <code>container</code> is </code>null</code>, the configuration
-	 * will reside locally in the metadata area.
-	 * Note: a launch configuration is not actually created until the working copy is saved.
-	 * 
-	 * @param container the container in which the new configuration will
-	 *  reside, or <code>null</code> if the configuration should reside
-	 *  locally with the metadata.
-	 * @param name name for the launch configuration
-	 * @return a new launch configuration working copy instance of this type
-	 * @exception CoreException if an instance of this type
-	 *  of launch configuration could not be created for any
-	 *  reason
-	 */
-	public ILaunchConfigurationWorkingCopy newInstance(IContainer container, String name) throws CoreException;
-	
-	/**
-	 * Returns whether this type of launch configuration supports
-	 * the specified mode.
-	 * 
-	 * @param mode a mode in which a configuration can be launched, one of
-	 *  the mode constants defined by <code>ILaunchManager</code> - <code>RUN_MODE</code> or
-	 *  <code>DEBUG_MODE</code>.
-	 * @return whether this kind of launch configuration supports the
-	 *  specified mode
-	 */
-	public boolean supportsMode(String mode);
-	
-	/**
-	 * Returns the name of the plug-in that contributed this launch configuration type.
-	 * 
-	 * @return name of contributing plug-in
-	 * @since 3.3
-	 */
-	public String getContributorName();
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java
deleted file mode 100644
index fce0972..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java
+++ /dev/null
@@ -1,250 +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.debug.core;
-
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * An editable copy of a launch configuration. Attributes of a
- * launch configuration are modified by modifying the attributes
- * of a working copy, and then saving the working copy.
- * <p>
- * Since 3.3, working copies can be nested. For example a working copy B can
- * be created from the original launch configuration A. Then a nested working
- * copy C can be created from working copy B. When the <code>doSave()</code> method
- * is called on C, changes are written back to its parent working copy B without
- * effecting the original launch configuration A. When <code>doSave()</code> is called
- * on B, the changes are persisted back to the original A.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients. Clients
- * that define a launch configuration delegate extension implement the
- * <code>ILaunchConfigurationDelegate</code> interface.
- * </p>
- * @see ILaunchConfiguration
- * @see ILaunchConfigurationType
- * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate
- * @since 2.0
- */
-public interface ILaunchConfigurationWorkingCopy extends ILaunchConfiguration, IAdaptable {
-	
-	/**
-	 * Returns whether this configuration has been modified
-	 * since it was last saved or created.
-	 * 
-	 * @return whether this configuration has been modified
-	 *  since it was last saved or created
-	 */
-	public boolean isDirty();
-	
-	/**
-	 * Saves this working copy to its underlying file and returns
-	 * a handle to the resulting launch configuration.
-	 * Has no effect if this configuration does not need saving.
-	 * Creates the underlying file if not yet created.
-	 * <p>
-	 * Since 3.3, if this is a nested working copy, the contents of this working copy are
-	 * saved to the parent working copy and the parent working copy is returned without
-	 * effecting the original launch configuration.
-	 * </p>
-	 * @return handle to saved launch configuration
-	 * @exception CoreException if an exception occurs while 
-	 *  writing this configuration to its underlying file.
-	 */
-	public ILaunchConfiguration doSave() throws CoreException;
-			
-	/**
-	 * Sets the integer-valued attribute with the given name.  
-	 *
-	 * @param attributeName the name of the attribute, cannot be <code>null</code>
-	 * @param value the value
-	 */
-	public void setAttribute(String attributeName, int value);
-	
-	/**
-	 * Sets the String-valued attribute with the given name.
-	 * If the value is <code>null</code>, the attribute is removed from
-	 * this launch configuration.
-	 *
-	 * @param attributeName the name of the attribute, cannot be <code>null</code>
-	 * @param value the value, or <code>null</code> if the attribute is to be undefined
-	 */
-	public void setAttribute(String attributeName, String value);
-	
-	/**
-	 * Sets the <code>java.util.List</code>-valued attribute with the given name.
-	 * The specified List <em>must</em> contain only String-valued entries.
-	 * If the value is <code>null</code>, the attribute is removed from
-	 * this launch configuration.
-	 *
-	 * @param attributeName the name of the attribute, cannot be <code>null</code>
-	 * @param value the value, or <code>null</code> if the attribute is to be undefined
-	 */
-	public void setAttribute(String attributeName, List value);
-	
-	/**
-	 * Sets the <code>java.util.Map</code>-valued attribute with the given name.
-	 * The specified Map <em>must</em> contain only String keys and String values.
-	 * If the value is <code>null</code>, the attribute is removed from
-	 * this launch configuration.
-	 *
-	 * @param attributeName the name of the attribute, cannot be <code>null</code>
-	 * @param value the value, or <code>null</code> if the attribute is to be undefined
-	 */
-	public void setAttribute(String attributeName, Map value);
-	
-	/**
-	 * Sets the boolean-valued attribute with the given name.  
-	 *
-	 * @param attributeName the name of the attribute, cannot be <code>null</code>
-	 * @param value the value
-	 */
-	public void setAttribute(String attributeName, boolean value);	
-	
-	/**
-	 * Returns the original launch configuration this working copy
-	 * was created from or <code>null</code> if this is a new
-	 * working copy created from a launch configuration type.
-	 * 
-	 * @return the original launch configuration, or <code>null</code>
-	 */
-	public ILaunchConfiguration getOriginal();
-	
-	/**
-	 * Renames this launch configuration to the specified name.
-	 * The new name cannot be <code>null</code>. Has no effect if the name
-	 * is the same as the current name. If this working copy is based
-	 * on an existing launch configuration, this will cause
-	 * the underlying launch configuration file to be renamed when
-	 * this working copy is saved.
-	 * 
-	 * @param name the new name for this configuration 
-	 */
-	public void rename(String name);	
-	
-	/**
-	 * Sets the container this launch configuration will be stored
-	 * in when saved. When set to <code>null</code>, this configuration
-	 * will be stored locally with the workspace. The specified
-	 * container must exist, if specified.
-	 * <p>
-	 * If this configuration is changed from local to non-local,
-	 * a file will be created in the specified container when
-	 * saved. The local file associated with this configuration
-	 * will be deleted.
-	 * </p>
-	 * <p>
-	 * If this configuration is changed from non-local to local,
-	 * a file will be created locally when saved.
-	 * The original file associated with this configuration in
-	 * the workspace will be deleted.
-	 * </p>
-	 * 
-	 * @param container the container in which to store this
-	 *  launch configuration, or <code>null</code> if this
-	 *  configuration is to be stored locally
-	 */
-	public void setContainer(IContainer container);	
-	
-	/**
-	 * Sets the attributes of this launch configuration to be the ones contained
-	 * in the given map. The values must be an instance of one of the following
-	 * classes: <code>String</code>, <code>Integer</code>, or
-	 * <code>Boolean</code>, <code>List</code>, <code>Map</code>. Attributes
-	 * previously set on this launch configuration but not included in the given
-	 * map are considered to be removals. Setting the given map to be
-	 * <code>null</code> is equivalent to removing all attributes.
-	 *
-	 * @param attributes a map of attribute names to attribute values.
-	 *  Attribute names are not allowed to be <code>null</code>
-	 * @since 2.1
-	 */
-	public void setAttributes(Map attributes);
-	
-	/**
-	 * Sets the resources associated with this launch configuration, possibly <code>null</code>.
-	 * Clients contributing launch configuration types are responsible for maintaining
-	 * resource mappings.
-	 *  
-	 * @param resources the resource to map to this launch configuration or <code>null</code>
-	 * @since 3.2
-	 */
-	public void setMappedResources(IResource[] resources);
-	
-	/**
-	 * Set the launch modes for this configuration.
-	 * Over-writes existing launch modes.
-	 * <p>
-	 * Setting launch modes on a configuration allows the configuration to
-	 * be launched in a mixed mode - for example, debug and profile.
-	 * </p>
-	 * @param modes launch mode identifiers to set on this configuration
-	 *  or <code>null</code> to clear mode settings
-	 *  
-	 * @since 3.3
-	 */
-	public void setModes(Set modes);
-	
-	/**
-	 * Set the preferred launch delegates' id for the given mode set. Passing in <code>null</code> as a delegate
-	 * id will cause the mapping for the specified mode set (if any) to be removed.
-	 * 
-	 * @param modes the set of modes to set this delegate id for
-	 * @param delegateId the id of the delegate to associate as preferred for the specified mode set
-	 *  or <code>null</code> to clear the setting
-	 *  
-	 * @since 3.3
-	 */
-	public void setPreferredLaunchDelegate(Set modes, String delegateId);
-	
-	/**
-	 * Adds the specified launch modes to this configuration's settings.
-	 * <p>
-	 * Setting launch modes on a configuration allows the configuration to
-	 * be launched in a mixed mode - for example, debug and profile.
-	 * </p>
-	 * @param modes launch mode identifiers to append to the current set of
-	 * 	launch modes set on this configuration
-	 * 
-	 * @since 3.3
-	 */
-	public void addModes(Set modes);
-	
-	/**
-	 * Removes the specified launch modes from this configuration's settings.
-	 * <p>
-	 * Setting launch modes on a configuration allows the configuration to
-	 * be launched in a mixed mode - for example, debug and profile.
-	 * </p>
-	 * @param modes launch mode identifiers to remove from the current set of
-	 * 	launch modes set on this configuration
-	 * 
-	 * @since 3.3
-	 */
-	public void removeModes(Set modes);
-	
-	/**
-	 * Returns the parent of this working copy or <code>null</code> if this working
-	 * copy is not a nested copy of another working copy.
-	 * 
-	 * @return parent or <code>null</code>
-	 * @since 3.3
-	 */
-	public ILaunchConfigurationWorkingCopy getParent();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchDelegate.java
deleted file mode 100644
index 038bc75..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchDelegate.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
-
-/**
- * A proxy to an {@link ILaunchConfigurationDelegate}. Represents a
- * launch delegate contributed to the <code>org.eclipse.debug.core.launchDelegates</code>
- * extension point. 
- * <p>
- * This interface is NOT to be implemented by clients
- * </p>
- * @since 3.3
- */
-public interface ILaunchDelegate {
-
-	/**
-	 * Returns this delegate's unique identifier.
-	 * 
-	 * @return launch delegate identifier
-	 */
-	public String getId();
-	
-	/**
-	 * Returns a human readable name for this launch delegate
-	 * or <code>null</code> if none.
-	 * 
-	 * @return name or <code>null</code>
-	 */
-	public String getName();
-	
-	/**
-	 * Returns a description of this launch delegate, or 
-	 * <code>null</code> if none.
-	 * 
-	 * @return description or <code>null</code>
-	 */
-	public String getDescription();
-	
-	/**
-	 * Returns the name of the plug-in that contributed this delegate.
-	 * 
-	 * @return contributor name
-	 */
-	public String getContributorName();
-	
-	/**
-	 * Returns the underlying launch configuration.
-	 * Causes the delegate to be instantiated.
-	 * 
-	 * @return launch configuration delegate
-	 * @exception CoreException if unable to instantiate the delegate
-	 */
-	public ILaunchConfigurationDelegate getDelegate() throws CoreException;
-	
-	/**
-	 * Returns the complete set of launch modes supported by this delegate as a list of sets.
-	 * Each set contains one of more launch mode identifiers. When a set contains more than
-	 * one launch mode, it indicates that a mixed launch mode is supported.
-	 * If no modes are available an empty list is returned.
-	 * 
-	 * @return the complete set of launch modes this delegate supports
-	 */
-	public List getModes();
-	
-	/**
-	 * Returns the id of the plug-in that contributed this launch delegate.
-	 * 
-	 * @return the id of the plug-in that contributed this launch delegate
-	 */
-	public String getPluginIdentifier();
-	
-	/**
-	 * Returns the specified perspective id for the given mode set, or null if one is not provided 
-	 * @param modes the set of modes to get the perspective id
-	 * @return the perspective id associated with the given mode set, or <code>null</code> if none provided
-	 */
-	public String getPerspectiveId(Set modes);
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java
deleted file mode 100644
index 427b6f4..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java
+++ /dev/null
@@ -1,51 +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.debug.core;
-
-
-/**
- * A launch listener is notified of launches as they
- * are added and removed from the launch manager. Also,
- * when a process or debug target is added to a launch,
- * listeners are notified of a change.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.ILaunch
- * @see org.eclipse.debug.core.ILaunchesListener
- */
-public interface ILaunchListener {	
-	/**
-	 * Notifies this listener that the specified
-	 * launch has been removed.
-	 *
-	 * @param launch the removed launch
-	 * @since 2.0
-	 */
-	public void launchRemoved(ILaunch launch);
-	/**
-	 * Notifies this listener that the specified launch
-	 * has been added.
-	 * 
-	 * @param launch the newly added launch
-	 * @since 2.0
-	 */
-	public void launchAdded(ILaunch launch);	
-	/**
-	 * Notifies this listener that the specified launch
-	 * has changed. For example, a process or debug target
-	 * has been added to the launch.
-	 * 
-	 * @param launch the changed launch
-	 * @since 2.0
-	 */
-	public void launchChanged(ILaunch launch);	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
deleted file mode 100644
index 606338f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
+++ /dev/null
@@ -1,469 +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.debug.core;
-
- 
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IPersistableSourceLocator;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputer;
-
-/**
- * The launch manager manages the set of registered launches, maintaining
- * a collection of active processes and debug targets. Clients interested
- * in launch notification may register with the launch manager.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @see ILaunch
- * @see ILaunchListener
- */
-public interface ILaunchManager {
-	/**
-	 * A launch in a normal, non-debug mode(value <code>"run"</code>).
-	 */
-	public static final String RUN_MODE= "run"; //$NON-NLS-1$
-	/**
-	 * A launch in a special debug mode (value <code>"debug"</code>).
-	 */
-	public static final String DEBUG_MODE= "debug"; //$NON-NLS-1$
-	/**
-	 * A launch in a special profile mode (value <code>"profile"</code>).
-	 * @since 3.0
-	 */
-	public static final String PROFILE_MODE= "profile"; //$NON-NLS-1$	
-	
-	/**
-	 * Launch configuration attribute name. The value is a map of environment
-	 * variables passed into Runtime.exec(...) when a launch configuration is launched.
-	 * Default value is <code>null</code> which indicates the default environment
-	 * should be used. 
-	 * 
-	 * @since 3.0
-	 */
-	public static final String ATTR_ENVIRONMENT_VARIABLES = DebugPlugin.getUniqueIdentifier() + ".environmentVariables"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute name. The value is a boolean value specifying
-	 * whether the environment variables in a launch configuration
-	 * should be appended to the native environment (i.e. when <code>true</code>),
-	 * or if they should replace the environment (i.e. <code>false</code>). The
-	 * default value is <code>true</code>.
-	 * 
-	 * @since 3.0 
-	 */
-	public static final String ATTR_APPEND_ENVIRONMENT_VARIABLES = DebugPlugin.getUniqueIdentifier() + ".appendEnvironmentVariables"; //$NON-NLS-1$	
-	
-	/**
-	 * Adds the specified launch and notifies listeners. Has no
-	 * effect if an identical launch is already registered.
-	 * 
-	 * @param launch the launch to add
-	 * @since 2.0
-	 */
-	public void addLaunch(ILaunch launch);
-	/**
-	 * Adds the given launch configuration listener to the list
-	 * of listeners notified when a launch configuration is
-	 * added, removed, or changed. Has no effect if the given listener
-	 * is already registered.
-	 * 
-	 * @param listener launch configuration listener
-	 * @since 2.0
-	 */
-	public void addLaunchConfigurationListener(ILaunchConfigurationListener listener);	
-	/**
-	 * Adds the specified launch objects and notifies listeners. Has no
-	 * effect on identical launch objects already registered.
-	 * 
-	 * @param launches the launch objects to add
-	 * @since 2.1
-	 */
-	public void addLaunches(ILaunch[] launches);	
-	/**
-	 * Adds the given listener to the collection of registered launch listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to register
-	 * @since 2.1
-	 */
-	public void addLaunchListener(ILaunchesListener listener);		
-	/**
-	 * Adds the given listener to the collection of registered launch listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to register
-	 */
-	public void addLaunchListener(ILaunchListener listener);
-	/**
-	 * Return a String that can be used as the name of a launch configuration.  The name
-	 * is guaranteed to be unique (no existing launch configurations will have this name).
-	 * The name that is returned uses the <code>namePrefix</code> as a starting point.  If 
-	 * there is no existing launch configuration with this name, then <code>namePrefix</code>
-	 * is returned.  Otherwise, the value returned consists of the specified prefix plus
-	 * some suffix that guarantees uniqueness.
-	 * 
-	 * @param namePrefix the String that the returned name must begin with
-	 * @return launch configuration name
-	 * @since 2.0
-	 */
-	public String generateUniqueLaunchConfigurationNameFrom(String namePrefix);
-	/**
-	 * Returns the collection of debug targets currently registered with this
-	 * launch manager.
-	 *
-	 * @return an array of debug targets
-	 */
-	public IDebugTarget[] getDebugTargets();
-	/** 
-	 * Returns an array of environment variables to be used when
-	 * launching the given configuration or <code>null</code> if unspecified.
-	 * Each entry is of the form "<code>var_name=value</code>".
-	 * 
-	 * @return an array of environment variables to use when launching the given
-	 *  configuration or <code>null</code> if unspecified
-	 * @param configuration launch configuration
-	 * @throws CoreException if unable to access associated attribute or if
-	 * unable to resolve a variable in an environment variable's value
-	 * @since 3.0
-	 */
-	public String[] getEnvironment(ILaunchConfiguration configuration) throws CoreException;	
-	/**
-	 * Returns a handle to the launch configuration contained
-	 * in the specified file. The file is not verified to exist
-	 * or contain a launch configuration.
-	 * 
-	 * @param file launch configuration file
-	 * @return a handle to the launch configuration contained
-	 *  in the specified file
-	 * @since 2.0
-	 */
-	public ILaunchConfiguration getLaunchConfiguration(IFile file);		
-	/**
-	 * Returns a handle to the launch configuration specified by
-	 * the given memento. The configuration may not exist.
-	 * 
-	 * @param memento launch configuration memento
-	 * @return a handle to the launch configuration specified by
-	 *  the given memento
-	 * @exception CoreException if the given memento is invalid or
-	 *  an exception occurs parsing the memento
-	 * @see ILaunchConfiguration#getMemento()
-	 * @since 2.0
-	 */
-	public ILaunchConfiguration getLaunchConfiguration(String memento) throws CoreException;
-	/**
-	 * Returns all launch configurations defined in the workspace.
-	 * 
-	 * @return all launch configurations defined in the workspace
-	 * @exception CoreException if an exception occurs retrieving configurations
-	 * @since 2.0
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations() throws CoreException;	
-	/**
-	 * Returns all launch configurations of the specified type defined in the workspace
-	 * 
-	 * @param type a launch configuration type
-	 * @return all launch configurations of the specified type defined in the workspace
-	 * @exception CoreException if an error occurs while retrieving
-	 *  a launch configuration
-	 * @since 2.0
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type) throws CoreException;
-	
-	/**
-	 * Returns the launch configuration type extension with the specified
-	 * id, or <code>null</code> if it does not exist.
-	 * 
-	 * @param id unique identifier for a launch configuration type extension
-	 * @return the launch configuration type extension with the specified
-	 * id, or <code>null</code> if it does not exist
-	 * @since 2.0
-	 */
-	public ILaunchConfigurationType getLaunchConfigurationType(String id);
-	
-	/**
-	 * Returns all defined launch configuration type extensions
-	 * 
-	 * @return all defined launch configuration type extensions
-	 * @since 2.0
-	 */
-	public ILaunchConfigurationType[] getLaunchConfigurationTypes();
-	
-	/**
-	 * Returns the collection of launches currently registered
-	 * with this launch manager.
-	 * 
-	 * @return an array of launches
-	 */
-	public ILaunch[] getLaunches();
-	
-	/**
-	 * Returns the launch mode registered with the given mode identifier,
-	 * or <code>null</code> if none.
-	 * 
-	 * @param mode mode identifier
-	 * @return launch mode or <code>null</code>
-	 * @since 3.0
-	 */
-	public ILaunchMode getLaunchMode(String mode);
-	
-	/**
-	 * Returns all registered launch modes.
-	 * 
-	 * @return all registered launch modes
-	 * @since 3.0
-	 */
-	public ILaunchMode[] getLaunchModes();
-	
-	/**
-	 * Returns a collection of launch configurations that required migration to be
-	 * compatible with current tooling.
-	 * 
-	 * @return a collection of launch configurations that required migration
-	 * @exception org.eclipse.core.runtime.CoreException if an exception occurs determining
-	 * 	 migration candidates
-	 * @since 3.2
-	 */
-	public ILaunchConfiguration[] getMigrationCandidates() throws CoreException;
-	
-	/**
-	 * When a launch configuration is created or moved, registered launch
-	 * configuration listeners (see <code>ILaunchConfigurationListener</code>)
-	 * are notified of an add notification for the new configuration. If the
-	 * notification is the result of a move this method will return a handle to
-	 * the launch configuration that the added launch configuration was moved
-	 * from. This method returns <code>null</code> if the added launch
-	 * configuration was not the result of a rename or move. This information is
-	 * only available during the add notification call back
-	 * <code>launchConfigurationAdded</code>.
-	 * <p>
-	 * Renaming a configuration is considered the same as moving a
-	 * configuration.
-	 * </p>
-	 * 
-	 * @param addedConfiguration a launch configuration for which an add
-	 * notification is being broadcast
-	 * @return the launch configuration that the added launch configuration was
-	 * moved from, or <code>null</code> if the add notification is not the
-	 * result of a move
-	 * @since 2.1
-	 */
-	public ILaunchConfiguration getMovedFrom(ILaunchConfiguration addedConfiguration);
-	
-	/**
-	 * When a launch configuration is deleted or moved, registered launch
-	 * configuration listeners (see <code>ILaunchConfigurationListener</code>)
-	 * are notified of a remove notification for launch configuration that has
-	 * been deleted. If the notification is the result of a move this method
-	 * will return a handle to the launch configuration that the removed launch
-	 * configuration was moved to. This method returns <code>null</code> if the
-	 * removed launch configuration was not the result of a rename or move. This
-	 * information is only available during the add notification call back
-	 * <code>launchConfigurationRemoved</code>.
-	 * <p>
-	 * Renaming a configuration is considered the same as moving a
-	 * configuration.
-	 * </p>
-	 *
-	 * @param removedConfiguration a launch configuration for which a
-	 * remove notification is being broadcast
-	 * @return the launch configuration that the removed launch configuration
-	 * was moved to, or <code>null</code> if the add notification is not the
-	 * result of a move
-	 * @since 2.1
-	 */
-	public ILaunchConfiguration getMovedTo(ILaunchConfiguration removedConfiguration);	
-	
-	/**
-	 * Returns the native system environment variables as a map of
-	 * variable names and values (Strings).
-	 * <p>
-	 * Note that WIN32 system environment preserves
-	 * the case of variable names but is otherwise case insensitive.
-	 * Depending on what you intend to do with the environment, the
-	 * lack of normalization may or may not be create problems. On 
-	 * WIN32, this method normalizes mixed-case keys variable names
-	 * to upper case. Use {@link #getNativeEnvironmentCasePreserved()}
-	 * instead to get a WIN32 system environment where the keys are
-	 * the mixed-case variable names recorded by the OS.
-	 * </p>
-	 * 
-	 * @return the native system environment variables; on WIN32, mixed-case
-	 * variable names (keys) have been normalized to upper case
-	 * (key type: <code>String</code>; value type: <code>String</code>)
-	 * @since 3.0
-	 */	
-	public Map getNativeEnvironment();
-
-	/**
-	 * Returns the native system environment variables as a map of
-	 * variable names and values (Strings).
-	 * <p>
-	 * Note that WIN32 system environment preserves
-	 * the case of variable names but is otherwise case insensitive.
-	 * Depending on what you intend to do with the environment, the
-	 * lack of normalization may or may not be create problems. This
-	 * method returns mixed-case keys using the variable names 
-	 * recorded by the OS.
-	 * Use {@link #getNativeEnvironment()} instead to get a WIN32 system
-	 * environment where all keys have been normalized to upper case.
-	 * </p>
-	 * 
-	 * @return the native system environment variables; on WIN32, mixed-case
-	 * variable names (keys) are returned without normalization
-	 * (key type: <code>String</code>; value type: <code>String</code>)
-	 * @since 3.1
-	 */	
-	public Map getNativeEnvironmentCasePreserved();
-
-	/**
-	 * Returns the collection of processes currently registered with this
-	 * launch manager.
-	 *
-	 * @return an array of processes
-	 */
-	public IProcess[] getProcesses();
-	
-	/**
-	 * Returns the source container type extension registered with the
-	 * given unique identifier, or <code>null</code> if none.
-	 * 
-	 * @param id unique identifier of a source container type extension
-	 * @return the source container type extension registered with the
-	 * given unique identifier, or <code>null</code> if none
-	 * @since 3.0
-	 */
-	public ISourceContainerType getSourceContainerType(String id);
-	
-	/**
-	 * Returns all registered source container type extensions.
-	 * 
-	 * @return all registered source container type extensions
-	 * @since 3.0
-	 */
-	public ISourceContainerType[] getSourceContainerTypes();
-
-	/**
-	 * Returns a source path computer to compute a default source lookup path for
-	 * the given launch configuration, or <code>null</code> if a source path
-	 * computer has not been registered for the associated launch configuration
-	 * type.
-	 *  
-	 * @param configuration a launch configuration
-	 * @return a source path computer registered for the associated launch
-	 *  configurations type, or <code>null</code> if unspecified
-	 * @throws CoreException if an exception occurs while instantiating a source
-	 *  path computer
-	 * @since 3.0
-	 */
-	public ISourcePathComputer getSourcePathComputer(ILaunchConfiguration configuration) throws CoreException;
-	
-	/**
-	 * Returns the source path computer extension registered with the given
-	 * unique identifier, or <code>null</code> if none.
-	 * 
-	 * @param id source path computer identifier
-	 * @return the source path computer extension registered with the given
-	 * unique identifier, or <code>null</code> if none
-	 * @since 3.0
-	 */
-	public ISourcePathComputer getSourcePathComputer(String id);	
-	
-	/**
-	 * Return <code>true</code> if there is a launch configuration with the specified name, 
-	 * <code>false</code> otherwise.
-	 * 
-	 * @return whether a launch configuration already exists with the given name
-	 * @param name the name of the launch configuration whose existence is being checked
-	 * @exception CoreException if unable to retrieve existing launch configuration names
-	 * @since 2.0
-	 */
-	public boolean isExistingLaunchConfigurationName(String name) throws CoreException;
-	
-	/**
-	 * Returns whether the given launch is currently registered.
-	 * 
-	 * @param launch a launch
-	 * @return whether the launch is currently registered
-	 * @since 3.1
-	 */
-	public boolean isRegistered(ILaunch launch);
-	
-	/**
-	 * Creates and returns a new source locator of the specified
-	 * type.
-	 * 
-	 * @param identifier the identifier associated with a 
-	 *  persistable source locator extension
-	 * @return a source locator
-	 * @exception CoreException if an exception occurs creating
-	 *  the source locator
-	 * @since 2.0
-	 */
-	public IPersistableSourceLocator newSourceLocator(String identifier) throws CoreException;
-
-	/**
-	 * Removes the specified launch and notifies listeners.
-	 * Has no effect if an identical launch is not already
-	 * registered.
-	 *
-	 * @param launch the launch to remove
-	 * @since 2.0
-	 */
-	public void removeLaunch(ILaunch launch);
-
-	/**
-	 * Removes the given launch configuration listener from the list
-	 * of listeners notified when a launch configuration is
-	 * added, removed, or changed. Has no effect if the given listener
-	 * is not already registered.
-	 * 
-	 * @param listener launch configuration listener
-	 * @since 2.0
-	 */
-	public void removeLaunchConfigurationListener(ILaunchConfigurationListener listener);
-
-	/**
-	 * Removes the specified launch objects and notifies listeners.
-	 * Has no effect on identical launch objects that are not already
-	 * registered.
-	 *
-	 * @param launches the launch objects to remove
-	 * @since 2.1
-	 */
-	public void removeLaunches(ILaunch[] launches);
-	
-	/**
-	 * Removes the given listener from the collection of registered launch listeners.
-	 * Has no effect if an identical listener is not already registered.
-	 *
-	 * @param listener the listener to unregister
-	 * @since 2.1
-	 */
-	public void removeLaunchListener(ILaunchesListener listener);
-	
-	/**
-	 * Removes the given listener from the collection of registered launch listeners.
-	 * Has no effect if an identical listener is not already registered.
-	 *
-	 * @param listener the listener to unregister
-	 */
-	public void removeLaunchListener(ILaunchListener listener);
-	
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchMode.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchMode.java
deleted file mode 100644
index 248c820..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchMode.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.debug.core;
-
-/**
- * A launch mode. The debug platform contributes launch modes
- * for run, debug, and profile. Clients may contribute additional launch
- * modes in plug-in XML via the <code>launchModes</code> extension point.
- * <p>
- * Following is an example launch mode contribution for profiling. A launch
- * mode has an unique identifier specified by the <code>mode</code> attribute
- * and a human readable label specified by the <code>label</code> attribute.
- * <pre>
- *  &lt;extension point=&quot;org.eclipse.debug.core.launchModes&quot;&gt;
- *   &lt;launchMode
- *    mode=&quot;profile&quot;
- *    label=&quot;Profile&quot;&gt;
- *   &lt;/launchMode&gt;
- *  &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface ILaunchMode {
-	
-	/**
-	 * Returns the unique identifier for this launch mode.
-	 * 
-	 * @return the unique identifier for this launch mode
-	 */
-	public String getIdentifier();
-	
-	/**
-	 * Returns a human readable label for this launch mode.
-	 * 
-	 * @return a human readable label for this launch mode
-	 */
-	public String getLabel();
-	
-	/**
-	 * Returns a human readable label for this launch mode when used in a
-	 * cascade menu. For example, "Run As". Allows the label to be
-	 * properly externalized.
-	 * <p>
-	 * A new attribute has been added the the launch mode extension in 3.2
-	 * to specify this label. When unspecified a default label is generated
-	 * by concatenation, for backwards compatibility.
-	 * </p>
-	 * @return human readable label for this launch mode when used in a
-	 * cascade menu
-	 * @since 3.2
-	 */
-	public String getLaunchAsLabel();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchesListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchesListener.java
deleted file mode 100644
index 1c93c48..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchesListener.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.debug.core;
-
-
-/**
- * A launches listener is notified of launches as they
- * are added and removed from the launch manager. Also,
- * when a process or debug target is added to a launch,
- * listeners are notified of a change.
- * <p>
- * This interface is analogous to <code>ILaunchListerner</code>, except
- * notifications are batched to include more than one launch object
- * when possible.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.ILaunch
- * @see org.eclipse.debug.core.ILaunchManager
- * @since 2.1
- */
-public interface ILaunchesListener {	
-	/**
-	 * Notifies this listener that the specified
-	 * launches have been removed.
-	 *
-	 * @param launches the removed launch objects
-	 */
-	public void launchesRemoved(ILaunch[] launches);
-	/**
-	 * Notifies this listener that the specified launches
-	 * have been added.
-	 * 
-	 * @param launches the newly added launch objects
-	 */
-	public void launchesAdded(ILaunch[] launches);	
-	/**
-	 * Notifies this listener that the specified launches
-	 * have changed. For example, a process or debug target
-	 * has been added to a launch.
-	 * 
-	 * @param launches the changed launch object
-	 */
-	public void launchesChanged(ILaunch[] launches);	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchesListener2.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchesListener2.java
deleted file mode 100644
index 7bf7022..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchesListener2.java
+++ /dev/null
@@ -1,30 +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.debug.core;
-
-/**
- * Enhancements to the launches listener interface. Provides notification
- * when one or more launches terminate.
- * <p>
- * Clients implementing launches listener may implement
- * this interface.
- * </p>
- * @since 3.0
- */
-public interface ILaunchesListener2 extends ILaunchesListener {
-	
-	/**
-	 * Notification that the given launches have terminated.
-	 * 
-	 * @param launches the launches that have terminated
-	 */
-	public void launchesTerminated(ILaunch[] launches);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILogicalStructureProvider.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILogicalStructureProvider.java
deleted file mode 100644
index df4fb48..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILogicalStructureProvider.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.debug.core;
-
-import org.eclipse.debug.core.model.IValue;
-
-/**
- * Provides logical structure types applicable to a raw implementation value from
- * a debug model. Associated with a logical structure provider extension.
- * <p>
- * The following is an example of a logical structure provider extension:
- * <pre>
- *  &lt;extension point=&quot;org.eclipse.debug.core.logicalStructureProviders&quot;&gt;
- *   &lt;logicalStructureProvider
- *    class=&quot;com.example.ExampleLogicalStructureProvider&quot;
- *    modelIdentifier=&quot;com.example.debug.model&quot;&gt;
- *   &lt;/logicalStructureProvider&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p>
- * In the example above, the specified logical structure provider will be consulted for
- * alternative logical structures for values from the <code>com.example.debug.model</code>
- * debug model as they are displayed in the variables view.
- * </p>
- * <p>
- * Clients contributing logical structure providers must implement this
- * interface.
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.core.ILogicalStructureType
- */
-public interface ILogicalStructureProvider {
-	
-	/**
-	 * Returns the logical structure types which are applicable to the given value.
-	 * 
-	 * @param value value for which logical structure types are being requested
-	 * @return the logical structure types which are applicable to the given value
-	 */
-	public ILogicalStructureType[] getLogicalStructureTypes(IValue value);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILogicalStructureType.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILogicalStructureType.java
deleted file mode 100644
index ae049d5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILogicalStructureType.java
+++ /dev/null
@@ -1,81 +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.debug.core;
-
-import org.eclipse.debug.core.model.ILogicalStructureTypeDelegate;
-import org.eclipse.debug.core.model.ILogicalStructureTypeDelegate2;
-
-/**
- * Provides a value representing the logical structure of a raw implementation value
- * from a debug model. Logical structures are useful for navigating complex data
- * structures. Logical structure types are contributed via extensions in plug-in XML,
- * and provide a delegate for performing logical value computation. Logical 
- * structure types can be retrieved from the <code>DebugPlugin</code>.
- * <p>
- * Following is example plug-in XML to define a logical structure type.
- * </p>
- * <pre>
- * &lt;extension point=&quot;org.eclipse.debug.core.logicalStructureTypes&quot;&gt;
- *  &lt;logicalStructureType
- *   id=&quot;com.example.ExampleLogicalStructure&quot;
- *   class=&quot;com.example.ExampleLogicalStructureDelegate&quot;
- *   modelIdentifier=&quot;com.example.debug.model&quot;
- *   description=&quot;Ordered Collection&quot;&gt;
- *  &lt;/logicalStructureType&gt;
- * &lt;/extension&gt;
- * </pre>
- * <p>
- * The attributes are specified as follows:
- * <ul>
- * <li>id - unique identifier for this logical structure type</li>
- * <li>class - fully qualified name of class that implements 
- *   <code>ILogicalStructureTypeDelegate</code></li>
- * <li>modelIdentifier - identifier of the debug model this logical structure
- *   type is associated with</li>
- * <li>description - description of the logical structure provided</li>
- * </ul>
- * </p>
- * <p>
- * Clients contributing logicalStructureType extensions are not intended to implement
- * this interface. Rather, they provide an <code>ILogicalStructureTypeDelegate</code>
- * that optionally implements <code>ILogicalStructureTypeDelegate2</code> to provide
- * dynamic descriptions of logical structures.
- * Since 3.1, clients contributing logicalStructureProviders extensions may implement this
- * interface to return a collection of logical structure types applicable to a value.
- * </p>
- * @since 3.0
- * @see org.eclipse.debug.core.model.ILogicalStructureTypeDelegate
- * @see org.eclipse.debug.core.ILogicalStructureProvider
- */
-public interface ILogicalStructureType extends ILogicalStructureTypeDelegate, ILogicalStructureTypeDelegate2 {
-	
-	/**
-	 * Returns a simple description of the logical structure provided by this
-	 * structure type.
-	 * <p>
-	 * Since 3.1, this method can return <code>null</code> if this logical structure
-	 * type's delegate implements <code>ILogicalStructureTypeDelegate2</code>.
-	 * </p>
-	 * 
-	 * @return a simple description of the logical structure provided by this
-	 * structure type, possibly <code>null</code>
-	 */
-	public String getDescription();
-	
-	/**
-	 * Returns this logical structure type's unique identifier, as defined
-	 * in plug-in XML.
-	 * 
-	 * @return this logical structure type's unique identifier
-	 */
-	public String getId();
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IMemoryBlockListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IMemoryBlockListener.java
deleted file mode 100644
index 65ff4d5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IMemoryBlockListener.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.debug.core;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-
-/**
- * A memory block listener is notified of the addition and removal
- * of memory blocks with the memory block manager. Listeners must
- * register with the memory block manager for notification.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryBlockListener {
-	
-	/**
-	 * Notification the given memory blocks have been added to the
-	 * memory block manager.
-	 * 
-	 * @param memory blocks added to the memory block manager
-	 */
-	void memoryBlocksAdded(IMemoryBlock[] memory);
-
-	/**
-	 * Notification the given memory blocks have been removed from
-	 * the memory block manager.
-	 * 
-	 * @param memory blocks removed from the memory block manager
-	 */
-	void memoryBlocksRemoved(IMemoryBlock[] memory);
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IMemoryBlockManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IMemoryBlockManager.java
deleted file mode 100644
index bbafff8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IMemoryBlockManager.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.core;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-
-
-/**
- * Manages registered memory blocks in the workspace. Clients
- * interested in notification of the addition and removal of 
- * memory blocks may register as a memory block listener with 
- * the memory block manager.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see org.eclipse.debug.core.model.IMemoryBlock
- * @see org.eclipse.debug.core.IMemoryBlockListener
- * @since 3.1
- */
-public interface IMemoryBlockManager {
-
-	/**
-	 * Adds the given memory blocks to the memory block manager.
-	 * Registered memory block listeners are notified of the additions.
-	 * Has no effect on memory blocks that are already registered.
-	 *   
-	 * @param memoryBlocks memory blocks to add
-	 */
-	public void addMemoryBlocks(IMemoryBlock[] memoryBlocks);
-	
-	/**
-	 * Removes the given memory blocks from the memory block manager.
-	 * Registered memory block listeners are notified of the removals.
-	 * Has no effect on memory blocks that are not currently registered.
-	 * 
-	 * @param memoryBlocks memory blocks to remove
-	 */
-	public void removeMemoryBlocks(IMemoryBlock[] memoryBlocks);
-	
-	/**
-	 * Registers the given listener for memory block addition and
-	 * removal notification. Has no effect if an identical listener
-	 * is already registered.
-	 *    
-	 * @param listener the listener to add
-	 */
-	public void addListener(IMemoryBlockListener listener);
-	
-	/**
-	 * Unregisters the given listener for memory block addition and
-	 * removal notification. Has no effect if an identical listener
-	 * is not already registered.
-	 * 
-	 * @param listener the listener to remove
-	 */
-	public void removeListener(IMemoryBlockListener listener);
-	
-	/**
-	 * Returns all registered memory blocks.
-	 * 
-	 * @return all registered memory blocks
-	 */
-	public IMemoryBlock[] getMemoryBlocks();
-	
-	/**
-	 * Returns all registered memory blocks associated with the
-	 * given debug target. That is, all registered memory blocks
-	 * whose <code>getDebugTarget()</code> method returns the
-	 * specified debug target.
-	 * 
-	 * @param debugTarget target for which memory blocks have been requested
-	 * @return all registered memory blocks associated with the given debug
-	 *  target
-	 */
-	public IMemoryBlock[] getMemoryBlocks(IDebugTarget debugTarget);
-	
-	/**
-	 * Returns all registered memory blocks that originated from the
-	 * given memory retrieval source.
-	 * 
-	 * @param source source for which memory blocks have been requested
-	 * @return all registered memory blocks that originated from the
-	 *  given memory retrieval source
-	 */
-	public IMemoryBlock[] getMemoryBlocks(IMemoryBlockRetrieval source);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IProcessFactory.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IProcessFactory.java
deleted file mode 100644
index 802ffc9..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IProcessFactory.java
+++ /dev/null
@@ -1,66 +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.debug.core;
-
-import java.util.Map;
-
-import org.eclipse.debug.core.model.IProcess;
-
-/**
- * A process factory is used to override default process (<code>IProcess</code>)
- * creation by the debug plug-in, and can be contributed via plug-in XML. When a
- * new process is created via <code>DebugPlugin.newProcess(..)</code>, the
- * launch configuration associated with the specified launch is consulted for
- * a process factory attribute (<code>DebugPlugin.ATTR_PROCESS_FACTORY_ID</code>). If
- * present, the associated process factory is consulted to create a process for
- * the launch. If not present a default process implementation is created and
- * returned by the debug plug-in.
- * <p>
- * Following is example plug-in XML that contributes a process factory.
- * <pre>
- * &lt;extension point="org.eclipse.debug.core.processFactories"&gt;
- *   &lt;processFactory
- *           id="com.example.ExampleIdentifier"
- *           class="com.example.ExampleProcessFactory"&gt;
- *   &lt;/processFactory&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li>id - a unique identifier for this extension point</li>
- * <li>class - the fully qualified name of a class the implements
- *   <code>IProcessFactory</code></li>
- * </ul>
- * </p>
- * <p>
- * Clients contributing a process factory are intended to implement this interface.
- * </p>
- * @since 3.0
- */
-
-public interface IProcessFactory {
-	
-	/**
-	 * Creates and returns a new process representing the given
-	 * <code>java.lang.Process</code>. A streams proxy is created
-	 * for the I/O streams in the system process. The process
-	 * is added to the given launch, and the process is initialized
-	 * with the given attribute map.
-	 *
-	 * @param launch the launch the process is contained in
-	 * @param process the system process to wrap
-	 * @param label the label assigned to the process
-	 * @param attributes initial values for the attribute map
-	 * @return the process
-	 * @see IProcess
-	 */
-	public IProcess newProcess(ILaunch launch, Process process, String label, Map attributes);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IRequest.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IRequest.java
deleted file mode 100644
index 1bec072..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IRequest.java
+++ /dev/null
@@ -1,84 +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.debug.core;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Common base interface for an asynchronously processed request. A request may succeed,
- * fail or be canceled as indicated by the request's status. When a request is complete
- * the client fulfilling the request must call <code>done()</code> on the request whether
- * the operation succeeds, fails, or is canceled.
- * <p>
- * Specific requests (sub types of this interface) often include data pertaining to
- * the request and usually contain results of the request.
- * </p>
- * <p>
- * Clients are expected to poll a request (using <code>isCanceled</code>)
- * periodically and abort at their earliest convenience calling <code>done()</code>.
- * A request can be canceled by the originator of the request or a client
- * fulfilling a request. 
- * </p>
- * <p>
- * Clients that invoke request handlers may implemented this interface.
- * </p>
- * @since 3.3
- */
-public interface IRequest {
-
-    /**
-     * Sets the status for this request indicating whether this request
-     * succeeded, failed, or was canceled. When a request fails, the status
-     * indicates why the request failed. A <code>null</code> status is considered
-     * to be successful. Only clients fulfilling a request should call this
-     * method. Clients making a request are not intended to call this method.
-     * 
-     * @param status request status or <code>null</code>
-     */
-    public void setStatus(IStatus status);
-    
-    /**
-     * Returns the status of this request, or <code>null</code>.
-     * 
-     * @return request status - <code>null</code> is equivalent
-     *  to an OK status
-     */
-    public IStatus getStatus();
-    
-    /**
-     * Indicates this request is complete. Clients must call this method
-     * whether the request succeeds, fails, or is cancelled to indicate that
-     * processing is complete. Only clients fulfilling a request should call this
-     * method. Clients making a request are not intended to call this method.
-     */
-    public void done();
-    
-    /**
-     * Cancels this request. A request may be canceled by the originator of request
-     * or a client fulfilling a request. Optionally a canceled status may be set on
-     * this request with more details. A client fulfilling a request must still call
-     * <code>done()</code> to indicate the request is complete.
-     */
-    public void cancel();
-    
-    /**
-     * Returns whether this request has been canceled.
-     * <p>
-     * Clients fulfilling a request are expected to poll a request (using <code>isCanceled</code>)
-     * periodically and abort at their earliest convenience calling <code>done()</code>.
-     * A request can be canceled by the originator of the request or a processor fulfilling a
-     * request. 
-     * </p>
-     * @return whether this request has been canceled
-     */
-    public boolean isCanceled();
-    
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IStatusHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IStatusHandler.java
deleted file mode 100644
index 571b064..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IStatusHandler.java
+++ /dev/null
@@ -1,78 +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.debug.core;
-
- 
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A status handler registers to handle a specific status - error
- * or otherwise. Provides a mechanism for separating core (headless)
- * function from UI interaction. The debug plug-in provides a
- * status handlers extension point, against which handlers can
- * register for specific status codes - identified by plug-in
- * identifier and plug-in specific status code. The interaction between
- * an object requiring a status handler (source), and the status handler
- * is defined by the source and handler.
- * <p>
- * For example, a launch configuration delegate might encounter a timeout
- * while launching an application. In this case the delegate could abort
- * or, via the use of a status handler, prompt the user to continue. This
- * allows the launcher to be implemented in a plug-in that does not require
- * UI support, and allows another (UI) plug-in to register a handler.
- * </p>
- * <p>
- * A status handler extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a status handler extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.core.statusHandlers"&gt;
- *   &lt;statusHandler 
- *      id="com.example.ExampleIdentifier"
- *      class="com.example.ExampleStatusHandler"
- *      plugin="com.example.ExamplePluginId"
- *      code="123"&gt;
- *   &lt;/statusHandler&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this status handler.</li>
- * <li><code>class</code> specifies the fully qualified name of the Java class
- *   that implements <code>IStatusHandler</code>.</li>
- * <li><code>plugin</code> plug-in identifier that corresponds to the
- *   plug-in of the status this handler is registered for (i.e.
- *   <code>IStatus.getPlugin()</code>).</li>
- * <li><code>code</code> specifies the status code this handler
- *   is registered for.</li>
- * </ul>
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see DebugPlugin#getStatusHandler(IStatus)
- * @since 2.0
- */
-
-public interface IStatusHandler {
-
-	/**
-	 * Notifies this status handler that the given status has been
-	 * generated by the specified source object and requires resolution.
-	 * 
-	 * @param status the status to handle
-	 * @param source the object delegating to this status handler
-	 *   the given status
-	 * @return an object representing the resolution of the status
-	 * @exception CoreException if unable to resolve the status
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java
deleted file mode 100644
index a074c89..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core;
-
-
-import org.eclipse.debug.core.model.IStreamMonitor;
-
-/**
- * A stream listener is notified of changes
- * to a stream monitor.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IStreamMonitor
- */
-public interface IStreamListener {
-	/**
-	 * Notifies this listener that text has been appended to
-	 * the given stream monitor.
-	 *
-	 * @param text the appended text
-	 * @param monitor the stream monitor to which text was appended
-	 */
-	public void streamAppended(String text, IStreamMonitor monitor);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java
deleted file mode 100644
index 6cd9962..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java
+++ /dev/null
@@ -1,594 +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
- *     Pawel Piech - Bug 82003: The IDisconnect implementation by Launch module is too restrictive.
- *******************************************************************************/
-package org.eclipse.debug.core;
-
-
-import java.util.ArrayList;
-import java.util.HashMap;
-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.PlatformObject;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.internal.core.DebugCoreMessages;
-import org.eclipse.debug.internal.core.LaunchManager;
-
-/**
- * A launch is the result of launching a debug session
- * and/or one or more system processes. This class provides
- * a public implementation of <code>ILaunch</code> for client
- * use.
- * <p>
- * Clients may instantiate this class. Clients may subclass this class.
- * </p>
- * @see ILaunch
- * @see ILaunchManager
- */
-
-public class Launch extends PlatformObject implements ILaunch, IDisconnect, ILaunchListener, ILaunchConfigurationListener, IDebugEventSetListener {
-	
-	/**
-	 * The debug targets associated with this
-	 * launch (the primary target is the first one
-	 * in this collection), or empty if
-	 * there are no debug targets.
-	 */
-	private List fTargets= new ArrayList();
-
-	/**
-	 * The configuration that was launched, or null.
-	 */
-	private ILaunchConfiguration fConfiguration= null;
-
-	/**
-	 * The system processes associated with
-	 * this launch, or empty if none.
-	 */
-	private List fProcesses= new ArrayList();
-
-	/**
-	 * The source locator to use in the debug session
-	 * or <code>null</code> if not supported.
-	 */
-	private ISourceLocator fLocator= null;
-
-	/**
-	 * The mode this launch was launched in.
-	 */
-	private String fMode;
-	
-	/**
-	 * Table of client defined attributes
-	 */
-	private HashMap fAttributes;	
-	
-	/**
-	 * Flag indicating that change notification should
-	 * be suppressed. <code>true</code> until this
-	 * launch has been initialized.
-	 */
-	private boolean fSuppressChange = true;
-		
-	/**
-	 * Constructs a launch with the specified attributes.
-	 *
-	 * @param launchConfiguration the configuration that was launched
-	 * @param mode the mode of this launch - run or debug (constants
-	 *  defined by <code>ILaunchManager</code>)
-	 * @param locator the source locator to use for this debug session, or
-	 * 	<code>null</code> if not supported
-	 */
-	public Launch(ILaunchConfiguration launchConfiguration, String mode, ISourceLocator locator) {		
-		fConfiguration = launchConfiguration;
-		setSourceLocator(locator);
-		fMode = mode;
-		fSuppressChange = false;
-		getLaunchManager().addLaunchListener(this);
-		getLaunchManager().addLaunchConfigurationListener(this);
-	}
-	
-	/**
-	 * Registers debug event listener.
-	 */
-	private void addEventListener() {
-		DebugPlugin.getDefault().addDebugEventListener(this);
-	}
-	
-	/**
-	 * Removes debug event listener.
-	 */
-	private void removeEventListener() {
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		List processes = getProcesses0();
-		for (int i = 0; i < processes.size(); i++) {
-			IProcess process = (IProcess)processes.get(i);
-			if (process.canTerminate()) {
-				return true;
-			}
-		}
-		List targets = getDebugTargets0();
-		for (int i = 0; i < targets.size(); i++) {
-			IDebugTarget target = (IDebugTarget)targets.get(i);
-			if (target.canTerminate() || target.canDisconnect()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @see ILaunch#getChildren()
-	 */
-	public Object[] getChildren() {
-		ArrayList children = new ArrayList(getDebugTargets0());
-		children.addAll(getProcesses0());
-		return children.toArray();
-	}
-
-	/**
-	 * @see ILaunch#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		if (!getDebugTargets0().isEmpty()) {
-			return (IDebugTarget)getDebugTargets0().get(0);
-		}
-		return null;
-	}
-		
-	/**
-	 * @see ILaunch#getProcesses()
-	 */
-	public IProcess[] getProcesses() {
-		return (IProcess[])getProcesses0().toArray(new IProcess[getProcesses0().size()]);
-	}
-	
-	/**
-	 * Returns the processes associated with this
-	 * launch, in its internal form - a list.
-	 * 
-	 * @return list of processes
-	 */
-	protected List getProcesses0() {
-		return fProcesses;
-	}	
-	
-	/**
-	 * @see ILaunch#getSourceLocator()
-	 */
-	public ISourceLocator getSourceLocator() {
-		return fLocator;
-	}
-	
-	/**
-	 * @see ILaunch#setSourceLocator(ISourceLocator)
-	 */
-	public void setSourceLocator(ISourceLocator sourceLocator) {
-		fLocator = sourceLocator;
-	}	
-
-	/**
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		if (getProcesses0().isEmpty() && getDebugTargets0().isEmpty()) {
-			return false;
-		}
-
-		Iterator processes = getProcesses0().iterator();
-		while (processes.hasNext()) {
-			IProcess process = (IProcess)processes.next();
-			if (!process.isTerminated()) {
-				return false;
-			}
-		}
-		
-		Iterator targets = getDebugTargets0().iterator();
-		while (targets.hasNext()) {
-			IDebugTarget target = (IDebugTarget)targets.next();
-			if (!(target.isTerminated() || target.isDisconnected())) {
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		MultiStatus status= 
-			new MultiStatus(DebugPlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, DebugCoreMessages.Launch_terminate_failed, null); 
-		
-		// terminate the system processes
-		IProcess[] processes = getProcesses();
-		for (int i = 0; i < processes.length; i++) {
-			IProcess process = processes[i];
-			if (process.canTerminate()) {
-				try {
-					process.terminate();
-				} catch (DebugException e) {
-					status.merge(e.getStatus());
-				}
-			}
-		}
-		
-		// terminate or disconnect debug target if it is still alive
-		IDebugTarget[] targets = getDebugTargets();
-		for (int i = 0; i < targets.length; i++) {
-			IDebugTarget target= targets[i];
-			if (target != null) {
-				if (target.canTerminate()) {
-					try {
-						target.terminate();
-					} catch (DebugException e) {
-						status.merge(e.getStatus());
-					}
-				} else {
-					if (target.canDisconnect()) {
-						try {
-							target.disconnect();
-						} catch (DebugException de) {
-							status.merge(de.getStatus());
-						}
-					}
-				}
-			}
-		}
-		if (status.isOK()) {
-			return;
-		}
-		IStatus[] children= status.getChildren();
-		if (children.length == 1) {
-			throw new DebugException(children[0]);
-		} 
-		throw new DebugException(status);
-	}
-
-	/**
-	 * @see ILaunch#getLaunchMode()
-	 */
-	public String getLaunchMode() {
-		return fMode;
-	}
-	
-	/**
-	 * @see ILaunch#getLaunchConfiguration()
-	 */
-	public ILaunchConfiguration getLaunchConfiguration() {
-		return fConfiguration;
-	}
-
-	/**
-	 * @see ILaunch#setAttribute(String, String)
-	 */
-	public void setAttribute(String key, String value) {
-		if (fAttributes == null) {
-			fAttributes = new HashMap(5);
-		}
-		fAttributes.put(key, value);		
-	}
-
-	/**
-	 * @see ILaunch#getAttribute(String)
-	 */
-	public String getAttribute(String key) {
-		if (fAttributes == null) {
-			return null;
-		}
-		return (String)fAttributes.get(key);
-	}
-
-	/**
-	 * @see ILaunch#getDebugTargets()
-	 */
-	public IDebugTarget[] getDebugTargets() {
-		return (IDebugTarget[])fTargets.toArray(new IDebugTarget[fTargets.size()]);
-	}
-	
-	/**
-	 * Returns the debug targets associated with this
-	 * launch, in its internal form - a list
-	 * 
-	 * @return list of debug targets
-	 */
-	protected List getDebugTargets0() {
-		return fTargets;
-	}	
-
-	/**
-	 * @see ILaunch#addDebugTarget(IDebugTarget)
-	 */
-	public void addDebugTarget(IDebugTarget target) {
-		if (target != null) {
-			if (!getDebugTargets0().contains(target)) {
-				addEventListener();
-				getDebugTargets0().add(target);
-				fireChanged();
-			}
-		}
-	}
-	
-	/**
-	 * @see ILaunch#removeDebugTarget(IDebugTarget)
-	 */
-	public void removeDebugTarget(IDebugTarget target) {
-		if (target != null) {
-			if (getDebugTargets0().remove(target)) {
-				fireChanged();
-			}
-		}
-	}	
-	
-	/**
-	 * @see ILaunch#addProcess(IProcess)
-	 */
-	public void addProcess(IProcess process) {
-		if (process != null) {
-			if (!getProcesses0().contains(process)) {
-				addEventListener();
-				getProcesses0().add(process);
-				fireChanged();
-			}
-		}
-	}
-	
-	/**
-	 * @see ILaunch#removeProcess(IProcess)
-	 */
-	public void removeProcess(IProcess process) {
-		if (process != null) {
-			if (getProcesses0().remove(process)) {
-				fireChanged();
-			}
-		}
-	}	
-	
-	/**
-	 * Adds the given processes to this launch.
-	 * 
-	 * @param processes processes to add
-	 */
-	protected void addProcesses(IProcess[] processes) {
-		if (processes != null) {
-			for (int i = 0; i < processes.length; i++) {
-				addProcess(processes[i]);
-				fireChanged();
-			}
-		}
-	}
-	
-	/**
-	 * Notifies listeners that this launch has changed.
-	 * Has no effect of this launch has not yet been
-	 * properly created/initialized.
-	 */
-	protected void fireChanged() {
-		if (!fSuppressChange) {
-			((LaunchManager)getLaunchManager()).fireUpdate(this, LaunchManager.CHANGED);
-			((LaunchManager)getLaunchManager()).fireUpdate(new ILaunch[] {this}, LaunchManager.CHANGED);
-		}
-	}
-
-	/**
-	 * Notifies listeners that this launch has terminated.
-	 * Has no effect of this launch has not yet been
-	 * properly created/initialized.
-	 */
-	protected void fireTerminate() {
-		if (!fSuppressChange) {
-			((LaunchManager)getLaunchManager()).fireUpdate(this, LaunchManager.TERMINATE);
-			((LaunchManager)getLaunchManager()).fireUpdate(new ILaunch[] {this}, LaunchManager.TERMINATE);
-		}
-		removeEventListener();
-	}
-	
-	/**
-	 * @see ILaunch#hasChildren()
-	 */
-	public boolean hasChildren() {
-		return getProcesses0().size() > 0 || (getDebugTargets0().size() > 0);
-	}
-	
-	/**
-     * Returns whether any processes or targets can be disconnected. 
-     * Ones that are already terminated or disconnected are ignored.
-     * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
-	 */
-	public boolean canDisconnect() {
-        List processes = getProcesses0();
-        for (int i = 0; i < processes.size(); i++) {
-            if (processes.get(i) instanceof IDisconnect) {
-                IDisconnect process = (IDisconnect)processes.get(i); 
-                if (process.canDisconnect()) {
-                    return true;
-                }
-            }
-        }
-        List targets = getDebugTargets0();
-        for (int i = 0; i < targets.size(); i++) {
-            if ( ((IDebugTarget)targets.get(i)).canDisconnect() ) {
-                return true;
-            }
-        }
-        return false;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IDisconnect#disconnect()
-	 */
-	public void disconnect() throws DebugException {
-        List processes = getProcesses0();
-        for (int i = 0; i < processes.size(); i++) {
-            if (processes.get(i) instanceof IDisconnect) {
-                IDisconnect disconnect = (IDisconnect)processes.get(i);
-                if (disconnect.canDisconnect()) {
-                    disconnect.disconnect();
-                }
-            }
-        }
-        List targets = getDebugTargets0();
-        for (int i = 0; i < targets.size(); i++) {
-            IDebugTarget debugTarget = (IDebugTarget)targets.get(i);
-            if (debugTarget.canDisconnect()) {
-                debugTarget.disconnect();
-            }
-        }
-	}
-
-	/**
-     * Returns whether all of the contained targets and processes are 
-     * disconnected. Processes that don't support disconnecting are not 
-     * counted.
-     * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
-	 */
-	public boolean isDisconnected() {
-        List processes = getProcesses0();
-        for (int i = 0; i < processes.size(); i++) {
-            if (processes.get(i) instanceof IDisconnect) {
-                IDisconnect process = (IDisconnect)processes.get(i); 
-                if (!process.isDisconnected()) {
-                    return false;
-                }
-            }
-        }
-        List targets = getDebugTargets0();
-        for (int i = 0; i < targets.size(); i++) {
-            if ( !((IDebugTarget)targets.get(i)).isDisconnected() ) {
-                return false;
-            }
-        }
-        // only return true if there are processes or targets that are disconnected
-        return hasChildren();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {
-		if (this.equals(launch)) {
-			removeEventListener();
-			getLaunchManager().removeLaunchListener(this);
-			getLaunchManager().removeLaunchConfigurationListener(this);
-		}
-	}
-
-	/**
-	 * Returns the launch manager.
-	 * 
-	 * @return the launch manager.
-	 */
-	protected ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * If the launch configuration this launch is associated with is
-	 * moved, update the underlying handle to the new location.
-	 *  
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationAdded(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationAdded(ILaunchConfiguration configuration) {
-		ILaunchConfiguration from = getLaunchManager().getMovedFrom(configuration);
-		if (from != null && from.equals(getLaunchConfiguration())) {
-			fConfiguration = configuration;
-			fireChanged();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationChanged(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationChanged(ILaunchConfiguration configuration) {}
-
-	/* (non-Javadoc)
-	 * 
-	 * Update the launch configuration associated with this launch if the
-	 * underlying configuration is deleted.
-	 * 
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationRemoved(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationRemoved(ILaunchConfiguration configuration) {
-		if (configuration.equals(getLaunchConfiguration())) {
-			if (getLaunchManager().getMovedTo(configuration) == null) {
-				fConfiguration = null;
-				fireChanged();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
-			if (event.getKind() == DebugEvent.TERMINATE) {
-				Object object = event.getSource();
-				ILaunch launch = null;
-				if (object instanceof IProcess) {
-					launch = ((IProcess)object).getLaunch();
-				} else if (object instanceof IDebugTarget) {
-					launch = ((IDebugTarget)object).getLaunch();
-				}
-				if (this.equals(launch)) {
-					if (isTerminated()) {
-						fireTerminate();
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(ILaunch.class)) {
-			return this;
-		}
-		//CONTEXTLAUNCHING
-		if(adapter.equals(ILaunchConfiguration.class)) {
-			return getLaunchConfiguration();
-		}
-		return super.getAdapter(adapter);
-	}
-	
-	
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDebugCommandHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDebugCommandHandler.java
deleted file mode 100644
index 437882b..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDebugCommandHandler.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-
-
-/**
- * Handles a command for a debugger. Specific command handlers extend this interface.
- * <p>
- * The debug platform provides actions for common debug commands that operate against
- * these handler interfaces. For example, the platform provides a terminate action that
- * operates on the active debug context (selected element in the debug view). The action
- * delegates to the active context's {@link ITerminateHandler} implementation to update
- * its enabled state and execute the command. Debug model elements may implement supported
- * command handler interfaces directly or provide them as adapters. The debug platform
- * provides implementations of handlers for standard debug models. 
- * </p>
- * <p>
- * Clients are not intended to implement this interface directly. Clients may 
- * implement specific command handler interfaces that extend this interface.
- * </p>
- * @see org.eclipse.core.runtime.IAdaptable
- * @see IDisconnectHandler
- * @see IDropToFrameHandler
- * @see IResumeHandler
- * @see IStepFiltersHandler
- * @see IStepIntoHandler
- * @see IStepOverHandler
- * @see IStepReturnHandler
- * @see ISuspendHandler
- * @see ITerminateHandler
- * @since 3.3
- */
-public interface IDebugCommandHandler {
-	
-	/**
-	 * Determines whether this handler can execute on the elements specified
-	 * in the given request by reporting enabled state to the request.
-	 * <p>
-	 * Implementations must be non-blocking and may respond asynchronously to the
-	 * given request. Errors can reported by setting an appropriate status
-	 * on the given request. A request can be canceled by this handler or caller.
-	 * A <code>null</code> status is equivalent to an OK status.
-	 * When a request succeeds, fails, or is canceled, implementations must call
-	 * <code>done()</code> on the given request.
-	 * </p>
-	 * <p>
-	 * Clients are expected to poll the request (using <code>isCanceled</code>)
-	 * periodically and abort at their earliest convenience calling <code>done()</code>
-	 * on the request.
-	 * </p>
-	 * @param request specifies elements to operate on and collects enabled state
-	 */
-	public void canExecute(IEnabledStateRequest request);
-	
-	/**
-	 * Executes this command on the elements specified in the given request
-	 * reporting status to the given request and returns whether this handler should
-	 * remain enabled while the command is executing.
-	 * <p>
-	 * Implementations must be non-blocking and may respond asynchronously to the
-	 * given request. Errors can reported by setting an appropriate status
-	 * on the given request. A request can be canceled by this handler or the caller. 
-	 * A <code>null</code> status is equivalent to an OK status. When a request is
-	 * complete, has encountered an error, or cancelled, implementations must call
-	 * <code>done()</code> on the given collector.
-	 * </p>
-	 * <p>
-	 * Handlers are expected to poll the request (using <code>isCanceled</code>)
-	 * periodically and abort at their earliest convenience calling <code>done()</code>
-	 * on the request.
-	 * </p>
-	 * @param request specifies elements to operate on and collects execution status
-	 * @return whether this handler remains enabled while command is executing
-	 */
-	public boolean execute(IDebugCommandRequest request);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDebugCommandRequest.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDebugCommandRequest.java
deleted file mode 100644
index b721005..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDebugCommandRequest.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.debug.core.commands;
-
-import org.eclipse.debug.core.IRequest;
-
-/**
- * A request to execute a command on specific elements. A debug command request is 
- * passed to a {@link IDebugCommandHandler} when a command is invoked.
- * <p>
- * Clients that invoke command handlers may implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IDebugCommandRequest extends IRequest {
-
-	/**
-	 * Returns the elements to execute a command on.
-	 * 
-	 * @return elements to execute a command on
-	 */
-	public Object[] getElements();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDisconnectHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDisconnectHandler.java
deleted file mode 100644
index 99b9bd8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDisconnectHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A disconnect handler disconnects the debug user interface from
- * a debug session. Typically a disconnect handler is supported by remote
- * debuggers allowing the debug user interface to disconnect and the
- * remote process to continue.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * disconnect action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the disconnect handler registered
- * as an adapter on objects that implement {@link org.eclipse.debug.core.model.IDisconnect}.
- * </p>
- * @since 3.3
- */
-public interface IDisconnectHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDropToFrameHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDropToFrameHandler.java
deleted file mode 100644
index d600c09..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IDropToFrameHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A drop to frame handler typically resets a program's instruction pointer
- * to the first executable line of code associated with a stack frame.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * drop to frame action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the drop to frame handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.IDropToFrame}.
- * </p>
- * @since 3.3
- */
-public interface IDropToFrameHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IEnabledStateRequest.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IEnabledStateRequest.java
deleted file mode 100644
index ee3e5b5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IEnabledStateRequest.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.debug.core.commands;
-
-
-
-/**
- * A request to update the enabled state of a command. A enabled state request
- * is passed to a {@link IDebugCommandHandler} to update the enabled state of
- * the handler.
- * <p>
- * Clients than invoke command handlers may implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IEnabledStateRequest extends IDebugCommandRequest {
-
-	/**
-	 * Sets the enabled state of a command handler.
-	 * 
-	 * @param result whether enabled
-	 */
-	public void setEnabled(boolean result);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IResumeHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IResumeHandler.java
deleted file mode 100644
index 6df44ef..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IResumeHandler.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A resume handler typically resumes execution of a suspended thread or target.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * resume action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the resume handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.ISuspendResume}.
- * </p>
- * @since 3.3
- */
-public interface IResumeHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepFiltersHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepFiltersHandler.java
deleted file mode 100644
index 5d0b739..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepFiltersHandler.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.debug.core.commands;
-
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * A step filters handler typically toggles the use of step filters
- * in a debug session based on the user preference setting. To determine if step filters
- * should be enabled use the method <code>isUseStepFilters()</code> in
- * {@link DebugPlugin}. 
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * toggle step filters action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the step filters handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.IStepFilters}.
- * </p>
- * @since 3.3
- */
-public interface IStepFiltersHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepIntoHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepIntoHandler.java
deleted file mode 100644
index 96a38cb..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepIntoHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A step into handler typically steps into the next instruction to
- * be executed.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * step into action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the step into handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.IStep}.
- * </p>
- * @since 3.3
- */
-public interface IStepIntoHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepOverHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepOverHandler.java
deleted file mode 100644
index 14e3b0e..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepOverHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A step over handler typically steps over the next instruction or line
- * of code to be executed.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * step over action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the step over handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.IStep}.
- * </p>
- * @since 3.3
- */
-public interface IStepOverHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepReturnHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepReturnHandler.java
deleted file mode 100644
index 01a8eda..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/IStepReturnHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A step return handler typically steps out of the current method or function
- * that the debugger is suspended in.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * step return action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the step return handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.IStep}.
- * </p>
- * @since 3.3
- */
-public interface IStepReturnHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/ISuspendHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/ISuspendHandler.java
deleted file mode 100644
index 39dc939..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/ISuspendHandler.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A suspend handler typically suspends an executing thread or target.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * suspend action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the suspend handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.ISuspendResume}.
- * </p>
- * @since 3.3
- */
-public interface ISuspendHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/ITerminateHandler.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/ITerminateHandler.java
deleted file mode 100644
index db26008..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/ITerminateHandler.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.commands;
-
-/**
- * A terminate handler typically terminates an executing thread or target.
- * <p>
- * Clients may implement this interface. The debug platform provides a
- * terminate action that delegates to this handler interface. As well, the
- * debug platform provides an implementation of the terminate handler registered
- * as an adapter on objects that implement
- * {@link org.eclipse.debug.core.model.ITerminate}.
- * </p>
- * @since 3.3
- */
-public interface ITerminateHandler extends IDebugCommandHandler {
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/package.html
deleted file mode 100644
index 5bae793..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/commands/package.html
+++ /dev/null
@@ -1,29 +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>Debug Commands</title>
-</head>
-
-<body link="#0000FF" vlink="#800080">
-
-<p align="left">Provides a set of interfaces for common debug commands.</p>
-
-<h2 align="left">Package Specification</h2>
-
-<p>This package provides a set interfaces for common debug commands. A debug command 
-  represent a debugger function that can be enabled or disabled and executed. 
-  The debug platform provides actions corresponding to the common debug commands. 
-  The actions delegate to the command handler interfaces to determine enabled 
-  state and execute.</p>
-<p>A debugger implementation can provide its own implementation of a command by 
-  implementing a command handler interface directly, or by registering an adapter 
-  that implements the command handler interface. The debug platform's actions 
-  update enabled state and execute based on the active debug context. The debug 
-  platform provides implementations of handlers for the common debug commands 
-  for debuggers that are an implementation of the standard debug model. For example, 
-  the debug platform registers an <code>IStepOverHandler</code> adapter for implementations 
-  of <code>IStep</code>.</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
deleted file mode 100644
index 3fd04ff..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
+++ /dev/null
@@ -1,341 +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.debug.core.model;
-
- 
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-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.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.internal.core.DebugCoreMessages;
-
-/**
- * Abstract implementation of a breakpoint. This class is
- * intended to be subclassed by implementations
- * of breakpoints.
- * 
- * @see IBreakpoint
- * @since 2.0
- */
-
-public abstract class Breakpoint extends PlatformObject implements IBreakpoint {
-	
-	static {
-		// making sure that the BreakpointManager is correctly initialized
-		// before any breakpoint marker related operation (see bug 54993)
-		DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
-	}
-				
-	/**
-	 * Underlying marker.
-	 */
-	private IMarker fMarker= null;
-	
-	/**
-	 * @see IBreakpoint#setMarker(IMarker)
-	 */
-	public void setMarker(IMarker marker) throws CoreException {
-		fMarker= marker;
-	}
-	
-	/**
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object item) {
-		if (item instanceof IBreakpoint) {
-			return getMarker().equals(((IBreakpoint)item).getMarker());
-		}
-		return false;
-	}
-	
-	/**
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return getMarker().hashCode();
-	}
-		
-	/**
-	 * @see IBreakpoint#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) throws CoreException {
-		if (enabled != isEnabled()) {
-			setAttribute(ENABLED, enabled);
-		}
-	}
-	
-	/**
-	 * @see IBreakpoint#isEnabled()
-	 */
-	public boolean isEnabled() throws CoreException {
-		return getMarker().getAttribute(ENABLED, false);
-	}
-	
-	/**
-	 * @see IBreakpoint#isRegistered()
-	 */
-	public boolean isRegistered() throws CoreException {
-			IMarker marker= getMarker();
-			return marker.exists() && marker.getAttribute(REGISTERED, true);
-	}	
-	
-	/**
-	 * @see IBreakpoint#setRegistered(boolean)
-	 */
-	public void setRegistered(boolean registered) throws CoreException {
-		if (isRegistered() != registered) {
-			setAttribute(REGISTERED, registered);
-			IBreakpointManager mgr = DebugPlugin.getDefault().getBreakpointManager();
-			if (registered) {
-				mgr.addBreakpoint(this);
-			} else {
-				mgr.removeBreakpoint(this, false);
-			}
-		}
-	}	
-
-	/**
-	 * @see IBreakpoint#delete()
-	 */
-	public void delete() throws CoreException {
-		DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(this, false);
-		getMarker().delete();
-	}
-
-	/**
-	 * @see IBreakpoint#getMarker()
-	 */
-	public IMarker getMarker() {
-		return fMarker;
-	}
-
-	/**
-	 * @see IBreakpoint#isPersisted()
-	 */
-	public boolean isPersisted() throws CoreException {
-		return getMarker().getAttribute(PERSISTED, true);
-	}
-
-	/**
-	 * @see IBreakpoint#setPersisted(boolean)
-	 */
-	public void setPersisted(boolean persisted) throws CoreException {
-		if (isPersisted() != persisted) {
-			setAttributes(new String[] {PERSISTED, IMarker.TRANSIENT}, new Object[] {Boolean.valueOf(persisted), Boolean.valueOf(!persisted)});
-		}
-	}
-	
-	/**
-	 * Convenience method to set the given boolean attribute of
-	 * this breakpoint's underlying marker in a workspace
-	 * runnable. Setting marker attributes in a workspace runnable
-	 * prevents deadlock.
-	 * 
-	 * @param attributeName attribute name
-	 * @param value attribute value
-	 * @exception CoreException is setting the attribute fails
-	 * @see IMarker#setAttribute(java.lang.String, boolean)
-	 */
-	protected void setAttribute(final String attributeName, final boolean value) throws CoreException {
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					ensureMarker().setAttribute(attributeName, value);
-				}
-			};
-			
-		workspace.run(runnable, getMarkerRule(), 0, null);
-	}
-	
-	/**
-	 * Convenience method to set the given integer attribute of
-	 * this breakpoint's underlying marker in a workspace
-	 * runnable. Setting marker attributes in a workspace runnable
-	 * prevents deadlock.
-	 * 
-	 * @param attributeName attribute name
-	 * @param value attribute value
-	 * @exception CoreException is setting the attribute fails
-	 * @see IMarker#setAttribute(java.lang.String, int)
-	 */
-	protected void setAttribute(final String attributeName, final int value) throws CoreException {
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					ensureMarker().setAttribute(attributeName, value);
-				}
-			};
-			
-		workspace.run(runnable, getMarkerRule(), 0, null);
-	}
-
-	/**
-	 * Convenience method to set the given attribute of
-	 * this breakpoint's underlying marker in a workspace
-	 * runnable. Setting marker attributes in a workspace runnable
-	 * prevents deadlock.
-	 * 
-	 * @param attributeName attribute name
-	 * @param value attribute value
-	 * @exception CoreException is setting the attribute fails
-	 * @see IMarker#setAttribute(java.lang.String, java.lang.Object)
-	 */
-	protected void setAttribute(final String attributeName, final Object value) throws CoreException {
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					ensureMarker().setAttribute(attributeName, value);
-				}
-			};
-			
-		workspace.run(runnable, getMarkerRule(), 0, null);
-	}
-
-	/**
-	 * Convenience method to set the given attributes of
-	 * this breakpoint's underlying marker in a workspace
-	 * runnable. Setting marker attributes in a workspace runnable
-	 * prevents deadlock.
-	 * 
-	 * @param attributeNames attribute names
-	 * @param values attribute values
-	 * @exception CoreException is setting the attributes fails
-	 * @see IMarker#setAttributes(java.lang.String[], java.lang.Object[])
-	 */
-	protected void setAttributes(final String[] attributeNames, final Object[] values) throws CoreException {
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					ensureMarker().setAttributes(attributeNames, values);
-				}
-			};
-			
-		workspace.run(runnable, getMarkerRule(), IWorkspace.AVOID_UPDATE, null);
-	}
-
-	/**
-	 * Convenience method to set the attributes of
-	 * this breakpoint's underlying marker in a workspace
-	 * runnable. Setting marker attributes in a workspace runnable
-	 * prevents deadlock.
-	 * 
-	 * @param attributes attribute map
-	 * @exception CoreException is setting the attributes fails
-	 * @see IMarker#setAttributes(java.util.Map)
-	 */
-	protected void setAttributes(final Map attributes) throws CoreException{
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					ensureMarker().setAttributes(attributes);
-				}
-			};
-			
-		workspace.run(runnable, getMarkerRule(), IWorkspace.AVOID_UPDATE, null);
-	}
-
-	/**
-	 * Returns the marker associated with this breakpoint.
-	 * 
-	 * @return breakpoint marker
-	 * @exception DebugException if no marker is associated with 
-	 *  this breakpoint or the associated marker does not exist
-	 */
-	protected IMarker ensureMarker() throws DebugException {
-		IMarker m = getMarker();
-		if (m == null || !m.exists()) {
-			throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED,
-				DebugCoreMessages.Breakpoint_no_associated_marker, null)); 
-		}
-		return m;
-	}
-	
-	/**
-	 * Returns whether this breakpoint has an associated marker that exists.
-	 * 
-	 * @return returns whether this breakpoint has an associated marker that exists
-	 * @since 2.1
-	 */
-	protected boolean markerExists() {
-		IMarker m = getMarker();
-		return (m != null && m.exists());
-	}
-
-	/**
-	 * Returns a scheduling rule to use when modifying markers on the given resource,
-	 * possibly <code>null</code>.
-	 * 
-	 * @param resource a resource on which a marker will be created, modified, or deleted
-	 * @return a scheduling rule to use when modifying markers on the given resource
-	 * 	possibly <code>null</code>
-	 * @since 3.1
-	 */
-    protected ISchedulingRule getMarkerRule(IResource resource) {
-        ISchedulingRule rule = null;
-        if (resource != null) {
-            IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
-            rule = ruleFactory.markerRule(resource);
-        }
-        return rule;
-    }
-    
-	/**
-	 * Returns a scheduling rule to use when modifying or deleting this breakpoint's marker, 
-	 * possibly <code>null</code>. This method is only valid when this breakpoint's
-	 * marker has already been created. When creating a marker on a specific resource,
-	 * use <code>getMarkerRule(IResource)</code> instead.
-	 * 
-	 * @return a scheduling rule to use when modifying or deleting this breakpoint's marker
-	 * @since 3.1
-	 */
-    protected ISchedulingRule getMarkerRule() {
-        ISchedulingRule rule = null;
-        IMarker marker = getMarker();
-        if (marker != null) {
-	        IResource resource = marker.getResource();
-	        if (resource != null) {
-	            IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
-	            rule = ruleFactory.markerRule(resource);
-	        }
-        }
-        return rule;
-    }
-    
-    /**
-	 * Execute the given workspace runnable with the scheduling rule to use when running the operation.
-	 * 
-	 * @param rule the rule to use when running the operation
-     * @param wr the runnable operation
-     * @throws DebugException If a core exception occurs performing the operation
-	 * @since 3.1
-	 */
-    protected void run(ISchedulingRule rule, IWorkspaceRunnable wr) throws DebugException {
-    	try {
-    		ResourcesPlugin.getWorkspace().run(wr, rule, 0, null);
-    	} catch (CoreException e) {
-    		throw new DebugException(e.getStatus());
-    	}			
-    }  
-    
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/DebugElement.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/DebugElement.java
deleted file mode 100644
index 2d13943..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/DebugElement.java
+++ /dev/null
@@ -1,168 +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.debug.core.model;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * Implementation of common function for debug elements.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.1
- */
-public abstract class DebugElement extends PlatformObject implements IDebugElement {
-    
-    private IDebugTarget fTarget;
-
-    /**
-     * Constructs a debug element referring to an artifact in the given
-     * debug target.
-     * 
-     * @param target debug target containing this element
-     */
-    public DebugElement(IDebugTarget target) {
-        fTarget = target;
-    }
-
-    /* (non-Javadoc)
-     * 
-     * Debug target implementation should override this method.
-     * 
-     * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
-     */
-    public IDebugTarget getDebugTarget() {
-        return fTarget;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
-     */
-    public ILaunch getLaunch() {
-        return getDebugTarget().getLaunch();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class adapter) {
-		if (adapter == IDebugElement.class) {
-			return this;
-		}
-		
-		// a debug target may not implement IStepFilters
-		if (adapter == IStepFilters.class) {
-			if (getDebugTarget() instanceof IStepFilters)
-				return getDebugTarget();
-		}
-		if (adapter == IDebugTarget.class) {
-			return getDebugTarget();
-		}
-		if (adapter == ILaunch.class) {
-		    return getLaunch();
-		}
-		if (adapter == IProcess.class) {
-		    return getDebugTarget().getProcess();
-		}
-		//CONTEXTLAUNCHING
-		if(adapter == ILaunchConfiguration.class) {
-			return getLaunch().getLaunchConfiguration();
-		}
-		return super.getAdapter(adapter);
-    }
-
-	/**
-	 * Fires a debug event.
-	 * 
-	 * @param event debug event to fire
-	 */
-	public void fireEvent(DebugEvent event) {
-		DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
-	}    
-
-	/**
-	 * Fires a change event for this debug element
-	 * with the specified detail code.
-	 * 
-	 * @param detail detail code for the change event,
-	 *  such as <code>DebugEvent.STATE</code> or <code>DebugEvent.CONTENT</code>
-	 */
-	public void fireChangeEvent(int detail) {
-		fireEvent(new DebugEvent(this, DebugEvent.CHANGE, detail));
-	}
-	
-	/**
-	 * Fires a creation event for this debug element.
-	 */
-    public void fireCreationEvent() {
-		fireEvent(new DebugEvent(this, DebugEvent.CREATE));
-	}	
-	
-	/**
-	 * Fires a resume for this debug element with
-	 * the specified detail code.
-	 * 
-	 * @param detail detail code for the resume event, such 
-	 *  as <code>DebugEvent.STEP_OVER</code>
-	 */
-    public void fireResumeEvent(int detail) {
-		fireEvent(new DebugEvent(this, DebugEvent.RESUME, detail));
-	}
-	
-	/**
-	 * Fires a suspend event for this debug element with
-	 * the specified detail code.
-	 * 
-	 * @param detail detail code for the suspend event, such
-	 *  as <code>DebugEvent.BREAKPOINT</code>
-	 */
-    public void fireSuspendEvent(int detail) {
-		fireEvent(new DebugEvent(this, DebugEvent.SUSPEND, detail));
-	}	
-	
-	/**
-	 * Fires a terminate event for this debug element.
-	 */
-    public void fireTerminateEvent() {
-		fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
-	}	
-	
-	/**
-	 * Throws a debug exception with a status code of <code>TARGET_REQUEST_FAILED</code>.
-	 * 
-	 * @param message exception message
-	 * @param e underlying exception or <code>null</code>
-	 * @throws DebugException
-	 */
-	protected void requestFailed(String message, Throwable e) throws DebugException {
-		throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), 
-				DebugException.TARGET_REQUEST_FAILED, message, e));
-	}
-	
-	/**
-	 * Throws a debug exception with a status code of <code>NOT_SUPPORTED</code>.
-	 * 
-	 * @param message exception message
-	 * @param e underlying exception or <code>null</code>
-	 * @throws DebugException
-	 */
-	protected void notSupported(String message, Throwable e) throws DebugException {
-		throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), 
-				DebugException.NOT_SUPPORTED, message, e));
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java
deleted file mode 100644
index d258655..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * A breakpoint is capable of suspending the execution of a
- * program at a specific location when a program is running
- * in debug mode. Each breakpoint has an associated marker which
- * stores and persists all attributes associated with a breakpoint.
- * <p>
- * A breakpoint is defined in two parts:
- * <ol>
- * <li>By an extension of kind <code>"org.eclipse.debug.core.breakpoints"</code></li>
- * <li>By a marker definition that corresponds to the above breakpoint extension</li>
- * </ol>
- * <p>
- * For example, following is a definition of corresponding breakpoint
- * and breakpoint marker definitions. Note that the <code>markerType</code>
- * attribute defined by the breakpoint extension corresponds to the 
- * type of the marker definition.
- * <pre>
- * &lt;extension point="org.eclipse.debug.core.breakpoints"&gt;
- *   &lt;breakpoint 
- *      id="com.example.Breakpoint"
- *      class="com.example.Breakpoint"
- *      markerType="com.example.BreakpointMarker"&gt;
- *   &lt;/breakpoint&gt;
- * &lt;/extension&gt;
- * &lt;extension point="org.eclipse.core.resources.markers"&gt;
- *   &lt;marker 
- *      id="com.example.BreakpointMarker"
- *      super type="org.eclipse.debug.core.breakpointMarker"
- *      attribute name ="exampleAttribute"&gt;
- *   &lt;/marker&gt;
- * &lt;/extension&gt;
- * </pre>
- * <p>
- * The breakpoint manager instantiates persisted breakpoints by
- * traversing all markers that are a subtype of
- * <code>"org.eclipse.debug.core.breakpointMarker"</code>, and 
- * instantiating the class defined by the <code>class</code> attribute
- * on the associated breakpoint extension. The method <code>setMarker</code>
- * is then called to associate a marker with the breakpoint.
- * </p>
- * <p>
- * Breakpoints may or may not be registered with the breakpoint manager, and
- * are persisted and restored as such. Since marker definitions only allow
- * all or none of a specific marker type to be persisted, breakpoints define
- * a <code>PERSISTED</code> attribute for selective persistence of breakpoints
- * of the same type.
- * </p>
- * 
- * @since 2.0
- */
-
-public interface IBreakpoint extends IAdaptable {
-	
-	/**
-	 * Root breakpoint marker type	
-	 * (value <code>"org.eclipse.debug.core.breakpointMarker"</code>).
-	 */
-	public static final String BREAKPOINT_MARKER = DebugPlugin.getUniqueIdentifier() + ".breakpointMarker"; //$NON-NLS-1$
-	
-	/**
-	 * Line breakpoint marker type
-	 * (value <code>"org.eclipse.debug.core.lineBreakpoint"</code>).
-	 */
-	public static final String LINE_BREAKPOINT_MARKER = DebugPlugin.getUniqueIdentifier() + ".lineBreakpointMarker"; //$NON-NLS-1$
-			
-	/**
-	 * Enabled breakpoint marker attribute (value <code>"org.eclipse.debug.core.enabled"</code>).
-	 * The attribute is a <code>boolean</code> corresponding to the
-	 * enabled state of a breakpoint.
-	 *
-	 * @see org.eclipse.core.resources.IMarker#getAttribute(String, boolean)
-	 */
-	public static final String ENABLED= "org.eclipse.debug.core.enabled"; //$NON-NLS-1$
-	
-	/**
-	 * Debug model identifier breakpoint marker attribute (value <code>"org.eclipse.debug.core.id"</code>).
-	 * The attribute is a <code>String</code> corresponding to the
-	 * identifier of the debug model a breakpoint is associated with.
-	 */
-	public static final String ID= "org.eclipse.debug.core.id"; //$NON-NLS-1$
-	
-	/**
-	 * Registered breakpoint marker attribute (value <code>"org.eclipse.debug.core.registered"</code>).
-	 * The attribute is a <code>boolean</code> corresponding to
-	 * whether a breakpoint has been registered with the breakpoint manager.
-	 *
-	 * @see org.eclipse.core.resources.IMarker#getAttribute(String, boolean)
-	 */
-	public static final String REGISTERED= "org.eclipse.debug.core.registered"; //$NON-NLS-1$	
-	
-	/**
-	 * Persisted breakpoint marker attribute (value <code>"org.eclipse.debug.core.persisted"</code>).
-	 * The attribute is a <code>boolean</code> corresponding to
-	 * whether a breakpoint is to be persisted across workspace
-	 * invocations.
-	 *
-	 * @see org.eclipse.core.resources.IMarker#getAttribute(String, boolean)
-	 */
-	public static final String PERSISTED= "org.eclipse.debug.core.persisted"; //$NON-NLS-1$
-	
-	/**
-	 * Deletes this breakpoint's underlying marker, and removes
-	 * this breakpoint from the breakpoint manager.
-	 *
-	 * @exception CoreException if unable to delete this breakpoint's
-	 *  underlying marker
-	 */
-	public void delete() throws CoreException;
-	
-	/**
-	 * Returns the marker associated with this breakpoint, or
-	 * <code>null</code> if no marker is associated with this breakpoint.
-	 * 
-	 * @return associated marker, or <code>null</code> if there is
-	 * 	no associated marker.
-	 */
-	public IMarker getMarker();
-	/**
-	 * Sets the marker associated with this breakpoint. This method is
-	 * called once at breakpoint creation.
-	 * 
-	 * @param marker the marker to associate with this breakpoint
-	 * @exception CoreException if an error occurs accessing the marker
-	 */
-	public void setMarker(IMarker marker) throws CoreException;
-	/**
-	 * Returns the identifier of the debug model this breakpoint is
-	 * associated with.
-	 * 
-	 * @return the identifier of the debug model this breakpoint is
-	 * 	associated with
-	 */
-	public String getModelIdentifier();
-	/**
-	 * Returns whether this breakpoint is enabled
-	 * 
-	 * @return whether this breakpoint is enabled
-	 * @exception CoreException if unable to access the associated
-	 *  attribute from this breakpoint's underlying marker
-	 */
-	public boolean isEnabled() throws CoreException;
-	/**
-	 * Sets the enabled state of this breakpoint. This has no effect
-	 * if the current enabled state is the same as specified by the
-	 * enabled parameter.
-	 * 
-	 * @param enabled  whether this breakpoint should be enabled
-	 * @exception CoreException if unable to set the associated attribute on
-	 *  this breakpoint's underlying marker.
-	 */
-	public void setEnabled(boolean enabled) throws CoreException;
-	
-	/**
-	 * Returns whether this breakpoint is currently registered with
-	 * the breakpoint manager.
-	 * 
-	 * @return whether this breakpoint is currently registered with
-	 *  the breakpoint manager
-	 * @exception CoreException if unable to access the associated 
-	 *  attribute on this breakpoint's underlying marker
-	 */
-	public boolean isRegistered() throws CoreException;
-	
-	/**
-	 * Sets whether this breakpoint is currently registered with the
-	 * breakpoint manager. 
-	 * 
-	 * @param registered whether this breakpoint is registered with the
-	 *   breakpoint manager
-	 * @exception CoreException if unable to set the associated attribute
-	 *  on this breakpoint's underlying marker.
-	 */
-	public void setRegistered(boolean registered) throws CoreException;
-	
-	/**
-	 * Returns whether this breakpoint is to be persisted across
-	 * workspace invocations, or when a project is closed and re-opened.
-	 * Since marker definitions only allow all/none of a specific type
-	 * of marker to be persisted (rather than selected markers of a
-	 * specific type), breakpoints define this functionality.
-	 * 
-	 * @return whether this breakpoint is to be persisted
-	 * @exception CoreException if unable to access the associated attribute
-	 *  on this breakpoint's underlying marker
-	 */
-	public boolean isPersisted() throws CoreException;
-	
-	/**
-	 * Sets whether this breakpoint is to be persisted across
-	 * workspace invocations, or when a project is closed and re-opened.
-	 * Has no effect if this breakpoint's marker definition is defined as not
-	 * persisted. Sets the underlying <code>TRANSIENT</code> attribute on this
-	 * breakpoint's marker to <code>true</code>.
-	 * 
-	 * @param registered whether this breakpoint is to be persisted across
-	 * workspace invocations
-	 * @exception CoreException if unable to set the associated attribute on
-	 *  this breakpoint's underlying marker.
-	 */
-	public void setPersisted(boolean registered) throws CoreException;
-    
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java
deleted file mode 100644
index a6defd6..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java
+++ /dev/null
@@ -1,63 +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.debug.core.model;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunch;
-
-/**
- * A debug element represents an artifact in a program being
- * debugged.
- * <p>
- * Some methods on debug elements require communication
- * with the target program. Such methods may throw a <code>DebugException</code>
- * with a status code of <code>TARGET_REQUEST_FAILED</code>
- * when unable to complete a request due to a failure on the target.
- * Methods that require communication with the target program or require
- * the target to be in a specific state (for example, suspended), are declared
- * as such.
- * </p>
- * <p>
- * Debug elements are language independent. However, language specific
- * features can be made available via the adapter mechanism provided by
- * <code>IAdaptable</code>, or by extending the debug element interfaces.
- * A debug model is responsible for declaring any special adapters 
- * its debug elements implement.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- */
-public interface IDebugElement extends IAdaptable {
-	
-	/**
-	 * Returns the unique identifier of the plug-in
-	 * this debug element originated from.
-	 *
-	 * @return the plug-in identifier
-	 */
-	public String getModelIdentifier();
-	/**
-	 * Returns the debug target this element is contained in.
-	 * 
-	 * @return the debug target this element is contained in
-	 */
-	public IDebugTarget getDebugTarget();
-	/**
-	 * Returns the launch this element is contained in.
-	 * 
-	 * @return the launch this element is contained in
-	 */
-	public ILaunch getLaunch();
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugModelProvider.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugModelProvider.java
deleted file mode 100644
index 49fd177..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugModelProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-/**
- * A debug model provider provides debug model identifiers.
- * This interface is used as an adapter to determine what 
- * debug models are associated with an adaptable object. 
- * Generally, when debugging one language, only one debug
- * model is associated with a debug element. However,
- * a debug model that provides cross language debugging
- * may represent several debug models. 
- * <p>
- * Clients are intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IDebugModelProvider {
-	
-	/**
-	 * Returns a collection of debug model identifiers.
-	 * 
-	 * @return a collection of debug model identifiers
-	 */
-	public String[] getModelIdentifiers();
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.java
deleted file mode 100644
index 35c21b6..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.IBreakpointListener;
-
-/**
- * A debug target is a debuggable execution context. For example, a debug target
- * may represent a debuggable process or a virtual machine. A debug target is the root
- * of the debug element hierarchy. A debug target contains threads. Minimally, a debug
- * target supports the following:
- * <ul>
- * <li>terminate
- * <li>suspend/resume
- * <li>breakpoints
- * <li>disconnect
- * </ul>
- * <p>
- * Generally, launching a debug session results in the creation of a
- * debug target. Launching is a client responsibility, as is debug target
- * creation.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see ITerminate
- * @see ISuspendResume
- * @see IBreakpointListener
- * @see IDisconnect
- * @see IMemoryBlockRetrieval
- * @see org.eclipse.debug.core.ILaunch
- */
-public interface IDebugTarget extends IDebugElement, ITerminate, ISuspendResume, IBreakpointListener, IDisconnect, IMemoryBlockRetrieval {
-	/**
-	 * Returns the system process associated with this debug target.
-	 * 
-	 * @return the system process associated with this debug target
-	 */
-	public IProcess getProcess();
-	/**
-	 * Returns the threads contained in this debug target. An
-	 * empty collection is returned if this debug target contains
-	 * no threads.
-	 * 
-	 * @return a collection of threads
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li></ul>
-	 * @since 2.0
-	 */
-	public IThread[] getThreads() throws DebugException;
-	
-	/**
-	 * Returns whether this debug target currently contains any threads.
-	 * 
-	 * @return whether this debug target currently contains any threads
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li></ul>
-	 * @since 2.0
-	 */
-	public boolean hasThreads() throws DebugException;
-	
-	/**
-	 * Returns the name of this debug target. Name format is debug model
-	 * specific, and should be specified by a debug model.
-	 *
-	 * @return this target's name
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li></ul>
-	 */
-	public String getName() throws DebugException;
-	
-	/**
-	 * Returns whether this target can install the given breakpoint. 
-	 * 
-	 * @param breakpoint breakpoing to consider
-	 * @return whether this target can install the given breakpoint
-	 */
-	public boolean supportsBreakpoint(IBreakpoint breakpoint);
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.java
deleted file mode 100644
index c0cf267..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * The ability to end a debug session with a target program
- * and allow the target to continue running.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IDebugTarget
- */
-public interface IDisconnect {
-	/**
-	 * Returns whether this element can currently disconnect.
-	 * 
-	 * @return whether this element can currently disconnect
-	 */
-	public boolean canDisconnect();
-	/**
-	 * Disconnects this element from its target. Generally, disconnecting
-	 * ends a debug session with a debug target, but allows the target
-	 * program to continue running.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 */
-	public void disconnect() throws DebugException;
-	/**
-	 * Returns whether this element is disconnected.
-	 *
-	 * @return whether this element is disconnected
-	 */
-	public boolean isDisconnected();
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDropToFrame.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDropToFrame.java
deleted file mode 100644
index 79229af..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDropToFrame.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.debug.core.model;
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Provides the ability to drop to frame. Drop to frame
- * generally means popping a selected stack frame (and all frames above it) from
- * the execution stack and then stepping back into the frame.
- * 
- * @since 3.1
- */
-public interface IDropToFrame {
-
-    /**
-     * Returns whether this element can currently perform a drop to frame.
-     * @return whether this element can currently perform a drop to frame
-     */
-    public boolean canDropToFrame();
-    
-    /**
-     * Performs a drop to frame on this element. Implementations must generate
-     * events such that debug clients can update appropriately, such as corresponding
-     * <code>RESUME</code> and <code>SUSPEND</code> events, or a single <code>CHANGE</code>
-     * event when the drop is complete. Implementations should implement drop to frame
-     * in a non-blocking fashion. 
-     * 
-     * @throws DebugException on failure. Reasons include:<ul>
-     * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
-     * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
-     * </ul>
-     */
-    public void dropToFrame() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IErrorReportingExpression.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IErrorReportingExpression.java
deleted file mode 100644
index 3ba24d4..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IErrorReportingExpression.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.debug.core.model;
-
-/**
- * An expression that can report errors which occurred during the
- * expression's evaluation.
- * 
- * @since 3.0
- */
-public interface IErrorReportingExpression extends IExpression {
-	/**
-	 * Returns whether this expression has errors to report. An expression
-	 * can have errors if errors were generated the last time its value was
-	 * computed
-	 * 
-	 * @return whether this expression's result has errors
-	 */
-	public boolean hasErrors();
-	/**
-	 * Returns this expression's error messages, if any. An expression can
-	 * have errors if errors were generated the last time its value was
-	 * computed.
-	 *  
-	 * @return this expression's error messages
-	 */
-	public String[] getErrorMessages();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IExpression.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IExpression.java
deleted file mode 100644
index 31c4f25..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IExpression.java
+++ /dev/null
@@ -1,67 +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.debug.core.model;
-
- 
-/**
- * An expression is a snippet of code that can be evaluated
- * to produce a value. When and how an expression is evaluated
- * is implementation specific. The context/binding required to
- * evaluate an expression varies by debug model, and by
- * user intent. Furthermore, an expression may need to be evaluated
- * at a specific location in a program (for example, at a
- * breakpoint/line where certain variables referenced in the
- * expression are visible/allocated). A user may want to
- * evaluate an expression once to produce a value that can
- * be inspected iteratively, or they may wish to evaluate an
- * expression iteratively producing new values each time
- * (i.e. as in a watch list). 
- * <p>
- * Clients are intended to implement this interface.
- * </p>
- * @since 2.0
- */
-public interface IExpression extends IDebugElement {
-	
-	/**
-	 * Returns this expression's snippet of code.
-	 * 
-	 * @return the expression
-	 */
-	public abstract String getExpressionText();
-
-	/**
-	 * Returns the current value of this expression or
-	 * <code>null</code> if this expression does not
-	 * currently have a value.
-	 * 
-	 * @return value or <code>null</code>
-	 */
-	public abstract IValue getValue();
-	
-	/**
-	 * Returns the debug target this expression is associated
-	 * with, or <code>null</code> if this expression is not
-	 * associated with a debug target.
-	 * 
-	 * @return debug target or <code>null</code>
-	 * @see IDebugElement#getDebugTarget()
-	 */
-	public abstract IDebugTarget getDebugTarget();
-	
-	/**
-	 * Notifies this expression that it has been removed
-	 * from the expression manager. Any required clean up
-	 * is be performed such that this expression can be
-	 * garbage collected.
-	 */
-	public abstract void dispose();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFilteredStep.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFilteredStep.java
deleted file mode 100644
index 24e375c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFilteredStep.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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Provides the ability to perform a filtered step. Implementations must be non-
- * blocking. Filter implementation is debug model specific and may not be
- * supported by all debug models.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 2.1
- * @deprecated clients should implement <code>IStepFilters</code> instead
- */
-public interface IFilteredStep extends IStep {
-	/**
-	 * Returns whether this element can currently perform a filtered step into.
-	 *
-	 * @return whether this element can currently perform a filtered step into
-	 */
-	public boolean canStepWithFilters();
-	/**
-	 * Steps into the current statement, generating <code>RESUME</code>
-	 * and <code>SUSPEND</code> events for the associated thread, applying step
-	 * filters, as applicable for the associated thread. Can only be called when
-	 * the associated thread is suspended. Implementations must implement
-	 * stepping as non- blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
-	 * </ul>
-	 */
-	public void stepWithFilters() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java
deleted file mode 100644
index 463faa3..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.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.debug.core.model;
-
-
-
-/**
- * A stream monitor who's contents can be flushed. As well, a client may
- * turn buffering on/off in a flushable stream monitor.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 2.1
- */
-public interface IFlushableStreamMonitor extends IStreamMonitor {
-
-	/**
-	 * Empties the contents of this stream monitor's underlying buffer.
-	 */
-	public void flushContents();
-	
-	/**
-	 * Sets whether the contents of this monitor's underlying stream should be
-	 * buffered. When <code>false</code>, contents appended to this stream monitor
-	 * are not stored in a buffer, and are thus not available from
-	 * <code>getContents()</code>. Registered listeners are notified of appended
-	 * text, and must buffer the contents if desired.
-	 * 
-	 * @param buffer whether the contents of this monitor's underlying stream
-	 * should be buffered
-	 */
-	public void setBuffered(boolean buffer);
-	
-	/**
-	 * Returns whether the contents of this monitor's underlying stream is
-	 * buffered.
-	 * 
-	 * @return whether the contents of this monitor's underlying stream is
-	 * buffered
-	 */
-	public boolean isBuffered();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IIndexedValue.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IIndexedValue.java
deleted file mode 100644
index 0b66289..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IIndexedValue.java
+++ /dev/null
@@ -1,71 +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.debug.core.model;
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * A value containing an indexed collection of variables - for example,
- * an array.
- * <p>
- * The indexed collection value has been added to the debug model to support
- * automatic partitioning of large arrays in the debug UI. Clients are not required
- * to implement this interface for values representing indexed collections,
- * however, doing so will provide enhanced display options in the debug UI.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IIndexedValue extends IValue {
-	
-	/**
-	 * Returns the variable at the given offset in this collection.
-	 * The offset is zero based.
-	 * @param offset zero based offset into this collection  
-	 * @return returns the variable in this collection at the given
-	 *  offset
-	 * @throws DebugException if unable to retrieve the variable at the
-	 * given offset
-	 */
-	public IVariable getVariable(int offset) throws DebugException;
-	
-	/**
-	 * Returns a subset of the elements in this collection of variables as
-	 * specified by the given offset and length.
-	 * 
-	 * @param offset beginning offset of the subset of elements to return 
-	 * @param length the number of elements to return
-	 * @return a subset of the elements in this collection of variables as
-	 *  specified by the given offset and length
-	 * @throws DebugException if unable to retrieve the variables
-	 */
-	public IVariable[] getVariables(int offset, int length) throws DebugException;
-
-	/**
-	 * Returns the number of entries in this indexed collection.
-	 * 
-	 * @return the number of entries in this indexed collection
-	 * @throws DebugException if unable to determine the number
-	 * of entries in this collection
-	 */
-	public int getSize() throws DebugException;
-	
-	/**
-	 * Returns the index of the first variable contained in this value.
-	 * Generally, indexed values are zero based, but this allows for
-	 * an arbitrary base offset.
-	 * 
-	 * @return the index of the first variable contained in this value
-	 */
-	public int getInitialOffset();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILaunchConfigurationDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILaunchConfigurationDelegate.java
deleted file mode 100644
index e648099..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILaunchConfigurationDelegate.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.debug.core.model;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * A launch configuration delegate performs launching for a
- * specific type of launch configuration. A launch configuration
- * delegate is defined by the <code>delegate</code> attribute
- * of a <code>launchConfigurationType</code> extension.
- * <p>
- * This interface is intended to be implemented by clients.
- * </p>
- * @see org.eclipse.debug.core.ILaunchConfigurationType
- * @see ILaunchConfiguration
- * @since 2.0
- */
-public interface ILaunchConfigurationDelegate {
-	
-	/**
-	 * Launches the given configuration in the specified mode, contributing
-	 * debug targets and/or processes to the given launch object. The
-	 * launch object has already been registered with the launch manager.
-	 * 
-	 * @param configuration the configuration to launch
-	 * @param mode the mode in which to launch, one of the mode constants
-	 *  defined by <code>ILaunchManager</code> -
-	 *  <code>RUN_MODE</code> or <code>DEBUG_MODE</code>.
-	 * @param monitor progress monitor, or <code>null</code>
-	 * @param launch the launch object to contribute processes and debug
-	 *  targets to
-	 * @exception CoreException if launching fails 
-	 */
-	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException;
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILaunchConfigurationDelegate2.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILaunchConfigurationDelegate2.java
deleted file mode 100644
index 525b86a..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILaunchConfigurationDelegate2.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.debug.core.model;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * Optional enhancements to the launch configuration delegate interface.
- * Allows launch delegates to abort a launch, build relevant projects in
- * the workspace before a launch, and create the launch object to be used
- * in a launch.
- * <p>
- * Clients implementing <code>ILaunchConfigurationDelegate</code> may also
- * implement this interface.
- * </p>
- * @since 3.0
- */
-public interface ILaunchConfigurationDelegate2 extends ILaunchConfigurationDelegate {
-	
-	/**
-	 * Returns a launch object to use when launching the given launch
-	 * configuration in the given mode, or <code>null</code> if a new default
-	 * launch object should be created by the debug platform. If a launch object
-	 * is returned, its launch mode must match that of the mode specified in
-	 * this method call.
-	 *  
-	 * @param configuration the configuration being launched
-	 * @param mode the mode the configuration is being launched in
-	 * @return a launch object or <code>null</code>
-	 * @throws CoreException if unable to launch
-	 */
-	public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException;
-	
-	/**
-	 * Optionally performs any required building before launching the given
-	 * configuration in the specified mode, and returns whether the debug platform
-	 * should perform an incremental workspace build before the launch continues.
-	 * If <code>false</code> is returned the launch will proceed without further
-	 * building, and if <code>true</code> is returned an incremental build will
-	 * be performed on the workspace before launching.
-	 * <p>
-	 * This method is only called if the launch is invoked with flag indicating
-	 * building should take place before the launch. This is done via the    
-	 * method
-	 * <code>ILaunchConfiguration.launch(String mode, IProgressMonitor monitor, boolean build)</code>.
-	 * </p> 
-	 * @param configuration the configuration being launched
-	 * @param mode the mode the configuration is being launched in
-	 * @param monitor progress monitor
-	 * @return whether the debug platform should perform an incremental workspace
-	 *  build before the launch
-	 * @throws CoreException if an exception occurs while building
-	 */
-	public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Returns whether a launch should proceed. This method is called after
-	 * <code>preLaunchCheck()</code> and <code>buildForLaunch()</code> providing
-	 * a final chance for this launch delegate to abort a launch if required.
-	 * For example, a delegate could cancel a launch if it discovered compilation
-	 * errors that would prevent the launch from succeeding.
-	 * 
-	 * @param configuration the configuration being launched
-	 * @param mode launch mode
-	 * @param monitor progress monitor
-	 * @return whether the launch should proceed
-	 * @throws CoreException if an exception occurs during final checks
-	 */
-	public boolean finalLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Returns whether a launch should proceed. This method is called first
-	 * in the launch sequence providing an opportunity for this launch delegate
-	 * to abort the launch.
-	 * 
-	 * @param configuration configuration being launched
-	 * @param mode launch mode
-	 * @param monitor progress monitor
-	 * @return whether the launch should proceed
-	 * @throws CoreException if an exception occurs while performing pre-launch checks
-	 */
-	public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILineBreakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILineBreakpoint.java
deleted file mode 100644
index 9b7b4cf..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILineBreakpoint.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.debug.core.model;
-
- 
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A breakpoint that can be located at a specific line of source code.
- */
-public interface ILineBreakpoint extends IBreakpoint {
-
-/**
- * Returns the line number in the original source that corresponds
- * to the location of this breakpoint, or -1 if the attribute is not
- * present.
- *
- * @return this breakpoint's line number, or -1 if unknown
- * @exception CoreException if a <code>CoreException</code> is thrown
- * 	while accessing the underlying <code>IMarker.LINE_NUMBER</code> marker attribute
- */
-public int getLineNumber() throws CoreException;
-/**
- * Returns starting source index in the original source that corresponds
- * to the location of this breakpoint, or -1 if the attribute is not present.
- *
- * @return this breakpoint's char start value, or -1 if unknown
- * @exception CoreException if a <code>CoreException</code> is thrown
- * 	while accessing the underlying <code>IMarker.CHAR_START</code> marker attribute
- */
-public int getCharStart() throws CoreException;
-/**
- * Returns ending source index in the original source that corresponds
- * to the location of this breakpoint, or -1 if the attribute is not present.
- *
- * @return this breakpoint's char end value, or -1 if unknown
- * @exception CoreException if a <code>CoreException</code> is thrown
- * 	while accessing the underlying <code>IMarker.CHAR_END</code> marker attribute
- */
-public int getCharEnd() throws CoreException;
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILogicalStructureTypeDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILogicalStructureTypeDelegate.java
deleted file mode 100644
index 50865a7..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILogicalStructureTypeDelegate.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.debug.core.model;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A delegate that provides a value representing the logical structure of a raw
- * implementation value from a debug model. Associated with a logical structure
- * type extension.
- * <p>
- * Clients contributing logical structure types should implement this
- * interface.
- * </p>
- * @since 3.0
- * @see org.eclipse.debug.core.ILogicalStructureType
- */
-public interface ILogicalStructureTypeDelegate {
-	
-	/**
-	 * Returns whether this structure type can provide a logical structure for 
-	 * the given value.
-	 * 
-	 * @param value value for which a logical structure is being requested
-	 * @return whether this structure type can provide a logical structure for 
-	 * the given value
-	 */
-	public boolean providesLogicalStructure(IValue value);
-	
-	/**
-	 * Returns a value representing a logical structure of the given value.
-	 * 
-	 * @param value value for which a logical structure is being requested
-	 * @return value representing logical structure
-	 * @throws CoreException if an exception occurs generating a logical
-	 *  structure
-	 */
-	public IValue getLogicalStructure(IValue value) throws CoreException;
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILogicalStructureTypeDelegate2.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILogicalStructureTypeDelegate2.java
deleted file mode 100644
index ff5f4e8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILogicalStructureTypeDelegate2.java
+++ /dev/null
@@ -1,46 +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.debug.core.model;
-
-
-/**
- * Optional extension to <code>ILogicalStructureTypeDelegate</code> that allows
- * a logical structure type delegate to provide a description for a value.
- * This allows a logical structure type to provide logical structures and
- * descriptions for more than one type of value.
- * <p>
- * If a logical structure type delegate implements this interface, it will
- * be consulted for a description rather than using the description attribute
- * provided in plug-in XML.
- * </p>
- * <p>
- * Clients contributing logical structure types can implement this
- * interface.
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.core.ILogicalStructureType
- */
-public interface ILogicalStructureTypeDelegate2 {
-	
-	/**
-	 * Returns a simple description of the logical structure provided by this
-	 * structure type delegate, for the given value.
-	 * Cannot return <code>null</code>. This method is only called if this
-	 * logical structure type delegate returns <code>true</code> for
-	 * <code>providesLogicalStructure(IValue)</code>.
-	 * 
-	 * @param value a value a description is requested for
-	 * @return a simple description of the logical structure provided by this
-	 * structure type delegate, for the given value
-	 */
-	public String getDescription(IValue value);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlock.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlock.java
deleted file mode 100644
index 7740c8a..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlock.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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
- 
-/**
- * A contiguous segment of memory in an execution context.
- * A memory block is represented by a starting memory address
- * and a length. Not all debug architectures support the retrieval
- * of memory blocks.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IMemoryBlockRetrieval
- * @since 2.0
- */
-public interface IMemoryBlock extends IDebugElement {
-	
-	/**
-	 * Returns the start address of this memory block.
-	 * 
-	 * @return the start address of this memory block
-	 */
-	public long getStartAddress();
-	
-	/**
-	 * Returns the length of this memory block in bytes.
-	 * 
-	 * @return the length of this memory block in bytes
-	 */	
-	public long getLength();
-	
-	/**
-	 * Returns the values of the bytes currently contained
-	 * in this this memory block.
-	 * 
-	 * @return the values of the bytes currently contained
-	 *  in this this memory block
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 */	
-	public byte[] getBytes() throws DebugException;
-	
-	/**
-	 * Returns whether this memory block supports value modification
-	 * 
-	 * @return whether this memory block supports value modification
-	 */
-	public boolean supportsValueModification();
-	
-	/**
-	 * Sets the value of the bytes in this memory block at the specified
-	 * offset within this memory block to the specified bytes.
-	 * The offset is zero based.
-	 * 
-	 * @param offset the offset at which to set the new values
-	 * @param bytes the new values
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * <li>This memory block does not support value modification</li>
-	 * <li>The specified offset is greater than or equal to the length
-	 *   of this memory block, or the number of bytes specified goes
-	 *   beyond the end of this memory block (index of out of range)</li>
-	 * </ul>
-	 */
-	public void setValue(long offset, byte[] bytes) throws DebugException;
-	
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockExtension.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockExtension.java
deleted file mode 100644
index cb41348..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockExtension.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Extensions to {@link org.eclipse.debug.core.model.IMemoryBlock}. Allows
- * for bytes to be accessed in a larger address space, and for state information
- * to be provided for each byte. 
- * <p>
- * Clients may optionally implement this interface when providing implementations of
- * {@link org.eclipse.debug.core.model.IMemoryBlock}.
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.core.model.MemoryByte
- */
-public interface IMemoryBlockExtension extends IMemoryBlock {
-	
-	/**
-	 * Returns the expression used to create this memory block. An expression can
-	 * be used as name for a memory block and typically represents an expression
-	 * used to compute a base address for a memory block.
-	 * 
-	 * @return the expression used to create this memory block
-	 */
-	public String getExpression();	
-	
-	/**
-	 * Returns the base address of this memory block as a big integer. The 
-	 * address is in terms of addressable units.
-	 * 
-	 * @return the base address of this memory block
-	 * @throws DebugException if unable to retrieve the base address
-	 */
-	public BigInteger getBigBaseAddress() throws DebugException;
-	
-	/**
-	 * Returns the hard start address of this memory block as a big integer, or 
-	 * <code>null</code> if none. A <code>null</code> start address indicates that
-	 * memory may be retrieved at any address less than this memory block's base
-	 * address.
-	 * 
-	 * @return the hard start address of this memory block or <code>null</code>
-	 * @throws DebugException if unable to retrieve the start address of this memory block.
-	 */
-	public BigInteger getMemoryBlockStartAddress() throws DebugException;
-	
-	/**
-	 * Returns the hard end address of this memory block as a big integer, or
-	 * <code>null</code> if none. A <code>null</code> end address indicates that
-	 * memory may be retrieved from any positive offset relative to the base address
-	 * of this memory block. 
-	 * 
-	 * @return the hard end address of this memory block or <code>null</code>
-	 * @throws DebugException if unable to retrieve the end address of this memory block.
-	 */
-	public BigInteger getMemoryBlockEndAddress() throws DebugException;
-	
-	/**
-	 * Returns the length of this memory block, or -1 if unbounded.
-	 * Returns "end address - start address"  for a memory block with a fixed
-	 * length (i.e. when both start and end address are known).
-	 * Returns -1 for an unbounded memory block (i.e. when start or end address is
-	 * <code>null</code>).
-	 * 
-	 * @return length of this memory block or -1 if unbounded
-	 * @throws DebugException if unable to retrieve the length of this memory block.
-	 */
-	public BigInteger getBigLength() throws DebugException;
-	
-	/**
-	 * Returns the address size of this memory block in number of bytes. The address
-	 * size indicates the number of bytes used to construct an address.
-	 *  
-	 * @return address size in number of bytes
-	 * @throws DebugException if unable to retrieve the address size
-	 */
-	public int getAddressSize() throws DebugException;
-	
-	/**
-	 * Returns whether the base address of this memory block can be modified.
-	 * 
-	 * @return whether the base address of this memory block can be modified
-	 * @throws DebugException is unable to determine if base address modification is supported
-	 */
-	public boolean supportBaseAddressModification() throws DebugException;
-	
-	/**
-	 * Returns whether this memory block manages the change state of its bytes.
-	 * <p>
-	 * If a memory block manages changes the memory block is responsible for
-	 * setting the <code>CHANGED</code> state of its <code>MemoryByte</code>'s
-	 * returned from <code>getBytesFromAddress</code> and
-	 * <code>getBytesFromOffset</code>. The changed state of a byte should
-	 * be updated each time a thread suspends in a memory block's target.
-	 * </p>
-	 * @return whether this memory block manages the change state of its bytes  
-	 */
-	public boolean supportsChangeManagement();
-	
-	/**
-	 * Sets the base address of this memory block to the given address.
-	 * 
-	 * @param address new base address
-	 * @throws DebugException if unable to modify the base address, or modification
-	 *  of the base address fails
-	 */
-	public void setBaseAddress(BigInteger address) throws DebugException;
-
-	/**
-	 * Returns bytes from this memory block based on the base address and
-	 * addressable size of this memory block.
-	 * <p>
-	 * A memory block may be asked to retrieve bytes beyond it's start
-	 * or end address. If a memory block is unable to retrieve memory outside
-	 * these boundaries, implementations should return memory bytes with
-	 * the <code>READABLE</code> bit turned off for each byte outside
-	 * the of the accessible range. An exception should not be thrown in this
-	 * case.
-	 * </p> 
-	 * @param unitOffset zero based offset into this memory block at which to start
-	 *  retrieving bytes in terms of addressable units. Client should retrieve
-	 *  memory starting from "base address + offset".
-	 * @param addressableUnits the number of addressable units to retrieve
-	 * @return an array of bytes from this memory block based on the given offset
-	 *  and number of units. The size of the array returned must to be equal to 
-	 *  <code>units</code> * <code>getAddressableSize()</code>.
-	 * @throws DebugException if unable to retrieve the specified bytes due to
-	 *  a failure communicating with the target
-	 * @see MemoryByte
-	 */
-	public MemoryByte[] getBytesFromOffset(BigInteger unitOffset, long addressableUnits) throws DebugException;
-	
-	/**
-	 * Returns bytes from this memory block based on the given address and the
-	 * addressable size of this memory block.
-	 * <p>
-	 * A memory block may be asked to retrieve bytes beyond it's start
-	 * or end address. If a memory block is unable to retrieve memory outside
-	 * these boundaries, implementations should return memory bytes with
-	 * the <code>READABLE</code> bit turned off for each byte outside
-	 * the of the accessible range. An exception should not be thrown in this
-	 * case.
-	 * </p>
-	 * @param address address at which to begin retrieving bytes in terms
-	 *  of addressable units
-	 * @param units is the number of addressable units of memory to retrieve 
-	 * @return an array of bytes from this memory block based on the given address
-	 *  and number of units. The size of the array returned must to be equal to 
-	 *  <code>units</code> * <code>getAddressableSize()</code>.
-	 * @throws DebugException if unable to retrieve the specified bytes due to
-	 *  a failure communicating with the target 
-	 * @see MemoryByte
-	 */
-	public MemoryByte[] getBytesFromAddress(BigInteger address, long units) throws DebugException;	
-
-	/**
-	 * Sets bytes in this memory block at the specified offset within this memory block to
-	 * the specified bytes. The offset is zero based. After successfully modifying the
-	 * specified bytes, a debug event should be fired with a kind of <code>CHANGE</code>. 
-	 * 
-	 * @param offset the zero based offset at which to set the new value.  Modify
-	 * the memory starting from base address + offset.
-	 * @param bytes replacement bytes
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * <li>This memory block does not support value modification</li>
-	 * <li>The specified offset is greater than or equal to the length
-	 *   of this memory block, or the number of bytes specified goes
-	 *   beyond the end of this memory block (index of out of range)</li>
-	 * </ul>
-	 * @see org.eclipse.debug.core.DebugEvent
-	 */
-	public void setValue(BigInteger offset, byte[] bytes) throws DebugException;
-
-	/**
-	 * Connects the given client to this memory block. Allows a memory block
-	 * to know when it is being monitored. Has no effect if an identical
-	 * client is already connected.
-	 * <p>
-	 * Memory blocks supporting change management may selectively turn off
-	 * change management when no clients are connected, for reasons of
-	 * efficiency. Clients that require access to change state information
-	 * are required to connect to a memory block before change information
-	 * is considered to be valid.
-	 * </p>
-	 * @param client the client to connect
-	 */
-	public void connect(Object client);
-	
-	/**
-	 * Disconnects the given client from this memory block. Has no effect if
-	 * an identical client is not already connected.
-	 *  
-	 * @param client the client to disconnect
-	 */
-	public void disconnect(Object client);
-	
-	/**
-	 * Returns the possibly empty list of clients currently connected to this
-	 * memory block.
-	 *  
-	 * @return the possibly empty list of clients currently connected to this
-	 * memory block
-	 */
-	public Object[] getConnections();
-	
-	/**
-	 * Dispose this memory block. Connected clients are disconnected.
-	 * @throws DebugException if the memory block cannot be disposed.
-	 */
-	public void dispose() throws DebugException;
-	
-	/**
-	 * Returns the origin of this memory block.
-	 * 
-	 * @return the origin of this memory block
-	 */
-	public IMemoryBlockRetrieval getMemoryBlockRetrieval();
-	
-	/**
-	 * Returns this memory block's addressable size in number of bytes. The addressable size
-	 * of memory block indicates the minimum number of bytes that can be retrieved as
-	 * a single unit.
-	 *  
-	 * @return this memory block's addressable size
-	 * @throws DebugException if the addressable size cannot be obtained.
-	 */
-	public int getAddressableSize() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockRetrieval.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockRetrieval.java
deleted file mode 100644
index 9253662..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockRetrieval.java
+++ /dev/null
@@ -1,52 +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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
- 
-/**
- * Supports the retrieval of arbitrary blocks of memory.
- * 
- * @see IMemoryBlock
- * @since 2.0
- */
-public interface IMemoryBlockRetrieval {
-	
-	/**
-	 * Returns whether this debug target supports the retrieval
-	 * of memory blocks.
-	 * 
-	 * @return whether this debug target supports the retrieval
-	 *  of memory blocks
-	 */
-	public boolean supportsStorageRetrieval();
-	
-	/**
-	 * Returns a memory block that starts at the specified
-	 * memory address, with the specified length.
-	 * 
-	 * @param startAddress starting address
-	 * @param length length of the memory block in bytes
-	 * @return a memory block that starts at the specified
-	 *  memory address, with the specified length
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * <li>This debug target does not support memory block retrieval</li>
-	 * <li>The specified address and length are not within valid
-	 *  ranges</li>
-	 * </ul>
-	 */
-	public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException;
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockRetrievalExtension.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockRetrievalExtension.java
deleted file mode 100644
index f6aea1b..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IMemoryBlockRetrievalExtension.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.debug.core.model;
-
-import org.eclipse.debug.core.DebugException;
-
-
-/**
- * Extended capabilities for memory block retrieval. Supports the retrieval
- * of memory blocks based on an expression and context.
- * 
- * @since 3.1
- */
-public interface IMemoryBlockRetrievalExtension extends IMemoryBlockRetrieval {
-	
-	/**
-	 * Retrieves and returns a memory block. 
-	 * 
-	 * @param expression expression to be evaluated to an address
-	 * @param context context for evaluating the expression.  This is typically
-	 *  a debug element.
-	 * @return a memory block based on the given expression and context
-	 * @throws DebugException if unable to retrieve the specified memory
-	 */
-	
-	public IMemoryBlockExtension getExtendedMemoryBlock(String expression, Object context) throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IPersistableSourceLocator.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IPersistableSourceLocator.java
deleted file mode 100644
index 8433aa8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IPersistableSourceLocator.java
+++ /dev/null
@@ -1,83 +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.debug.core.model;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * A source locator that can be persisted and restored,
- * to be used with a specific launch configuration.
- * The debug plug-in defines a source locator extension
- * point for persistable source locators.
- * <p>
- * A source locator extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a source locator extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.core.sourceLocators"&gt;
- *   &lt;sourceLocator 
- *      id="com.example.ExampleIdentifier"
- *      class="com.example.ExampleSourceLocator"
- *      name="Example Source Locator"&gt;
- *   &lt;/sourceLocator&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this source locator.</li>
- * <li><code>class</code> specifies the fully qualified name of the Java class
- *   that implements <code>IPersistableSourceLocator</code>.</li>
- * <li><code>name</code> a human readable name, describing the type of
- *   this source locator.</li>
- * </ul>
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.ILaunch
- * @see IStackFrame 
- * @since 2.0
- */
-public interface IPersistableSourceLocator extends ISourceLocator {
-	
-	/**
-	 * Returns a memento that can be used to reconstruct
-	 * this source locator
-	 * 
-	 * @return a memento that can be used to reconstruct
-	 *  this source locator
-	 * @exception CoreException if unable to construct a memento
-	 */
-	public String getMemento() throws CoreException;
-	
-	/**
-	 * Initializes this source locator based on the given
-	 * memento.
-	 * 
-	 * @param memento a memento to initialize this source locator
-	 * @exception CoreException on failure to initialize 
-	 */
-	public void initializeFromMemento(String memento) throws CoreException;
-	
-	/**
-	 * Initializes this source locator to perform default
-	 * source lookup for the given launch configuration.
-	 * 
-	 * @param configuration launch configuration this source locator
-	 *  will be performing source lookup for
-	 * @exception CoreException on failure to initialize
-	 */
-	public void initializeDefaults(ILaunchConfiguration configuration) throws CoreException;
-
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java
deleted file mode 100644
index 7ce2452..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java
+++ /dev/null
@@ -1,105 +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.debug.core.model;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-
-/**
- * A process represents a program running in normal (non-debug) mode.
- * Processes support setting and getting of client defined attributes.
- * This way, clients can annotate a process with any extra information
- * important to them. For example, classpath annotations, or command
- * line arguments used to launch the process may be important to a client.
- * <p>
- * Clients may implement this interface, however, the debug plug-in
- * provides an implementation of this interface for a
- * <code>java.lang.Process</code>. 
- * </p>
- * @see org.eclipse.debug.core.DebugPlugin#newProcess(ILaunch, Process, String)
- */
-public interface IProcess extends IAdaptable, ITerminate {
-	
-	/**
-	 * Attribute key for a common, optional, process property. The value of this
-	 * attribute is the command line a process was launched with.
-	 * 
-	 * @since 2.1
-	 */
-	public final static String ATTR_CMDLINE= DebugPlugin.getUniqueIdentifier() + ".ATTR_CMDLINE"; //$NON-NLS-1$
-	
-	/**
-	 * Attribute key for a common, optional, process property. The value of this
-	 * attribute is an identifier for the type of this process. Process types
-	 * are client defined - whoever creates a process may define its type. For
-	 * example, a process type could be "java", "javadoc", or "ant".
-	 *
-	 * @since 2.1
-	 */
-	public final static String ATTR_PROCESS_TYPE = DebugPlugin.getUniqueIdentifier() + ".ATTR_PROCESS_TYPE"; //$NON-NLS-1$		
-
-	/**
-	 * Attribute key for a common, optional, process property. The value of this
-	 * attribute specifies an alternate dynamic label for a process, displayed by
-	 * the console.
-	 * 
-	 * @since 3.0
-	 */
-	public final static String ATTR_PROCESS_LABEL = DebugPlugin.getUniqueIdentifier() + ".ATTR_PROCESS_LABEL"; //$NON-NLS-1$
-	
-	/**
-	 * Returns a human-readable label for this process.
-	 *
-	 * @return a label for this process
-	 */
-	public String getLabel();
-	/**
-	 * Returns the launch this element originated from.
-	 *
-	 * @return the launch this process is contained in
-	 */
-	public ILaunch getLaunch();
-	/**
-	 * Returns a proxy to the standard input, output, and error streams 
-	 * for this process, or <code>null</code> if not supported.
-	 *
-	 * @return a streams proxy, or <code>null</code> if not supported
-	 */
-	public IStreamsProxy getStreamsProxy();
-	
-	/**
-	 * Sets the value of a client defined attribute.
-	 *
-	 * @param key the attribute key
-	 * @param value the attribute value
-	 */
-	public void setAttribute(String key, String value);
-	
-	/**
-	 * Returns the value of a client defined attribute.
-	 *
-	 * @param key the attribute key
-	 * @return value the String attribute value, or <code>null</code> if undefined
-	 */
-	public String getAttribute(String key);
-	
-	/**
-	 * Returns the exit value of this process. Conventionally, 0 indicates
-	 * normal termination.
-	 * 
-	 * @return the exit value of this process
-	 * @exception DebugException if this process has not yet terminated
-	 */
-	public int getExitValue() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IRegister.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IRegister.java
deleted file mode 100644
index d3bd739..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IRegister.java
+++ /dev/null
@@ -1,39 +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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
- 
-/**
- * A register is a special kind of variable that is contained
- * in a register group. Each register has a name and a value.
- * Not all debug architectures provide access to registers.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 2.0
- */
-public interface IRegister extends IVariable {
-	
-	/**
-	 * Returns the register group this register is contained in.
-	 * 
-	 * @return the register group this register is contained in
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public IRegisterGroup getRegisterGroup() throws DebugException; 
-
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IRegisterGroup.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IRegisterGroup.java
deleted file mode 100644
index 528df35..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IRegisterGroup.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.debug.core.model;
-
- 
-import org.eclipse.debug.core.DebugException;
- 
-/**
- * A register group is a group of registers that are
- * assigned to a stack frame. Some debug architectures
- * provide access to registers, and registers are often
- * grouped logically. For example, a floating point
- * register group. 
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 2.0
- */
-public interface IRegisterGroup extends IDebugElement {
-	
-
-	/**
-	 * Returns the name of this register group.
-	 * 
-	 * @return this register group's name
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public String getName() throws DebugException;
-	
-	/**
-	 * Returns the registers in this register group.
-	 * 
-	 * @return the registers in this register group
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public IRegister[] getRegisters() throws DebugException;
-	
-	/**
-	 * Returns whether this register group currently contains any registers.
-	 * 
-	 * @return whether this register group currently contains any registers
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public boolean hasRegisters() throws DebugException;	
-
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.java
deleted file mode 100644
index e78a7f8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.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.debug.core.model;
-
-
-import org.eclipse.debug.core.model.IStackFrame;
-
-/**
- * A source locator locates source elements for stack frames. A launch (optionally)
- * specifies a source locator which is
- * used to locate source for that debug session. If a launch does not
- * provide a source locator, source cannot be displayed.
- * Abstraction of source lookup allows clients to hide implementation
- * details of source location and representation.
- * <p>
- * Generally, an implementor of a debug model will also implement launch configuration types,
- * delegates, and source locators that work together as a whole. That is, the implementation
- * of a source locator will have knowledge of how to locate a source element
- * for a stack frame. For example, a Java stack frame could define API which
- * specifies a source file name. A Java source locator would use this information
- * to locate the associated file in the workspace.
- * </p>
- * <p>
- * Source is displayed by the debug UI plug-in. The debug UI uses a source locator
- * to resolve an object representing the source for a stack frame, and then uses
- * a debug model presentation to determine the editor and editor input to use to
- * display the actual source in an editor.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.ILaunch
- * @see org.eclipse.debug.core.model.IStackFrame 
- * @see org.eclipse.debug.core.model.IPersistableSourceLocator
- */
-public interface ISourceLocator {
-	
-	/**
-	 * Returns a source element that corresponds to the given stack frame, or
-	 * <code>null</code> if a source element could not be located. The object returned
-	 * by this method will be used by the debug UI plug-in to display source.
-	 * The debug UI uses the debug model presentation associated
-	 * with the given stack frame's debug model to translate a source object into an
-	 * {editor input, editor id} pair in which to display source.
-	 * <p>
-	 * For example, a java source locator could return an object representing a
-	 * compilation unit or class file. The java debug model presentation would
-	 * then be responsible for providing an editor input and editor id for each
-	 * compilation unit and class file such that the debug UI could display source.
-	 * </p>
-	 *
-	 * @param stackFrame the stack frame for which to locate source
-	 * @return an object representing a source element. 
-	 */
-	 public Object getSourceElement(IStackFrame stackFrame);
-
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.java
deleted file mode 100644
index 72ee242..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * A stack frame represents an execution context in a suspended thread.
- * A stack frame contains variables representing visible locals and arguments at
- * the current execution location. Minimally, a stack frame supports
- * the following:
- * <ul>
- * <li>suspend/resume (convenience to resume this stack frame's thread)
- * <li>stepping
- * <li>termination (convenience to terminate this stack frame's thread or debug target)
- * </ul>
- * <p>
- * A debug model implementation may choose to re-use or discard
- * stack frames on iterative thread suspensions. Clients
- * cannot assume that stack frames are identical or equal across
- * iterative thread suspensions and must check for equality on iterative
- * suspensions if they wish to re-use the objects.
- * </p>
- * <p>
- * A debug model implementation that preserves equality
- * across iterative suspensions may display more desirable behavior in
- * some clients. For example, if stack frames are preserved
- * while stepping, a UI client would be able to update the UI incrementally,
- * rather than collapse and redraw the entire list. 
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IStep
- * @see ISuspendResume
- * @see ITerminate
- */
-public interface IStackFrame extends IDebugElement, IStep, ISuspendResume, ITerminate {
-	/**
-	 * Returns the thread this stack frame is contained in.
-	 * 
-	 * @return thread
-	 * @since 2.0
-	 */
-	public IThread getThread();
-	/**
-	 * Returns the visible variables in this stack frame. An empty
-	 * collection is returned if there are no visible variables.
-	 * 
-	 * @return collection of visible variables
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public IVariable[] getVariables() throws DebugException;
-	
-	/**
-	 * Returns whether this stack frame currently contains any visible variables.
-	 * 
-	 * @return whether this stack frame currently contains any visible variables
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public boolean hasVariables() throws DebugException;
-		
-	/**
-	 * Returns the line number of the instruction pointer in 
-	 * this stack frame that corresponds to a line in an associated source
-	 * element, or <code>-1</code> if line number information
-	 * is unavailable.
-	 *
-	 * @return line number of instruction pointer in this stack frame, or 
-	 * <code>-1</code> if line number information is unavailable
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 */
-	public int getLineNumber() throws DebugException;
-	
-	/**
-	 * Returns the index of the first character in the associated source
-	 * element that corresponds to the current location of the instruction pointer
-	 * in this stack frame, or <code>-1</code> if the information is unavailable.
-	 * <p>
-	 * If a debug model supports expression level stepping, the start/end
-	 * character ranges are used to highlight the expression within a line
-	 * that is being executed.
-	 * </p>
-	 * @return index of the first character in the associated source
-	 * element that corresponds to the current location of the instruction pointer
-	 * in this stack frame, or <code>-1</code> if the information is unavailable
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public int getCharStart() throws DebugException;
-	
-	/**
-	 * Returns the index of the last character in the associated source
-	 * element that corresponds to the current location of the instruction pointer
-	 * in this stack frame, or <code>-1</code> if the information is unavailable.
-	 * <p>
-	 * If a debug model supports expression level stepping, the start/end
-	 * character ranges are used to highlight the expression within a line
-	 * that is being executed.
-	 * </p>
-	 * @return index of the last character in the associated source
-	 * element that corresponds to the current location of the instruction pointer
-	 * in this stack frame, or <code>-1</code> if the information is unavailable
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public int getCharEnd() throws DebugException;	
-		
-	/**
-	 * Returns the name of this stack frame. Name format is debug model
-	 * specific, and should be specified by a debug model.
-	 *
-	 * @return this frame's name
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 */
-	public String getName() throws DebugException;
-	
-	/**
-	 * Returns the register groups assigned to this stack frame,
-	 * or an empty collection if no register groups are assigned
-	 * to this stack frame.
-	 * 
-	 * @return the register groups assigned to this stack frame
-	 *  or an empty collection if no register groups are assigned
-	 *  to this stack frame
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public IRegisterGroup[] getRegisterGroups() throws DebugException;
-	
-	/**
-	 * Returns whether this stack frame contains any register groups.
-	 * 
-	 * @return whether this stack frame contains any visible register groups
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public boolean hasRegisterGroups() throws DebugException;	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java
deleted file mode 100644
index 009aaad..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java
+++ /dev/null
@@ -1,96 +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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Provides the ability to step into, over, and return
- * from the current execution location.  Implementations
- * must be non-blocking.
- * <p>
- * Implementations should honor step filter settings in their
- * associated debug target, as defined by <code>IStepFilters</code>.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.model.IStepFilters
- */
-public interface IStep {
-	/**
-	 * Returns whether this element can currently perform a step into.
-	 *
-	 * @return whether this element can currently perform a step into
-	 */
-	public boolean canStepInto();
-	/**
-	 * Returns whether this element can currently perform a step over.
-	 *
-	 * @return whether this element can currently perform a step over
-	 */
-	public boolean canStepOver();
-	/**
-	 * Returns whether this element can currently perform a step return.
-	 *
-	 * @return whether this element can currently perform a step return
-	 */
-	public boolean canStepReturn();
-	/**
-	 * Returns whether this element is currently stepping.
-	 * <p>
-	 * For example, a thread is considered to be stepping
-	 * after the <code>stepOver</code> call until the step over is completed,
-	 * a breakpoint is reached, an exception is thrown, or the thread or debug target is
-	 * terminated.
-	 * </p>
-	 *
-	 * @return whether this element is currently stepping
-	 */
-	public boolean isStepping();
-	/**
-	 * Steps into the current statement, generating <code>RESUME</code>
-	 * and <code>SUSPEND</code> events for the associated thread. Can only be called
-	 * when the associated thread is suspended. Implementations must implement
-	 * stepping as non-blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
-	 * </ul>
-	 */
-	public void stepInto() throws DebugException;
-	/**
-	 * Steps over the current statement, generating <code>RESUME</code>
-	 * and <code>SUSPEND</code> events for the associated thread. Can only be called
-	 * when the associated thread is suspended. Implementations must implement
-	 * stepping as non-blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
-	 * </ul>
-	 */
-	public void stepOver() throws DebugException;
-	/**
-	 * Steps to the next return statement in the current scope,
-	 * generating <code>RESUME</code> and <code>SUSPEND</code> events for
-	 * the associated thread. Can only be called when the associated thread is suspended.
-	 * Implementations must implement stepping as non-blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
-	 * </ul>
-	 */
-	public void stepReturn() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStepFilters.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStepFilters.java
deleted file mode 100644
index 1e11c95..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStepFilters.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.debug.core.model;
-
-/**
- * Support for step filters for a debug target. A debug target
- * that supports step filters should implement this interface.
- * Step filters can be toggled on/off for a debug target via
- * this interface. When a step method is called (see
- * <code>IStep</code>), the step implementation must respect
- * the state of the step filters as defined by this interface.
- * This allows step filters to be toggled on/off for
- * all stepping operations (in, over, return).
- * <p>
- * Step filter management is debug model specific - this interface
- * is used only to turn them on/off.
- * </p>
- * <p>
- * In 2.1, the <code>IFilteredStep</code> interface was used
- * to implement step filtering. The <code>IFilteredStep</code>
- * interface is now deprecated, and this interface should be used
- * in its place to allow filters to be applied to any step
- * function.
- * </p>
- * <p>
- * Clients may implement this interface. Debug targets that support
- * step filters should implement this interface.
- * </p>
- * @see org.eclipse.debug.core.model.IStep
- * @since 3.0
- */
-public interface IStepFilters {
-	
-	/**
-	 * Returns whether this debug target supports step filters.
-	 *
-	 * @return whether this debug target supports step filters
-	 */
-	public boolean supportsStepFilters();
-	
-	/**
-	 * Returns whether step filters are currently enabled in this
-	 * debug target.
-	 * 
-	 * @return whether step filters are currently enabled in this
-	 * debug target
-	 */
-	public boolean isStepFiltersEnabled();
-	
-	/**
-	 * Sets whether step filters are enabled in this debug target.
-	 * 
-	 * @param enabled whether step filters are enabled in this debug target
-	 */
-	public void setStepFiltersEnabled(boolean enabled);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java
deleted file mode 100644
index fdabfb2..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.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.debug.core.model;
-
-
-import org.eclipse.debug.core.IStreamListener;
-
-/**
- * A stream monitor manages the contents of the stream a process
- * is writing to, and notifies registered listeners of changes in
- * the stream.
- * <p>
- * Clients may implement this interface. Generally, a client that
- * provides an implementation of the <code>IStreamsProxy</code>
- * interface must also provide an implementation of this interface.
- * </p>
- * @see org.eclipse.debug.core.model.IStreamsProxy
- * @see org.eclipse.debug.core.model.IFlushableStreamMonitor
- */
-public interface IStreamMonitor {
-	/**
-	 * Adds the given listener to this stream monitor's registered listeners.
-	 * Has no effect if an identical listener is already registered.
-	 *
-	 * @param listener the listener to add
-	 */
-	public void addListener(IStreamListener listener);
-	/**
-	 * Returns the entire current contents of the stream. An empty
-	 * String is returned if the stream is empty.
-	 *
-	 * @return the stream contents as a <code>String</code>
-	 */
-	public String getContents();
-	/**
-	 * Removes the given listener from this stream monitor's registered listeners.
-	 * Has no effect if the listener is not already registered.
-	 *
-	 * @param listener the listener to remove
-	 */
-	public void removeListener(IStreamListener listener);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java
deleted file mode 100644
index 120e5e8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.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.debug.core.model;
-
- 
-import java.io.IOException;
-
-/**
- * A streams proxy acts as proxy between the streams of a
- * process and interested clients. This abstraction allows
- * implementations of <code>IProcess</code> to handle I/O related
- * to the standard input, output, and error streams associated
- * with a process.
- * <p>
- * Clients implementing the <code>IProcess</code> interface must also
- * provide an implementation of this interface.
- * </p>
- * @see IProcess
- */
-public interface IStreamsProxy {
-	/**
-	 * Returns a monitor for the error stream of this proxy's process,
-	 * or <code>null</code> if not supported.
-	 * The monitor is connected to the error stream of the
-	 * associated process.
-	 *
-	 * @return an error stream monitor, or <code>null</code> if none
-	 */
-	public IStreamMonitor getErrorStreamMonitor();
-	/**
-	 * Returns a monitor for the output stream of this proxy's process,
-	 * or <code>null</code> if not supported.
-	 * The monitor is connected to the output stream of the
-	 * associated process.
-	 *
-	 * @return an output stream monitor, or <code>null</code> if none
-	 */
-	public IStreamMonitor getOutputStreamMonitor();
-	/**
-	 * Writes the given text to the output stream connected to the
-	 * standard input stream of this proxy's process.
-	 *
-	 * @param input the text to be written
-	 * @exception IOException when an error occurs writing to the 
-	 *		underlying <code>OutputStream</code>.
-	 *
-	 */
-	public void write(String input) throws IOException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy2.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy2.java
deleted file mode 100644
index d0294db..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy2.java
+++ /dev/null
@@ -1,34 +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.debug.core.model;
-
-import java.io.IOException;
-
-/**
- * Extension to a streams proxy that allows closing of the output stream
- * connected to the standard input stream of a proxy's process.
- * <p>
- * Clients should implement this interface, in addition to
- * <code>IStreamsProxy</code>, if interested closing the standard
- * input stream.
- * </p>
- * @since 3.1
- */
-public interface IStreamsProxy2 extends IStreamsProxy {
-
-    /**
-     * Closes the output stream connected to the standard input stream
-     * of this proxy's process.
-     * 
-     * @throws IOException if unable to close the stream
-     */
-    public void closeInputStream() throws IOException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java
deleted file mode 100644
index 9ffe269..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java
+++ /dev/null
@@ -1,63 +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.debug.core.model;
-
- 
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Provides the ability to suspend and resume a thread
- * or debug target.
- * <p>
- * Clients may implement this interface.
- * </p>
- */
-public interface ISuspendResume {
-	/**
-	 * Returns whether this element can currently be resumed.
-	 *
-	 * @return whether this element can currently be resumed
-	 */
-	public boolean canResume();
-	/**
-	 * Returns whether this element can currently be suspended.
-	 *
-	 * @return whether this element can currently be suspended
-	 */
-	public boolean canSuspend();
-	/**
-	 * Returns whether this element is currently suspended.
-	 *
-	 * @return whether this element is currently suspended
-	 */
-	public boolean isSuspended();
-	/**
-	 * Causes this element to resume its execution, generating a <code>RESUME</code> event. 
-	 * Has no effect on an element that is not suspended. This call is non-blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 */
-	public void resume() throws DebugException;
-	/**
-	 * Causes this element to suspend its execution, generating a <code>SUSPEND</code> event.
-	 * Has no effect on an already suspended element.
-	 * Implementations may be blocking or non-blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 */
-	public void suspend() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.java
deleted file mode 100644
index 0c376aa..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.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.debug.core.model;
-
- 
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Provides the ability to terminate an execution
- * context - for example, a thread, debug target or process.
- * <p>
- * Clients may implement this interface.
- * </p>
- */
-public interface ITerminate {
-	/**
-	 * Returns whether this element can be terminated.
-	 *
-	 * @return whether this element can be terminated
-	 */
-	public boolean canTerminate();
-	/**
-	 * Returns whether this element is terminated.
-	 *
-	 * @return whether this element is terminated
-	 */
-	public boolean isTerminated();
-	/**
-	 * Causes this element to terminate, generating a <code>TERMINATE</code> event.  
-	 * Implementations may be blocking or non-blocking.
-	 *
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 */
-	public void terminate() throws DebugException;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java
deleted file mode 100644
index 54f5667..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java
+++ /dev/null
@@ -1,111 +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.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * A thread is a sequential flow of execution in a debug target.
- * A thread contains stack frames.  Stack frames are only available when the
- * thread is suspended, and are returned in top-down order.
- * Minimally, a thread supports the following:
- * <ul>
- * <li>suspend/resume
- * <li>stepping
- * <li>terminate
- * </ul>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see ISuspendResume
- * @see IStep
- * @see ITerminate
- * @see IStackFrame
- */
-
-public interface IThread extends IDebugElement, ISuspendResume, IStep, ITerminate {
-	/**
-	 * Returns the stack frames contained in this thread. An
-	 * empty collection is returned if this thread contains
-	 * no stack frames, or is not currently suspended. Stack frames
-	 * are returned in top down order.
-	 * 
-	 * @return a collection of stack frames
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public IStackFrame[] getStackFrames() throws DebugException;
-	
-	/**
-	 * Returns whether this thread currently contains any stack
-	 * frames.
-	 * 
-	 * @return whether this thread currently contains any stack frames
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public boolean hasStackFrames() throws DebugException;
-	
-	/**
-	 * Returns the priority of this thread. The meaning of this
-	 * number is operating-system dependent.
-	 *
-	 * @return thread priority
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public int getPriority() throws DebugException;
-	/** 
-	 * Returns the top stack frame or <code>null</code> if there is
-	 * currently no top stack frame.
-	 *
-	 * @return the top stack frame, or <code>null</code> if none
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public IStackFrame getTopStackFrame() throws DebugException;
-	/**
-	 * Returns the name of this thread. Name format is debug model
-	 * specific, and should be specified by a debug model.
-	 *
-	 * @return this thread's name
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public String getName() throws DebugException;
-
-	/**
-	 * Returns the breakpoints that caused this thread to suspend,
-	 * or an empty collection if this thread is not suspended or
-	 * was not suspended by a breakpoint. Usually a single breakpoint
-	 * will be returned, but this collection can contain more than
-	 * one breakpoint if two breakpoints are at the same location in
-	 * a program.
-	 *
-	 * @return the collection of breakpoints that caused this thread to suspend
-	 */
-	public IBreakpoint[] getBreakpoints();	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java
deleted file mode 100644
index 89652fe..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java
+++ /dev/null
@@ -1,104 +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.debug.core.model;
-
- 
-import org.eclipse.debug.core.DebugException;
-
-/**
- * A value represents the value of a variable.
- * A value representing a complex data structure contains variables.
- * <p>
- * An implementation may choose to re-use or discard
- * values on iterative thread suspensions. Clients
- * cannot assume that values are identical or equal across
- * iterative thread suspensions and must check for equality on iterative
- * suspensions if they wish to re-use the objects.
- * </p>
- * <p>
- * An implementation that preserves equality
- * across iterative suspensions may display more desirable behavior in
- * some clients. For example, if variables are preserved
- * while stepping, a UI client would be able to update the UI incrementally,
- * rather than collapse and redraw the entire list or tree.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IVariable
- */
-
-
-public interface IValue extends IDebugElement {
-	
-	/**
-	 * Returns a description of the type of data this value contains
-	 * or references.
-	 * 
-	 * @return the name of this value's reference type
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public String getReferenceTypeName() throws DebugException;
-	
-	/**
-	 * Returns this value as a <code>String</code>.
-	 *
-	 * @return a String representation of this value
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public String getValueString() throws DebugException;
-		
-	/**
-	 * Returns whether this value is currently allocated.
-	 * <p>
-	 * For example, if this value represents
-	 * an object that has been garbage collected, <code>false</code> is returned.
-	 * </p>
-	 * @return whether this value is currently allocated
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public boolean isAllocated() throws DebugException;
-	/**
-	 * Returns the visible variables in this value. An empty
-	 * collection is returned if there are no visible variables.
-	 * 
-	 * @return an array of visible variables
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public IVariable[] getVariables() throws DebugException;
-	
-	/**
-	 * Returns whether this value currently contains any visible variables.
-	 * 
-	 * @return whether this value currently contains any visible variables
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the debug target.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 * </ul>
-	 * @since 2.0
-	 */
-	public boolean hasVariables() throws DebugException;	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.java
deleted file mode 100644
index b426601..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.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
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * Provides the ability to modify the value of a variable in
- * a target.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IVariable
- */
-public interface IValueModification {
-
-	/**
-	 * Attempts to set the value of this variable to the
-	 * value of the given expression.
-	 *
-	 * @param expression an expression to generate a new value
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 */
-	public void setValue(String expression) throws DebugException;
-	
-	/**
-	 * Sets the value of this variable to the given value.
-	 *
-	 * @param value a new value
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 * @since 2.0
-	 */
-	public void setValue(IValue value) throws DebugException;	
-	
-	/**
-	 * Returns whether this variable supports value modification.
-	 *
-	 * @return whether this variable supports value modification
-	 */
-	public boolean supportsValueModification();
-	
-	/**
-	 * Returns whether the given expression is valid to be used in
-	 * setting a new value for this variable.
-	 *
-	 * @param expression an expression to generate a new value
-	 * @return whether the expression is valid
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 */
-	public boolean verifyValue(String expression) throws DebugException;
-	
-	/**
-	 * Returns whether the given value can be used as
-	 * a new value for this variable.
-	 *
-	 * @param value a new value
-	 * @return whether the value is valid
-	 * @exception DebugException on failure. Reasons include:<ul>
-	 * <li>TARGET_REQUEST_FAILED - The request failed in the target
-	 * <li>NOT_SUPPORTED - The capability is not supported by the target
-	 * </ul>
-	 * @since 2.0
-	 */
-	public boolean verifyValue(IValue value) throws DebugException;
-}
-
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.java
deleted file mode 100644
index f199c05..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.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.debug.core.model;
-
- 
-import org.eclipse.debug.core.DebugException;
-
-/**
- * A variable represents a visible data structure in a stack frame
- * or value.
- * Each variable has a value which may in turn contain more variables.
- * A variable may support value modification.
- * <p>
- * An implementation may choose to re-use or discard
- * variables on iterative thread suspensions. Clients
- * cannot assume that variables are identical or equal across
- * iterative thread suspensions and must check for equality on iterative
- * suspensions if they wish to re-use the objects.
- * </p>
- * <p>
- * An implementation that preserves equality
- * across iterative suspensions may display more desirable behavior in
- * some clients. For example, if variables are preserved
- * while stepping, a UI client would be able to update the UI incrementally,
- * rather than collapse and redraw the entire list or tree.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IValue
- * @see IStackFrame
- * @see IValueModification
- */
-public interface IVariable extends IDebugElement, IValueModification {
-	/**
-	 * Returns the value of this variable.
-	 * 
-	 * @return this variable's value
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public IValue getValue() throws DebugException;
-	/**
-	 * Returns the name of this variable. Name format is debug model
-	 * specific, and should be specified by a debug model.
-	 *
-	 * @return this variable's name
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public String getName() throws DebugException;	
-	/**
-	 * Returns a description of the type of data this variable is
-	 * declared to reference. Note that the declared type of a
-	 * variable and the concrete type of its value are not necessarily
-	 * the same.
-	 *
-	 * @return the declared type of this variable
-	 * @exception DebugException if this method fails.  Reasons include:
-	 * <ul><li>Failure communicating with the VM.  The DebugException's
-	 * status code contains the underlying exception responsible for
-	 * the failure.</li>
-	 */
-	public String getReferenceTypeName() throws DebugException;
-	
-	/** 
-	 * Returns whether this variable's value has changed since the last suspend event. 
-	 * Implementations may choose whether the last suspend event is the last suspend 
-	 * event in this variable's debug target, or within the thread(s) in which this variable 
-	 * is visible. 
-	 * <p>
-	 * Implementations that choose not to implement this function should always
-	 * return <code>false</code>.
-	 * </p>
-	 * 
-	 * @return whether this variable's value has changed since the last suspend event 
-	 * @exception DebugException if an exception occurs determining if this variable's 
-	 *   value has changed since the last suspend event 
-	 */ 
-	public boolean hasValueChanged() throws DebugException; 
-
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpression.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpression.java
deleted file mode 100644
index ff7fa81..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpression.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-/**
- * A watch expression is an expression that is evaluated in the context
- * of a specific stack frame, thread, debug target, process, or launch.
- * Generally, a watch expression is a snippet of code that is evaluated
- * each time a debug target suspends, or when a user provides a context
- * for an evaluation by selecting a debug target or thread. An expression
- * updates its value when it is provided with a context in which it
- * can perform an evaluation. 
- * <p>
- * Clients are not intended to implement this interface. An implementation
- * is provided by the debug platform. Clients that support watch expressions
- * should contribute and implement a watch expression delegate. Watch
- * expressions can be created via the <code>IExpressionManager</code>.
- * </p>
- * @see org.eclipse.debug.core.model.IWatchExpressionDelegate
- * @see org.eclipse.debug.core.IExpressionManager
- * @since 3.0
- */
-public interface IWatchExpression extends IErrorReportingExpression {
-	
-	/**
-	 * Updates this watch expression's value based on the current evaluation
-	 * context. This watch expression fires a debug change event when the
-	 * evaluation is complete. A watch expression can be asked to
-	 * evaluate even when it is disabled. Note that implementations should
-	 * generally be asynchronous to avoid blocking the calling thread. 
-	 */
-	public void evaluate();
-	/**
-	 * Sets the context for this watch expression, or <code>null</code> if none.
-	 * If the given context is valid for this expression, this expression may
-	 * update its value. When the value update is complete, a debug change event is
-	 * fired. When <code>null</code> is specified as a context, this expression
-	 * may choose to retain its previous value.
-	 * <p>
-	 * The context is usually one of (but not limited to):
-	 * <ul>
-	 * <li>a debug target (<code>IDebugTarget</code>)</li>
-	 * <li>a thread (<code>IThread</code>)</li>
-	 * <li>a stack frame (<code>IStackFrame</code>)</li>
-	 * </ul>
-	 * </p>
-	 *  
-	 * @param context context in which to update this expression's value, or
-	 * 	<code>null</code> if none
-	 */
-	public void setExpressionContext(IDebugElement context);
-	/**
-	 * Sets this watch expression's snippet of code. This method
-	 * causes the new snippet to be evaluated immediately in
-	 * the expression's last context.
-	 * 
-	 * @param expressionText the snippet which will be evaluated
-	 */
-	public void setExpressionText(String expressionText);
-	/**
-	 * Returns whether the result of this watch expression is pending.
-	 * An expression is pending if an evaluation has been requested, but
-	 * the value has not yet been returned.
-	 * 
-	 * @return whether this expression's result is pending
-	 */
-	public boolean isPending();
-	/**
-	 * Returns whether this expression is enabled. An enabled expression will
-	 * update its value. A disabled expression will not.
-	 * 
-	 * @return whether this expression is enabled
-	 */
-	public boolean isEnabled();
-	/**
-	 * Sets this expression's enabled state. This method
-	 * causes the new snippet to be evaluated immediately in
-	 * the expression's last context.
-	 * 
-	 * @param enabled whether this expression should be enabled
-	 */
-	public void setEnabled(boolean enabled);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionDelegate.java
deleted file mode 100644
index ec662ec..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionDelegate.java
+++ /dev/null
@@ -1,51 +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.debug.core.model;
-
-/**
- * A delegate which computes the value of a watch expression
- * when provided a context. Watch delegates are provided on a
- * per debug model basis. Watch expressions query the appropriate
- * delegate based on the debug model of the context element.
- * Plug-ins that wish to contribute watch expression delegates may do so using the
- * <code>org.eclipse.debug.core.watchExpressionDelegates</code>
- * extension point.
- * <p>
- * For example, the following is the definition of a watch expression
- * delegate for the com.example.foo plug-in:
- * <pre>
- * &lt;extension point="org.eclipse.debug.core.watchExpressionDelegates"&gt;
- *   &lt;watchExpressionDelegate
- *     debugModel="org.eclipse.jdt.debug"
- *     delegateClass="org.eclipse.jdt.internal.debug.ui.JavaWatchExpressionDelegate"/&gt;
- *  &lt;/extension&gt;
- * </pre>
- * <p>
- * Clients are intended to implement this interface.
- * </p>
- * @see org.eclipse.debug.core.model.IWatchExpression
- * @see org.eclipse.debug.core.model.IWatchExpressionListener
- * 
- * @since 3.0
- */
-public interface IWatchExpressionDelegate {
-	
-	/**
-	 * Evaluates the given expression in the given context asynchronously and
-	 * notifies the given listener when the evaluation finishes.
-	 * 
-	 * @param expression the expression to evaluate 
-	 * @param context the context for the evaluation
-	 * @param listener the listener to notify when the evaluation completes
-	 */
-	public void evaluateExpression(String expression, IDebugElement context, IWatchExpressionListener listener);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionListener.java
deleted file mode 100644
index 34007a9..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionListener.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.debug.core.model;
-
-/**
- * A watch expression listener is notified when an
- * <code>org.eclipse.debug.core.model.IWatchExpressionDelegate</code>
- * completes an evaluation.
- * 
- * @see org.eclipse.debug.core.model.IWatchExpressionDelegate
- * @see org.eclipse.debug.core.model.IWatchExpressionResult
- * @since 3.0
- */
-public interface IWatchExpressionListener {
-
-	/**
-	 * Notifies the listener that an evaluation has completed.
-	 * 
-	 * @param result the result of the evaluation
-	 */
-	public void watchEvaluationFinished(IWatchExpressionResult result);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionResult.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionResult.java
deleted file mode 100644
index 26bfd77..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchExpressionResult.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.debug.core.model;
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * The result of an evaluation performed by an
- * <code>org.eclipse.debug.core.model.IWatchExpressionDelegate</code>.
- * A watch expression reports the value of the evaluation
- * and any errors or exceptions that occurred.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.model.IWatchExpressionDelegate
- * @since 3.0
- */
-public interface IWatchExpressionResult {
-	/**
-	 * Returns the value representing the result of the
-	 * evaluation, or <code>null</code> if the
-	 * associated evaluation failed. If
-	 * the associated evaluation failed, there will
-	 * be problems, or an exception in this result.
-	 *
-	 * @return the resulting value, possibly
-	 * <code>null</code>
-	 */
-	public IValue getValue();
-	
-	/**
-	 * Returns whether the evaluation had any problems
-	 * or if an exception occurred while performing the
-	 * evaluation.
-	 *
-	 * @return whether there were any problems.
-	 * @see #getErrorMessages()
-	 * @see #getException()
-	 */
-	public boolean hasErrors();
-		
-	/**
-	 * Returns an array of problem messages. Each message describes a problem that
-	 * occurred while compiling the snippet.
-	 *
-	 * @return evaluation error messages, or an empty array if no errors occurred
-	 */
-	public String[] getErrorMessages();
-		
-	/**
-	 * Returns the expression that was evaluated.
-	 *
-	 * @return The string expression.
-	 */
-	public String getExpressionText();
-	
-	/**
-	 * Returns any exception that occurred while performing the evaluation
-	 * or <code>null</code> if an exception did not occur.
-	 * The exception will be a debug exception or a debug exception
-	 * that wrappers a debug model specific exception that indicates a problem communicating
-	 * with the target or with actually performing some action in the target.
-	 *
-	 * @return The exception that occurred during the evaluation
-	 * @see org.eclipse.debug.core.DebugException
-	 */
-	public DebugException getException();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchpoint.java
deleted file mode 100644
index bb356fe..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IWatchpoint.java
+++ /dev/null
@@ -1,83 +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.debug.core.model;
-
- 
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A breakpoint that suspends when an associated variable is
- * read or written.
- * <p>
- * Clients may implement this interface. Clients are not required to 
- * implement this interface to implement watchpoints, but those that do inherit
- * default rendering of images for watchpoints from the debug platform's
- * default label provider and actions to toggle access and modification
- * properties of a watchpoint.
- * </p>
- * @since 3.1
- */
-public interface IWatchpoint extends IBreakpoint {
-	/**
-	 * Returns whether this watchpoint will suspend execution when its associated
-	 * variable is accessed (read).
-	 * 
-	 * @return whether this is an access watchpoint
-	 * @exception CoreException if unable to access the property
-	 * 	on this breakpoint's underlying marker
-	 */	
-	public boolean isAccess() throws CoreException;
-	/**
-	 * Sets whether this breakpoint will suspend execution when its associated
-	 * variable is accessed.
-	 * 
-	 * @param access whether to suspend on access
-	 * @exception CoreException if unable to set the property on this breakpoint's
-	 *  underlying marker or if the capability is not supported
-	 */
-	public void setAccess(boolean access) throws CoreException;
-	/**
-	 * Returns whether this watchpoint will suspend execution when its associated
-	 * variable is written.
-	 * 
-	 * @return whether this is a modification watchpoint
-	 * @exception CoreException if unable to access the property
-	 * 	on this breakpoint's underlying marker
-	 */	
-	public boolean isModification() throws CoreException;
-	/**
-	 * Sets whether this breakpoint will suspend execution when its associated
-	 * variable is modified.
-	 * 
-	 * @param modification whether to suspend on modification
-	 * @exception CoreException if unable to set the property on
-	 * 	this breakpoint's underlying marker or if the capability is not supported
-	 */
-	public void setModification(boolean modification) throws CoreException;
-	/**
-	 * Returns whether this breakpoints supports the capability to suspend
-	 * when an associated variable is read.
-	 * 
-	 * @return whether this breakpoints supports the capability to suspend
-	 * when an associated variable is read
-	 */
-	public boolean supportsAccess();
-	/**
-	 * Returns whether this breakpoints supports the ability to suspend
-	 * when an associated variable is written.
-	 * 
-	 * @return whether this breakpoints supports the ability to suspend
-	 * when an associated variable is written
-	 */	
-	public boolean supportsModification();
-
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/LaunchConfigurationDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/LaunchConfigurationDelegate.java
deleted file mode 100644
index 7f18e38..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/LaunchConfigurationDelegate.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.core.DebugCoreMessages;
-
-/**
- * Default implementation of a launch configuration delegate. Provides
- * convenience methods for computing the build order of projects,
- * building projects, and searching for errors in the workspace. The
- * default pre-launch check prompts the user to launch in debug mode
- * if breakpoints are present in the workspace. 
- * <p>
- * Clients implementing launch configuration delegates should subclass
- * this class.
- * </p>
- * @since 3.0
- */
-public abstract class LaunchConfigurationDelegate implements ILaunchConfigurationDelegate2 {
-	
-	/**
-	 * Constant to define debug.core for the status codes
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DEBUG_CORE = "org.eclipse.debug.core"; //$NON-NLS-1$
-	
-	/**
-	 * Constant to define debug.ui for the status codes
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DEBUG_UI = "org.eclipse.debug.ui"; //$NON-NLS-1$
-	
-	/**
-	 * Constant to represent the empty string
-	 * 
-	 * @since 3.2
-	 */
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	
-	/**
-	 * Status code for which a UI prompter is registered.
-	 */
-	protected static final IStatus promptStatus = new Status(IStatus.INFO, DEBUG_UI, 200, EMPTY_STRING, null);
-	
-	/**
-	 * Status code for which a prompter is registered to ask the user if they
-	 * want to launch in debug mode when breakpoints are present.
-	 */
-	protected static final IStatus switchToDebugPromptStatus = new Status(IStatus.INFO, DEBUG_CORE, 201, EMPTY_STRING, null);
-	
-	/**
-	 * Status code for which a prompter is registered to ask the user if the
-	 * want to continue launch despite existing compile errors
-	 */
-	protected static final IStatus complileErrorPromptStatus = new Status(IStatus.INFO, DEBUG_CORE, 202, EMPTY_STRING, null);
-	
-	/**
-	 * Status code for which a prompter will ask the user to save any/all of the dirty editors which have only to do
-	 * with this launch (scoping them to the current launch/build)
-	 * 
-	 * @since 3.2
-	 */
-	protected static final IStatus saveScopedDirtyEditors = new Status(IStatus.INFO, DEBUG_CORE, 222, EMPTY_STRING, null);
-	
-	/**
-	 * Status code for which a prompter is registered to ask the user if the
-	 * want to continue launch despite existing compile errors in specific
-	 * projects. This enhances the 'compileErrorPromptStatus' by specifying
-	 * which projects the errors exist in.
-	 * 
-	 * @since 3.1
-	 */
-	protected static final IStatus complileErrorProjectPromptStatus = new Status(IStatus.INFO, DEBUG_CORE, 203, EMPTY_STRING, null);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#getLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
-	 */
-	public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#buildForLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		IProject[] projects = getBuildOrder(configuration, mode);
-		if (projects == null) {
-			return true;
-		} 
-		buildProjects(projects, monitor);
-		return false;
-	}
-	
-	/**
-	 * Returns the projects to build before launching the given launch configuration
-	 * or <code>null</code> if the entire workspace should be built incrementally.
-	 * Subclasses should override as required.
-	 * 
-	 * @param configuration the configuration being launched
-	 * @param mode launch mode
-	 * @return projects to build, in build order, or <code>null</code>
-	 * @throws CoreException if an exception occurs
-	 */
-	protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException {
-		return null;
-	}
-	
-	/**
-	 * Returns the set of projects to use when searching for errors or <code>null</code> 
-	 * if no search is to be done.  
-	 * 
-	 * @param configuration the configuration being launched
-	 * @param mode launch mode
-	 * @return a list of projects or <code>null</code>
-	 * @throws CoreException if an exception occurs
-	 */
-	protected IProject[] getProjectsForProblemSearch(ILaunchConfiguration configuration, String mode) throws CoreException {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#finalLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean finalLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		IProject[] projects = getProjectsForProblemSearch(configuration, mode);
-		if (projects == null) {
-			return true; //continue launch
-		}
-		boolean continueLaunch = true;
-			
-		monitor.subTask(DebugCoreMessages.LaunchConfigurationDelegate_6); 
-		List errors = new ArrayList();
-		for (int i = 0; i < projects.length; i++) {
-			monitor.subTask(MessageFormat.format(DebugCoreMessages.LaunchConfigurationDelegate_7, new String[]{projects[i].getName()})); 
-			if (existsProblems(projects[i])) {
-				errors.add(projects[i]);
-			}	
-		}	
-		if (!errors.isEmpty()) {
-			errors.add(0, configuration);
-			IStatusHandler prompter = DebugPlugin.getDefault().getStatusHandler(promptStatus);
-			if (prompter != null) {
-				continueLaunch = ((Boolean) prompter.handleStatus(complileErrorProjectPromptStatus, errors)).booleanValue();
-			}
-		}
-			
-		return continueLaunch;
-	}
-	
-	/* (non-Javadoc)
-	 * 
-	 * If launching in run mode, and the configuration supports debug mode, check
-	 * if there are any breakpoints in the workspace, and ask the user if they'd
-	 * rather launch in debug mode.
-	 * <p>
-	 * Since 3.2, this check also performs saving of resources before launching.
-	 * </p>
-	 * 
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#preLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		if (!saveBeforeLaunch(configuration, mode, monitor)) {
-			return false;
-		}
-		if (mode.equals(ILaunchManager.RUN_MODE) && configuration.supportsMode(ILaunchManager.DEBUG_MODE)) {
-			IBreakpoint[] breakpoints= getBreakpoints(configuration);
-            if (breakpoints == null) {
-                return true;
-            }
-			for (int i = 0; i < breakpoints.length; i++) {
-				if (breakpoints[i].isEnabled()) {
-					IStatusHandler prompter = DebugPlugin.getDefault().getStatusHandler(promptStatus);
-					if (prompter != null) {
-						boolean launchInDebugModeInstead = ((Boolean)prompter.handleStatus(switchToDebugPromptStatus, configuration)).booleanValue();
-						if (launchInDebugModeInstead) { 
-							return false; //kill this launch
-						} 
-					}
-					// if no user prompt, or user says to continue (no need to check other breakpoints)
-					return true;
-				}
-			}
-		}	
-		// no enabled breakpoints... continue launch
-		return true;
-	}
-	
-	/**
-	 * Performs the scoped saving of resources before launching and returns whether
-	 * the launch should continue. By default, only resources contained within the projects
-	 * which are part of the build scope are considered.
-	 * <p>
-	 * Subclasses may override this method if required.
-	 * </p>
-	 * 
-	 * @param configuration the configuration being launched
-	 * @param mode the launch mode
-	 * @param monitor progress monitor
-	 * @return whether the launch should continue
-	 * @throws CoreException if an exception occurs during the save
-	 * @since 3.2
-	 */
-	protected boolean saveBeforeLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		IStatusHandler prompter = DebugPlugin.getDefault().getStatusHandler(promptStatus);
-		if(prompter != null) {
-			//do save here and remove saving from DebugUIPlugin to avoid it 'trumping' this save
-			IProject[] buildOrder = getBuildOrder(configuration, mode);
-			if(!((Boolean)prompter.handleStatus(saveScopedDirtyEditors, new Object[]{configuration, buildOrder})).booleanValue()) {
-				return false;
-			}
-		}	
-		return true;
-	}
-
-    /**
-     * Returns the breakpoint collection that is relevant for this launch delegate.
-     * By default this is all the breakpoints registered with the Debug breakpoint manager.
-     * 
-     * @since 3.1
-     * @return the breakpoints that are relevant for this launch delegate
-     */ 
-    protected IBreakpoint[] getBreakpoints(ILaunchConfiguration configuration) {
-        IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
-        if (!breakpointManager.isEnabled()) {
-            // no need to check breakpoints individually.
-            return null;
-        }
-        return breakpointManager.getBreakpoints();
-    }
-	
-	/**
-	 * Returns an array of projects in their suggested build order
-	 * containing all of the projects specified by <code>baseProjects</code>
-	 * and all of their referenced projects.
-	 *  
-	 * @param baseProjects a collection of projects
-	 * @return an array of projects in their suggested build order
-	 * containing all of the projects specified by <code>baseProjects</code>
-	 * @throws CoreException if an error occurs while computing referenced
-	 *  projects
-	 */
-	protected IProject[] computeReferencedBuildOrder(IProject[] baseProjects) throws CoreException {
-		HashSet unorderedProjects = new HashSet();
-		for(int i = 0; i< baseProjects.length; i++) {
-			unorderedProjects.add(baseProjects[i]);
-			addReferencedProjects(baseProjects[i], unorderedProjects);
-		}
-		IProject[] projectSet = (IProject[]) unorderedProjects.toArray(new IProject[unorderedProjects.size()]);
-		return computeBuildOrder(projectSet);
-	}
-	
-	
-	/**
-	 * Adds all projects referenced by <code>project</code> to the given
-	 * set.
-	 * 
-	 * @param project project
-	 * @param references set to which referenced projects are added
-	 * @throws CoreException if an error occurs while computing referenced
-	 *  projects
-	 */
-	protected void addReferencedProjects(IProject project, Set references) throws CoreException{
-		if (project.isOpen()) {
-			IProject[] projects = project.getReferencedProjects();
-			for (int i = 0; i < projects.length; i++) {
-				IProject refProject= projects[i];
-				if (refProject.exists() && !references.contains(refProject)) {
-					references.add(refProject);
-					addReferencedProjects(refProject, references);
-				}
-			}		
-		}
-	}
-	
-	/**  
-	 * Returns a list of projects in their suggested build order from the
-	 * given unordered list of projects.
-	 * 
-	 * @param projects the list of projects to sort into build order
-	 * @return a new array containing all projects from <code>projects</code> sorted
-	 *   according to their build order.
-	 */
-	protected IProject[] computeBuildOrder(IProject[] projects) { 
-		String[] orderedNames = ResourcesPlugin.getWorkspace().getDescription().getBuildOrder();
-		if (orderedNames != null) {
-			List orderedProjects = new ArrayList(projects.length);
-			//Projects may not be in the build order but should be built if selected
-			List unorderedProjects = new ArrayList(projects.length);
-			for(int i = 0; i < projects.length; ++i) {
-				unorderedProjects.add(projects[i]);
-			}
-			
-			for (int i = 0; i < orderedNames.length; i++) {
-				String projectName = orderedNames[i];
-				for (Iterator iterator = unorderedProjects.iterator(); iterator.hasNext(); ) {
-					IProject project = (IProject)iterator.next();
-					if (project.getName().equals(projectName)) {
-						orderedProjects.add(project);
-						iterator.remove();
-						break;
-					}
-				}
-			}
-			//Add anything not specified before we return
-			orderedProjects.addAll(unorderedProjects);
-			return (IProject[]) orderedProjects.toArray(new IProject[orderedProjects.size()]);
-		}
-		
-		// Computing build order returned null, try the project prerequisite order
-		IWorkspace.ProjectOrder po = ResourcesPlugin.getWorkspace().computeProjectOrder(projects);
-		return po.projects;
-	}	
-	
-	/**
-	 * Returns whether the given project contains any problem markers of the
-	 * specified severity.
-	 * 
-	 * @param proj the project to search
-	 * @return whether the given project contains any problems that should
-	 *  stop it from launching
-	 * @throws CoreException if an error occurs while searching for
-	 *  problem markers
-	 */
-	protected boolean existsProblems(IProject proj) throws CoreException {
-		IMarker[] markers = proj.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
-		if (markers.length > 0) {
-			for (int i = 0; i < markers.length; i++) {
-				if (isLaunchProblem(markers[i])) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns whether the given problem should potentially abort the launch.
-	 * By default if the problem has an error severity, the problem is considered
-	 * a potential launch problem. Subclasses may override to specialize error
-	 * detection.
-	 * 
-	 * @param problemMarker candidate problem
-	 * @return whether the given problem should potentially abort the launch
-	 * @throws CoreException if any exceptions occur while accessing marker attributes
-	 */
-	protected boolean isLaunchProblem(IMarker problemMarker) throws CoreException {
-		Integer severity = (Integer)problemMarker.getAttribute(IMarker.SEVERITY);
-		if (severity != null) {
-			return severity.intValue() >= IMarker.SEVERITY_ERROR;
-		} 
-		
-		return false;
-	}
-	
-	/**
-	 * Performs an incremental build on each of the given projects.
-	 * 
-	 * @param projects projects to build
-	 * @param monitor progress monitor
-	 * @throws CoreException if an exception occurs while building
-	 */
-	protected void buildProjects(IProject[] projects, IProgressMonitor monitor) throws CoreException {
-		for (int i = 0; i < projects.length; i++ ) {
-			projects[i].build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
-		}
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/LineBreakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/LineBreakpoint.java
deleted file mode 100644
index 94f04ba..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/LineBreakpoint.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-
-
-/**
- * Abstract implementation of a line breakpoint. This class is
- * intended to be subclassed by debug model specific implementations
- * of line breakpoints.
- * 
- * @see ILineBreakpoint
- */
-
-public abstract class LineBreakpoint extends Breakpoint implements ILineBreakpoint {
-	
-
-	/**
-	 * @see ILineBreakpoint#getLineNumber()
-	 */
-	public int getLineNumber() throws CoreException {
-		IMarker m = getMarker();
-		if (m != null) {
-			return m.getAttribute(IMarker.LINE_NUMBER, -1);
-		}
-		return -1;
-	}
-
-	/**
-	 * @see ILineBreakpoint#getCharStart()
-	 */
-	public int getCharStart() throws CoreException {
-		IMarker m = getMarker();
-		if (m != null) {
-			return m.getAttribute(IMarker.CHAR_START, -1);
-		}
-		return -1;
-	}
-
-	/**
-	 * @see ILineBreakpoint#getCharEnd()
-	 */
-	public int getCharEnd() throws CoreException {
-		IMarker m = getMarker();
-		if (m != null) {
-			return m.getAttribute(IMarker.CHAR_END, -1);
-		}
-		return -1;
-	}
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/MemoryByte.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/MemoryByte.java
deleted file mode 100644
index 6498ec3..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/MemoryByte.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.model;
-
-
-/**
- * A byte of memory in a memory block. Each byte of memory has a value and
- * attributes indicating if the byte is read-only, valid, or if its value has
- * changed.
- * <p>
- * Clients may instantiate this class. Clients may subclass this class to 
- * add other attributes to a memory byte, as required.
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.core.model.IMemoryBlockExtension
- */
-public class MemoryByte {
-	
-    /**
-     * Bit mask used to indicate a byte is writable.
-     */
-	public static final byte	WRITABLE	= 0x01;
-	
-	/**
-	 * Bit mask used to indicate a byte is readable.
-	 * A memory byte is readable when its value and attributes are retrievable.
-	 * Otherwise, a byte is considered non-readable.
-	 */
-	public static final byte	READABLE		= 0x02;
-	
-	/**
-	 * Bit mask used to indicate a byte has changed since the last
-	 * suspend event.
-	 * 
-	 * @see org.eclipse.debug.core.DebugEvent#SUSPEND
-	 */
-	public static final byte	CHANGED		= 0x04;
-	
-	/**
-	 * Bit mask used to indicate a memory byte has history to
-	 * determine if its value has changed. When a memory byte's
-	 * history is unknown, the change state has no meaning.
-	 */
-	public static final byte 	HISTORY_KNOWN		= 0x08;
-	
-	/**
-	 * Bit mask used to indicate a this byte of memory
-	 * is big endian.  If this byte of memory is little endian,
-	 * turn this bit mask to off.
-	 */
-	public static final byte	BIG_ENDIAN	= 0x10;
-	
-	/**
-	 * Bit mask used to indicate that the endianess of this byte
-	 * of memory is known.  When a memory byte's endianess is
-	 * unknown, the endianess of this byte has no meaning.  
-	 */
-	public static final byte	ENDIANESS_KNOWN = 0x20;
-	
-	/**
-	 * Value of this byte.
-	 */
-	protected byte value;
-	
-	/**
-	 * Attribute flags.
-	 * <p>
-	 * To specify READABLE:  flags |= MemoryByte.READABLE;
-	 * To specify WRITABLE:  flags |= MemoryByte.WRITABLE;
-	 * </p>
-	 */
-	protected byte flags;
-	
-	/**
-	 * Constructs a readable, writable memory byte without a change history,
-	 * and a value of 0.  The byte's endianess is known and is little endian
-	 * by default.
-	 */
-	public MemoryByte() {
-	    this((byte)0, (byte)(WRITABLE | READABLE | ENDIANESS_KNOWN));
-	}
-	
-	/**
-	 * Constructs a readable, writable memory byte without a change history,
-	 * with the given value.  The byte's endianess is known and is little endian
-	 * by default.  
-	 * 
-	 * @param byteValue value of this memory byte
-	 * 
-	 */
-	public MemoryByte(byte byteValue) {
-	    this(byteValue, (byte)(WRITABLE | READABLE | ENDIANESS_KNOWN));
-	}
-	
-	/**
-	 * Constructs a memory byte with the given value and attributes.
-	 * 
-	 * @param byteValue value of this memory byte
-	 * @param byteFlags attributes of the byte specified as a bit mask 
-	 */
-	public MemoryByte(byte byteValue, byte byteFlags) {		
-		value = byteValue;
-		flags = byteFlags;
-	}
-
-	/**
-	 * Returns this memory byte's attribute as a bit mask.
-	 * 
-	 * @return this memory byte's attribute as a bit mask
-	 */
-	public byte getFlags() {
-		return flags;
-	}
-	/**
-	 * Sets this memory byte's attributes based on the given bit mask.
-	 * 
-	 * @param flags bit mask of attributes
-	 */
-	public void setFlags(byte flags) {
-		this.flags = flags;
-	}
-
-	/**
-	 * Returns the value of this memory byte.
-	 * 
-	 * @return the value of this memory byte
-	 */
-	public byte getValue() {
-		return value;
-	}
-	
-	/**
-	 * Sets the value of this memory byte.
-	 * 
-	 * @param value the new value of this memory byte
-	 */
-	public void setValue(byte value) {
-		this.value = value;
-	}
-	
-	/**
-	 * Sets whether this memory byte is readable. A memory byte
-	 * is considered readable when its value and attributes are
-	 * retrievable.
-	 * 
-	 * @param readable whether this memory byte is readable
-	 */
-	public void setReadable(boolean readable) {
-		flags |= MemoryByte.READABLE;
-		if (!readable)
-			flags ^= MemoryByte.READABLE;
-	}
-	
-	/**
-	 * Returns whether this memory byte is readable. A memory byte
-	 * is considered readable when its value and attributes are
-	 * retrievable.
-	 * 
-	 * @return whether this memory byte is readable
-	 */
-	public boolean isReadable() {
-		return ((flags & MemoryByte.READABLE) == MemoryByte.READABLE);
-	}
-	
-	/**
-	 * Sets whether this memory byte is writable.
-	 * 
-	 * @param writable whether this memory byte is writable.
-	 */
-	public void setWritable(boolean writable) {
-		flags |= MemoryByte.WRITABLE;
-		if (!writable)
-			flags ^= MemoryByte.WRITABLE;
-	}
-	
-	/**
-	 * Returns whether this memory byte is writable.
-	 * 
-	 * @return whether this memory byte is writable
-	 */
-	public boolean isWritable() {
-		return ((flags & MemoryByte.WRITABLE) == MemoryByte.WRITABLE);
-	}
-	
-	/**
-	 * Sets whether this memory byte has changed.
-	 * 
-	 * @param changed whether this memory byte has changed
-	 */
-	public void setChanged(boolean changed) {
-		flags |= MemoryByte.CHANGED;
-		if (!changed)
-			flags ^= MemoryByte.CHANGED;
-	}
-	
-	/**
-	 * Returns whether this memory byte has changed.
-	 * 
-	 * @return whether this memory byte has changed
-	 */
-	public boolean isChanged() {
-		return ((flags & MemoryByte.CHANGED) == MemoryByte.CHANGED);
-	}
-	
-	/**
-	 * Sets whether the history of this byte is known. When history
-	 * is unknown, the change state of a memory byte has no meaning.
-	 * 
-	 * @param known whether the change state of this byte is known
-	 */
-	public void setHistoryKnown(boolean known) {
-		flags |= MemoryByte.HISTORY_KNOWN;
-		if (!known)
-			flags ^= MemoryByte.HISTORY_KNOWN;
-	}
-	
-	/**
-	 * Returns whether the history of this byte is known. When history
-	 * is unknown, the change state of a memory byte has no meaning.
-	 * 
-	 * @return whether the change state of this byte is known
-	 */
-	public boolean isHistoryKnown() {
-		return ((flags & MemoryByte.HISTORY_KNOWN) == MemoryByte.HISTORY_KNOWN);
-	}
-	
-	/**
-	 * Sets whether this byte of memory is big endian.
-	 * 
-	 * @param isBigEndian whether the byte of memory is big endian.
-	 */
-	public void setBigEndian(boolean isBigEndian)
-	{
-		flags |= MemoryByte.BIG_ENDIAN;
-		if (!isBigEndian)
-			flags ^= MemoryByte.BIG_ENDIAN;
-	}
-	
-	/**
-	 * Returns whether this byte of memory is big endian.
-	 * 
-	 * @return whether the byte of memory is big endian.
-	 */
-	public boolean isBigEndian()
-	{
-		return ((flags & MemoryByte.BIG_ENDIAN) == MemoryByte.BIG_ENDIAN);
-	}
-	
-	/**
-	 * Sets whether the endianess of this byte of memory is known.
-	 * If the endianess is unknown, the endianess of this byte
-	 * has no meaning. 
-	 * 
-	 * @param isEndianessKnown whether the endianess of this byte is known.
-	 */
-	public void setEndianessKnown(boolean isEndianessKnown)
-	{
-		flags |= MemoryByte.ENDIANESS_KNOWN;
-		if (!isEndianessKnown)
-			flags ^= MemoryByte.ENDIANESS_KNOWN;
-	}
-	
-	/**
-	 * Returns whether the endianess of this byte of memory is known.
-	 * If the endianess is unknown, the endianess of this byte
-	 * has no meaning.
-	 *  
-	 * @return whether the endianess of this byte of memory is known.
-	 */
-	public boolean isEndianessKnown()
-	{
-		return ((flags & MemoryByte.ENDIANESS_KNOWN) == MemoryByte.ENDIANESS_KNOWN);
-	}
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java
deleted file mode 100644
index 8aa90bf..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java
+++ /dev/null
@@ -1,447 +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.debug.core.model;
-
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.core.DebugCoreMessages;
-import org.eclipse.debug.internal.core.NullStreamsProxy;
-import org.eclipse.debug.internal.core.StreamsProxy;
-
-
-/**
- * Standard implementation of an <code>IProcess</code> that wrappers a system
- * process (<code>java.lang.Process</code>).
- * <p>
- * Clients may subclass this class. Clients that need to replace the implementation
- * of a streams proxy associated with an <code>IProcess</code> should subclass this
- * class. Generally clients should not instantiate this class directly, but should
- * instead call <code>DebugPlugin.newProcess(...)</code>, which can delegate to an 
- * <code>IProcessFactory</code> if one is referenced by the associated launch configuration.
- * </p>
- * @see org.eclipse.debug.core.model.IProcess
- * @see org.eclipse.debug.core.IProcessFactory
- * @since 3.0
- */
-public class RuntimeProcess extends PlatformObject implements IProcess {
-
-	private static final int MAX_WAIT_FOR_DEATH_ATTEMPTS = 10;
-	private static final int TIME_TO_WAIT_FOR_THREAD_DEATH = 500; // ms
-	
-	/**
-	 * The launch this process is contained in
-	 */
-	private ILaunch fLaunch;
-	
-	/**
-	 * The system process represented by this <code>IProcess</code>
-	 */
-	private Process fProcess;
-	
-	/**
-	 * This process's exit value
-	 */
-	private int fExitValue;
-	
-	/**
-	 * The monitor which listens for this runtime process' system process
-	 * to terminate.
-	 */
-	private ProcessMonitorThread fMonitor;
-	
-	/**
-	 * The streams proxy for this process
-	 */
-	private IStreamsProxy fStreamsProxy;
-
-	/**
-	 * The name of the process
-	 */
-	private String fName;
-
-	/**
-	 * Whether this process has been terminated
-	 */
-	private boolean fTerminated;
-	
-	/**
-	 * Table of client defined attributes
-	 */
-	private Map fAttributes;
-	
-	/**
-	 * Whether output from the process should be captured or swallowed
-	 */
-	private boolean fCaptureOutput = true;
-
-	/**
-	 * Constructs a RuntimeProcess on the given system process
-	 * with the given name, adding this process to the given
-	 * launch.
-	 * 
-	 * @param launch the parent launch of this process
-	 * @param process underlying system process
-	 * @param name the label used for this process
-	 * @param attributes map of attributes used to initialize the attributes
-	 *   of this process, or <code>null</code> if none
-	 */
-	public RuntimeProcess(ILaunch launch, Process process, String name, Map attributes) {
-		setLaunch(launch);
-		initializeAttributes(attributes);
-		fProcess= process;
-		fName= name;
-		fTerminated= true;
-		try {
-			process.exitValue();
-		} catch (IllegalThreadStateException e) {
-			fTerminated= false;
-		}
-		
-		String captureOutput = launch.getAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT);
-		fCaptureOutput = !("false".equals(captureOutput)); //$NON-NLS-1$
-
-		fStreamsProxy= createStreamsProxy();
-		fMonitor = new ProcessMonitorThread(this);
-		fMonitor.start();
-		launch.addProcess(this);
-		fireCreationEvent();
-	}
-
-	/**
-	 * Initialize the attributes of this process to those in the given map.
-	 * 
-	 * @param attributes attribute map or <code>null</code> if none
-	 */
-	private void initializeAttributes(Map attributes) {
-		if (attributes != null) {
-			Iterator keys = attributes.keySet().iterator();
-			while (keys.hasNext()) {
-				String key = (String)keys.next();
-				setAttribute(key, (String)attributes.get(key));
-			}	
-		}
-	}
-
-	/**
-	 * @see ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return !fTerminated;
-	}
-
-	/**
-	 * @see IProcess#getLabel()
-	 */
-	public String getLabel() {
-		return fName;
-	}
-	
-	/**
-	 * Sets the launch this process is contained in
-	 * 
-	 * @param launch the launch this process is contained in
-	 */
-	protected void setLaunch(ILaunch launch) {
-		fLaunch = launch;
-	}
-
-	/**
-	 * @see IProcess#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return fLaunch;
-	}
-
-	/**
-	 * Returns the underlying system process associated with this process.
-	 * 
-	 * @return system process
-	 */
-	protected Process getSystemProcess() {
-		return fProcess;
-	}
-
-	/**
-	 * @see ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return fTerminated;
-	}
-
-	/**
-	 * @see ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		if (!isTerminated()) {			
-			if (fStreamsProxy instanceof StreamsProxy) {
-				((StreamsProxy)fStreamsProxy).kill();
-			}
-			Process process = getSystemProcess();
-			if (process != null) {
-			    process.destroy();
-			}
-			int attempts = 0;
-			while (attempts < MAX_WAIT_FOR_DEATH_ATTEMPTS) {
-				try {
-				    process = getSystemProcess();
-					if (process != null) {
-						fExitValue = process.exitValue(); // throws exception if process not exited
-					}
-					return;
-				} catch (IllegalThreadStateException ie) {
-				}
-				try {
-					Thread.sleep(TIME_TO_WAIT_FOR_THREAD_DEATH);
-				} catch (InterruptedException e) {
-				}
-				attempts++;
-			}
-			// clean-up
-			if (fMonitor != null) {
-				fMonitor.killThread();
-				fMonitor = null;
-			}
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugException.TARGET_REQUEST_FAILED, DebugCoreMessages.RuntimeProcess_terminate_failed, null);		 
-			throw new DebugException(status);
-		}
-	}
-
-	/**
-	 * Notification that the system process associated with this process
-	 * has terminated.
-	 */
-	protected void terminated() {
-		if (fStreamsProxy instanceof StreamsProxy) {
-			((StreamsProxy)fStreamsProxy).close();
-		}
-		fTerminated= true;
-		try {
-			fExitValue = fProcess.exitValue();
-		} catch (IllegalThreadStateException ie) {
-		}
-		fProcess= null;
-		fireTerminateEvent();
-	}
-		
-	/**
-	 * @see IProcess#getStreamsProxy()
-	 */
-	public IStreamsProxy getStreamsProxy() {
-	    if (!fCaptureOutput) {
-	        return null;
-	    }
-		return fStreamsProxy;
-	}
-	
-	/**
-	 * Creates and returns the streams proxy associated with this process.
-	 * 
-	 * @return streams proxy
-	 */
-	protected IStreamsProxy createStreamsProxy() {
-	    if (!fCaptureOutput) {
-	        return new NullStreamsProxy(getSystemProcess());
-	    }
-		String encoding = getLaunch().getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING);	    
-		return new StreamsProxy(getSystemProcess(), encoding);
-	}	
-	
-	/**
-	 * Fires a creation event.
-	 */
-	protected void fireCreationEvent() {
-		fireEvent(new DebugEvent(this, DebugEvent.CREATE));
-	}
-
-	/**
-	 * Fires the given debug event.
-	 * 
-	 * @param event debug event to fire
-	 */
-	protected void fireEvent(DebugEvent event) {
-		DebugPlugin manager= DebugPlugin.getDefault();
-		if (manager != null) {
-			manager.fireDebugEventSet(new DebugEvent[]{event});
-		}
-	}
-
-	/**
-	 * Fires a terminate event.
-	 */
-	protected void fireTerminateEvent() {
-		fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
-	}
-
-	/**
-	 * Fires a change event.
-	 */	
-	protected void fireChangeEvent() {
-		fireEvent(new DebugEvent(this, DebugEvent.CHANGE));
-	}
-
-	/**
-	 * @see IProcess#setAttribute(String, String)
-	 */
-	public void setAttribute(String key, String value) {
-		if (fAttributes == null) {
-			fAttributes = new HashMap(5);
-		}
-		Object origVal = fAttributes.get(key);
-		if (origVal != null && origVal.equals(value)) {
-			return; //nothing changed.
-		}
-		
-		fAttributes.put(key, value);
-		fireChangeEvent();
-	}
-	
-	/**
-	 * @see IProcess#getAttribute(String)
-	 */
-	public String getAttribute(String key) {
-		if (fAttributes == null) {
-			return null;
-		}
-		return (String)fAttributes.get(key);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(IProcess.class)) {
-			return this;
-		}
-		if (adapter.equals(IDebugTarget.class)) {
-			ILaunch launch = getLaunch();
-			IDebugTarget[] targets = launch.getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if (this.equals(targets[i].getProcess())) {
-					return targets[i];
-				}
-			}
-			return null;
-		}
-		if (adapter.equals(ILaunch.class)) {
-			return getLaunch();
-		}
-		//CONTEXTLAUNCHING
-		if(adapter.equals(ILaunchConfiguration.class)) {
-			return getLaunch().getLaunchConfiguration();
-		}
-		return super.getAdapter(adapter);
-	}
-	/**
-	 * @see IProcess#getExitValue()
-	 */
-	public int getExitValue() throws DebugException {
-		if (isTerminated()) {
-			return fExitValue;
-		} 
-		throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugException.TARGET_REQUEST_FAILED, DebugCoreMessages.RuntimeProcess_Exit_value_not_available_until_process_terminates__1, null)); 
-	}
-	
-	/**
-	 * Monitors a system process, waiting for it to terminate, and
-	 * then notifies the associated runtime process.
-	 */
-	class ProcessMonitorThread extends Thread {
-		
-		/**
-		 * Whether the thread has been told to exit.
-		 */
-		protected boolean fExit;
-		/**
-		 * The underlying <code>java.lang.Process</code> being monitored.
-		 */
-		protected Process fOSProcess;	
-		/**
-		 * The <code>IProcess</code> which will be informed when this
-		 * monitor detects that the underlying process has terminated.
-		 */
-		protected RuntimeProcess fRuntimeProcess;
-
-		/**
-		 * The <code>Thread</code> which is monitoring the underlying process.
-		 */
-		protected Thread fThread;
-		
-		/**
-		 * A lock protecting access to <code>fThread</code>.
-		 */
-		private final Object fThreadLock = new Object();
-
-		/**
-		 * @see Thread#run()
-		 */
-		public void run() {
-			synchronized (fThreadLock) {
-				if (fExit) {
-					return;
-				}
-				fThread = Thread.currentThread();
-			}
-			while (fOSProcess != null) {
-				try {
-					fOSProcess.waitFor();
-				} catch (InterruptedException ie) {
-					// clear interrupted state
-					Thread.interrupted();
-				} finally {
-					fOSProcess = null;
-					fRuntimeProcess.terminated();
-				}
-			}
-			fThread = null;
-		}
-
-		/**
-		 * Creates a new process monitor and starts monitoring the process for
-		 * termination.
-		 * 
-		 * @param process process to monitor for termination
-		 */
-		public ProcessMonitorThread(RuntimeProcess process) {
-			super(DebugCoreMessages.ProcessMonitorJob_0); 
-			setDaemon(true);
-			fRuntimeProcess= process;
-			fOSProcess= process.getSystemProcess();
-		}
-
-		/**
-		 * Kills the monitoring thread.
-		 * 
-		 * This method is to be useful for dealing with the error
-		 * case of an underlying process which has not informed this
-		 * monitor of its termination.
-		 */
-		protected void killThread() {
-			synchronized (fThreadLock) {
-				if (fThread == null) {
-					fExit = true;
-				} else {
-					fThread.interrupt();
-				}
-			}
-		}
-	}	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html
deleted file mode 100644
index 6192e28..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html
+++ /dev/null
@@ -1,146 +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>Eclipse Debug Platform [org.eclipse.debug.core.model]</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Defines interfaces for debug model elements, source lookup, and launching.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package defines classes and interfaces known as the &quot;debug model&quot; 
-  which support an extensible set of debug architectures and languages. The debug 
-  model is a set of interfaces representing common artifacts in debuggable programs. 
-  The debug plug-in itself does not provide an implementation of a debug model. 
-  It is intended that third parties providing an integrated set of development 
-  tools for a specific language will also implement a debug model for that language, 
-  using an underlying debug architecture of their choice. For example, Java development 
-  tooling provides an implementation of a debug model based on the standard Java 
-  Platform Debug Architecture (JPDA).</p>
-
-<h4>The Debug Model</h4>
-
-<p>A client implements a debug model by
-providing an implementation of the interfaces defined in this package. (There is no explicit
-extension point that represents a debug model). Each debug model provides one or more
-launch configuration types capable of initiating a debug session.</p>
-
-<p>The common elements defined by the debug model are: 
-
-<ul>
-  <li>Debug Target - A debug target represents a debuggable program - for example, a virtual
-    machine or a process.</li>
-  <li>Thread - A debug target may contain one or more threads.</li>
-  <li>Stack Frame - A suspended thread may contain one or more stack frames.</li>
-  <li>Variable - A stack frame may contain variables.</li>
-  <li>Value - Each variable has an associated value, and a value may contain more variables (to
-  	represent complex data structures and objects).</li>
-  <li>Register Group - A stack frame may (optionally) be associated with one or more register
-    groups.</li>
-  <li>Register - A register group contains one or more registers.</li>
-  <li>Memory Blocks - A debug target may (optionally) support the retrieval of
-    arbitrary contiguous segments of memory.</li>
-  <li>Breakpoint - Breakpoints suspend the execution of a program.</li>
-  <li>Expression -  An expression is a snippet of code that can be evaluated to
-  	produce a value.</li>
-</ul>
-
-<p>A debug model implementation is responsible for firing debug events. A debug event
-corresponds to an event in a program being debugged - for example the creation or
-termination of a thread.</p>
-
-<h4>Breakpoints</h4>
-
-<p>Breakpoints are used to suspend the execution of a program being debugged. There are
-many kinds of breakpoints - line breakpoints, conditional line breakpoints, hit count
-breakpoints, exception breakpoints, etc. The kinds of breakpoints supported by each debug
-architecture, and the information required to create those breakpoints
-is dictated by each debug architecture. The debug platform supports an extensible
-set of breakpoint via the breakpoints extension point.</p>
-
-<p>The debug platform provides a breakpoint manager that maintains the collection 
-  of all registered breakpoints. Clients add and remove breakpoints via this manager. 
-  Breakpoints are implemented by instances of <b>IBreakpoint</b>. Each breakpoint 
-  object has an associated marker, which provides persistence and presentation 
-  in editors. The debug platform defines a generic breakpoint and line breakpoint, 
-  as well as their corresponding marker definitions. Breakpoint creation is a 
-  client responsibility - that is, defining the attributes of a breakpoint and 
-  the resource to associate a breakpoint marker with.</p>
-
-<p>Breakpoints are persisted via their underlying marker. Breakpoint markers defined 
-  with the <b>persisted</b> attribute as <b>false</b> will not be persisted. Breakpoints 
-  are restored at workspace startup time by the breakpoint manager - that is, 
-  breakpoint objects are created for all persisted markers which are a subtype 
-  of the root breakpoint marker and are added to the breakpoint manager. To allow 
-  for selective persistence of breakpoints (of the same kind), the <b>IBreakpoint</b> 
-  interface and root breakpoint implementation defines a &quot;persisted&quot; 
-  attribute. If this value is set to false, the breakpoint will not be persisted 
-  across workspace invocations.</p>
-
-<p>As breakpoint markers are modified (created, removed, and changed), resource 
-  deltas are created by the platform. The breakpoint manager translates pertinent 
-  resource deltas into breakpoint change notifications (breakpoint added/removed/changed 
-  messages). Interested listeners may register with the breakpoint manager. The 
-  breakpoint manager only fires change notifications for registered breakpoints. 
-  This simplifies breakpoint processing for clients, as resource delta traversal 
-  and analysis is not required. Debug targets that support breakpoints should 
-  register for breakpoint change notifications.</p>
-<h4>New Features in the Debug Model, Eclipse 3.0</h4>
-<blockquote> 
-  <h4>Launch Delegate Enhancements<br>
-  </h4>
-  <p>Lanuch delegates can optionally implement the new interface <code>ILaunchConfigurationDelegate2</code>. 
-    This allows launch delegates to provide a launch object to be used for a launch. 
-    For example, when debugging on a server a delegate could create a new launch 
-    object or may reuse an existing launch object if the server is already running 
-    in debug mode. As well, the inteface provides a mechanism for performing a 
-    scoped build prior to launching (i.e. scoped to the projects in the workspace 
-    pertaining to the launch), and searching for errors in the workspace which 
-    may prevent the launch from succeeding (for example, compilation errors).</p>
-  <p></p>
-  <h4>Extensible Watch Expressions</h4>
-  <p>The debug platform provides an implementation of watch expressions. Debug 
-    models can contribute watch expression delegates if they support watch expressions. 
-    When a stack frame is selected, the associated delegate is queried to provide 
-    a value for a watch expression in that context. The debug platform provides 
-    persistence, enabling, disabling, entering, and editing of watch expressions.</p>
-  <h4>Automatic Array Partitioning<br>
-  </h4>
-  <p>The debug plug-in supports automatic partitioning of indexed collections, 
-    which partitions large arrays into sub-ranges in the variables view. This 
-    is supported with the introduction of a new interface in the debug model representing 
-    an indexed value - <code>IIndexedValue</code>. If a value implements this 
-    interface, the variables view will automatically partition its elements as 
-    required, into sub-ranges</p>
-  <h4>Logical Structure Types<br>
-  </h4>
-  <p>Often, it is convenient to navigate complex data structures in terms of a 
-    logical structure, rather than an implementation structure. For example, no 
-    matter how a list is implemented (i.e. linked list, collection of arrays, 
-    etc.), it is often convenient to be able to view the list as an ordered collection. 
-    To facilitate the display of logical structures in the variables view, an 
-    extension point has been added (<code>org.eclipse.debug.core.logicalStructureTypes</code>) 
-    allowing debug models to contribute logical structures of its values, where 
-    applicable. Debug models may contribute delegates to translate raw implementation 
-    values into logical values. The variables view will display the logical values, 
-    when the option to display logical structures is turned on. More than one 
-    logical structure can be provided for a single value - the user can choose 
-    which structure to display.</p>
-  <h4>Step Filters<br>
-  </h4>
-  <p>To support step filters on all stepping functions (into, over, return), a 
-    new interface has been added to the debug platform - <code>IStepFilters</code> 
-    - which can be implemented by debug targets. This interface replaces <code>IFilteredStep</code>, 
-    which is now deprecated. The debugger provides a global toggle that turns 
-    step filters on/off for all stepping functions. Debug targets should implement 
-    this new interface and honor the step filter enablement setting when stepping.</p>
-  <p>This change maintains binary compatibility with previous releases. However, 
-    targets wishing to leverage the new function must implement the new interface.<br>
-  </p>
-</blockquote>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/package.html
deleted file mode 100644
index 069ad32..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/package.html
+++ /dev/null
@@ -1,115 +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>Eclipse Debug Platform</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides support for launching programs, breakpoint management, expression management,
-and debug events.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package provides classes and interfaces to support facilities common among 
-  many debug architectures: launching programs, breakpoint management, expression 
-  management, and debug events. An extensible set of debug architectures and languages 
-  are supported by the definition of a &quot;debug model&quot; - a set of interfaces 
-  representing common artifacts in debuggable programs, which are defined in <b>org.eclipse.debug.core.model</b>. 
-  The debug plug-in itself does not provide an implementation of a debug model. 
-  It is intended that third parties providing an integrated set of development 
-  tools for a specific language will also implement a debug model for that language, 
-  using an underlying debug architecture of their choice. For example, Java development 
-  tooling provides an implementation of a debug model based on the standard Java 
-  Platform Debug Architecture (JPDA).</p>
-
-<h4>The Managers</h4>
-
-<p>The debug platform defines and provides an implementation of the following managers:
-<ul>
-  <li>Launch Manager - The launch manager maintains the set of registered launches 
-    - that is, a collection of programs that have been launched in debuggable 
-    or non-debuggable (run) mode. Each launch contains its associated debug targets 
-    and system processes. A launch that represents a debuggable program may specify 
-    an associated source locator used to locate source elements associated with 
-    stack frames for a particular debug session. Clients may provide implementations 
-    of source locators, which are generally tied to the manner in which a program 
-    is launched.</li>
- <li>Breakpoint Manager - The breakpoint manager maintains, persists, and restores the collection
-    of all registered breakpoints in the workspace. As well, it provides change notification for
-    breakpoints.</li>
- <li>Expression Manager - The expression manager maintains a collection of registered expressions.
-    Expressions are not automatically persisted, but a client could persist its own expressions
-    if required.</li>
-</ul>
-<p></p>
-
-<h4>Launch Configurations</h4>
-
-<p>A launch configuration is a persistable description of how to launch an application. 
-  Each launch configuration is an instance of a type of launch configuration - 
-  for example, a Java Application. The debug plug-in defines a launch configuration 
-  type extension point that clients can contribute to. A launch configuration 
-  is a set of attributes describing how to launch a program. The launching of 
-  an application is performed by an associated implementation of a launch configuration 
-  delegate, contributed by each launch configuration type extension.</p>
-<p>A launch configuration may be stored as a file in the worksapce (and shared 
-  in a repository via standard team mechanisms), or may be stored locally, essentially 
-  making the launch configuration private for a single user.</p>
-<h4>New Features in the Debug Platform, Eclipse 3.0</h4>
-<blockquote> 
-  <h4>Extensible Launch Modes</h4>
-  <p>The debug platform supports an extensible set of launch modes. Prior releases 
-    only supported two launch modes - run and debug. The debug platform defines 
-    an extension point for contributing new launch modes (<code>org.eclipse.debug.core.launchModes)</code>, 
-    and contributes three basic launch modes itself: run, debug, and profile. 
-    The launch manager has API to retrieve all launch modes, and a human readable 
-    label for each launch mode.</p>
-  <p>The debug platform has an extension point to support the contribution of 
-    a launch delegate for a specific launch configuration type and launch mode 
-    - <code>org.eclipse.debug.core.launchDelegates</code>. This allows launch 
-    configurations to be extended by third parties, to support new launch modes. 
-    For example, a client could contribute a launch delegate that launches a Java 
-    Application in profile mode (currently, the SDK does not provide a Java profiler).</p>
-  <p>For backwards compatibility, the launch delegate supplied by a launch configuration 
-    type extension is used for the launch modes specified by the launch configuration 
-    type. A launch delegate supplied for a specific mode, is used only for that 
-    mode.</p>
-  <h4>Extensible Debug Events</h4>
-  <p>The debug platform supports an extensible set of debug events. A debug event 
-    kind of <code>MODEL_SPECIFIC</code> has been added to indicate an application 
-    specific debug event. When a debug event of kind <code>MODEL_SPECIFIC</code> 
-    is created, the detail code in the event is client defined. The source of 
-    the event (debug element that generated the event) identifies the debug model 
-    from which the event was generated. The debug platform and user interface 
-    ignores model specific debug events.</p>
-  <p>A data field has been added to debug events to allow clients to store application 
-    specific data in debug events.<br>
-  </p>
-  <h4>Process Factories<br>
-  </h4>
-  <p>The debug platform provides an extension point (<code>org.eclipse.debug.core.processFactories</code>) 
-    for contributing process factories. A process factory can be used to override 
-    default process creation for a launch configuration when the debug plug-in 
-    creates a new process. A launch configuration can specify a process factory 
-    to use when creating a process, via the launch configuration attribute<code> 
-    DebugPlugin.ATTR_PROCESS_FACTORY_ID</code>.</p>
-  <h4>Launch Termination Notification<br>
-  </h4>
-  <p>The debug platform provides a mechanism for launch listeners to be notified 
-    when a launch terminates. A launch is a container of processes and debug targets. 
-    When all of the contained targets and processes terminate, a terminate notification 
-    is sent to those listeners implementing <code>ILaunchesListener2</code>.</p>
-  <h4>Breakpoint Manager Enablement<br>
-  </h4>
-  <p>The breakpoint manager defines the methods <code>setEnabled(boolean)</code> 
-    and <code>isEnabled()</code>. When the breakpoint manager is disabled, debuggers 
-    should ignore all registered breakpoints. The debug platform also provides 
-    a new listener mechanism, <code>IBreakpointManagerListener</code> which allows 
-    clients to register with the breakpoint manager to be notified when its enablement 
-    changes.</p>
-</blockquote>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupDirector.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupDirector.java
deleted file mode 100644
index 98224ac..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupDirector.java
+++ /dev/null
@@ -1,746 +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
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 88232
- *******************************************************************************/
-package org.eclipse.debug.core.sourcelookup;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationListener;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Directs source lookup among a collection of source lookup participants,
- * and a common collection of source containers.
- * Each source lookup participant is a source locator itself, which allows
- * more than one source locator to participate in source lookup for a
- * launch. Each source lookup participant searches for source in the source
- * containers managed by this director, and each participant is notified
- * of changes in the source containers (i.e. when the set of source
- * containers changes).
- * <p>
- * When a source director is initialized, it adds it self as a launch listener,
- * and automatically disposes itself when its associated launch is removed
- * from the launch manager. If a source director is instantiated by a client
- * that is not part of a launch, that client is responsible for disposing
- * the source director.
- * </p>
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.0
- * @see org.eclipse.debug.core.model.ISourceLocator
- * @see org.eclipse.debug.core.sourcelookup.ISourceContainer
- * @see org.eclipse.debug.core.sourcelookup.ISourceContainerType
- * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputer
- * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant
- */
-public abstract class AbstractSourceLookupDirector implements ISourceLookupDirector, ILaunchConfigurationListener, ILaunchListener {
-	
-	// source locator type identifier
-	protected String fId;
-	//ISourceLocatorParticipants that are listening for container changes
-	protected ArrayList fParticipants = new ArrayList();
-	//list of current source containers
-	protected ISourceContainer[] fSourceContainers = null;
-	//the launch config associated with this director
-	protected ILaunchConfiguration fConfig; 
-	//whether duplicates should be searched for or not
-	protected boolean fDuplicates = false;
-	// source path computer, or null if default
-	protected ISourcePathComputer fComputer = null;
-	/**
-	 * Cache of resolved source elements when duplicates exist.
-	 * Keys are the duplicates, values are the source element to use.
-	 */
-	protected Map fResolvedElements = null;
-	
-	protected static final IStatus fPromptStatus = new Status(IStatus.INFO, "org.eclipse.debug.ui", 200, "", null);  //$NON-NLS-1$//$NON-NLS-2$
-	protected static final IStatus fResolveDuplicatesStatus = new Status(IStatus.INFO, "org.eclipse.debug.ui", 205, "", null);  //$NON-NLS-1$//$NON-NLS-2$
-	
-	// XML nodes & attributes for persistence
-	protected static final String DIRECTOR_ROOT_NODE = "sourceLookupDirector"; //$NON-NLS-1$
-	protected static final String CONTAINERS_NODE = "sourceContainers"; //$NON-NLS-1$
-	protected static final String DUPLICATES_ATTR = "duplicates"; //$NON-NLS-1$
-	protected static final String CONTAINER_NODE = "container"; //$NON-NLS-1$
-	protected static final String CONTAINER_TYPE_ATTR = "typeId"; //$NON-NLS-1$
-	protected static final String CONTAINER_MEMENTO_ATTR = "memento"; //$NON-NLS-1$
-	  
-	class SourceLookupQuery implements ISafeRunnable {
-		
-		private List fSourceElements = new ArrayList();
-		private Object fElement = null;
-		private Throwable fException = null;
-		
-		SourceLookupQuery(Object element) {
-			fElement = element;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			fException = exception;
-		}
-		
-		/**
-		 * Returns any exception that occurred during source lookup.
-		 * 
-		 * @return the (any) exception that occured during source lookup
-		 */
-		public Throwable getException() {
-			return fException;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			MultiStatus multiStatus = null;
-			CoreException single = null;
-			ISourceLookupParticipant[] participants = getParticipants();
-			for(int i=0; i < participants.length; i++) {
-				Object[] sourceArray;
-				try {
-					sourceArray = participants[i].findSourceElements(fElement);
-					if (sourceArray !=null && sourceArray.length > 0) {
-						if (isFindDuplicates()) {
-							for(int j=0; j<sourceArray.length; j++)
-								if(!checkDuplicate(sourceArray[j], fSourceElements))
-									fSourceElements.add(sourceArray[j]);
-						} else {
-							fSourceElements.add(sourceArray[0]);
-							return;
-						}
-					}
-				} catch (CoreException e) {
-					if (single == null) {
-						single = e;
-					} else if (multiStatus == null) {
-						multiStatus = new MultiStatus(DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, new IStatus[]{single.getStatus()}, SourceLookupMessages.Source_Lookup_Error, null); 
-						multiStatus.add(e.getStatus());
-					} else {
-						multiStatus.add(e.getStatus());
-					}
-				}
-			}	
-			if (fSourceElements.isEmpty()) {
-				// set exception if there was one
-				if (multiStatus != null) {
-					fException = new CoreException(multiStatus);
-				} else if (single != null) {
-					fException = single;
-				}
-			}
-		}
-		
-		public List getSourceElements() {
-			return fSourceElements;
-		}
-
-		public void dispose() {
-			fElement = null;
-			fSourceElements = null;
-			fException = null;
-		}
-		
-	}
-	
-	/**
-	 * Constructs source lookup director
-	 */
-	public AbstractSourceLookupDirector() {
-	}
-	
-	/**
-	 * Sets the type identifier for this source locator's type
-	 *  
-	 * @param id corresponds to source locator type identifier for a
-	 *  persistable source locator 
-	 */
-	public void setId(String id) {
-		fId = id;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.IPersistableSourceLocator2#dispose()
-	 */
-	public synchronized void dispose() {
-		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-		launchManager.removeLaunchConfigurationListener(this);
-		launchManager.removeLaunchListener(this);
-		Iterator iterator = fParticipants.iterator();
-		while (iterator.hasNext()) {
-			ISourceLookupParticipant participant = (ISourceLookupParticipant) iterator.next();
-			//director may also be a participant
-			if(participant != this)
-				participant.dispose();
-		}
-		fParticipants.clear();
-		if (fSourceContainers != null) {
-			for (int i = 0; i < fSourceContainers.length; i++) {
-				fSourceContainers[i].dispose();
-			}
-		}
-		fSourceContainers = null;
-		fResolvedElements = null;
-	}
-	
-	/**
-	 * Throws an exception with the given message and underlying exception.
-	 * 
-	 * @param message error message
-	 * @param exception underlying exception, or <code>null</code>
-	 * @throws CoreException
-	 */
-	protected void abort(String message, Throwable exception) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, message, exception);
-		throw new CoreException(status);
-	}
-	
-	/**
-	 * Constructs source containers from a list of container mementos.
-	 * 
-	 * @param list the list of nodes to be parsed
-	 * @exception CoreException if parsing encounters an error
-	 * @return a list of source containers
-	 */
-	private List parseSourceContainers(NodeList list) throws CoreException {
-		List containers = new ArrayList();
-		for (int i=0; i < list.getLength(); i++) {
-			if(!(list.item(i).getNodeType() == Node.ELEMENT_NODE))
- 				continue;
-			Element element = (Element)list.item(i);
-			String typeId = element.getAttribute(CONTAINER_TYPE_ATTR);
-			if (typeId == null || typeId.equals("")) {	 //$NON-NLS-1$
-				abort(SourceLookupMessages.AbstractSourceLookupDirector_11, null); 
-			}
-			ISourceContainerType type = DebugPlugin.getDefault().getLaunchManager().getSourceContainerType(typeId);
-			if(type == null) {
-				abort(MessageFormat.format(SourceLookupMessages.AbstractSourceLookupDirector_12, new String[]{typeId}), null); 
-			}			
-			String memento = element.getAttribute(CONTAINER_MEMENTO_ATTR);
-			if (memento == null || memento.equals("")) {	 //$NON-NLS-1$
-				abort(SourceLookupMessages.AbstractSourceLookupDirector_13, null); 
-			}
-			ISourceContainer container = type.createSourceContainer(memento);
-			containers.add(container);
-		}	
-		return containers;
-	}
-	
-	/**
-	 * Registers the given source lookup participant. Has no effect if an identical
-	 * participant is already registered. Participants receive notification
-	 * when the source containers associated with this source director change. 
-	 * 
-	 * @param participant the participant to register
-	 */
-	private synchronized void addSourceLookupParticipant(ISourceLookupParticipant participant) {
-		if (!fParticipants.contains(participant)) {
-			fParticipants.add(participant);
-			participant.init(this);
-		}	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#getSourceContainers()
-	 */
-	public synchronized ISourceContainer[] getSourceContainers() {
-		if (fSourceContainers == null) {
-			return new ISourceContainer[0];
-		}
-		ISourceContainer[] copy = new ISourceContainer[fSourceContainers.length];
-		System.arraycopy(fSourceContainers, 0, copy, 0, fSourceContainers.length);
-		return copy;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#isFindDuplicates()
-	 */
-	public boolean isFindDuplicates() {			
-		return fDuplicates;			
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#setFindDuplicates(boolean)
-	 */
-	public void setFindDuplicates(boolean duplicates) {			
-		fDuplicates = duplicates;			
-	}	
-	
-	/**
-	 * Removes the given participant from the list of registered participants.
-	 * Has no effect if an identical participant is not already registered.
-	 * 
-	 * @param participant the participant to remove
-	 */
-	private synchronized void removeSourceLookupParticipant(ISourceLookupParticipant participant) {
-		if (fParticipants.remove(participant)) {
-			participant.dispose();
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationAdded(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationAdded(ILaunchConfiguration configuration) {
-		ILaunchConfiguration from = DebugPlugin.getDefault().getLaunchManager().getMovedFrom(configuration);
-		if (from != null && from.equals(getLaunchConfiguration())) {
-			fConfig = configuration;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * 
-	 * Updates source containers in response to changes in underlying launch
-	 * configuration. Only responds to changes in non-working copies.
-	 * 
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationChanged(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationChanged(ILaunchConfiguration configuration) {
-		if (fConfig == null || configuration.isWorkingCopy()) {
-			return;
-		}
-		if(fConfig.equals(configuration)) {
-			try{
-				String locatorMemento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO,(String)null);
-				if (locatorMemento == null) {
-					initializeDefaults(configuration);
-				} else {
-					initializeFromMemento(locatorMemento, configuration);
-				}
-			} catch (CoreException e){
-			}
-		}
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationRemoved(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationRemoved(ILaunchConfiguration configuration) {
-		if (configuration.equals(getLaunchConfiguration())) {
-			if (DebugPlugin.getDefault().getLaunchManager().getMovedTo(configuration) == null) {
-				fConfig = null;
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
-	 */
-	public synchronized String getMemento() throws CoreException {
-		Document doc = DebugPlugin.newDocument();
-		Element rootNode = doc.createElement(DIRECTOR_ROOT_NODE);
-		doc.appendChild(rootNode);
-				
-		Element pathNode = doc.createElement(CONTAINERS_NODE);		
-		if(fDuplicates) {
-			pathNode.setAttribute(DUPLICATES_ATTR, "true"); //$NON-NLS-1$
-		} else {
-			pathNode.setAttribute(DUPLICATES_ATTR, "false"); //$NON-NLS-1$
-		}
-		rootNode.appendChild(pathNode);
-		if(fSourceContainers !=null){
-			for(int i=0; i<fSourceContainers.length; i++){
-				Element node = doc.createElement(CONTAINER_NODE);
-				ISourceContainer container = fSourceContainers[i];
-				ISourceContainerType type = container.getType();
-				node.setAttribute(CONTAINER_TYPE_ATTR, type.getId());
-				node.setAttribute(CONTAINER_MEMENTO_ATTR, type.getMemento(container));
-				pathNode.appendChild(node);
-			}
-		}
-		return DebugPlugin.serializeDocument(doc);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(java.lang.String)
-	 */
-	public void initializeFromMemento(String memento) throws CoreException {
-	    doInitializeFromMemento(memento, true);
-	}
-	
-	/**
-	 * Initializes this source lookup director from the given memento.
-	 * Disposes itself before initialization if specified.
-	 * 
-	 * @param memento source locator memento
-	 * @param dispose whether to dispose any current source containers and participants
-	 *  before initializing
-	 * @throws CoreException if an exception occurs during initialization
-	 * @since 3.1
-	 */
-	protected void doInitializeFromMemento(String memento, boolean dispose) throws CoreException {
-	    if (dispose) {
-	        dispose();
-	    }
-		Element rootElement = DebugPlugin.parseDocument(memento);		
-		if (!rootElement.getNodeName().equalsIgnoreCase(DIRECTOR_ROOT_NODE)) { 
-			abort(SourceLookupMessages.AbstractSourceLookupDirector_14, null); 
-		}
-		NodeList list = rootElement.getChildNodes();
-		int length = list.getLength();
-		for (int i = 0; i < length; ++i) {
-			Node node = list.item(i);
-			short type = node.getNodeType();
-			if (type == Node.ELEMENT_NODE) {
-				Element entry = (Element) node;
-				if(entry.getNodeName().equalsIgnoreCase(CONTAINERS_NODE)){
-					setFindDuplicates("true".equals(entry.getAttribute(DUPLICATES_ATTR))); //$NON-NLS-1$
-					NodeList children = entry.getChildNodes();
-					List containers = parseSourceContainers(children);
-					setSourceContainers((ISourceContainer[]) containers.toArray(new ISourceContainer[containers.size()]));
-				}
-			}
-		}
-		initializeParticipants();
-	}	
-	
-	/**
-	 * Sets the source containers used by this source lookup
-	 * director.
-	 * 
-	 * @param containers source containers to search
-	 */
-	public void setSourceContainers(ISourceContainer[] containers) {
-		synchronized (this) {
-			List list = Arrays.asList( containers );
-			ISourceContainer[] old = getSourceContainers();
-			for (int i = 0; i < old.length; i++) {
-				// skip overlapping containers
-				if (!list.contains(old[i]))
-					old[i].dispose();
-			}
-			fSourceContainers = containers;
-			for (int i = 0; i < containers.length; i++) {
-				ISourceContainer container = containers[i];
-				container.init(this);
-			}
-		}
-		// clear resolved duplicates
-		fResolvedElements = null;
-		// notify participants
-		ISourceLookupParticipant[] participants = getParticipants();
-		for (int i = 0; i < participants.length; i++) {
-			ISourceLookupParticipant participant = participants[i];
-			participant.sourceContainersChanged(this);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
-	 * Would be better to accept Object so this can be used for breakpoints and other objects.
-	 */
-	public Object getSourceElement(IStackFrame stackFrame) {
-		return getSourceElement((Object)stackFrame);
-	}
-	
-	/**
-	 * Performs a source lookup query for the given element
-	 * returning the source elements associated with the element.
-	 * 
-	 * @param element stack frame
-	 * @return list of associated source elements
-	 */
-	protected List doSourceLookup(Object element) {
-		SourceLookupQuery query = new SourceLookupQuery(element);
-		SafeRunner.run(query);
-		List sources = query.getSourceElements();
-		query.dispose();
-		return sources;
-	}
-	
-	/**
-	 * Returns the source element to associate with the given element.
-	 * This method is called when more than one source element has been found
-	 * for an element, and allows the source director to select a single
-	 * source element to associate with the element.
-	 * <p>
-	 * Subclasses should override this method as appropriate. For example,
-	 * to prompt the user to choose a source element.
-	 * </p>
-	 * @param element the debug artifact for which source is being searched for
-	 * @param sources the source elements found for the given element
-	 * @return a single source element for the given element
-	 */
-	public Object resolveSourceElement(Object element, List sources) {
-		// check the duplicates cache first
-		Iterator duplicates = sources.iterator();
-		while (duplicates.hasNext()) {
-			Object dup = duplicates.next();
-			Object resolved = getCachedElement(dup);
-			if (resolved != null) {
-				return resolved;
-			}
-		}
-		// consult a status handler
-		IStatusHandler prompter = DebugPlugin.getDefault().getStatusHandler(fPromptStatus);
-		if (prompter != null) {
-			try {
-				Object result = prompter.handleStatus(fResolveDuplicatesStatus, new Object[]{element, sources});
-				if (result != null) {
-					cacheResolvedElement(sources, result);
-					return result;
-				}
-			} catch (CoreException e) {
-			}
-		}
-		return sources.get(0);
-	}
-
-	/**
-	 * Checks if the object being added to the list of sources is a duplicate of what's already in the list
-	 * @param sourceToAdd the new source file to be added 
-	 * @param sources the list that the source will be compared against
-	 * @return true if it is already in the list, false if it is a new object
-	 */
-	private boolean checkDuplicate(Object sourceToAdd, List sources){
-		if(sources.size() == 0)
-			return false;
-		Iterator iterator = sources.iterator();
-		while(iterator.hasNext())
-			if(iterator.next().equals(sourceToAdd))
-				return true;
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.IPersistableSourceLocator2#initializeFromMemento(java.lang.String, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFromMemento(String memento, ILaunchConfiguration configuration) throws CoreException {
-	    dispose();
-		setLaunchConfiguration(configuration);
-		doInitializeFromMemento(memento, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeDefaults(ILaunchConfiguration configuration) throws CoreException {
-		dispose();
-		setLaunchConfiguration(configuration);
-		setSourceContainers(new ISourceContainer[]{new DefaultSourceContainer()});
-		initializeParticipants();
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#getLaunchConfiguration()
-	 */
-	public ILaunchConfiguration getLaunchConfiguration() {
-		return fConfig;
-	}
-	
-	/**
-	 * Sets the launch configuration associated with this source lookup
-	 * director. If the given configuration is a working copy, this director
-	 * will respond to changes the working copy. If the given configuration
-	 * is a persisted launch configuration, this director will respond to changes
-	 * in the persisted launch configuration.
-	 * 
-	 * @param configuration launch configuration to associate with this
-	 *  source lookup director, or <code>null</code> if none
-	 */
-	protected void setLaunchConfiguration(ILaunchConfiguration configuration) {
-		fConfig = configuration;
-		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-		launchManager.addLaunchConfigurationListener(this);
-		launchManager.addLaunchListener(this);		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {
-		if (this.equals(launch.getSourceLocator())) {
-			dispose();
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#getParticipants()
-	 */
-	public synchronized ISourceLookupParticipant[] getParticipants() {
-		return (ISourceLookupParticipant[]) fParticipants.toArray(new ISourceLookupParticipant[fParticipants.size()]);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#supportsSourceContainerType(org.eclipse.debug.core.sourcelookup.ISourceContainerType)
-	 */
-	public boolean supportsSourceContainerType(ISourceContainerType type) {
-		return true;
-	}
-	
-	/**
-	 * Caches the resolved source element to use when one of the following
-	 * duplicates is found.
-	 * 
-	 * @param duplicates duplicates source elements
-	 * @param sourceElement chosen source element to use in place of the
-	 *  duplicates
-	 */
-	protected void cacheResolvedElement(List duplicates, Object sourceElement) {
-		if (fResolvedElements == null) {
-			fResolvedElements = new HashMap(10);
-		}
-		Iterator iterator = duplicates.iterator();
-		while (iterator.hasNext()) {
-			Object dup = iterator.next();
-			fResolvedElements.put(dup, sourceElement);
-		}
-		
-	}
-	
-	/**
-	 * Returns the cached source element to use when the given duplicate
-	 * is encountered.
-	 * 
-	 * @param duplicate duplicates source element
-	 * @return element to use in the duplicate's place
-	 */
-	protected Object getCachedElement(Object duplicate) {
-		if (fResolvedElements != null) {
-			return fResolvedElements.get(duplicate);
-		}
-		return null;
-	}
-	
-	/**
-	 * Clears any cached source element associated with the given duplicate
-	 * is source element.
-	 * 
-	 * @param duplicate duplicate source element to cache resolved results
-	 *  for
-	 */
-	protected void clearCachedElement(Object duplicate) {
-		if (fResolvedElements != null) {
-			fResolvedElements.remove(duplicate);
-		}
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#clearSourceElements(java.lang.Object)
-	 */
-	public void clearSourceElements(Object element) {
-		List list = doSourceLookup(element);
-		if (list.size() > 0) {
-			Iterator iterator = list.iterator();
-			while (iterator.hasNext()) {
-				clearCachedElement(iterator.next());
-			}
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#addParticipants(org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant[])
-	 */
-	public void addParticipants(ISourceLookupParticipant[] participants) {
-		for (int i = 0; i < participants.length; i++) {
-			ISourceLookupParticipant participant = participants[i];
-			addSourceLookupParticipant(participant);
-			participant.sourceContainersChanged(this);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#removeParticipants(org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant[])
-	 */
-	public void removeParticipants(ISourceLookupParticipant[] participants) {
-		for (int i = 0; i < participants.length; i++) {
-			removeSourceLookupParticipant(participants[i]);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#getId()
-	 */
-	public String getId() {
-		return fId;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#getSourcePathComputer()
-	 */
-	public ISourcePathComputer getSourcePathComputer() {
-		if (fComputer == null && getLaunchConfiguration() != null) {
-			try {
-				return DebugPlugin.getDefault().getLaunchManager().getSourcePathComputer(getLaunchConfiguration());
-			} catch (CoreException e) {
-			}
-		}
-		return fComputer;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#setSourcePathComputer(org.eclipse.debug.core.sourcelookup.ISourcePathComputer)
-	 */
-	public void setSourcePathComputer(ISourcePathComputer computer) {
-		fComputer = computer;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#findSourceElements(java.lang.Object)
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException {
-		SourceLookupQuery query = new SourceLookupQuery(object);
-		SafeRunner.run(query);
-		List sources = query.getSourceElements();
-		Throwable exception = query.getException();
-		query.dispose();
-		if (exception != null && sources.isEmpty()) {
-			if (exception instanceof CoreException) {
-				throw (CoreException)exception;
-			}
-			abort(SourceLookupMessages.AbstractSourceLookupDirector_10, exception);
-		}
-		return sources.toArray();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#getSourceElement(java.lang.Object)
-	 */
-	public Object getSourceElement(Object element) {
-		List sources = doSourceLookup(element);
-		if(sources.size() == 1) {
-			return sources.get(0);
-		} else if(sources.size() > 1) {
-			return resolveSourceElement(element, sources);
-		} else { 
-			return null;
-		}
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.java
deleted file mode 100644
index e808896..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/AbstractSourceLookupParticipant.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
- *******************************************************************************/
-package org.eclipse.debug.core.sourcelookup;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-
-
-/**
- * Common super class for implementations of source lookup participants.
- * <p>
- * Clients implementing source lookup participants should subclass this class.
- * </p>
- * @since 3.0
- */
-public abstract class AbstractSourceLookupParticipant implements ISourceLookupParticipant {
-	
-	private ISourceLookupDirector fDirector;
-	
-	protected static final Object[] EMPTY = new Object[0]; 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#init(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
-	 */
-	public void init(ISourceLookupDirector director) {
-		fDirector = director;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#dispose()
-	 */
-	public void dispose() {
-		fDirector = null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#findSourceElements(java.lang.Object)
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException {
-		List results = null;
-		CoreException single = null;
-		MultiStatus multiStatus = null;
-		if (isFindDuplicates()) {
-			results = new ArrayList();
-		}
-		String name = getSourceName(object);
-		if (name != null) {
-			ISourceContainer[] containers = getSourceContainers();
-			for (int i = 0; i < containers.length; i++) {
-				try {
-					ISourceContainer container = getDelegateContainer(containers[i]);
-					if (container != null) {
-						Object[] objects = container.findSourceElements(name);
-						if (objects.length > 0) {
-							if (isFindDuplicates()) {
-								for (int j = 0; j < objects.length; j++) {
-									results.add(objects[j]);
-								}
-							} else {
-								if (objects.length == 1) {
-									return objects;
-								} 
-								return new Object[]{objects[0]};
-							}
-						}
-					}
-				} catch (CoreException e) {
-					if (single == null) {
-						single = e;
-					} else if (multiStatus == null) {
-						multiStatus = new MultiStatus(DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, new IStatus[]{single.getStatus()}, SourceLookupMessages.Source_Lookup_Error, null);  //$NON-NLS-1$
-						multiStatus.add(e.getStatus());
-					} else {
-						multiStatus.add(e.getStatus());
-					}
-				}
-			}
-		}
-		if (results == null) {
-			if (multiStatus != null) {
-				throw new CoreException(multiStatus);
-			} else if (single != null) {
-				throw single;
-			}
-			return EMPTY;
-		}
-		return results.toArray();
-	}	
-	
-	/**
-	 * Returns the source container to search in place of the given source
-	 * container, or <code>null</code> if the given source container is not
-	 * to be searched. The default implementation does not translate source
-	 * containers. Subclasses should override if required.
-	 *  
-	 * @param container the source container about to be searched (proxy)
-	 * @return the source container to be searched (delegate), or <code>null</code>
-	 * 	if the source container should not be searched
-	 */
-	protected ISourceContainer getDelegateContainer(ISourceContainer container) {
-		return container;
-	}
-	
-	/**
-	 * Returns the source lookup director this participant is registered with
-	 * or <code>null</code> if none.
-	 * 
-	 * @return the source lookup director this participant is registered with
-	 *  or <code>null</code> if none
-	 */
-	protected ISourceLookupDirector getDirector() {
-		return fDirector;
-	}
-	
-	/**
-	 * Returns whether this participant's source lookup director is configured
-	 * to search for duplicate source elements.
-	 * 
-	 * @return whether this participant's source lookup director is configured
-	 * to search for duplicate source elements
-	 */
-	protected boolean isFindDuplicates() {
-		ISourceLookupDirector director = getDirector();
-		if (director != null) {
-			return director.isFindDuplicates();
-		}
-		return false;
-	}	
-	
-	/**
-	 * Returns the source containers currently registered with this participant's
-	 * source lookup director.
-	 * 
-	 * @return the source containers currently registered with this participant's
-	 * source lookup director
-	 */
-	protected ISourceContainer[] getSourceContainers() {
-		ISourceLookupDirector director = getDirector();
-		if (director != null) {
-			return director.getSourceContainers();
-		}
-		return new ISourceContainer[0];
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#sourceContainersChanged(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
-	 */
-	public void sourceContainersChanged(ISourceLookupDirector director) {
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/IPersistableSourceLocator2.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/IPersistableSourceLocator2.java
deleted file mode 100644
index f30b971..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/IPersistableSourceLocator2.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.debug.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IPersistableSourceLocator;
-
-/**
- * Extensions to the <code>IPersistableSourceLocator</code> interface.
- * <p>
- * Clients may optionally implement this interface when implementing an
- * {@link org.eclipse.debug.core.model.IPersistableSourceLocator}.
- * </p>
- * @see org.eclipse.debug.core.model.IPersistableSourceLocator
- * @since 3.0 
- */
-public interface IPersistableSourceLocator2 extends IPersistableSourceLocator {
-
-	/**
-	 * Initializes this source locator based on the given
-	 * memento, for the given launch configuration. This method
-	 * is called instead of <code>initializeFrom(String memento)</code>
-	 * defined in <code>IPersistableSourceLocator</code> when a source
-	 * locator implements this interface.
-	 * 
-	 * @param memento a memento to initialize this source locator
-	 * @param configuration the launch configuration this source locator is
-	 *  being created for
-	 * @exception CoreException on failure to initialize 
-	 */
-	public void initializeFromMemento(String memento, ILaunchConfiguration configuration) throws CoreException;
-	
-	/**
-	 * Disposes this source locator. This method is called when a source
-	 * locator's associated launch is removed from the launch manager.
-	 */
-	public void dispose();
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainer.java
deleted file mode 100644
index ed721bd..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainer.java
+++ /dev/null
@@ -1,108 +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.debug.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * A source container is a container of source code. A source container is
- * capable of searching for source elements by name. For example, a source
- * container may be a project or a directory capable of searching for files
- * by name. A source container may be a composite container - i.e. contain
- * other source containers.
- * <p>
- * When a source container is created and added to a source director, the
- * source container's <code>dispose()</code> method is called when the
- * source director is disposed. Clients creating source containers for other
- * purposes must dispose of containers themselves.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see ISourceLookupParticipant
- * @see ISourceContainerType
- * @since 3.0
- */
-public interface ISourceContainer extends IAdaptable {
-	
-	/**
-	 * Notification this source container has been added to the given
-	 * source lookup director.
-	 * 
-	 * @param director the director this container has been added to
-	 */
-	public void init(ISourceLookupDirector director);
-
-	/**
-	 * Returns a collection of source elements in this container corresponding to the
-	 * given name. Returns an empty collection if no source elements are found.
-	 * This source container's source lookup director specifies if duplicate
-	 * source elements should be searched for, via <code>isFindDuplicates()</code>.
-	 * When <code>false</code> the returned collection should contain at most one
-	 * source element. If this is a composite container, the containers contained
-	 * by this container are also searched.
-	 * <p>
-	 * The format of the given name is implementation specific but generally conforms
-	 * to the format of a file name. If a source container does not recognize the
-	 * name format provided, an empty collection should be returned. A source container
-	 * may or may not require names to be fully qualified (i.e. be qualified with directory
-	 * names).
-	 * </p>
-	 * @param name the name of the source element to search for
-	 * @return a collection of source elements corresponding to the given name
-	 * @exception CoreException if an exception occurs while searching for source elements
-	 */
-	public Object[] findSourceElements(String name) throws CoreException;
-
-	/**
-	 * The name of this source container that can be used for presentation purposes.
-	 * For example, the name of a project.
-	 *  
-	 * @return the name of this source container
-	 */
-	public String getName();
-
-	/**
-	 * Returns the source containers this container is composed of. An empty
-	 * collection is returned if this container is not a composite container.
-	 * For example, a workspace source container may be composed of project source
-	 * containers.
-	 * 
-	 * @return the source containers this container is composed of, possibly
-	 *  an empty collection
-	 * @exception CoreException if unable to retrieve source containers
-	 */
-	public ISourceContainer[] getSourceContainers() throws CoreException;
-
-	/**
-	 * Returns whether this container is a composite container. A composite
-	 * container is composed of other source containers. For example, a workspace
-	 * source container may be composed of project source containers.
-	 * 
-	 * @return whether this container is a composite container
-	 */ 	
-	public boolean isComposite();
-	
-	/**
-	 * Returns this container's type.
-	 * 
-	 * @return this container's type 
-	 */
-	public ISourceContainerType getType();
-	
-	/**
-	 * Disposes this source container. This method is called when the source
-	 * director associated with this source container is disposed.
-	 */
-	public void dispose();
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainerType.java
deleted file mode 100644
index 50095f4..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainerType.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.debug.core.sourcelookup;
-
-
-
-/**
- * A source container type represents a kind of container of source code.
- * For example, a source container type may be a project or a directory. A specific
- * project or directory is represented by an instance of a source container type,
- * which is called a source container (<code>ISourceContainer</code>).
- * <p>
- * A source container type is contributed via the <code>sourceContainerTypes</code>
- * extension point, providing a delegate to the work specific to the contributed
- * type. Following is an example contribution.
- * <pre>
- * &lt;extension point=&quot;org.eclipse.debug.core.sourceContainerTypes&quot;&gt;
- * 	&lt;sourceContainerType
- * 		name=&quot;Project&quot;
- * 		class=&quot;org.eclipse.debug.internal.core.sourcelookup.containers.ProjectSourceContainerType&quot;
- * 		id=&quot;org.eclipse.debug.core.containerType.project&quot;
- * 		description=&quot;A project in the workspace&quot;&gt;
- * 	&lt;/sourceContainerType&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * Clients are not intended to implement this interface. Instead, clients contributing
- * a source container type implement {@link org.eclipse.debug.core.sourcelookup.ISourceContainerTypeDelegate}.
- * </p>
- * @see org.eclipse.debug.core.sourcelookup.ISourceContainer
- * @see org.eclipse.debug.core.sourcelookup.ISourceContainerTypeDelegate
- * @since 3.0
- */
-public interface ISourceContainerType extends ISourceContainerTypeDelegate {
-
-	/**
-	 * Returns the name of this source container type that can be used for
-	 * presentation purposes. For example, <code>Working Set</code> or
-	 * <code>Project</code>.  The value returned is
-	 * identical to the name specified in plugin.xml by the <code>name</code>
-	 * attribute.
-	 * 
-	 * @return the name of this source container type
-	 */
-	public String getName();
-
-	/**
-	 * Returns the unique identifier associated with this source container type.
-	 * The value returned is identical to the identifier specified in plugin.xml by
-	 * the <code>id</code> attribute.
-	 * 
-	 * @return the unique identifier associated with this source container type
-	 */
-	public String getId();
-	
-	/**
-	 * Returns a short description of this source container type that can be used
-	 * for presentation purposes, or <code>null</code> if none.
-	 * 
-	 * @return a short description of this source container type, or <code>null</code>
-	 */
-	public String getDescription();
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainerTypeDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainerTypeDelegate.java
deleted file mode 100644
index d8c9448..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceContainerTypeDelegate.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.debug.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A source container type delegate represents a kind of container of source code.
- * For example, a source container type may be a project or a directory. A specific
- * project or directory is represented by an instance of a source container type,
- * which is called a source container (<code>ISourceContainer</code>).
- * <p>
- * A source container type delegate is contributed via the
- * <code>sourceContainerTypes</code> extension point.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p> 
- * @see org.eclipse.debug.core.sourcelookup.ISourceContainer
- * @see org.eclipse.debug.core.sourcelookup.ISourceContainerType
- * @since 3.0
- */
-public interface ISourceContainerTypeDelegate {
-
-	/**
-	 * Creates and returns a new source container of this type
-	 * corresponding to the given memento.
-	 * 
-	 * @param memento a memento for a source container of this source container type
-	 * @return a source container corresponding to the given memento
-	 * @exception CoreException if unable to construct a source container based
-	 *  on the given memento
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException;
-	
-	/**
-	 * Constructs and returns a memento for the given source container. A memento
-	 * can be used to reconstruct a source container.
-	 * 
-	 * @param container The container for which a memento should be created. The
-	 *  container must of this source container type.
-	 * @return a memento for the source container
-	 * @exception CoreException if unable to create a memento
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException;
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceLookupDirector.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceLookupDirector.java
deleted file mode 100644
index 5eb4596..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceLookupDirector.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.debug.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * A source lookup director directs the source lookup process
- * among a set of participants and source containers.
- * <p>
- * Clients may implement this interface. An abstract implementation
- * is provided by <code>AbstractSourceLookupDirector</code>, which
- * clients should subclass.
- * </p>
- * @since 3.0
- */
-public interface ISourceLookupDirector extends IPersistableSourceLocator2 {
-	
-	/**
-	 * Returns the launch configuration associated with this source 
-	 * lookup director, or <code>null</code> if none.
-	 * 
-	 * @return the launch configuration associated with this source 
-	 * lookup director, or <code>null</code> if none
-	 */
-	public ILaunchConfiguration getLaunchConfiguration();
-	
-	/**
-	 * Returns the source lookup participants currently registered with
-	 * this director, possibly an empty collection.
-	 * 
-	 * @return the source lookup participants currently registered with
-	 * this director, possibly an empty collection
-	 */
-	public ISourceLookupParticipant[] getParticipants();
-	
-	/**
-	 * Returns the source containers currently registered with this 
-	 * director, possibly an empty collection.
-	 * 
-	 * @return the source containers currently registered with this 
-	 * director, possibly an empty collection
-	 */
-	public ISourceContainer[] getSourceContainers();
-	
-	/**
-	 * Sets the source containers this source lookup director
-	 * should search when looking for source, possibly an empty collection.
-	 * 
-	 * @param containers the source containers this source lookup director
-	 * should search when looking for source, possibly an empty collection
-	 */
-	public void setSourceContainers(ISourceContainer[] containers);	
-	
-	/**
-	 * Returns whether to search exhaustively for all source elements
-	 * with the same name in all registered source containers, or
-	 * whether to stop searching when the first source element matching
-	 * the required name is found.
-	 * 
-	 * @return whether to search exhaustively for all source elements
-	 * with the same name
-	 */
-	public boolean isFindDuplicates();
-	
-	/**
-	 * Sets whether to search exhaustively for all source elements
-	 * with the same name in all registered source containers, or
-	 * whether to stop searching when the first source element matching
-	 * the required name is found.
-	 * 
-	 * @param findDuplicates whether to search exhaustively for all source elements
-	 * with the same name
-	 */
-	public void setFindDuplicates(boolean findDuplicates);	
-	
-	/**
-	 * Notifies this source lookup director that it should initialize
-	 * its set of source lookup participants.
-	 */
-	public void initializeParticipants();
-	
-	/**
-	 * Returns whether this source director supports the given type
-	 * of source location. 
-	 * 
-	 * @param type source container type
-	 * @return whether this source director supports the given type
-	 * of source location
-	 */
-	public boolean supportsSourceContainerType(ISourceContainerType type);
-	
-	/**
-	 * Clears any source lookup results associated with the given
-	 * debug artifact, such that a subsequent lookup will force a new search
-	 * to be performed.
-	 *  
-	 * @param element debug artifact to clear source lookup results for
-	 */
-	public void clearSourceElements(Object element);
-	
-	/**
-	 * Adds the given source lookup participants to this director.
-	 * 
-	 * @param participants participants to add
-	 */
-	public void addParticipants(ISourceLookupParticipant[] participants);
-	
-	/**
-	 * Removes the given source lookup participants from this director.
-	 * 
-	 * @param participants participants to remove
-	 */
-	public void removeParticipants(ISourceLookupParticipant[] participants);
-	
-	/**
-	 * Returns the identifier of this type of source locator.
-	 * 
-	 * @return the identifier of this type of source locator
-	 */
-	public String getId();
-	
-	/**
-	 * Returns the source path computer to use with this source lookup
-	 * director, possibly <code>null</code>. By default, the source path 
-	 * computer returned is the one associated with this director's launch
-	 * configuration's type. However, the source path computer can be specified
-	 * programmatically by calling <code>setSourcePathComputer(...)</code>.
-	 * 
-	 * @return the source path computer to use with this source lookup
-	 *  director, possibly <code>null</code>
-	 */
-	public ISourcePathComputer getSourcePathComputer();
-	
-	/**
-	 * Sets the source path computer for this source lookup director.
-	 * This method can be used to override the default source path computer
-	 * for a launch configuration type. When <code>null</code> is specified
-	 * the default source path computer will be used (i.e. the one associated
-	 * with this director's launch configuration's type).
-	 *  
-	 * @param computer source path computer or <code>null</code>
-	 */
-	public void setSourcePathComputer(ISourcePathComputer computer);
-	
-	/**
-	 * Returns a collection of source elements corresponding to the given debug
-	 * artifact (for example, a stack frame or breakpoint). Returns an empty
-	 * collection if no source elements are found.
-	 * This participant's source lookup director specifies if duplicate
-	 * source elements should be searched for, via <code>isFindDuplicates()</code>.
-	 * When <code>false</code> the returned collection should contain at most one
-	 * source element.
-	 * 
-	 * @param object the debug artifact for which source needs to be found (e.g., stack frame)
-	 * @return a collection of source elements corresponding to the given
-	 *  debug artifact, possibly empty
-	 * @exception CoreException if an exception occurs while searching for source
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException;	
-	
-	/**
-	 * Returns a source element that corresponds to the given debug artifact, or
-	 * <code>null</code> if a source element could not be located. This is a
-	 * generalization of <code>getSourceElement(IStackFrame)</code> to allow
-	 * source to be found for other types of elements.
-	 *
-	 * @param element the debug artifact for which to locate source
-	 * @return an object representing a source element. 
-	 */
-	 public Object getSourceElement(Object element);	
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceLookupParticipant.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceLookupParticipant.java
deleted file mode 100644
index b47d086..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourceLookupParticipant.java
+++ /dev/null
@@ -1,90 +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.debug.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A source lookup participant participates in source lookup by searching an ordered
- * list of source containers for source elements corresponding to a debug artifact.
- * For example, a participant may be asked to find source corresponding to a stack
- * frame or breakpoint. An implementation of a source lookup participant is debug
- * model specific, since it must convert the debug model artifact (stack frame,
- * breakpoint, etc.),  into a source name that can be recognized by a source container
- * (<code>ISourceContainer</code>), to search for source elements. Source containers
- * are generally debug model independent, whereas source lookup participants are
- * debug model specific.  
- * <p>
- * Clients may implement this interface. An abstract implementation is
- * provided by <code>AbstractSourceLookupParticipant</code>, which clients
- * should subclass.
- * </p>
- * @since 3.0
- */
-public interface ISourceLookupParticipant {
-
-	/**
-	 * Notification this participant has been added to the specified
-	 * source lookup director. 
-     *
-	 * @param director the source lookup director that this participant
-	 *  has been added to
-	 */
-	public void init(ISourceLookupDirector director);
-	
-	/**
-	 * Returns a collection of source elements corresponding to the given debug
-	 * artifact (for example, a stack frame or breakpoint). Returns an empty
-	 * collection if no source elements are found.
-	 * This participant's source lookup director specifies if duplicate
-	 * source elements should be searched for, via <code>isFindDuplicates()</code>.
-	 * When <code>false</code> the returned collection should contain at most one
-	 * source element.
-	 * <p>
-	 * If the given debug artifact is not recognized by this participant, an empty
-	 * collection is returned. Otherwise, this participant generates a source name
-	 * from the given artifact and performs a search for associated source elements
-	 * in its source containers.
-	 * </p>
-	 * @param object the debug artifact for which source needs to be found (e.g., stack frame)
-	 * @return a collection of source elements corresponding to the given
-	 *  debug artifact, possibly empty
-	 * @exception CoreException if an exception occurs while searching for source
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException;
-	
-	/**
-	 * Returns the source file name associated with the given debug artifact that
-	 * source needs to be found for, or <code>null</code> if none.
-	 * 
-	 * @param object the debug artifact for which source needs to be found (e.g., stack frame)
-	 * @return the source file name associated with the given debug artifact,
-	 *  or <code>null</code> if none.
-	 * @throws CoreException if unable to determine a source file name 
-	 */
-	public String getSourceName(Object object) throws CoreException;
-
-	/**
-	 * Disposes this source lookup participant. This method is called when
-	 * the source lookup director associated with this participant is 
-	 * disposed.
-	 */
-	public void dispose();
-	
-	/**
-	 * Notification that the source lookup containers in the given source
-	 * lookup director have changed.
-	 * 
-	 * @param director source lookup director that is directing this
-	 * participant
-	 */
-	public void sourceContainersChanged(ISourceLookupDirector director);
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourcePathComputer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourcePathComputer.java
deleted file mode 100644
index 5ac695d..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourcePathComputer.java
+++ /dev/null
@@ -1,64 +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.debug.core.sourcelookup;
-
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * A source path computer computes the default source lookup path (set of source
- * containers that should be considered) for a launch configuration.
- * <p>
- * A source path computer is contributed in plug-in XML via the 
- * <code>sourcePathComputers</code> extension point, that provides a delegate
- * to compute the path specific to a launch configuration. Following
- * is an example contribution.
- * <pre>
- * &lt;extension point=&quot;org.eclipse.debug.core.sourcePathComputers&quot;&gt;
- *    	&lt;sourcePathComputer
- *    		id=&quot;org.eclipse.example.exampleSourcePathComputer&quot;
- *    		class=&quot;org.eclipse.example.SourcePathComputer&quot;&gt;
- *    	&lt;/sourcePathComputer&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p> 
- * <p>
- * A source path computer can be associated with a launch configuration type
- * via the <code>sourcePathComputerId</code> attribute of a launch configuration
- * type extension. As well, a launch configuration can specify its own
- * source path computer to use via the <code>ATTR_SOURCE_PATH_COMPUTER_ID</code>
- * attribute.
- * </p>
- * <p>
- * Clients are not intended to implement this interface. Instead, clients contributing
- * a source path computer provide an implementation of 
- * {@link org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate}.
- * </p>
- * @since 3.0
- */
-public interface ISourcePathComputer extends ISourcePathComputerDelegate {
-	
-	/**
-	 * Launch configuration attribute to specify a source path computer
-	 * that should be used for a launch configuration. The value is an identifier
-	 * of a source path computer extension, or unspecified (<code>null</code>), if the
-	 * default source path computer should be used. A default source path computer
-	 * can be associated with a launch configuration type.
-	 */
-	public static final String ATTR_SOURCE_PATH_COMPUTER_ID = DebugPlugin.getUniqueIdentifier() + ".SOURCE_PATH_COMPUTER_ID"; //$NON-NLS-1$
-
-	/**
-	 * Returns the unique identifier for this source path computer.
-	 * 
-	 * @return the unique identifier for this source path computer
-	 */
-	public String getId();
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourcePathComputerDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourcePathComputerDelegate.java
deleted file mode 100644
index 9d55061..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/ISourcePathComputerDelegate.java
+++ /dev/null
@@ -1,49 +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.debug.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * A source path computer delegate computes the default source lookup path
- * (set of source containers that should be considered) for a launch
- * configuration.
- * <p>
- * A source path computer is contributed in plug-in XML via the 
- * <code>sourcePathComputers</code> extension point, providing a delegate
- * to compute the default source lookup path specific to a launch
- * configuration.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputer
- * @since 3.0
- */
-public interface ISourcePathComputerDelegate {
-	
-	/**
-	 * Returns a default collection source containers to be considered for the
-	 * given launch configuration. The collection returned represents the default
-	 * source lookup path for the given configuration.
-	 * 
-	 * @param configuration the launch configuration for which a default source lookup path
-	 *  is to be computed
-	 * @param monitor a progress monitor to be used in case of long operations
-	 * @return a default collection source containers to be considered for the
-	 *  given launch configuration
-	 * @exception CoreException if unable to compute a default source lookup path
-	 */
-	public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException;
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/AbstractSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/AbstractSourceContainer.java
deleted file mode 100644
index 3237615..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/AbstractSourceContainer.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-
-/**
- * Common function for source containers.
- * <p>
- * Clients implementing source containers should subclass this class.
- * </p>
- * @since 3.0
- */
-public abstract class AbstractSourceContainer extends PlatformObject implements ISourceContainer {
-	
-	public static final Object[] EMPTY = new Object[0];
-	
-	private ISourceLookupDirector fDirector;
-	
-	/**
-	 * Throws an error exception with the given message and underlying exception.
-	 * 
-	 * @param message error message
-	 * @param exception underlying exception, or <code>null</code>
-	 * @throws CoreException
-	 */
-	protected void abort(String message, Throwable exception) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, message, exception);
-		throw new CoreException(status);
-	}
-	
-	/**
-	 * Throws a warning exception with the given message and underlying exception.
-	 * 
-	 * @param message error message
-	 * @param exception underlying exception, or <code>null</code>
-	 * @throws CoreException
-	 * @since 3.3
-	 */	
-	protected void warn(String message, Throwable exception) throws CoreException {
-		IStatus status = new Status(IStatus.WARNING, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, message, exception);
-		throw new CoreException(status);
-	}
-	
-	/* (non-Javadoc)
-	 * 
-	 * By default, do nothing. Subclasses should override as required.
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#dispose()
-	 */
-	public void dispose() {
-		fDirector = null;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getSourceContainers()
-	 */
-	public ISourceContainer[] getSourceContainers() throws CoreException {
-		return new ISourceContainer[0];
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#isComposite()
-	 */
-	public boolean isComposite() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#init(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
-	 */
-	public void init(ISourceLookupDirector director) {
-		fDirector = director;
-	}
-	
-	/**
-	 * Returns the source lookup director this source container registered
-	 * in, or <code>null</code> if none.
-	 * 
-	 * @return the source lookup director this source container registered
-	 * in, or <code>null</code> if none
-	 */
-	protected ISourceLookupDirector getDirector() {
-		return fDirector;
-	}
-	
-	/**
-	 * Returns whether this container's source lookup director is configured
-	 * to search for duplicate source elements.
-	 * 
-	 * @return whether this container's source lookup director is configured
-	 * to search for duplicate source elements
-	 */
-	protected boolean isFindDuplicates() {
-		if (getDirector() != null) {
-			return getDirector().isFindDuplicates();
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns the source container type identified by the given id,
-	 * or <code>null</code> if none.
-	 * 
-	 * @param id source container type identifier
-	 * @return source container type or <code>null</code>
-	 */
-	protected ISourceContainerType getSourceContainerType(String id) {
-		return DebugPlugin.getDefault().getLaunchManager().getSourceContainerType(id);
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/AbstractSourceContainerTypeDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/AbstractSourceContainerTypeDelegate.java
deleted file mode 100644
index 0b0b7b1..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/AbstractSourceContainerTypeDelegate.java
+++ /dev/null
@@ -1,73 +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.debug.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerTypeDelegate;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * Common function for source container type delegates.
- * <p>
- * Clients implementing source container delegates should subclass this class.
- * </p>
- * @since 3.0
- */
-public abstract class AbstractSourceContainerTypeDelegate implements ISourceContainerTypeDelegate {
-	
-	/**
-	 * Throws an exception with the given message and underlying exception.
-	 * 
-	 * @param message error message
-	 * @param exception underlying exception, or <code>null</code>
-	 * @throws CoreException
-	 */
-	protected void abort(String message, Throwable exception) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, message, exception);
-		throw new CoreException(status);
-	}
-	
-	/**
-	 * Creates and returns a new XML document.
-	 * 
-	 * @return a new XML document
-	 * @throws CoreException if unable to create a new document
-	 */
-	protected Document newDocument()throws CoreException {
-		return DebugPlugin.newDocument();
-	}	
-	
-	/**
-	 * Returns the given XML document as a string.
-	 * 
-	 * @param document document to serialize
-	 * @return the given XML document as a string
-	 * @throws CoreException if unable to serialize the document
-	 */
-	protected String serializeDocument(Document document) throws CoreException {
-		return DebugPlugin.serializeDocument(document);
-	}
-
-	/**
-	 * Parses the given XML document, returning its root element.
-	 * 
-	 * @param document XML document as a string
-	 * @return the document's root element
-	 * @throws CoreException if unable to parse the document
-	 */
-	protected Element parseDocument(String document) throws CoreException {
-		return DebugPlugin.parseDocument(document);
-	}	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ArchiveSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ArchiveSourceContainer.java
deleted file mode 100644
index 8df120f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ArchiveSourceContainer.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.debug.core.sourcelookup.containers;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-
-/**
- * Archive source container for an archive in the workspace. Returns instances
- * of <code>ZipEntryStorage</code> as source elements.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class ArchiveSourceContainer extends AbstractSourceContainer {
-	
-	private IFile fFile;
-	private boolean fDetectRoot; 
-	private ExternalArchiveSourceContainer fDelegateContainer;
-	
-	/**
-	 * Unique identifier for the archive source container type
-	 * (value <code>org.eclipse.debug.core.containerType.archive</code>).
-	 */
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.archive";	 //$NON-NLS-1$
-	
-	/**
-	 * Creates an archive source container on the given file. 
-	 * 
-	 * @param archive archive in the workspace
-	 * @param detectRootPath whether a root path should be detected. When
-	 *   <code>true</code>, searching is performed relative to a root path
-	 *   within the archive based on fully qualified file names. The root
-	 *   path is automatically determined when the first successful search
-	 *   is performed. For example, when searching for a file named
-	 *   <code>a/b/c.d</code>, and an entry in the archive named
-	 *   <code>r/a/b/c.d</code> exists, the root path is set to <code>r</code>.
-	 *   From that point on, searching is performed relative to <code>r</code>.
-	 *   When <code>false</code>, searching is performed by
-	 *   matching file names as suffixes to the entries in the archive. 
-	 */
-	public ArchiveSourceContainer(IFile archive, boolean detectRootPath) {
-		fFile = archive;
-		fDetectRoot = detectRootPath;
-		if (archive.exists() && archive.getLocation() != null) {
-		    fDelegateContainer = new ExternalArchiveSourceContainer(archive.getLocation().toOSString(), detectRootPath);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {
-		return fFile.getName();
-	}
-	
-	/**
-	 * Returns the associated file in the workspace.
-	 *  
-	 * @return associated file in the workspace
-	 */
-	public IFile getFile() {
-		return fFile;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return obj instanceof ArchiveSourceContainer &&
-			((ArchiveSourceContainer)obj).getName().equals(getName());
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getName().hashCode();
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
-     */
-    public Object[] findSourceElements(String name) throws CoreException {
-        ExternalArchiveSourceContainer container = getDelegateContainer();
-        if (container != null) {
-            return container.findSourceElements(name);
-        }
-        return EMPTY;
-    }
-    
-    /**
-     * Returns the underlying external archive source container.
-     * 
-     * @return underlying external archive source container
-     * @since 3.0.1.1
-     */
-    private ExternalArchiveSourceContainer getDelegateContainer() {
-        return fDelegateContainer;
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#init(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
-     */
-    public void init(ISourceLookupDirector director) {
-        super.init(director);
-        if (fDelegateContainer != null) {
-            fDelegateContainer.init(director);
-        }
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#dispose()
-     */
-    public void dispose() {
-        super.dispose();
-        if (fDelegateContainer != null) {
-            fDelegateContainer.dispose();
-        }
-    }
-    
-	/**
-	 * Returns whether root paths are automatically detected in this
-	 * archive source container.
-	 *  
-	 * @return whether root paths are automatically detected in this
-	 * archive source container
-	 * @since 3.0.1.1
-	 */
-	public boolean isDetectRoot() {
-		return fDetectRoot;
-	}    
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/CompositeSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/CompositeSourceContainer.java
deleted file mode 100644
index f403073..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/CompositeSourceContainer.java
+++ /dev/null
@@ -1,149 +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.debug.core.sourcelookup.containers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-
-/**
- * A source container of source containers.
- * <p>
- * Clients implementing composite source containers should subclass
- * this class.
- * </p>
- * @since 3.0
- */
-public abstract class CompositeSourceContainer extends AbstractSourceContainer {
-	
-	private ISourceContainer[] fContainers;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#isComposite()
-	 */
-	public boolean isComposite() {
-		return true;
-	}
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
-	 */
-	public Object[] findSourceElements(String name) throws CoreException {
-		return findSourceElements(name, getSourceContainers());
-	}
-	
-	/**
-	 * Returns a collection of source elements in the given containers corresponding to
-	 * the given name. Returns an empty collection if no source elements are found.
-	 * This source container's source lookup director specifies if duplicate
-	 * source elements should be searched for, via <code>isFindDuplicates()</code>.
-	 * When <code>false</code> the returned collection should contain at most one
-	 * source element. If this is a composite container, the containers contained
-	 * by this container are also searched.
-	 * <p>
-	 * The format of the given name is implementation specific but generally conforms
-	 * to the format of a file name. If a source container does not recognize the
-	 * name format provided, an empty collection should be returned. A source container
-	 * may or may not require names to be fully qualified (i.e. be qualified with directory
-	 * names).
-	 * </p>
-	 * @param name the name of the source element to search for
-	 * @param containers the containers to search
-	 * @return a collection of source elements corresponding to the given name
-	 * @exception CoreException if an exception occurs while searching for source elements
-	 */	
-	protected Object[] findSourceElements(String name, ISourceContainer[] containers) throws CoreException {
-		List results = null;
-		CoreException single = null;
-		MultiStatus multiStatus = null;
-		if (isFindDuplicates()) {
-			results = new ArrayList();
-		}
-		for (int i = 0; i < containers.length; i++) {
-			ISourceContainer container = containers[i];
-			try {
-				Object[] objects = container.findSourceElements(name);
-				if (objects.length > 0) {
-					if (isFindDuplicates()) {
-						for (int j = 0; j < objects.length; j++) {
-							results.add(objects[j]);
-						}
-					} else {
-						if (objects.length == 1) {
-							return objects;
-						}
-						return new Object[]{objects[0]};
-					}
-				}
-			} catch (CoreException e) {
-				if (single == null) {
-					single = e;
-				} else if (multiStatus == null) {
-					multiStatus = new MultiStatus(DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, new IStatus[]{single.getStatus()}, SourceLookupMessages.Source_Lookup_Error, null); 
-					multiStatus.add(e.getStatus());
-				} else {
-					multiStatus.add(e.getStatus());
-				}
-			}
-		}
-		if (results == null) {
-			if (multiStatus != null) {
-				throw new CoreException(multiStatus);
-			} else if (single != null) {
-				throw single;
-			}
-			return EMPTY;
-		}
-		return results.toArray();
-	}	
-	
-	/**
-	 * Creates the source containers in this composite container.
-	 * Subclasses should override this methods.
-	 * 
-	 * @throws CoreException if unable to create the containers
-	 */
-	protected abstract ISourceContainer[] createSourceContainers() throws CoreException;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getSourceContainers()
-	 */
-	public synchronized ISourceContainer[] getSourceContainers() throws CoreException {
-		if (fContainers == null) {
-			fContainers = createSourceContainers();
-			for (int i = 0; i < fContainers.length; i++) {
-				ISourceContainer container = fContainers[i];
-				container.init(getDirector());
-			}			
-		}
-		return fContainers;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (fContainers != null) {
-			for (int i = 0; i < fContainers.length; i++) {
-				ISourceContainer container = fContainers[i];
-				container.dispose();
-			}
-		}
-		fContainers = null;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ContainerSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ContainerSourceContainer.java
deleted file mode 100644
index 16a3308..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ContainerSourceContainer.java
+++ /dev/null
@@ -1,211 +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
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 80857
- *******************************************************************************/
-package org.eclipse.debug.core.sourcelookup.containers;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.filesystem.EFS;
-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.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-
-/**
- * A source container for a container in the workspace. Source elements are searched
- * for within this container and optionally nested containers.
- * <p>
- * Names specified in <code>findSourceElements</code> method can
- * be simple or qualified. When a name is qualified, a file will
- * be searched for relative to this container, and optionally
- * nested containers.
- * </p>
- * <p>
- * This class is not intended to be subclassed or instantiated by clients.
- * </p>
- * @since 3.2
- */
-public abstract class ContainerSourceContainer extends CompositeSourceContainer {
-
-	private IContainer fContainer = null;
-	private boolean fSubfolders = false;
-	
-	private URI fRootURI = null;
-	private IFileStore fRootFile = null;
-	private IWorkspaceRoot fRoot = null;
-
-	/**
-	 * Constructs a source container on the given workspace container. 
-	 * 
-	 * @param container the container to search for source in
-	 * @param subfolders whether nested folders should be searched
-	 *  for source elements
-	 */
-	public ContainerSourceContainer(IContainer container, boolean subfolders) {
-		fContainer = container;
-		fSubfolders = subfolders;
-		fRootURI = fContainer.getLocationURI();
-		if (fRootURI != null) {
-			try {
-				fRootFile = EFS.getStore(fRootURI);
-			} catch (CoreException e) {
-			}
-			fRoot = ResourcesPlugin.getWorkspace().getRoot();
-		}
-	}
-	
-	/**
-	 * Returns the workspace container this source container is
-	 * rooted at.
-	 *  
-	 * @return the workspace container this source container is
-	 * rooted at
-	 */
-	public IContainer getContainer() {
-		return fContainer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
-	 */
-	public Object[] findSourceElements(String name) throws CoreException {
-		ArrayList sources = new ArrayList();
-
-		// An IllegalArgumentException is thrown from the "getFile" method 
-		// if the path created by appending the file name to the container 
-		// path doesn't conform with Eclipse resource restrictions.
-		// To prevent the interruption of the search procedure we check 
-		// if the path is valid before passing it to "getFile".		
-		if ( validateFile(name) ) {
-			IFile file = fContainer.getFile(new Path(name));
-			if (file.exists()) {
-				sources.add(file);
-			} else {
-				// See bug 82627 - perform case insensitive source lookup
-				if (fRootURI == null) {
-					return EMPTY;
-				}
-				// See bug 98090 - we need to handle relative path names
-				IFileStore target = fRootFile.getChild(new Path(name));
-				if (target.fetchInfo().exists()) {
-					// We no longer have to account for bug 95832, and URIs take care
-					// of canonical paths (fix to bug 95679 was removed).
-					IFile[] files = fRoot.findFilesForLocationURI(target.toURI());
-					if (isFindDuplicates() && files.length > 1) {
-						for (int i = 0; i < files.length; i++) {
-							sources.add(files[i]);
-						}
-					} else if (files.length > 0) {
-						sources.add(files[0]);
-					}					
-				}
-			}
-		}
-
-		//check sub-folders		
-		if ((isFindDuplicates() && fSubfolders) || (sources.isEmpty() && fSubfolders)) {
-			ISourceContainer[] containers = getSourceContainers();
-			for (int i=0; i < containers.length; i++) {
-				Object[] objects = containers[i].findSourceElements(name);
-				if (objects == null || objects.length == 0) {
-					continue;
-				}
-				if (isFindDuplicates()) {
-					for(int j=0; j < objects.length; j++)
-						sources.add(objects[j]);
-				} else {
-					sources.add(objects[0]);
-					break;
-				}
-			}
-		}			
-		
-		if(sources.isEmpty())
-			return EMPTY;
-		return sources.toArray();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {		
-		return getContainer().getName(); 
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj != null && obj instanceof ContainerSourceContainer) {
-			ContainerSourceContainer loc = (ContainerSourceContainer) obj;
-			return loc.getContainer().equals(getContainer());
-		}	
-		return false;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getContainer().hashCode();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#isComposite()
-	 */
-	public boolean isComposite() {	
-		return fSubfolders;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
-	 */
-	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		if(fSubfolders) {
-			IResource[] resources = getContainer().members();
-			List list = new ArrayList(resources.length);
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
-				if (resource.getType() == IResource.FOLDER) {
-					list.add(new FolderSourceContainer((IFolder)resource, fSubfolders));
-				}
-			}
-			ISourceContainer[] containers = (ISourceContainer[]) list.toArray(new ISourceContainer[list.size()]);
-			for (int i = 0; i < containers.length; i++) {
-				ISourceContainer container = containers[i];
-				container.init(getDirector());
-			}			
-			return containers;
-		}
-		return new ISourceContainer[0];
-	}
-
-	/**
-	 * Validates the given string as a path for a file in this container. 
-	 * 
-	 * @param name path name
-	 */
-	private boolean validateFile(String name) {
-		IContainer container = getContainer();
-		IPath path = container.getFullPath().append(name);
-		return ResourcesPlugin.getWorkspace().validatePath(path.toOSString(), IResource.FILE).isOK();
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/DefaultSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/DefaultSourceContainer.java
deleted file mode 100644
index fead34c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/DefaultSourceContainer.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-
-/**
- * A source container that computer the default source lookup path
- * for a launch configuration on each launch using a launch configuration's
- * associated source path computer.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class DefaultSourceContainer extends CompositeSourceContainer {  
-	
-	/**
-	 * Unique identifier for the default source container type
-	 * (value <code>org.eclipse.debug.core.containerType.default</code>).
-	 */
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.default"; //$NON-NLS-1$
-
-	/**
-	 * Constructs a default source container. 
-	 */
-	public DefaultSourceContainer() {
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return obj instanceof DefaultSourceContainer;
-	}	
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getClass().hashCode();
-	}	
-	
-	/**
-	 * Returns the launch configuration for which a default source lookup
-	 * path will be computed, or <code>null</code> if none.
-	 * 
-	 * @return the launch configuration for which a default source lookup
-	 * path will be computed, or <code>null</code>
-	 */
-	protected ILaunchConfiguration getLaunchConfiguration() {
-		ISourceLookupDirector director = getDirector();
-		if (director != null) {
-			return director.getLaunchConfiguration();
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-	
-	/**
-	 * Returns the source path computer to use, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the source path computer to use, or <code>null</code>
-	 * if none
-	 */
-	private ISourcePathComputer getSourcePathComputer() {
-		ISourceLookupDirector director = getDirector();
-		if (director != null) {
-			return director.getSourcePathComputer();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {
-		return SourceLookupMessages.DefaultSourceContainer_0; 
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
-	 */
-	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		ISourcePathComputer sourcePathComputer = getSourcePathComputer();
-		if (sourcePathComputer != null) {
-			ILaunchConfiguration config= getLaunchConfiguration();
-			if (config != null) {
-				return sourcePathComputer.computeSourceContainers(config, null);
-			}
-		}
-		
-		return new ISourceContainer[0];
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/DirectorySourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/DirectorySourceContainer.java
deleted file mode 100644
index f47a762..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/DirectorySourceContainer.java
+++ /dev/null
@@ -1,179 +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.debug.core.sourcelookup.containers;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-
-/**
- * A directory in the local file system. Source elements returned
- * from <code>findSourceElements(...)</code> are instances
- * of <code>LocalFileStorage</code>.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-
-public class DirectorySourceContainer extends CompositeSourceContainer {
-	
-	// root directory
-	private File fDirectory;
-	// whether to search sub-folders
-	private boolean fSubfolders = false;
-	/**
-	 * Unique identifier for the directory source container type
-	 * (value <code>org.eclipse.debug.core.containerType.directory</code>).
-	 */
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.directory"; //$NON-NLS-1$
-	
-	/**
-	 * Constructs an external folder container for the
-	 * directory identified by the given path.
-	 * 
-	 * @param dirPath path to a directory in the local file system
-	 * @param subfolders whether folders within the root directory
-	 *  should be searched for source elements
-	 */
-	public DirectorySourceContainer(IPath dirPath, boolean subfolders) {
-		this(dirPath.toFile(), subfolders);
-	}
-	
-	/**
-	 * Constructs an external folder container for the
-	 * directory identified by the given file.
-	 * 
-	 * @param dir a directory in the local file system
-	 * @param subfolders whether folders within the root directory
-	 *  should be searched for source elements
-	 */
-	public DirectorySourceContainer(File dir, boolean subfolders) {
-		fDirectory = dir;
-		fSubfolders = subfolders;
-	}	
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {
-		return fDirectory.getName();
-	}	
-	
-	/**
-	 * Returns the root directory in the local file system associated
-	 * with this source container.
-	 * 
-	 * @return the root directory in the local file system associated
-	 * with this source container
-	 */
-	public File getDirectory() {
-		return fDirectory;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
-	 */
-	public Object[] findSourceElements(String name) throws CoreException {
-		ArrayList sources = new ArrayList();
-		File directory = getDirectory();
-		File file = new File(directory, name);
-		if (file.exists() && file.isFile()) {
-			sources.add(new LocalFileStorage(file));
-		}
-		
-		//check sub-folders		
-		if ((isFindDuplicates() && fSubfolders) || (sources.isEmpty() && fSubfolders)) {
-			ISourceContainer[] containers = getSourceContainers();
-			for (int i=0; i < containers.length; i++) {
-				Object[] objects = containers[i].findSourceElements(name);
-				if (objects == null || objects.length == 0) {
-					continue;
-				}
-				if (isFindDuplicates()) {
-					for(int j=0; j < objects.length; j++)
-						sources.add(objects[j]);
-				} else {
-					sources.add(objects[0]);
-					break;
-				}
-			}
-		}			
-		
-		if(sources.isEmpty())
-			return EMPTY;
-		return sources.toArray();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#isComposite()
-	 */
-	public boolean isComposite() {
-		return fSubfolders;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof DirectorySourceContainer) {
-			DirectorySourceContainer container = (DirectorySourceContainer) obj;
-			return container.getDirectory().equals(getDirectory());
-		}
-		return false;
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getDirectory().hashCode();
-	}
-	
-    /* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
-	 */
-	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		if (isComposite()) {
-			String[] files = fDirectory.list();
-			if (files != null) {
-				List dirs = new ArrayList();
-				for (int i = 0; i < files.length; i++) {
-					String name = files[i];
-					File file = new File(getDirectory(), name);
-					if (file.exists() && file.isDirectory()) {
-						dirs.add(new DirectorySourceContainer(file, true));
-					}
-				}
-				ISourceContainer[] containers = (ISourceContainer[]) dirs.toArray(new ISourceContainer[dirs.size()]);
-				for (int i = 0; i < containers.length; i++) {
-					ISourceContainer container = containers[i];
-					container.init(getDirector());
-				}				
-				return containers;
-			}
-		}
-		return new ISourceContainer[0];
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ExternalArchiveSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ExternalArchiveSourceContainer.java
deleted file mode 100644
index 3fe6e33..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ExternalArchiveSourceContainer.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.debug.core.sourcelookup.containers;
-
-import java.io.File;
-import java.io.IOException;
-import com.ibm.icu.text.MessageFormat;
-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.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupUtils;
-
-/**
- * An archive in the local file system. Returns instances
- * of <code>ZipEntryStorage</code> as source elements.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class ExternalArchiveSourceContainer extends AbstractSourceContainer {
-	
-	private boolean fDetectRoots = false;
-	private Set fPotentialRoots = null;
-	private List fRoots = new ArrayList();
-	private String fArchivePath = null;
-	/**
-	 * Unique identifier for the external archive source container type
-	 * (value <code>org.eclipse.debug.core.containerType.externalArchive</code>).
-	 */
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.externalArchive";	 //$NON-NLS-1$
-	
-	/**
-	 * Creates an archive source container on the archive at the 
-	 * specified location in the local file system. 
-	 * 
-	 * @param archivePath path to the archive in the local file system
-	 * @param detectRootPaths whether root container paths should be detected. When
-	 *   <code>true</code>, searching is performed relative to a root path
-	 *   within the archive based on fully qualified file names. A root
-	 *   path is automatically determined for when the first
-	 *   successful search is performed. For example, when searching for a file
-	 *   named <code>a/b/c.d</code>, and an entry in the archive named
-	 *   <code>r/a/b/c.d</code> exists, a root path is set to <code>r</code>.
-	 *   When searching for an unqualified file name, root containers are not
-	 *   considered.
-	 *   When <code>false</code>, searching is performed by
-	 *   matching file names as suffixes to the entries in the archive. 
-	 */
-	public ExternalArchiveSourceContainer(String archivePath, boolean detectRootPaths) {
-		fArchivePath = archivePath;
-		fDetectRoots = detectRootPaths;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
-	 */
-	public Object[] findSourceElements(String name) throws CoreException {
-		name = name.replace('\\', '/');
-		ZipFile file = getArchive();
-		synchronized (file) {
-			boolean isQualfied = name.indexOf('/') > 0;
-			if (fDetectRoots && isQualfied) {
-				ZipEntry entry = searchRoots(file, name);
-				if (entry != null) {
-					return new Object[]{new ZipEntryStorage(file, entry)};
-				}
-			} else {
-				// try exact match
-				ZipEntry entry = file.getEntry(name);
-				if (entry != null) {
-					// can't be any duplicates if there is an exact match
-					return new Object[]{new ZipEntryStorage(file, entry)};
-				}
-				// search
-				Enumeration entries = file.entries();
-				List matches = null;
-				while (entries.hasMoreElements()) {
-					entry = (ZipEntry)entries.nextElement();
-					String entryName = entry.getName();
-					if (entryName.endsWith(name)) {
-						if (isQualfied || entryName.length() == name.length() || entryName.charAt(entryName.length() - name.length() - 1) == '/') {
-							if (isFindDuplicates()) {
-								if (matches == null) {
-									matches = new ArrayList();
-								}
-								matches.add(new ZipEntryStorage(file, entry));
-							} else {
-								return new Object[]{new ZipEntryStorage(file, entry)};
-							}
-						}
-					}
-				}
-				if (matches != null) {
-					return matches.toArray();
-				}
-			}
-		}
-		return EMPTY;
-	}
-	
-	/**
-	 * Returns the root path in this archive for the given file name, based
-	 * on its type, or <code>null</code> if none. Detects a root if a root has
-	 * not yet been detected for the given file type.
-	 * 
-	 * @param file zip file to search in
-	 * @param name file name
-	 * @exception CoreException if an exception occurs while detecting the root
-	 */
-	private ZipEntry searchRoots(ZipFile file, String name) {
-		if (fPotentialRoots == null) {
-			fPotentialRoots = new HashSet();
-			fPotentialRoots.add(""); //$NON-NLS-1$
-			// all potential roots are the directories
-			Enumeration entries = file.entries();
-			while (entries.hasMoreElements()) {
-				ZipEntry entry = (ZipEntry) entries.nextElement();
-				if (entry.isDirectory()) {
-					fPotentialRoots.add(entry.getName());
-				} else {
-					String entryName = entry.getName();
-					int index = entryName.lastIndexOf("/"); //$NON-NLS-1$
-					while (index > 0) {
-						if (fPotentialRoots.add(entryName.substring(0, index + 1))) {
-							entryName = entryName.substring(0, index);
-							index = entryName.lastIndexOf("/"); //$NON-NLS-1$
-						} else {
-							break;
-						}
-					}
-				}
-			}
-		}
-		int i = 0;
-		while (i < fRoots.size()) {
-			String root = (String) fRoots.get(i);
-			ZipEntry entry = file.getEntry(root+name);
-			if (entry != null) {
-				return entry;
-			}
-			i++;
-		}
-		if (!fPotentialRoots.isEmpty()) {
-			Iterator roots = fPotentialRoots.iterator();
-			String root = null;
-			ZipEntry entry = null;
-			while (roots.hasNext()) {
-				root = (String) roots.next();
-				entry = file.getEntry(root+name);
-				if (entry != null) {
-					break;
-				}
-			}
-			if (entry != null) {
-				if (root != null) {
-					fRoots.add(root);
-					fPotentialRoots.remove(root);
-					// remove any roots that begin with the new root, as roots cannot be nested
-					Iterator rs = fPotentialRoots.iterator();
-					while (rs.hasNext()) {
-						String r = (String) rs.next();
-						if (r.startsWith(root)) {
-							rs.remove();
-						}
-					}
-				}				
-				return entry;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the archive to search in.
-	 * 
-	 * @throws CoreException if unable to access the archive
-	 */
-	private ZipFile getArchive() throws CoreException {
-		try {
-			return SourceLookupUtils.getZipFile(fArchivePath);
-		} catch (IOException e) {
-			File file = new File(fArchivePath);
-			if (file.exists()) {
-				abort(MessageFormat.format(SourceLookupMessages.ExternalArchiveSourceContainer_2, new String[]{fArchivePath}), e);
-			} else {
-				warn(MessageFormat.format(SourceLookupMessages.ExternalArchiveSourceContainer_1, new String[]{fArchivePath}), e);
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {
-		return fArchivePath;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-	
-	/**
-	 * Returns whether root paths are automatically detected in this
-	 * archive source container.
-	 *  
-	 * @return whether root paths are automatically detected in this
-	 * archive source container
-	 */
-	public boolean isDetectRoot() {
-		return fDetectRoots;
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return obj instanceof ExternalArchiveSourceContainer &&
-			((ExternalArchiveSourceContainer)obj).getName().equals(getName());
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getName().hashCode();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (fPotentialRoots != null) {
-			fPotentialRoots.clear();
-		}
-		fRoots.clear();
-	}	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/FolderSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/FolderSourceContainer.java
deleted file mode 100644
index 6ac3b31..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/FolderSourceContainer.java
+++ /dev/null
@@ -1,51 +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.debug.core.sourcelookup.containers;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-
-/**
- * A folder in the workspace.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class FolderSourceContainer extends ContainerSourceContainer {
-
-	/**
-	 * Unique identifier for the folder source container type
-	 * (value <code>org.eclipse.debug.core.containerType.folder</code>).
-	 */
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.folder";	 //$NON-NLS-1$
-
-
-	/**
-	 * Constructs a source container on the given folder. 
-	 * 
-	 * @param folder the folder to search for source in
-	 * @param subfolders whether to search nested folders
-	 */
-	public FolderSourceContainer(IContainer folder, boolean subfolders) {
-		super(folder, subfolders);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/LocalFileStorage.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/LocalFileStorage.java
deleted file mode 100644
index 702a635..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/LocalFileStorage.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.debug.core.sourcelookup.containers;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IStorage;
-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.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-
-/**
- * Implementation of storage for a local file
- * (<code>java.io.File</code>).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @see IStorage
- * @since 3.0
- */
-public class LocalFileStorage extends PlatformObject implements IStorage {
-	
-	/**
-	 * The file this storage refers to.
-	 */ 
-	private File fFile;
-		
-	/**
-	 * Constructs and returns storage for the given file.
-	 * 
-	 * @param file a local file
-	 */
-	public LocalFileStorage(File file){
-		setFile(file);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#getContents()
-	 */
-	public InputStream getContents() throws CoreException {
-		try {
-			return new FileInputStream(getFile());
-		} catch (IOException e){
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, SourceLookupMessages.LocalFileStorage_0, e)); 
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#getFullPath()
-	 */
-	public IPath getFullPath() {
-		try {
-			return new Path(getFile().getCanonicalPath());
-		} catch (IOException e) {
-			DebugPlugin.log(e);
-			return null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#getName()
-	 */
-	public String getName() {
-		return getFile().getName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#isReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return true;
-	}
-	
-	/**
-	 * Sets the file associated with this storage
-	 * 
-	 * @param file a local file
-	 */
-	private void setFile(File file) {
-		fFile = file;	
-	}
-	
-	/**
-	 * Returns the file associated with this storage
-	 * 
-	 * @return file
-	 */
-	public File getFile() {
-		return fFile;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {		
-		return object instanceof LocalFileStorage &&
-			 getFile().equals(((LocalFileStorage)object).getFile());
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getFile().hashCode();
-	}	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ProjectSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ProjectSourceContainer.java
deleted file mode 100644
index ae890ae..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ProjectSourceContainer.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Mikhail Khodjaiants, QNX - Bug 110227: Possible infinite loop in ProjectSourceContainer  
- *******************************************************************************/
-package org.eclipse.debug.core.sourcelookup.containers;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-
-/**
- * A project in the workspace. Source is searched for in the root project
- * folder and all folders within the project recursively. Optionally,
- * referenced projects may be searched as well.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class ProjectSourceContainer extends ContainerSourceContainer {
-
-	boolean fReferencedProjects=false;
-	/**
-	 * Unique identifier for the project source container type
-	 * (value <code>org.eclipse.debug.core.containerType.project</code>).
-	 */	
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.project"; //$NON-NLS-1$
-	
-	/**
-	 * Constructs a project source container.
-	 * 
-	 * @param project the project to search for source in
-	 * @param referenced whether referenced projects should be considered
-	 */
-	public ProjectSourceContainer(IProject project, boolean referenced) {
-		super(project, true);
-		fReferencedProjects = referenced;
-	}
-	
-	/**
-	 * Returns whether referenced projects are considered.
-	 * 
-	 * @return whether referenced projects are considered
-	 */
-	public boolean isSearchReferencedProjects() {
-		return fReferencedProjects;
-	}
-	
-	/**
-	 * Returns the project this source container references.
-	 * 
-	 * @return the project this source container references
-	 */
-	public IProject getProject() {
-		return (IProject) getContainer();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#isComposite()
-	 */
-	public boolean isComposite() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
-	 */
-	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		if (getProject().isOpen()) {
-			if (isSearchReferencedProjects()) {
-				IProject project = getProject();
-				IProject[] projects = getAllReferencedProjects(project);
-				ISourceContainer[] folders = super.createSourceContainers();
-				List all = new ArrayList(folders.length + projects.length);
-				for (int i = 0; i < folders.length; i++) {
-					all.add(folders[i]);
-				}
-				for (int i = 0; i < projects.length; i++) {
-					if (project.exists() && project.isOpen()) {
-						ProjectSourceContainer container = new ProjectSourceContainer(projects[i], false);
-						container.init(getDirector());
-						all.add(container);
-					}
-				}
-				return (ISourceContainer[]) all.toArray(new ISourceContainer[all.size()]);
-			} 
-			return super.createSourceContainers();
-		}
-		return new ISourceContainer[0];
-	}
-
-	private IProject[] getAllReferencedProjects(IProject project) throws CoreException {
-		Set all = new HashSet();
-		getAllReferencedProjects(all, project);
-		return (IProject[]) all.toArray(new IProject[all.size()]);
-	}
-
-	private void getAllReferencedProjects(Set all, IProject project) throws CoreException {
-		IProject[] refs = project.getReferencedProjects();
-		for (int i = 0; i < refs.length; i++) {
-			if (!all.contains(refs[i]) && refs[i].exists() && refs[i].isOpen()) {
-				all.add(refs[i]);
-				getAllReferencedProjects(all, refs[i]);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/WorkspaceSourceContainer.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/WorkspaceSourceContainer.java
deleted file mode 100644
index 3f14bb5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/WorkspaceSourceContainer.java
+++ /dev/null
@@ -1,82 +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.debug.core.sourcelookup.containers;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-
-/**
- * All projects in the workspace.
- * <p>
- * Clients may instantiate this class. This class is not intended to
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class WorkspaceSourceContainer extends CompositeSourceContainer {
-	
-	/**
-	 * Unique identifier for the workspace source container type
-	 * (value <code>org.eclipse.debug.core.containerType.workspace</code>).
-	 */
-	public static final String TYPE_ID = DebugPlugin.getUniqueIdentifier() + ".containerType.workspace"; //$NON-NLS-1$
-
-	public WorkspaceSourceContainer() {
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {
-		return SourceLookupMessages.WorkspaceSourceContainer_0; 
-	}
-		
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return obj instanceof WorkspaceSourceContainer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */	
-	public int hashCode() {
-		return ResourcesPlugin.getWorkspace().hashCode();
-	}
-			
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
-	 */
-	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-		ISourceContainer[] containers = new ISourceContainer[projects.length];
-		for (int i = 0; i < projects.length; i++) {
-			ISourceContainer container = new ProjectSourceContainer(projects[i], false);
-			container.init(getDirector());
-			containers[i] = container;
-		}
-		return containers;
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ZipEntryStorage.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ZipEntryStorage.java
deleted file mode 100644
index e3e2cd6..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/ZipEntryStorage.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.debug.core.sourcelookup.containers;
-
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IStorage;
-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.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
- 
-/**
- * Storage implementation for zip entries.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @see IStorage
- * @since 3.0
- */
-public class ZipEntryStorage extends PlatformObject implements IStorage {
-	
-	/**
-	 * Zip file associated with zip entry
-	 */
-	private ZipFile fArchive;
-	
-	/**
-	 * Zip entry
-	 */
-	private ZipEntry fZipEntry;
-	
-	/**
-	 * Constructs a new storage implementation for the
-	 * given zip entry in the specified zip file
-	 * 
-	 * @param archive zip file
-	 * @param entry zip entry
-	 */
-	public ZipEntryStorage(ZipFile archive, ZipEntry entry) {
-		setArchive(archive);
-		setZipEntry(entry);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#getContents()
-	 */
-	public InputStream getContents() throws CoreException {
-		try {
-			return getArchive().getInputStream(getZipEntry());
-		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, SourceLookupMessages.ZipEntryStorage_0, e)); 
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#getFullPath()
-	 */
-	public IPath getFullPath() {
-		return new Path(getArchive().getName()).append(getZipEntry().getName());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#getName()
-	 */
-	public String getName() {
-		int index = getZipEntry().getName().lastIndexOf('\\');
-		if (index == -1) {
-			index = getZipEntry().getName().lastIndexOf('/');
-		}
-		if (index == -1) {
-			return getZipEntry().getName();
-		} 
-		return getZipEntry().getName().substring(index + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IStorage#isReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return true;
-	}
-	
-	/**
-	 * Sets the archive containing the zip entry.
-	 * 
-	 * @param archive a zip file
-	 */
-	private void setArchive(ZipFile archive) {
-		fArchive = archive;
-	}
-	
-	/**
-	 * Returns the archive containing the zip entry.
-	 * 
-	 * @return zip file
-	 */
-	public ZipFile getArchive() {
-		return fArchive;
-	}	
-	
-	/**
-	 * Sets the entry that contains the source.
-	 * 
-	 * @param entry the entry that contains the source
-	 */
-	private void setZipEntry(ZipEntry entry) {
-		fZipEntry = entry;
-	}
-	
-	/**
-	 * Returns the entry that contains the source
-	 * 
-	 * @return zip entry
-	 */
-	public ZipEntry getZipEntry() {
-		return fZipEntry;
-	}		
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {		
-		return object instanceof ZipEntryStorage &&
-			 getArchive().equals(((ZipEntryStorage)object).getArchive()) &&
-			 getZipEntry().getName().equals(((ZipEntryStorage)object).getZipEntry().getName());
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getZipEntry().getName().hashCode();
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/package.html
deleted file mode 100644
index 7125fb5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/containers/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">
-<title>Eclipse Debug Platform</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides implementations of common source containers supporting source lookup.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package provides implementations of common source containers, such as 
-  archives, folders, and projects.</p>
-
-<blockquote>&nbsp;</blockquote>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/package.html
deleted file mode 100644
index 8866be6..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/sourcelookup/package.html
+++ /dev/null
@@ -1,34 +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>Eclipse Debug Platform</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides support for source lookup.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package provides classes and interfaces to support source lookup. A source 
-  lookup director is a persistable source locator that directs source lookup among 
-  a collection of source lookup participants and a collection of source containers. 
-  Each source lookup participant is a source locator itself, which allows more 
-  than one source locator to participate in source lookup for a launch. Each source 
-  lookup participant searches for source in the source containers managed by its 
-  director, and each participant is notified of changes in the set of source containers 
-  being searched.</p>
-<p>A source lookup participant participates in source lookup by searching an ordered 
-  list of source containers for source elements corresponding to a debug artifact. 
-  For example, a participant may be asked to find source corresponding to a stack 
-  frame or breakpoint. An implementation of a source lookup participant is debug 
-  model specific, since it must convert the debug model artifact (stack frame, 
-  breakpoint, etc.), into a source name that can be recognized by a source container, 
-  to search for source elements. Source containers are generally debug model independent, 
-  whereas source lookup participants are debug model specific.</p>
-
-<blockquote>&nbsp;</blockquote>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
deleted file mode 100644
index 3d7848c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
+++ /dev/null
@@ -1,1101 +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.debug.internal.core;
-
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-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.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointListener;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointManagerListener;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * The breakpoint manager manages all registered breakpoints
- * for the debug plug-in. It is instantiated by the debug plug-in at startup.
- *
- * @see IBreakpointManager
- */
-public class BreakpointManager implements IBreakpointManager, IResourceChangeListener {
-	
-	/**
-	 * Constants for breakpoint add/remove/change updates
-	 */
-	private final static int ADDED = 0;
-	private final static int REMOVED = 1;
-	private final static int CHANGED = 2;
-
-	/**
-	 * A collection of breakpoints registered with this manager.
-	 */
-	private Vector fBreakpoints= null;
-	
-	/**
-	 * A collection of breakpoint markers that have received a POST_CHANGE notification
-	 * that they have changed before a POST_BUILD notification of add. This allows us
-	 * to tell if a marker has been created & changed since the breakpoint has been
-	 * registered (see bug 138473).
-	 */
-	private Set fPostChangMarkersChanged = new HashSet();
-	
-	/**
-	 * A collection of breakpoint markers that have received a POST_BUILD notification
-	 * of being added.
-	 */
-	private Set fPostBuildMarkersAdded = new HashSet();
-	
-	/**
-	 * Collection of breakpoints being added currently. Used to 
-	 * suppress change notification of "REGISTERED" attribute when
-	 * being added.
-	 */
-	private List fSuppressChange = new ArrayList();
-	
-	/**
-	 * A table of breakpoint extension points, keyed by
-	 * marker type
-	 * key: a marker type
-	 * value: the breakpoint extension which corresponds to that marker type
-	 */
-	private HashMap fBreakpointExtensions;
-	
-	/**
-	 * Collection of markers that associates markers to breakpoints
-	 * key: a marker
-	 * value: the breakpoint which contains that marker
-	 */	
-	private HashMap fMarkersToBreakpoints;
-
-	/**
-	 * Collection of breakpoint listeners.
-	 */
-	private ListenerList fBreakpointListeners= new ListenerList();
-		
-	/**
-	 * Collection of (plural) breakpoint listeners.
-	 */
-	private ListenerList fBreakpointsListeners= new ListenerList();	
-	
-	/**
-	 * Singleton resource delta visitor which handles marker
-	 * additions, changes, and removals.
-	 */
-	private static BreakpointManagerVisitor fgVisitor;
-	
-	/**
-	 * Whether or not this breakpoint manager is enabled.
-	 */
-	private boolean fEnabled= true;
-	
-	/**
-	 * Collection of breakpoint manager listeners which are
-	 * notified when this manager's state changes.
-	 */
-	private ListenerList fBreakpointManagerListeners= new ListenerList();
-
-	/**
-	 * Listens to POST_CHANGE notifications of breakpoint markers to detect when
-	 * a breakpoint is added & changed before the POST_BUILD add notification is
-	 * sent.
-	 */
-	class PostChangeListener implements IResourceChangeListener {
-		
-		private PostChangeVisitor fVisitor = new PostChangeVisitor();
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-			IResourceDelta delta= event.getDelta();
-			if (delta != null) {
-				try {
-					delta.accept(fVisitor);
-				} catch (CoreException ce) {
-					DebugPlugin.log(ce);
-				}
-			}
-		}
-		
-	}
-	
-	/**
-	 * The listener
-	 */
-	private PostChangeListener fPostChangeListener = new PostChangeListener();
-	
-	class PostChangeVisitor implements IResourceDeltaVisitor {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) throws CoreException {
-			if (delta == null) {
-				return false;
-			}
-			IMarkerDelta[] markerDeltas= delta.getMarkerDeltas();
-			for (int i= 0; i < markerDeltas.length; i++) {
-				IMarkerDelta markerDelta= markerDeltas[i];
-				if (markerDelta.isSubtypeOf(IBreakpoint.BREAKPOINT_MARKER)) {
-					switch (markerDelta.getKind()) {
-						case IResourceDelta.ADDED :
-							break;
-						case IResourceDelta.REMOVED :
-							break;
-						case IResourceDelta.CHANGED :
-							IMarker marker = markerDelta.getMarker();
-							synchronized (fPostChangMarkersChanged) {
-								if (!fPostBuildMarkersAdded.contains(marker)) {
-									fPostChangMarkersChanged.add(marker);
-								}
-							}
-							break;
-					}
-				}
-			}
-			return true;
-		}
-		
-	}
-	
-	/**
-	 * Constructs a new breakpoint manager.
-	 */
-	public BreakpointManager() {
-		fMarkersToBreakpoints= new HashMap(10);	
-		fBreakpointExtensions= new HashMap(15);
-	}
-	
-	/**
-	 * Loads all the breakpoints on the given resource.
-	 * 
-	 * @param resource the resource which contains the breakpoints
-	 * @param notify whether to notify of the breakpoint additions
-	 */
-	private void loadBreakpoints(IResource resource, boolean notify) throws CoreException {
-		initBreakpointExtensions();
-		IMarker[] markers= getPersistedMarkers(resource);
-		List added = new ArrayList();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker= markers[i];
-			try {
-				IBreakpoint breakpoint = createBreakpoint(marker);
-				synchronized (fPostChangMarkersChanged) {
-					fPostBuildMarkersAdded.add(marker);
-				}
-				if (breakpoint.isRegistered()) {
-					added.add(breakpoint);
-				}
-			} catch (DebugException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		addBreakpoints((IBreakpoint[])added.toArray(new IBreakpoint[added.size()]), notify);
-	}
-	
-	/**
-	 * Returns the persisted markers associated with the given resource.
-	 * 
-	 * Delete any invalid breakpoint markers. This is done at startup rather
-	 * than shutdown, since the changes made at shutdown are not persisted as
-	 * the workspace state has already been saved. See bug 7683.
-	 * 
-	 * Since the <code>TRANSIENT</code> marker attribute/feature has been added,
-	 * we no longer have to manually delete non-persisted markers - the platform
-	 * does this for us (at shutdown, transient markers are not saved). However,
-	 * the code is still present to delete non-persisted markers from old
-	 * workspaces.
-	 */
-	protected IMarker[] getPersistedMarkers(IResource resource) throws CoreException {
-		IMarker[] markers= resource.findMarkers(IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE);
-		final List delete = new ArrayList();
-		List persisted= new ArrayList();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker= markers[i];
-			// ensure the marker has a valid model identifier attribute
-			// and delete the breakpoint if not
-			String modelId = marker.getAttribute(IBreakpoint.ID, null);
-			if (modelId == null) {
-				// marker with old/invalid format - delete
-				delete.add(marker);
-			} else if (!marker.getAttribute(IBreakpoint.PERSISTED, true)) {
-				// the breakpoint is marked as not to be persisted,
-				// schedule for deletion
-				delete.add(marker);
-			} else {
-				persisted.add(marker);
-			}
-		}
-		// delete any markers that are not to be restored
-		if (!delete.isEmpty()) {
-            final IMarker[] delMarkers = (IMarker[])delete.toArray(new IMarker[delete.size()]);
-			IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-				public void run(IProgressMonitor pm) throws CoreException {
-                    for (int i = 0; i < delMarkers.length; i++) {
-                        IMarker marker = delMarkers[i];
-                        marker.delete();
-                    }
-				}
-			};
-			new BreakpointManagerJob(wr).schedule();
-		}
-		return (IMarker[])persisted.toArray(new IMarker[persisted.size()]);
-	}
-	
-	/**
-	 * Removes this manager as a resource change listener
-	 * and removes all breakpoint listeners.
-	 */
-	public void shutdown() {
-		getWorkspace().removeResourceChangeListener(this);
-		getWorkspace().removeResourceChangeListener(fPostChangeListener);
-		fBreakpointListeners = null;
-        fBreakpointsListeners = null;
-        fBreakpointManagerListeners = null;
-	}
-
-	/**
-	 * Find the defined breakpoint extensions and cache them for use in recreating
-	 * breakpoints from markers.
-	 */
-	private void initBreakpointExtensions() {
-		IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_BREAKPOINTS);
-		IConfigurationElement[] elements = ep.getConfigurationElements();
-		for (int i= 0; i < elements.length; i++) {
-			String markerType = elements[i].getAttribute(IConfigurationElementConstants.MARKER_TYPE);
-			String className = elements[i].getAttribute(IConfigurationElementConstants.CLASS);
-			if (markerType == null) {
-				DebugPlugin.log(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, MessageFormat.format("Breakpoint extension {0} missing required attribute: markerType", new String[]{elements[i].getDeclaringExtension().getUniqueIdentifier()}), null)); //$NON-NLS-1$ 
-			} else if (className == null){
-				DebugPlugin.log(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, MessageFormat.format("Breakpoint extension {0} missing required attribute: class", new String[]{elements[i].getDeclaringExtension().getUniqueIdentifier()}), null)); //$NON-NLS-1$
-			} else {
-				fBreakpointExtensions.put(markerType, elements[i]);
-			}
-		}
-	}
-
-	/**
-	 * Convenience method to get the workspace
-	 */
-	private IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * @see IBreakpointManager#getBreakpoint(IMarker)
-	 */
-	public IBreakpoint getBreakpoint(IMarker marker) {
-		// ensure that breakpoints are initialized
-		getBreakpoints0();
-		return (IBreakpoint)fMarkersToBreakpoints.get(marker);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManager#getBreakpoints()
-	 */
-	public IBreakpoint[] getBreakpoints() {
-		IBreakpoint[] temp = new IBreakpoint[0];
-		Vector breakpoints = getBreakpoints0();
-		synchronized (breakpoints) {
-			temp = new IBreakpoint[breakpoints.size()];
-			breakpoints.copyInto(temp);
-		}
-		return temp;
-	}
-	
-	/**
-	 * The BreakpointManager waits to load the breakpoints
-	 * of the workspace until a request is made to retrieve the 
-	 * breakpoints.
-	 */
-	private synchronized Vector getBreakpoints0() {
-		if (fBreakpoints == null) {
-			initializeBreakpoints();
-		}
-		return fBreakpoints;
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManager#getBreakpoints(java.lang.String)
-	 */
-	public IBreakpoint[] getBreakpoints(String modelIdentifier) {
-		Vector allBreakpoints= getBreakpoints0();
-		synchronized (allBreakpoints) {
-			ArrayList temp = new ArrayList(allBreakpoints.size());
-			Iterator breakpoints= allBreakpoints.iterator();
-			while (breakpoints.hasNext()) {
-				IBreakpoint breakpoint= (IBreakpoint) breakpoints.next();
-				String id= breakpoint.getModelIdentifier();
-				if (id != null && id.equals(modelIdentifier)) {
-					temp.add(breakpoint);
-				}
-			}
-			return (IBreakpoint[]) temp.toArray(new IBreakpoint[temp.size()]);
-		}
-	}
-
-	/**
-	 * Loads the list of breakpoints from the breakpoint markers in the
-	 * workspace. Start listening to resource deltas.
-	 */
-	private void initializeBreakpoints() {
-		setBreakpoints(new Vector(10));
-		try {
-			loadBreakpoints(getWorkspace().getRoot(), false);
-			getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_BUILD);
-			getWorkspace().addResourceChangeListener(fPostChangeListener, IResourceChangeEvent.POST_CHANGE);
-		} catch (CoreException ce) {
-			DebugPlugin.log(ce);
-			setBreakpoints(new Vector(0));
-		} 
-	}
-	
-	/**
-	 * @see IBreakpointManager#isRegistered(IBreakpoint)
-	 */
-	public boolean isRegistered(IBreakpoint breakpoint) {
-		return getBreakpoints0().contains(breakpoint);
-	}
-
-	
-	/**
-	 * @see IBreakpointManager#removeBreakpoint(IBreakpoint, boolean)
-	 */
-	public void removeBreakpoint(IBreakpoint breakpoint, boolean delete) throws CoreException {
-		removeBreakpoints(new IBreakpoint[]{breakpoint}, delete);
-	}
-	
-	/**
-	 * @see IBreakpointManager#removeBreakpoints(IBreakpoint[], boolean)
-	 */
-	public void removeBreakpoints(IBreakpoint[] breakpoints, final boolean delete) throws CoreException {
-		final List remove = new ArrayList(breakpoints.length);
-		for (int i = 0; i < breakpoints.length; i++) {
-			IBreakpoint breakpoint = breakpoints[i];
-			if (getBreakpoints0().contains(breakpoint)) {
-				remove.add(breakpoint);
-			}
-		}
-		if (!remove.isEmpty()) {
-			Iterator iter = remove.iterator();
-			while (iter.hasNext()) {
-				IBreakpoint breakpoint = (IBreakpoint)iter.next();
-				getBreakpoints0().remove(breakpoint);
-				fMarkersToBreakpoints.remove(breakpoint.getMarker());
-			}
-			fireUpdate(remove, null, REMOVED);
-			IWorkspaceRunnable r = new IWorkspaceRunnable() {
-				public void run(IProgressMonitor montitor) throws CoreException {
-					Iterator innerIter = remove.iterator();
-					while (innerIter.hasNext()) {
-						IBreakpoint breakpoint = (IBreakpoint)innerIter.next();
-						if (delete) {
-							breakpoint.delete();
-						} else {
-							// if the breakpoint is being removed from the manager
-							// because the project is closing, the breakpoint should
-							// remain as registered, otherwise, the breakpoint should
-							// be marked as unregistered
-							IMarker marker = breakpoint.getMarker();
-							if (marker.exists()) {
-								IProject project = breakpoint.getMarker().getResource().getProject();
-								if (project == null || project.isOpen()) {
-									breakpoint.setRegistered(false);
-								}
-							}
-						}
-					}					
-				}
-			};
-			getWorkspace().run(r, null, 0, null);
-		}
-	}	
-	
-	/**
-	 * Create a breakpoint for the given marker. The created breakpoint
-	 * is of the type specified in the breakpoint extension associated
-	 * with the given marker type.
-	 * 
-	 * @param marker marker to create a breakpoint for
-	 * @return a breakpoint on this marker
-	 * @exception DebugException if breakpoint creation fails. Reasons for 
-	 *  failure include:
-	 * <ol>
-	 * <li>The breakpoint manager cannot determine what kind of breakpoint
-	 *     to instantiate for the given marker type</li>
-	 * <li>A lower level exception occurred while accessing the given marker</li>
-	 * </ol>
-	 */
-	public IBreakpoint createBreakpoint(IMarker marker) throws DebugException {
-		IBreakpoint breakpoint= (IBreakpoint) fMarkersToBreakpoints.get(marker);
-		if (breakpoint != null) {
-			return breakpoint;
-		}
-		try {
-			IConfigurationElement config = (IConfigurationElement)fBreakpointExtensions.get(marker.getType());
-			if (config == null) {
-				throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), 
-					DebugException.CONFIGURATION_INVALID, MessageFormat.format(DebugCoreMessages.BreakpointManager_Missing_breakpoint_definition, new String[] {marker.getType()}), null)); 
-			}
-			Object object = config.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			if (object instanceof IBreakpoint) {
-				breakpoint = (IBreakpoint)object;
-				breakpoint.setMarker(marker);
-			} else {
-				DebugPlugin.log(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, MessageFormat.format("Breakpoint extension {0} missing required attribute: class", new String[]{config.getAttribute(IConfigurationElementConstants.CLASS), config.getDeclaringExtension().getUniqueIdentifier()}), null)); //$NON-NLS-1$ 
-			}
-			return breakpoint;		
-		} catch (CoreException e) {
-			throw new DebugException(e.getStatus());
-		}
-	}	
-
-	/**
-	 * @see IBreakpointManager#addBreakpoint(IBreakpoint)
-	 */
-	public void addBreakpoint(IBreakpoint breakpoint) throws CoreException {
-		addBreakpoints(new IBreakpoint[]{breakpoint});
-	}
-	
-	/**
-	 * @see IBreakpointManager#addBreakpoints(IBreakpoint[])
-	 */
-	public void addBreakpoints(IBreakpoint[] breakpoints) throws CoreException {
-	    addBreakpoints(breakpoints, true);
-	}	
-	
-	/**
-	 * Registers the given breakpoints and notifies listeners if specified.
-	 * 
-	 * @param breakpoints the breakpoints to register
-	 * @param notify whether to notify listeners of the add
-	 * @param loading whether the given breakpoints are being automatically loaded
-	 *  from previously persisted markers
-	 */
-	private void addBreakpoints(IBreakpoint[] breakpoints, boolean notify) throws CoreException {
-		List added = new ArrayList(breakpoints.length);
-		final List update = new ArrayList();
-		for (int i = 0; i < breakpoints.length; i++) {
-			IBreakpoint breakpoint = breakpoints[i];
-			if (!getBreakpoints0().contains(breakpoint)) {
-				verifyBreakpoint(breakpoint);
-				if (breakpoint.isRegistered()) {
-				    // If notify == false, the breakpoints are just being added at startup
-					added.add(breakpoint);
-					getBreakpoints0().add(breakpoint);
-					fMarkersToBreakpoints.put(breakpoint.getMarker(), breakpoint);
-				} else {
-					// need to update the 'registered' and/or 'group' attributes
-					update.add(breakpoint);
-				}
-			}	
-		}
-		if (notify) {
-		    fireUpdate(added, null, ADDED);
-		}
-		if (!update.isEmpty()) {
-			IWorkspaceRunnable r = new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					Iterator iter = update.iterator();
-					while (iter.hasNext()) {
-						IBreakpoint breakpoint = (IBreakpoint)iter.next();
-						getBreakpoints0().add(breakpoint);
-						breakpoint.setRegistered(true);
-						fMarkersToBreakpoints.put(breakpoint.getMarker(), breakpoint);						
-					}
-				}
-			};
-			// Need to suppress change notification, since this is really
-			// an add notification			
-			fSuppressChange.addAll(update);
-			getWorkspace().run(r, null, 0, null);
-			fSuppressChange.removeAll(update);
-			if (notify) {
-			    fireUpdate(update, null, ADDED);
-			}
-		}			
-	}	
-	
-	/**
-	 * Returns whether change notification is to be suppressed for the given breakpoint.
-	 * Used when adding breakpoints and changing the "REGISTERED" attribute.
-	 * 
-	 * @param breakpoint
-	 * @return boolean whether change notification is suppressed
-	 */
-	protected boolean isChangeSuppressed(IBreakpoint breakpoint) {
-		return fSuppressChange.contains(breakpoint);
-	}
-	
-	/**
-	 * @see IBreakpointManager#fireBreakpointChanged(IBreakpoint)
-	 */
-	public void fireBreakpointChanged(IBreakpoint breakpoint) {
-		if (getBreakpoints0().contains(breakpoint)) {
-			List changed = new ArrayList();
-			changed.add(breakpoint);
-			fireUpdate(changed, null, CHANGED);
-		}
-	}
-
-	/**
-	 * Verifies that the breakpoint marker has the minimal required attributes,
-	 * and throws a debug exception if not.
-	 */
-	private void verifyBreakpoint(IBreakpoint breakpoint) throws DebugException {
-		try {
-			String id= breakpoint.getModelIdentifier();
-			if (id == null) {
-				throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), 
-					DebugException.CONFIGURATION_INVALID, DebugCoreMessages.BreakpointManager_Missing_model_identifier, null)); 
-			}
-		} catch (CoreException e) {
-			throw new DebugException(e.getStatus());
-		}
-	}
-
-	/**
-	 * A resource has changed. Traverses the delta for breakpoint changes.
-	 * 
-	 * @param event resource change event
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta= event.getDelta();
-		if (delta != null) {
-			try {
-				if (fgVisitor == null) {
-					fgVisitor= new BreakpointManagerVisitor();
-				}
-				delta.accept(fgVisitor);
-				fgVisitor.update();
-			} catch (CoreException ce) {
-				DebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/**
-	 * Visitor for handling resource deltas
-	 */
-	class BreakpointManagerVisitor implements IResourceDeltaVisitor {
-		/**
-		 * Moved markers
-		 */
-		private List fMoved = new ArrayList();
-		/**
-		 * Removed breakpoints
-		 */
-		private List fRemoved = new ArrayList();
-		/**
-		 * Changed breakpoints and associated marker deltas
-		 */
-		private List fChanged = new ArrayList();
-		private List fChangedDeltas = new ArrayList();
-		
-		/**
-		 * Resets the visitor for a delta traversal - empties
-		 * collections of removed/changed breakpoints.
-		 */
-		protected void reset() {
-			fMoved.clear();
-			fRemoved.clear();
-			fChanged.clear();
-			fChangedDeltas.clear();
-		}
-		
-		/**
-		 * Performs updates on accumulated changes, and fires change notification after
-		 * a traversal. Accumulated updates are reset.
-		 */
-		public void update() {
-			if (!fMoved.isEmpty()) {
-				// delete moved markers
-				IWorkspaceRunnable wRunnable= new IWorkspaceRunnable() {
-					public void run(IProgressMonitor monitor) throws CoreException {
-                        IMarker[] markers = (IMarker[])fMoved.toArray(new IMarker[fMoved.size()]);
-						for (int i = 0; i < markers.length; i++) {
-                            markers[i].delete();
-                        }
-					}
-				};
-				try {
-					getWorkspace().run(wRunnable, null, 0, null);
-				} catch (CoreException e) {
-				}
-			}
-			if (!fRemoved.isEmpty()) {
-				try {
-					removeBreakpoints((IBreakpoint[])fRemoved.toArray(new IBreakpoint[fRemoved.size()]), false);
-				} catch (CoreException e) {
-					DebugPlugin.log(e);
-				}
-			}
-			if (!fChanged.isEmpty()) {
-				fireUpdate(fChanged, fChangedDeltas, CHANGED);
-			}
-			reset();
-		} 
-				
-		/**
-		 * @see IResourceDeltaVisitor#visit(IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			if (delta == null) {
-				return false;
-			}
-			if (0 != (delta.getFlags() & IResourceDelta.OPEN) && 0 == (delta.getFlags() & IResourceDelta.MOVED_FROM)) {
-				handleProjectResourceOpenStateChange(delta.getResource());
-				return false;
-			}
-			IMarkerDelta[] markerDeltas= delta.getMarkerDeltas();
-			for (int i= 0; i < markerDeltas.length; i++) {
-				IMarkerDelta markerDelta= markerDeltas[i];
-				if (markerDelta.isSubtypeOf(IBreakpoint.BREAKPOINT_MARKER)) {
-					switch (markerDelta.getKind()) {
-						case IResourceDelta.ADDED :
-							handleAddBreakpoint(delta, markerDelta.getMarker(), markerDelta);
-							break;
-						case IResourceDelta.REMOVED :
-							handleRemoveBreakpoint(markerDelta.getMarker());
-							break;
-						case IResourceDelta.CHANGED :
-							handleChangeBreakpoint(markerDelta.getMarker(), markerDelta);
-							break;
-					}
-				}
-			}
-
-			return true;
-		}		
-
-		/**
-		 * Wrapper for handling adds
-		 */
-		protected void handleAddBreakpoint(IResourceDelta rDelta, IMarker marker, IMarkerDelta mDelta) {
-			if (0 != (rDelta.getFlags() & IResourceDelta.MOVED_FROM)) {
-				// This breakpoint has actually been moved - already removed
-				// from the Breakpoint manager during the remove callback.
-				// Schedule the marker associated with the new resource for deletion.
-				if (getBreakpoint(marker) == null) {
-					fMoved.add(marker);
-				}
-			} else {
-				// check if the an add & change have be combined into one add notification 
-				synchronized (fPostChangMarkersChanged) {
-					if (fPostChangMarkersChanged.contains(marker)) {
-						handleChangeBreakpoint(marker, mDelta);
-						fPostChangMarkersChanged.remove(marker);
-					}
-					fPostBuildMarkersAdded.add(marker);
-				}
-			}
-		}
-		
-		/**
-		 * Wrapper for handling removes
-		 */
-		protected void handleRemoveBreakpoint(IMarker marker) {
-			synchronized (fPostChangMarkersChanged) {
-				fPostChangMarkersChanged.remove(marker);
-				fPostBuildMarkersAdded.remove(marker);
-			}
-			IBreakpoint breakpoint= getBreakpoint(marker);
-			if (breakpoint != null) {
-				fRemoved.add(breakpoint);
-			}
-		}
-
-		/**
-		 * Wrapper for handling changes
-		 */
-		protected void handleChangeBreakpoint(IMarker marker, IMarkerDelta delta) {
-			IBreakpoint breakpoint= getBreakpoint(marker);
-			if (breakpoint != null && isRegistered(breakpoint) && !isChangeSuppressed(breakpoint)) {
-				fChanged.add(breakpoint);
-				fChangedDeltas.add(delta);
-			}
-		}
-		
-		/**
-		 * A project has been opened or closed.  Updates the breakpoints for
-		 * that project
-		 */
-		private void handleProjectResourceOpenStateChange(final IResource project) {
-			if (!project.isAccessible()) {
-				//closed
-				Enumeration breakpoints= ((Vector)getBreakpoints0().clone()).elements();
-				while (breakpoints.hasMoreElements()) {
-					IBreakpoint breakpoint= (IBreakpoint) breakpoints.nextElement();
-					IResource markerResource= breakpoint.getMarker().getResource();
-					if (project.getFullPath().isPrefixOf(markerResource.getFullPath())) {
-						fRemoved.add(breakpoint);
-					}
-				}
-				return;
-			} 
-			try {
-				loadBreakpoints(project, true);
-			} catch (CoreException e) {
-				DebugPlugin.log(e);
-			}
-		}		
-	}
-
-	/**
-	 * @see IBreakpointManager#addBreakpointListener(IBreakpointListener)
-	 */
-	public void addBreakpointListener(IBreakpointListener listener) {
-		fBreakpointListeners.add(listener);
-	}
-
-	/**
-	 * @see IBreakpointManager#removeBreakpointListener(IBreakpointListener)
-	 */
-	public void removeBreakpointListener(IBreakpointListener listener) {
-		fBreakpointListeners.remove(listener);
-	}
-	
-	/**
-	 * Notifies listeners of the adds/removes/changes
-	 * 
-	 * @param breakpoints associated breakpoints
-	 * @param deltas or <code>null</code>
-	 * @param update type of change
-	 */
-	private void fireUpdate(List breakpoints, List deltas, int update) {
-		if (breakpoints.isEmpty()) {
-			return; 
-		}
-		IBreakpoint[] bpArray = (IBreakpoint[])breakpoints.toArray(new IBreakpoint[breakpoints.size()]);
-		IMarkerDelta[] deltaArray = new IMarkerDelta[bpArray.length];
-		if (deltas != null) {
-			deltaArray = (IMarkerDelta[])deltas.toArray(deltaArray);
-		}
-		// single listeners
-		getBreakpointNotifier().notify(bpArray, deltaArray, update);
-		
-		// plural listeners
-		getBreakpointsNotifier().notify(bpArray, deltaArray, update);
-	}	
-
-	protected void setBreakpoints(Vector breakpoints) {
-		fBreakpoints = breakpoints;
-	}
-	
-	/**
-	 * @see IBreakpointManager#hasBreakpoints()
-	 */
-	public boolean hasBreakpoints() {
-		return !getBreakpoints0().isEmpty();
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.IBreakpointManager#addBreakpointListener(org.eclipse.debug.core.IBreakpointsListener)
-	 */
-	public void addBreakpointListener(IBreakpointsListener listener) {
-		fBreakpointsListeners.add(listener);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.IBreakpointManager#removeBreakpointListener(org.eclipse.debug.core.IBreakpointsListener)
-	 */
-	public void removeBreakpointListener(IBreakpointsListener listener) {
-		fBreakpointsListeners.remove(listener);
-	}
-
-	private BreakpointNotifier getBreakpointNotifier() {
-		return new BreakpointNotifier();
-	}
-	
-	/**
-	 * Notifies breakpoint listener (single breakpoint) in a safe runnable to
-	 * handle exceptions.
-	 */
-	class BreakpointNotifier implements ISafeRunnable {
-		
-		private IBreakpointListener fListener;
-		private int fType;
-		private IMarkerDelta fDelta;
-		private IBreakpoint fBreakpoint;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during breakpoint change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.breakpointAdded(fBreakpoint);
-					break;
-				case REMOVED:
-					fListener.breakpointRemoved(fBreakpoint, fDelta);
-					break;
-				case CHANGED:
-					fListener.breakpointChanged(fBreakpoint, fDelta);		
-					break;
-			}			
-		}
-
-		/**
-		 * Notifies the listeners of the add/change/remove
-		 * 
-		 * @param breakpoints the breakpoints that changed
-		 * @param deltas the deltas associated with the change
-		 * @param update the type of change
-		 */
-		public void notify(IBreakpoint[] breakpoints, IMarkerDelta[] deltas, int update) {
-			fType = update;
-			Object[] copiedListeners= fBreakpointListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IBreakpointListener)copiedListeners[i];
-				for (int j = 0; j < breakpoints.length; j++) {
-					fBreakpoint = breakpoints[j];
-					fDelta = deltas[j];
-                    SafeRunner.run(this);				
-				}
-			}
-			fListener = null;
-			fDelta = null;
-			fBreakpoint = null;			
-		}
-	}
-	
-	private BreakpointsNotifier getBreakpointsNotifier() {
-		return new BreakpointsNotifier();
-	}
-	
-	/**
-	 * Notifies breakpoint listener (multiple breakpoints) in a safe runnable to
-	 * handle exceptions.
-	 */
-	class BreakpointsNotifier implements ISafeRunnable {
-		
-		private IBreakpointsListener fListener;
-		private int fType;
-		private IMarkerDelta[] fDeltas;
-		private IBreakpoint[] fNotifierBreakpoints;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during breakpoint change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.breakpointsAdded(fNotifierBreakpoints);
-					break;
-				case REMOVED:
-					fListener.breakpointsRemoved(fNotifierBreakpoints, fDeltas);
-					break;
-				case CHANGED:
-					fListener.breakpointsChanged(fNotifierBreakpoints, fDeltas);		
-					break;
-			}			
-		}
-
-		/**
-		 * Notifies the listeners of the adds/changes/removes
-		 * 
-		 * @param breakpoints the breakpoints that changed
-		 * @param deltas the deltas associated with the changed breakpoints
-		 * @param update the type of change
-		 */
-		public void notify(IBreakpoint[] breakpoints, IMarkerDelta[] deltas, int update) {
-			fType = update;
-			fNotifierBreakpoints = breakpoints;
-			fDeltas = deltas;
-			Object[] copiedListeners = fBreakpointsListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IBreakpointsListener)copiedListeners[i];
-                SafeRunner.run(this);
-			}
-			fDeltas = null;
-			fNotifierBreakpoints = null;
-			fListener = null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManager#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return fEnabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManager#setEnabled(boolean)
-	 */
-	public void setEnabled(final boolean enabled) {
-        if (fEnabled != enabled) {
-    		fEnabled= enabled;
-            IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-                public void run(IProgressMonitor monitor) throws CoreException {
-                    IBreakpoint[] breakpoints = getBreakpoints();
-                    for (int i = 0; i < breakpoints.length; i++) {
-                        IBreakpoint breakpoint = breakpoints[i];
-                        // Touch the marker (but don't actually change anything) so that the icon in
-                        // the editor ruler will be updated (editors listen to marker changes). 
-                        breakpoint.getMarker().setAttribute(IBreakpoint.ENABLED, breakpoint.isEnabled());
-                    }
-                }
-            };
-            try {
-                ResourcesPlugin.getWorkspace().run(runnable, null, IWorkspace.AVOID_UPDATE ,null);
-            } catch (CoreException e) {
-                DebugPlugin.log(e);
-            }
-    		new BreakpointManagerNotifier().notify(enabled);
-        }
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManager#addBreakpointManagerListener(org.eclipse.debug.core.IBreakpointManagerListener)
-	 */
-	public void addBreakpointManagerListener(IBreakpointManagerListener listener) {
-		fBreakpointManagerListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManager#removeBreakpointManagerListener(org.eclipse.debug.core.IBreakpointManagerListener)
-	 */
-	public void removeBreakpointManagerListener(IBreakpointManagerListener listener) {
-		fBreakpointManagerListeners.remove(listener);
-	}	
-	
-	/**
-	 * Notifies breakpoint manager listeners in a safe runnable to
-	 * handle exceptions.
-	 */
-	class BreakpointManagerNotifier implements ISafeRunnable {
-		
-		private IBreakpointManagerListener fListener;
-		private boolean fManagerEnabled;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during breakpoint change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			fListener.breakpointManagerEnablementChanged(fManagerEnabled);
-		}
-
-		/**
-		 * Notifies the listeners of the enabled state change
-		 * 
-		 * @param enabled whether the manager is enabled
-		 */
-		public void notify(boolean enabled) {
-			fManagerEnabled= enabled;
-			Object[] copiedListeners = fBreakpointManagerListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IBreakpointManagerListener)copiedListeners[i];
-                SafeRunner.run(this);
-			}
-			fListener = null;
-		}
-	}
-	
-	class BreakpointManagerJob extends Job {
-		
-		private final IWorkspaceRunnable fRunnable;
-
-		public BreakpointManagerJob (IWorkspaceRunnable wRunnable) {
-			super("breakpoint manager job"); //$NON-NLS-1$
-			fRunnable= wRunnable;
-			setSystem(true);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		protected IStatus run(IProgressMonitor monitor) {
-			try {
-				getWorkspace().run(fRunnable, null, 0, null);
-			} catch (CoreException ce) {
-				DebugPlugin.log(ce);
-			}
-			return new Status(IStatus.OK, DebugPlugin.getUniqueIdentifier(), IStatus.OK, "", null); //$NON-NLS-1$
-		}
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.IBreakpointManager#getTypeName(org.eclipse.debug.core.model.IBreakpoint)
-     */
-    public String getTypeName(IBreakpoint breakpoint) {
-        String typeName= null;
-        IMarker marker = breakpoint.getMarker();
-        if (marker != null) {
-            try {
-                IConfigurationElement element = (IConfigurationElement) fBreakpointExtensions.get(marker.getType());
-                if (element != null) {
-                    typeName= element.getAttribute(IConfigurationElementConstants.NAME);
-                }
-            } 
-            catch (CoreException e) {}
-        }
-        return typeName;
-    }
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java
deleted file mode 100644
index 48849e5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java
+++ /dev/null
@@ -1,126 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core;
-
-import org.eclipse.osgi.util.NLS;
-
-public class DebugCoreMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.core.DebugCoreMessages";//$NON-NLS-1$
-
-	public static String Breakpoint_no_associated_marker;
-	public static String BreakpointManager_Missing_breakpoint_definition;
-	public static String BreakpointManager_Missing_model_identifier;
-	public static String DebugEvent_illegal_detail;
-	public static String DebugEvent_illegal_kind;
-
-	public static String DebugPlugin_0;
-
-	public static String DebugPlugin_2;
-
-	public static String DebugPlugin_3;
-
-	public static String DebugPlugin_4;
-
-	public static String DebugPlugin_5;
-
-	public static String DebugPlugin_6;
-
-	public static String DebugPlugin_7;
-
-	public static String DebugPlugin_8;
-	public static String DebugPlugin_Eclipse_runtime_does_not_support_working_directory_2;
-	public static String DebugPlugin_1;
-	public static String EnvironmentVariableResolver_0;
-
-	public static String LaunchConfiguration_0;
-	public static String LaunchConfiguration_1;
-	public static String LaunchConfiguration_11;
-	public static String LaunchConfiguration_13;
-	public static String LaunchConfiguration_14;
-
-	public static String LaunchConfiguration_15;
-
-	public static String LaunchConfiguration_16;
-
-	public static String LaunchConfiguration_17;
-
-	public static String LaunchConfiguration_18;
-
-	public static String LaunchConfiguration_19;
-	public static String LaunchConfiguration_2;
-	public static String LaunchConfiguration_3;
-	public static String LaunchConfiguration_4;
-	public static String LaunchConfiguration_5;
-	public static String LaunchConfiguration_6;
-	public static String LaunchConfiguration_7;
-	public static String LaunchConfiguration_8;
-	public static String LaunchConfiguration_9;
-	public static String LaunchConfigurationInfo_35;
-	public static String LaunchConfigurationType_7;
-
-	public static String LaunchConfigurationWorkingCopy_0;
-	public static String LaunchConfigurationWorkingCopy_1;
-
-	public static String LaunchConfigurationWorkingCopy_2;
-
-	public static String LaunchConfigurationWorkingCopy_3;
-
-	public static String LaunchDelegate_0;
-	public static String LaunchDelegate_1;
-	public static String LaunchDelegate_2;
-	
-	public static String LaunchManager_29;
-
-	public static String LaunchManager_31;
-
-	public static String LaunchMode_1;
-
-	public static String LogicalStructureProvider_0;
-
-	public static String LogicalStructureProvider_1;
-
-	public static String LogicalStructureType_1;
-	public static String SystemPropertyResolver_0;	
-	public static String InputStreamMonitor_label;
-	public static String Launch_terminate_failed;
-	public static String LaunchConfiguration_Failed_to_delete_launch_configuration__1;
-	public static String LaunchConfigurationDelegate_6;
-	public static String LaunchConfigurationDelegate_7;
-	public static String LaunchConfigurationInfo_Attribute__0__is_not_of_type_boolean__3;
-	public static String LaunchConfigurationInfo_Attribute__0__is_not_of_type_int__2;
-	public static String LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_lang_String__1;
-	public static String LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_util_List__1;
-	public static String LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_util_Map__1;
-	public static String LaunchConfigurationInfo_Invalid_launch_configuration_XML__10;
-	public static String LaunchConfigurationInfo_missing_type;
-	public static String LaunchConfigurationInfo_36;
-	public static String LaunchConfigurationWorkingCopy__0__occurred_generating_launch_configuration_XML__1;
-	public static String LaunchConfigurationWorkingCopy_Specified_container_for_launch_configuration_does_not_exist_2;
-	public static String LaunchConfigurationWorkingCopy_5;
-	public static String LaunchManager__0__occurred_while_reading_launch_configuration_file__1___1;
-	public static String LaunchManager_Invalid_launch_configuration_index__18;
-	public static String LaunchManager_does_not_exist;
-	public static String LaunchManager_Source_locator_does_not_exist___0__13;
-	public static String LaunchManager_30;
-	public static String LogicalStructureType_0;
-	public static String OutputStreamMonitor_label;
-	public static String ProcessMonitorJob_0;
-	public static String RuntimeProcess_terminate_failed;
-	public static String RuntimeProcess_Exit_value_not_available_until_process_terminates__1;
-	public static String WatchExpression_0;
-	public static String NullStreamsProxy_0;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, DebugCoreMessages.class);
-	}
-	public static String LaunchMode_0;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties
deleted file mode 100644
index 994bc5f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties
+++ /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
-###############################################################################
-
-Breakpoint_no_associated_marker=Breakpoint does not have an associated marker.
-BreakpointManager_Missing_breakpoint_definition=Missing breakpoint definition for marker type {0}
-BreakpointManager_Missing_model_identifier=Breakpoint missing debug model identifier
-DebugEvent_illegal_detail=detail is not one of the allowed constants, see IDebugEventConstants
-DebugEvent_illegal_kind=kind is not one of the allowed constants, see IDebugEventConstants
-DebugPlugin_Eclipse_runtime_does_not_support_working_directory_2=Eclipse runtime does not support working directory
-DebugPlugin_1=Debug Event Dispatch
-DebugPlugin_0=Exception occurred executing command line.
-DebugPlugin_2=Internal message logged from Debug Core: {0}
-DebugPlugin_3=Error logged from Debug Core: 
-DebugPlugin_4=Invalid process factory extension contributed by {0}; id: {1}
-DebugPlugin_5=Invalid status handler extension: {0}
-DebugPlugin_6=An exception occurred in asynchronous runnable.
-DebugPlugin_7=An exception occurred while filtering debug events.
-DebugPlugin_8=An exception occurred while dispatching debug events.
-EnvironmentVariableResolver_0=Environment variable not specified
-SystemPropertyResolver_0=System property not specified
-InputStreamMonitor_label=Input Stream Monitor
-Launch_terminate_failed=Terminate failed
-LaunchConfiguration_Failed_to_delete_launch_configuration__1=Failed to delete launch configuration.
-LaunchConfiguration_9=Preparing launch delegate...
-LaunchConfiguration_8=Performing pre-launch check...
-LaunchConfiguration_7=Build before launch - 
-LaunchConfiguration_6=Performing required build...
-LaunchConfiguration_5=Performing incremental workspace build...
-LaunchConfiguration_4=Performing final launch validation...
-LaunchConfiguration_3=Initializing source locator...
-LaunchConfiguration_2=Launching delegate...
-LaunchConfiguration_1=Unable to restore location for launch configuration from memento: {0}
-LaunchConfiguration_0=Launch configuration has corrupt resource mapping attributes
-LaunchConfiguration_11=No launch delegate found - launch canceled
-LaunchConfiguration_13=Duplicate launcher detected - launch canceled
-LaunchConfiguration_14=Incompatible launch mode: expecting {0} instead of {1}
-LaunchConfiguration_15=Unable to generate memento for {0}, shared file does not exist.
-LaunchConfiguration_16=Exception occurred creating launch configuration memento
-LaunchConfiguration_17=Exception occurred parsing memento
-LaunchConfiguration_18=Invalid launch configuration memento: missing path attribute
-LaunchConfiguration_19=Invalid launch configuration memento: missing local attribute
-LaunchConfigurationDelegate_6=Searching for errors
-LaunchConfigurationDelegate_7=Searching for errors in {0}
-LaunchConfigurationInfo_Attribute__0__is_not_of_type_boolean__3=Attribute {0} is not of type boolean.
-LaunchConfigurationInfo_Attribute__0__is_not_of_type_int__2=Attribute {0} is not of type int.
-LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_lang_String__1=Attribute {0} is not of type java.lang.String.
-LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_util_List__1=Attribute {0} is not of type java.util.List.
-LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_util_Map__1=Attribute {0} is not of type java.util.Map.
-LaunchConfigurationInfo_Invalid_launch_configuration_XML__10=Invalid launch configuration XML.
-LaunchConfigurationInfo_missing_type=Launch configuration type id \"{0}\" does not exist.\nPossible causes:\n\tMissing specification of a launch type (missing plug-in)\n\tIncorrect launch configuration XML
-LaunchConfigurationInfo_36=A null key has been specified for an attribute in this launch configuration
-LaunchConfigurationInfo_35=Attribute {0} is not of type java.util.Set.
-LaunchConfigurationWorkingCopy__0__occurred_generating_launch_configuration_XML__1={0} occurred generating launch configuration XML.
-LaunchConfigurationWorkingCopy_Specified_container_for_launch_configuration_does_not_exist_2=Specified container for launch configuration does not exist
-LaunchConfigurationWorkingCopy_5=Unable to save launch configuration.
-LaunchConfigurationWorkingCopy_0=Saving launch configuration [{0}]:
-LaunchConfigurationWorkingCopy_1=Writing local file
-LaunchConfigurationWorkingCopy_2=Creating new file {0}.launch in workspace
-LaunchConfigurationWorkingCopy_3=Setting contents of {0}.launch
-LaunchManager__0__occurred_while_reading_launch_configuration_file__1___1={0} occurred while reading launch configuration file: {1}.
-LaunchManager_Invalid_launch_configuration_index__18=Invalid launch configuration index.
-LaunchManager_does_not_exist=Launch configuration {0} at {1} does not exist.
-LaunchManager_Source_locator_does_not_exist___0__13=Source locator does not exist: {0}
-LaunchManager_30=Unable to retrieve shared launch configuration file for {0}
-LaunchManager_29=A shared launch configuration must be shared in same project that it is a default configuration for.
-
-# This describes the name of a single launch configuration
-# {0} is the base name of the configuration
-# {1} is the numerical modifier for the name
-# For example if we have a config named 'test' and we created a new one from test
-# we would get 'test (1)', where test is the basename, and 1 is the numerical modifier
-LaunchManager_31={0} ({1})
-LaunchDelegate_0=No description provided.
-LaunchDelegate_1={0} Launcher
-LaunchDelegate_2={0} launcher
-LaunchMode_0={0} As
-LaunchMode_1=Required attribute {0} missing for launchMode extension.
-LogicalStructureType_0=<Missing Description>
-LogicalStructureType_1=Required attribute {0} missing for logicalStructureType extension.
-LogicalStructureProvider_0=Required attribute modelIdentifier missing for logicalStructureType extension.
-LogicalStructureProvider_1=Required attribute class missing for logicalStructureType extension.
-OutputStreamMonitor_label=Output Stream Monitor
-ProcessMonitorJob_0=Process monitor
-RuntimeProcess_terminate_failed=Terminate failed
-RuntimeProcess_Exit_value_not_available_until_process_terminates__1=Exit value not available until process terminates.
-LaunchConfigurationType_7=Launch mode not supported: {0}
-WatchExpression_0=(Watch expressions not supported)
-NullStreamsProxy_0=Null Stream Monitor
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugOptions.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugOptions.java
deleted file mode 100644
index 2345f05..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugOptions.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.debug.internal.core;
-
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Access to debug options.
- * 
- * @since 3.3
- */
-public class DebugOptions {
-
-	// debug option flags
-	public static boolean DEBUG = false;
-	public static boolean DEBUG_COMMANDS = false;
-	public static boolean DEBUG_EVENTS = false;
-
-	public static void initDebugOptions() {
-		DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.debug.core/debug"));  //$NON-NLS-1$//$NON-NLS-2$
-		DEBUG_COMMANDS = DEBUG && "true".equals( //$NON-NLS-1$
-				 Platform.getDebugOption("org.eclipse.debug.core/debug/commands")); //$NON-NLS-1$
-		DEBUG_EVENTS = DEBUG && "true".equals( //$NON-NLS-1$
-				 Platform.getDebugOption("org.eclipse.debug.core/debug/events")); //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugPreferenceInitializer.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugPreferenceInitializer.java
deleted file mode 100644
index 2ef4d7f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugPreferenceInitializer.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.debug.internal.core;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * Initializes preferences for debug.core
- * 
- * @since 3.3
- */
-public class DebugPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		Preferences prefs = DebugPlugin.getDefault().getPluginPreferences();
-		// Step filter preferences
-		prefs.setDefault(StepFilterManager.PREF_USE_STEP_FILTERS, false);
-		prefs.setDefault(LaunchManager.PREF_DELETE_CONFIGS_ON_PROJECT_DELETE, true);
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/EnvironmentVariableResolver.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/EnvironmentVariableResolver.java
deleted file mode 100644
index b3f1f6c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/EnvironmentVariableResolver.java
+++ /dev/null
@@ -1,55 +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.debug.internal.core;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.osgi.service.environment.Constants;
-
-/**
- * Resolves the value of environment variables. 
- */
-public class EnvironmentVariableResolver implements IDynamicVariableResolver {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IDynamicVariableResolver#resolveValue(org.eclipse.core.variables.IDynamicVariable, java.lang.String)
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		if (argument == null) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), IStatus.ERROR, DebugCoreMessages.EnvironmentVariableResolver_0, null)); 
-		}
-		Map map= DebugPlugin.getDefault().getLaunchManager().getNativeEnvironmentCasePreserved();
-        String value= (String) map.get(argument);
-		if (value == null && Platform.getOS().equals(Constants.OS_WIN32)) {
-			// On Win32, env variables are case insensitive, so we search the map
-            // for matches manually.
-            Iterator iter = map.entrySet().iterator();
-            while (iter.hasNext()) {
-                Map.Entry entry= ((Map.Entry) iter.next());
-                String key= (String) entry.getKey();
-                if (key.equalsIgnoreCase(argument)) {
-                    return (String) entry.getValue();
-                }
-            }
-		}
-		return value;
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java
deleted file mode 100644
index 1d86507..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ExpressionManager.java
+++ /dev/null
@@ -1,675 +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.debug.internal.core;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionListener;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.IExpressionsListener;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.core.model.IWatchExpressionDelegate;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * The expression manager manages all registered expressions
- * for the debug plug-in. It is instantiated by the debug plug-in
- * at startup.
- *
- * @see IExpressionManager
- */
-public class ExpressionManager extends PlatformObject implements IExpressionManager {
-	
-	/**
-	 * Ordered collection of registered expressions.
-	 */
-	private Vector fExpressions = null;
-	
-	/**
-	 * List of expression listeners
-	 */
-	private ListenerList fListeners = null;
-	
-	/**
-	 * List of expressions listeners (plural)
-	 */
-	private ListenerList fExpressionsListeners = null;
-	
-	/**
-	 * Mapping of debug model identifiers (String) to
-	 * expression delegate extensions (IConfigurationElement)
-	 */
-	private Map fWatchExpressionDelegates= new HashMap();	
-	
-	// Constants for add/remove/change/insert/move notification
-	private static final int ADDED = 1;
-	private static final int CHANGED = 2;
-	private static final int REMOVED = 3;
-	private static final int INSERTED = 4;
-	private static final int MOVED = 5;
-
-	// Preference for persisted watch expressions
-	private static final String PREF_WATCH_EXPRESSIONS= "prefWatchExpressions"; //$NON-NLS-1$
-	// Persisted watch expression XML tags
-	private static final String WATCH_EXPRESSIONS_TAG= "watchExpressions"; //$NON-NLS-1$
-	private static final String EXPRESSION_TAG= "expression"; //$NON-NLS-1$
-	private static final String TEXT_TAG= "text"; //$NON-NLS-1$
-	private static final String ENABLED_TAG= "enabled"; //$NON-NLS-1$
-	// XML values
-	private static final String TRUE_VALUE= "true"; //$NON-NLS-1$
-	private static final String FALSE_VALUE= "false"; //$NON-NLS-1$
-	
-	public ExpressionManager() {
-		loadPersistedExpressions();
-		loadWatchExpressionDelegates();
-	}
-	
-	/**
-	 * Loads the mapping of debug models to watch expression delegates
-	 * from the org.eclipse.debug.core.watchExpressionDelegates
-	 * extension point.
-	 */
-	private void loadWatchExpressionDelegates() {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), "watchExpressionDelegates"); //$NON-NLS-1$
-		IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
-		for (int i = 0; i < configurationElements.length; i++) {
-			IConfigurationElement element = configurationElements[i];
-			if (element.getName().equals("watchExpressionDelegate")) { //$NON-NLS-1$
-				String debugModel = element.getAttribute("debugModel"); //$NON-NLS-1$
-				if (debugModel == null || debugModel.length() == 0) {
-					continue;
-				}
-				fWatchExpressionDelegates.put(debugModel, element);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#newWatchExpressionDelegate(java.lang.String)
-	 */
-	public IWatchExpressionDelegate newWatchExpressionDelegate(String debugModel) {
-		try {
-			IConfigurationElement element= (IConfigurationElement) fWatchExpressionDelegates.get(debugModel);
-			if (element != null) {
-				return (IWatchExpressionDelegate) element.createExecutableExtension(IConfigurationElementConstants.DELEGATE_CLASS);
-			} 
-			return null;
-		} catch (CoreException e) {
-			DebugPlugin.log(e);
-			return null;
-		}
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.IExpressionManager#hasWatchExpressionDelegate(java.lang.String)
-     */
-    public boolean hasWatchExpressionDelegate(String id) {
-        IConfigurationElement element= (IConfigurationElement) fWatchExpressionDelegates.get(id);
-        return element != null;
-    }
-    
-	/**
-	 * Loads any persisted watch expressions from the preferences.
-	 * NOTE: It's important that no setter methods are called on
-	 * 		the watchpoints which will fire change events as this
-	 * 		will cause an infinite loop (see Bug 27281).
-	 */
-	private void loadPersistedExpressions() {
-		String expressionsString= DebugPlugin.getDefault().getPluginPreferences().getString(PREF_WATCH_EXPRESSIONS);
-		if (expressionsString.length() == 0) {
-			return;
-		}
-		Element root;
-		try {
-			root = DebugPlugin.parseDocument(expressionsString);
-		} catch (CoreException e) {
-			DebugPlugin.logMessage("An exception occurred while loading watch expressions.", e); //$NON-NLS-1$
-			return;
-		}
-		if (!root.getNodeName().equals(WATCH_EXPRESSIONS_TAG)) {
-			DebugPlugin.logMessage("Invalid format encountered while loading watch expressions.", null); //$NON-NLS-1$
-			return;
-		}
-		NodeList list= root.getChildNodes();
-		for (int i= 0, numItems= list.getLength(); i < numItems; i++) {
-			Node node= list.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element element= (Element) node;
-				if (!element.getNodeName().equals(EXPRESSION_TAG)) {
-					DebugPlugin.logMessage(MessageFormat.format("Invalid XML element encountered while loading watch expressions: {0}", new String[] {node.getNodeName()}), null); //$NON-NLS-1$
-					continue;
-				}
-				String expressionText= element.getAttribute(TEXT_TAG);
-				if (expressionText.length() > 0) {
-					boolean enabled= TRUE_VALUE.equals(element.getAttribute(ENABLED_TAG));
-					IWatchExpression expression= newWatchExpression(expressionText, enabled);
-					if (fExpressions == null) {
-						fExpressions= new Vector(list.getLength());
-					}
-					fExpressions.add(expression);
-				} else {
-					DebugPlugin.logMessage("Invalid expression entry encountered while loading watch expressions. Expression text is empty.", null); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Creates a new watch expression with the given expression
-	 * and the given enablement;
-	 * 
-	 * @param expressionText the text of the expression to be evaluated
-	 * @param enabled whether or not the new expression should be enabled
-	 * @return the new watch expression
-	 */
-	private IWatchExpression newWatchExpression(String expressionText, boolean enabled) {
-		return new WatchExpression(expressionText, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#newWatchExpression(java.lang.String)
-	 */
-	public IWatchExpression newWatchExpression(String expressionText) {
-		return new WatchExpression(expressionText);
-	}
-	
-	/**
-	 * Persists this manager's watch expressions as XML in the
-	 * preference store. 
-	 */
-	public void storeWatchExpressions() {
-		Preferences prefs= DebugPlugin.getDefault().getPluginPreferences();
-		String expressionString= ""; //$NON-NLS-1$
-		try {
-			expressionString= getWatchExpressionsAsXML();
-		} catch (IOException e) {
-			DebugPlugin.log(e);
-		} catch (ParserConfigurationException e) {
-			DebugPlugin.log(e);
-		} catch (TransformerException e) {
-			DebugPlugin.log(e);
-		}
-		prefs.setValue(PREF_WATCH_EXPRESSIONS, expressionString);
-	}
-
-	/**
-	 * Returns this manager's watch expressions as XML.
-	 * @return this manager's watch expressions as XML
-	 * @throws IOException if an exception occurs while creating
-	 * 		the XML document.
-	 * @throws ParserConfigurationException if an exception occurs while creating
-	 * 		the XML document.
-	 * @throws TransformerException if an exception occurs while creating
-	 * 		the XML document.
-	 */
-	private String getWatchExpressionsAsXML() throws IOException, ParserConfigurationException, TransformerException {
-		IExpression[] expressions= getExpressions();
-		Document document= LaunchManager.getDocument();
-		Element rootElement= document.createElement(WATCH_EXPRESSIONS_TAG);
-		document.appendChild(rootElement);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression= expressions[i];
-			if (expression instanceof IWatchExpression) {
-				Element element= document.createElement(EXPRESSION_TAG); 
-				element.setAttribute(TEXT_TAG, expression.getExpressionText());
-				element.setAttribute(ENABLED_TAG, ((IWatchExpression) expression).isEnabled() ? TRUE_VALUE : FALSE_VALUE);
-				rootElement.appendChild(element);
-			}
-		}
-		return LaunchManager.serializeDocument(document);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#addExpression(org.eclipse.debug.core.model.IExpression)
-	 */
-	public void addExpression(IExpression expression) {
-		addExpressions(new IExpression[]{expression});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#addExpressions(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void addExpressions(IExpression[] expressions) {
-		if (fExpressions == null) {
-			fExpressions = new Vector(expressions.length);
-		}
-		boolean addedWatchExpression= false;
-		List added = new ArrayList(expressions.length);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			if (fExpressions.indexOf(expression) == -1) {
-				added.add(expression);
-				fExpressions.add(expression);
-				if (expression instanceof IWatchExpression) {
-					addedWatchExpression= true;
-				}
-			}				
-		}
-		if (!added.isEmpty()) {
-			fireUpdate((IExpression[])added.toArray(new IExpression[added.size()]), ADDED);
-		}
-		if (addedWatchExpression) {
-			storeWatchExpressions();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#getExpressions()
-	 */
-	public IExpression[] getExpressions() {
-		if (fExpressions == null) {
-			return new IExpression[0];
-		}
-		IExpression[] temp= new IExpression[fExpressions.size()];
-		fExpressions.copyInto(temp);
-		return temp;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#getExpressions(java.lang.String)
-	 */
-	public IExpression[] getExpressions(String modelIdentifier) {
-		if (fExpressions == null) {
-			return new IExpression[0];
-		}
-		ArrayList temp= new ArrayList(fExpressions.size());
-		Iterator iter= fExpressions.iterator();
-		while (iter.hasNext()) {
-			IExpression expression= (IExpression) iter.next();
-			String id= expression.getModelIdentifier();
-			if (id != null && id.equals(modelIdentifier)) {
-				temp.add(expression);
-			}
-		}
-		return (IExpression[]) temp.toArray(new IExpression[temp.size()]);
-	}
-	
-	/**
-	 * Adds the given expressions to the collection of registered expressions
-	 * in the workspace and notifies all registered listeners. The expressions
-	 * are inserted in the same order as the passed array at the index of the
-	 * specified expressions (before or after it depending on the boolean argument).
-	 * If no valid insertion location could be found, the expressions are added
-	 * to the end of the collection. Has no effect on expressions already registered.
-	 *
-	 * @param expressions expressions to insert into the collection
-	 * @param insertionLocation the expression at the location where expressions will be inserted
-	 * @param insertBefore whether to insert the expressions before or after the given insertion location
-	 * @since 3.4
-	 */
-	public void insertExpressions(IExpression[] expressions, IExpression insertionLocation, boolean insertBefore){
-		if (fExpressions == null) {
-			addExpressions(expressions);
-			return;
-		}
-		
-		int insertionIndex = fExpressions.indexOf(insertionLocation);
-		if (insertionIndex < 0){
-			addExpressions(expressions);
-			return;
-		}
-		if (!insertBefore){
-			insertionIndex++;
-		}
-		boolean addedWatchExpression = false;
-		List added = new ArrayList(expressions.length);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			if (fExpressions.indexOf(expression) == -1) {
-				//Insert in the same order as the array is passed
-				fExpressions.add(insertionIndex+added.size(), expression);
-				added.add(expression);
-				if (expression instanceof IWatchExpression) {
-					addedWatchExpression= true;
-				}
-			}				
-		}
-		
-		if (!added.isEmpty()) {
-			fireUpdate((IExpression[])added.toArray(new IExpression[added.size()]), INSERTED, insertionIndex);
-		}
-		if (addedWatchExpression) {
-			storeWatchExpressions();
-		}
-	}
-	
-	/**
-	 * Moves the given expressions from their location in the collection
-	 * of registered expressions in the workspace to the specified insertion
-	 * location.  Notifies all registered listeners.  This method has no effect
-	 * if an expression does not exist in the collection or if no valid insertion 
-	 * location could be determined.
-	 *   
-	 * @param expressions expressions to move
-	 * @param insertionLocation the expression at the location to insert the moved expressions
-	 * @param insertBefore whether to insert the moved expressions before or after the given insertion location
-	 * @since 3.4
-	 */
-	public void moveExpressions(IExpression[] expressions, IExpression insertionLocation, boolean insertBefore){
-		if (fExpressions == null){
-			return;
-		}
-		int insertionIndex = fExpressions.indexOf(insertionLocation);
-		if (insertionIndex < 0){
-			return;
-		}
-		if (!insertBefore){
-			insertionIndex++;
-		}
-		
-		List movedExpressions = new ArrayList(expressions.length);
-		for (int i = 0; i < expressions.length; i++) {
-			int removeIndex = fExpressions.indexOf(expressions[i]);
-			if (removeIndex >= 0){
-				movedExpressions.add(expressions[i]);
-				if (removeIndex < insertionIndex){
-					insertionIndex--;
-				}
-				fExpressions.remove(removeIndex);
-			}
-		}
-		IExpression[] movedExpressionsArray = (IExpression[])movedExpressions.toArray(new IExpression[movedExpressions.size()]);
-		for (int i = 0; i < movedExpressionsArray.length; i++) {
-			// Insert the expressions in the same order as the passed array
-			fExpressions.add(insertionIndex+i,movedExpressionsArray[i]);
-		}
-				
-		if (!movedExpressions.isEmpty()) {
-			fireUpdate(movedExpressionsArray, MOVED, insertionIndex);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#removeExpression(org.eclipse.debug.core.model.IExpression)
-	 */
-	public void removeExpression(IExpression expression) {
-		removeExpressions(new IExpression[] {expression});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#removeExpressions(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void removeExpressions(IExpression[] expressions) {
-		if (fExpressions == null) {
-			return;
-		}
-		List removed = new ArrayList(expressions.length);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			if (fExpressions.remove(expression)) {
-				removed.add(expression);
-				expression.dispose();
-			}				
-		}
-		if (!removed.isEmpty()) {
-			fireUpdate((IExpression[])removed.toArray(new IExpression[removed.size()]), REMOVED);
-			storeWatchExpressions();
-		}
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#addExpressionListener(org.eclipse.debug.core.IExpressionListener)
-	 */
-	public void addExpressionListener(IExpressionListener listener) {
-		if (fListeners == null) {
-			fListeners = new ListenerList();
-		}
-		fListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#removeExpressionListener(org.eclipse.debug.core.IExpressionListener)
-	 */
-	public void removeExpressionListener(IExpressionListener listener) {
-		if (fListeners == null) {
-			return;
-		}
-		fListeners.remove(listener);
-	}
-	
-	/**
-	 * The given watch expression has changed. Update the persisted
-	 * expressions to store this change as indicated
-	 * 
-	 * @param expression the changed expression
-	 * @param persist whether to persist the expressions
-	 */
-	protected void watchExpressionChanged(IWatchExpression expression, boolean persist) {
-		if (fExpressions != null && fExpressions.contains(expression)) {
-			if (persist) {
-				storeWatchExpressions();
-			}
-			fireUpdate(new IExpression[]{expression}, CHANGED);
-		}
-	}
-
-	/**
-	 * Notifies listeners of the adds/removes/changes
-	 * 
-	 * @param expressions expressions that were modified
-	 * @param update update flags
-	 */
-	private void fireUpdate(IExpression[] expressions, int update){
-		fireUpdate(expressions, update, -1);
-	}
-	
-	/**
-	 * Notifies listeners of the adds/removes/changes/insertions/moves
-	 * 
-	 * @param expressions expressions that were modified
-	 * @param update update flags
-	 * @param index index where expressions were inserted/moved to or <code>-1</code>
-	 */
-	private void fireUpdate(IExpression[] expressions, int update, int index){
-		// single listeners
-		getExpressionNotifier().notify(expressions, update);
-		
-		// multi listeners
-		getExpressionsNotifier().notify(expressions, update, index);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#hasExpressions()
-	 */
-	public boolean hasExpressions() {
-		return fExpressions != null && !fExpressions.isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#addExpressionListener(org.eclipse.debug.core.IExpressionsListener)
-	 */
-	public void addExpressionListener(IExpressionsListener listener) {
-		if (fExpressionsListeners == null) {
-			fExpressionsListeners = new ListenerList();
-		}
-		fExpressionsListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionManager#removeExpressionListener(org.eclipse.debug.core.IExpressionsListener)
-	 */
-	public void removeExpressionListener(IExpressionsListener listener) {
-		if (fExpressionsListeners == null) {
-			return;
-		}
-		fExpressionsListeners.remove(listener);
-	}
-	
-	private ExpressionNotifier getExpressionNotifier() {
-		return new ExpressionNotifier();
-	}
-	
-	/**
-	 * Notifies an expression listener (single expression) in a safe runnable to
-	 * handle exceptions.
-	 */
-	class ExpressionNotifier implements ISafeRunnable {
-		
-		private IExpressionListener fListener;
-		private int fType;
-		private IExpression fExpression;
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during expression change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.expressionAdded(fExpression);
-					break;
-				case REMOVED:
-					fListener.expressionRemoved(fExpression);
-					break;
-				case CHANGED:
-					fListener.expressionChanged(fExpression);		
-					break;
-			}			
-		}
-
-		/**
-		 * Notifies listeners of the add/change/remove
-		 * 
-		 * @param expressions the expressions that have changed
-		 * @param update the type of change
-		 */
-		public void notify(IExpression[] expressions, int update) {
-			if (fListeners != null) {
-				fType = update;
-				Object[] copiedListeners= fListeners.getListeners();
-				for (int i= 0; i < copiedListeners.length; i++) {
-					fListener = (IExpressionListener)copiedListeners[i];
-					for (int j = 0; j < expressions.length; j++) {
-						fExpression = expressions[j];
-                        SafeRunner.run(this);
-					}
-				}			
-			}
-			fListener = null;
-			fExpression = null;
-		}
-	}
-	
-	/**
-	 * Returns the expressions notifier
-	 * @return the expressions notifier
-	 */
-	private ExpressionsNotifier getExpressionsNotifier() {
-		return new ExpressionsNotifier();
-	}
-	
-	/**
-	 * Notifies an expression listener (multiple expressions) in a safe runnable
-	 * to handle exceptions.
-	 */
-	class ExpressionsNotifier implements ISafeRunnable {
-		
-		private IExpressionsListener fListener;
-		private int fType;
-		private int fIndex;
-		private IExpression[] fNotifierExpressions;
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during expression change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case MOVED:
-					// If the listener doesn't know about moves or the insertion location is unknown, do nothing.
-					if (fIndex >= 0 && fListener instanceof IExpressionsListener2){
-						((IExpressionsListener2)fListener).expressionsMoved(fNotifierExpressions, fIndex);
-					}
-					break;
-				case INSERTED:
-					// If the listener doesn't know about insertions or the insertion location is unknown, notify of an ADD
-					if (fIndex >= 0 && fListener instanceof IExpressionsListener2){
-						((IExpressionsListener2)fListener).expressionsInserted(fNotifierExpressions, fIndex);
-					} else {
-						fListener.expressionsAdded(fNotifierExpressions);
-					}
-					break;
-				case ADDED:
-					fListener.expressionsAdded(fNotifierExpressions);
-					break;
-				case REMOVED:
-					fListener.expressionsRemoved(fNotifierExpressions);
-					break;
-				case CHANGED:
-					fListener.expressionsChanged(fNotifierExpressions);		
-					break;
-			}			
-		}
-
-		/**
-		 * Notifies listeners of the adds/changes/removes
-		 * 
-		 * @param expressions the expressions that changed
-		 * @param update the type of change
-		 * @param index the index of the first change
-		 */
-		public void notify(IExpression[] expressions, int update, int index) {
-			if (fExpressionsListeners != null) {
-				fNotifierExpressions = expressions;
-				fType = update;
-				fIndex = index;
-				Object[] copiedListeners = fExpressionsListeners.getListeners();
-				for (int i= 0; i < copiedListeners.length; i++) {
-					fListener = (IExpressionsListener)copiedListeners[i];
-                    SafeRunner.run(this);
-				}
-			}	
-			fNotifierExpressions = null;
-			fListener = null;				
-		}
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java
deleted file mode 100644
index 60a0265..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core;
-
-/**
- * This interface provides a repository for the names of <code>IConfigurationElement</code> child node ids.
- * @since 3.3
- */
-public interface IConfigurationElementConstants {
-
-	/**
-	 * The id node name for a configuration element.
-	 * <p>Equal to the word: <code>id</code></p>
-	 */
-	public static final String ID = "id"; //$NON-NLS-1$
-	
-	/**
-	 * The name node name for a configuration element.
-	 * <p>Equal to the word: <code>name</code></p>
-	 */
-	public static final String NAME = "name"; //$NON-NLS-1$
-	
-	/**
-	 * The category node name for a configuration element.
-	 * <p>Equal to the word: <code>category</code></p>
-	 */
-	public static final String CATEGORY = "category"; //$NON-NLS-1$
-	
-	/**
-	 * The local node name for a configuration element.
-	 * <p>Equal to the word: <code>local</code></p>
-	 */
-	public static final String LOCAL = "local"; //$NON-NLS-1$
-	
-	/**
-	 * The shortcutId node name for a configuration element.
-	 * <p>Equal to the word: <code>shortcutID</code></p>
-	 */
-	public static final String LAUNCH_SHORTCUT_ID = "shortcutID"; //$NON-NLS-1$
-
-	/**
-	 * The launchPerspectives node name for a configuration element.
-	 * <p>Equal to the word: <code>launchPerspectives</code></p>
-	 */
-	public static final String LAUNCH_PERSPECTIVES = "launchPerspectives";  //$NON-NLS-1$
-	
-	/**
-	 * The launchPerspective node name for a configuration element.
-	 * <p>Equal to the word: <code>launchPerspective</code></p>
-	 */
-	public static final String LAUNCH_PERSPECTIVE = "launchPerspective"; //$NON-NLS-1$
-	
-	/**
-	 * The markerType node name for a configuration element.
-	 * <p>Equal to the word: <code>markerType</code></p>
-	 * 
-	 * @since 3.4
-	 */
-	public static final String MARKER_TYPE = "markerType";	 //$NON-NLS-1$
-	
-	/**
-	 * The delegateClass node name for a configuration element.
-	 * <p>Equal to the word: <code>delegateClass</code></p>
-	 * 
-	 * @since 3.4
-	 */
-	public static final String DELEGATE_CLASS = "delegateClass"; //$NON-NLS-1$
-	
-	/**
-	 * The launchConfiguration node name for a configuration element.
-	 * <p>Equal to the word: <code>launchConfiguration</code></p>
-	 */
-	public static final String LAUNCH_CONFIGURATION = "launchConfiguration"; //$NON-NLS-1$
-	
-	/**
-	 * The launchMode node name for a configuration element.
-	 * <p>Equal to the word: <code>launchMode</code></p>
-	 */
-	public static final String LAUNCH_MODE = "launchMode"; //$NON-NLS-1$
-	
-	/**
-	 * The lastLaunch node name for a configuration element.
-	 * <p>Equal to the word: <code>lastLaunch</code></p>
-	 */
-	public static final String LAST_LAUNCH = "lastLaunch"; //$NON-NLS-1$
-	
-	/**
-	 * The launch node name for a configuration element.
-	 * <p>Equal to the word: <code>launch</code></p>
-	 */
-	public static final String LAUNCH = "launch"; //$NON-NLS-1$
-	
-	/**
-	 * The launch as label node name for a configuration element.
-	 *  <p>Equal to the word: <code>launchAsLabel</code></p>
-	 *  
-	 *  @since 3.4
-	 */
-	public static final String LAUNCH_AS_LABEL = "launchAsLabel"; //$NON-NLS-1$
-	
-	/**
-	 * The launchHistory node name for a configuration element.
-	 * <p>Equal to the word: <code>launchHistory</code></p>
-	 */
-	public static final String LAUNCH_HISTORY = "launchHistory"; //$NON-NLS-1$
-	
-	/**
-	 * The node name for a launch group configuration element.
-	 * <p>Equal to the word: <code>launchGroup</code></p>
-	 */
-	public static final String LAUNCH_GROUP = "launchGroup"; //$NON-NLS-1$
-	
-	/**
-	 * The node name for a launch history MRU list configuration element.
-	 * <p>Equal to the word: <code>mruHistory</code></p>
-	 */
-	public static final String MRU_HISTORY = "mruHistory"; //$NON-NLS-1$	
-	
-	/**
-	 * The node name for a launch favorites list configuration element.
-	 * <p>Equal to the word: <code>favorites</code></p>
-	 */
-	public static final String FAVORITES = "favorites"; //$NON-NLS-1$
-	
-	/**
-	 * The after node name for a configuration element.
-	 * <p>Equal to the word: <code>after</code></p>
-	 */
-	public static final String AFTER = "after"; //$NON-NLS-1$
-	
-	/**
-	 * The path node name for a configuration element.
-	 * <p>Equal to the word: <code>path</code></p>
-	 */
-	public static final String PATH = "path"; //$NON-NLS-1$
-	
-	/**
-	 * The placement node name for a configuration element.
-	 * <p>Equal to the word: <code>placement</code></p>
-	 */
-	public static final String PLACEMENT = "placement"; //$NON-NLS-1$
-	
-	/**
-	 * The associated launch delegate node name for a configuration element
-	 * <p>Equal to the word: <code>associatedDelegate</code></p>
-	 */
-	public static final String ASSOCIATED_DELEGATE = "associatedDelegate"; //$NON-NLS-1$
-	
-	/**
-	 * The label node name for a configuration element.
-	 * <p>Equal to the word: <code>label</code></p>
-	 */
-	public static final String LABEL = "label"; //$NON-NLS-1$
-	
-	/**
-	 * The description node name for a configuration element.
-	 * <p>Equal to the word: <code>description</code></p>
-	 */
-	public static final String DESCRIPTION = "description"; //$NON-NLS-1$
-	
-	/**
-	 * The helpContextId node name for a configuration element.
-	 * <p>Equal to the word: <code>helpContextId</code></p>
-	 */
-	public static final String HELP_CONTEXT_ID = "helpContextId"; //$NON-NLS-1$
-	
-	/**
-	 * The icon node name for a configuration element.
-	 * <p>Equal to the word: <code>icon</code></p>
-	 */
-	public static final String ICON = "icon"; //$NON-NLS-1$
-	
-	/**
-	 * The public node name for a configuration element
-	 * <p>Equal to the word: <code>public</code></p>
-	 */
-	public static final String PUBLIC = "public"; //$NON-NLS-1$
-	
-	/**
-	 * The perspective node name for a configuration element.
-	 * <p>Equal to the word: <code>perspective</code></p>
-	 */
-	public static final String PERSPECTIVE = "perspective"; //$NON-NLS-1$
-	
-	/**
-	 * The preferredDelegates node name for a configuration element.
-	 * <p>Equal to the word: <code>preferredDelegates</code></p>
-	 */
-	public static final String PREFERRED_DELEGATES = "preferredDelegates"; //$NON-NLS-1$
-	
-	/**
-	 * The modes node name for a configuration element.
-	 * <p>Equal to the word: <code>modes</code></p>
-	 */
-	public static final String MODES = "modes"; //$NON-NLS-1$
-	
-	/**
-	 * The modesCombination node name for a configuration element.
-	 * <p>Equal to the word: <code>modeCombination</code></p> 
-	 */
-	public static final String MODE_COMBINATION = "modeCombination"; //$NON-NLS-1$
-	
-	/**
-	 * The mode node name for a configuration element.
-	 * <p>Equal to the word: <code>mode</code></p>
-	 */
-	public static final String MODE = "mode"; //$NON-NLS-1$
-	
-	/**
-	 * The type node name for a configuration element.
-	 * <p>Equal to the word: <code>type</code></p>
-	 */
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	
-	/**
-	 * The typeid node name for a configuration element.
-	 * <p>Equal to the word: <code>typeid</code></p> 
-	 */
-	public static final String TYPE_ID = "typeid"; //$NON-NLS-1$
-	
-	/**
-	 * The option node name for a configuration element.
-	 * <p>Equal to the word: <code>options</code></p>
-	 */
-	public static final String OPTIONS = "options"; //$NON-NLS-1$
-	
-	/**
-	 * The delegate node name for a configuration element.
-	 * <p>Equal to the word: <code>delegate</code></p>
-	 */
-	public static final String DELEGATE = "delegate"; //$NON-NLS-1$
-	
-	/**
-	 * The defaultShortcut node name for a configuration element.
-	 * <p>Equal to the word: <code>defaultShortcut</code></p>
-	 */
-	public static final String DEFAULT_LAUNCH_SHORTCUT = "defaultShortcut"; //$NON-NLS-1$
-	
-	/**
-	 * The delegateName node name for a configuration element.
-	 * <p>Equal to the word: <code>delegateName</code></p>
-	 */
-	public static final String DELEGATE_NAME = "delegateName"; //$NON-NLS-1$
-	
-	/**
-	 * The group node name for a configuration element.
-	 * <p>Equal to the word: <code>group</code></p>
-	 */
-	public static final String GROUP = "group"; //$NON-NLS-1$
-	
-	/**
-	 * The class node name for a configuration element.
-	 * <p>Equal to the word: <code>class</code></p>
-	 */
-	public static final String CLASS = "class"; //$NON-NLS-1$
-	
-	/**
-	 * The modelIdentifier node name for a configuration element.
-	 * <p>Equal to the word: <code>modelIdentifier</code></p>
-	 * 
-	 * @since 3.4
-	 */
-	public static final String MODEL_IDENTIFIER = "modelIdentifier"; //$NON-NLS-1$
-	
-	/**
-	 * The configurationTypes node name for a configuration element.
-	 * <p>Equal to the word: <code>configurationType</code></p>
-	 */
-	public static final String CONFIGURATION_TYPES = "configurationType"; //$NON-NLS-1$
-	
-	/**
-	 * The contextLabel node name for a configuration element.
-	 * <p>Equal to the word: <code>contextLabel</code></p>
-	 */
-	public static final String CONTEXT_LABEL = "contextLabel"; //$NON-NLS-1$
-	
-	/**
-	 * The contextualLaunch node name for a configuration element.
-	 * <p>Equal to the word: <code>contextualLaunch</code></p>
-	 */
-	public static final String CONTEXTUAL_LAUNCH = "contextualLaunch"; //$NON-NLS-1$
-	
-	/**
-	 * The sourcePathComputerId node name for a configuration element.
-	 * <p>Equal to the word: <code>sourcePathComputerId</code></p>
-	 */
-	public static final String SOURCE_PATH_COMPUTER = "sourcePathComputerId"; //$NON-NLS-1$
-	
-	/**
-	 * The delegateDescription node name for a configuration element.
-	 * <p>Equal to the word: <code>delegateDescription</code></p>
-	 */
-	public static final String DELEGATE_DESCRIPTION = "delegateDescription"; //$NON-NLS-1$
-	
-	/**
-	 * The sourceLocatorId node name for a configuration element.
-	 * <p>Equal to the word: <code>sourceLocatorId</code></p>
-	 */
-	public static final String SOURCE_LOCATOR = "sourceLocatorId"; //$NON-NLS-1$
-	
-	/**
-	 * The migrationDelegate node name for a configuration element.
-	 * <p>Equal to the word: <code>migrationDelegate</code></p>
-	 */
-	public static final String MIGRATION_DELEGATE = "migrationDelegate";  //$NON-NLS-1$
-	
-	/**
-	 * The memento node name for a configuration element.
-	 * <p>Equal to the word: <code>memento</code></p>
-	 */
-	public static final String MEMENTO = "memento"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IExpressionsListener2.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IExpressionsListener2.java
deleted file mode 100644
index fd20fcf..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IExpressionsListener2.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.debug.internal.core;
-
-import org.eclipse.debug.core.IExpressionsListener;
-import org.eclipse.debug.core.model.IExpression;
-
-/**
- * Provides call-back methods for expressions that have been moved or inserted
- * @since 3.4
- */
-public interface IExpressionsListener2 extends IExpressionsListener {
-
-	/**
-	 * Fires the model delta necessary to update the viewer after one or more
-	 * expressions have been moved to a different index in the tree.  The
-	 * expression array must be in the same order as they were added.  The given index
-	 * <strong>must</strong> take into account the removal of the expressions to be removed.
-	 * Therefore, for each of the expressions being moved with indices lower than the expect
-	 * insertion index, the passed insertion index must be reduced by one.
-	 * 
-	 * @param expressions array of expressions to be moved
-	 * @param index the index the expressions will be added to, adjusted for moved expressions
-	 */
-	public void expressionsMoved(IExpression[] expressions, int index);
-	
-	/**
-	 * Fires the model delta necessary to update the viewer after one or more
-	 * expressions have been inserted into a specific index in the tree.  The 
-	 * expression array must be in the same order as they were added.
-	 * 
-	 * @param expressions array of expressions to be moved
-	 * @param index the index the expressions will be added to
-	 */
-	public void expressionsInserted(IExpression[] expressions, int index);
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
deleted file mode 100644
index d2a5dc9..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
+++ /dev/null
@@ -1,158 +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.debug.internal.core;
-
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Vector;
-
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * Writes to the input stream of a system process, 
- * queueing output if the stream is blocked.
- * 
- * The input stream monitor writes to system in via
- * an output stream.
- */
-public class InputStreamMonitor {
-	
-	/**
-	 * The stream which is being written to (connected to system in).
-	 */
-	private OutputStream fStream;
-	/**
-	 * The queue of output.
-	 */
-	private Vector fQueue;
-	/**
-	 * The thread which writes to the stream.
-	 */
-	private Thread fThread;
-	/**
-	 * A lock for ensuring that writes to the queue are contiguous
-	 */
-	private Object fLock;
-	
-	/**
-	 * Whether the underlying output stream has been closed
-	 */
-	private boolean fClosed = false;
-	
-	/**
-	 * Creates an input stream monitor which writes
-	 * to system in via the given output stream.
-	 * 
-	 * @param stream output stream
-	 */
-	public InputStreamMonitor(OutputStream stream) {
-		fStream= stream;
-		fQueue= new Vector();
-		fLock= new Object();
-	}
-	
-	/**
-	 * Appends the given text to the stream, or
-	 * queues the text to be written at a later time
-	 * if the stream is blocked.
-	 * 
-	 * @param text text to append
-	 */
-	public void write(String text) {
-		synchronized(fLock) {
-			fQueue.add(text);
-			fLock.notifyAll();
-		}
-	}
-
-	/**
-	 * Starts a thread which writes the stream.
-	 */
-	public void startMonitoring() {
-		if (fThread == null) {
-			fThread= new Thread(new Runnable() {
-				public void run() {
-					write();
-				}
-			}, DebugCoreMessages.InputStreamMonitor_label); 
-            fThread.setDaemon(true);
-			fThread.start();
-		}
-	}
-	
-	/**
-	 * Close all communications between this
-	 * monitor and the underlying stream.
-	 */
-	public void close() {
-		if (fThread != null) {
-			Thread thread= fThread;
-			fThread= null;
-			thread.interrupt(); 
-		}
-	}
-	
-	/**
-	 * Continuously writes to the stream.
-	 */
-	protected void write() {
-		while (fThread != null) {
-			writeNext();
-		}
-		if (!fClosed) {
-			try {
-			    fStream.close();
-			} catch (IOException e) {
-				DebugPlugin.log(e);
-			}
-		}
-	}
-	
-	/**
-	 * Write the text in the queue to the stream.
-	 */
-	protected void writeNext() {
-		while (!fQueue.isEmpty() && !fClosed) {
-			String text = (String)fQueue.firstElement();
-			fQueue.removeElementAt(0);
-			try {
-				fStream.write(text.getBytes());
-				fStream.flush();
-			} catch (IOException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		try {
-			synchronized(fLock) {
-				fLock.wait();
-			}
-		} catch (InterruptedException e) {
-		}
-	}
-
-    /**
-     * Closes the output stream attached to the standard input stream of this
-     * monitor's process.
-     * 
-     * @exception IOException if an exception occurs closing the input stream
-     */
-    public void closeInputStream() throws IOException {
-        if (!fClosed) {
-            fClosed = true;
-            fStream.close();
-        } else {
-            throw new IOException();
-        }
-        
-    }
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
deleted file mode 100644
index 646f933..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
+++ /dev/null
@@ -1,867 +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
- *     Sascha Radike - bug 56642
- *******************************************************************************/
-package org.eclipse.debug.internal.core;
-
- 
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-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.resources.IncrementalProjectBuilder;
-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.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.core.Launch;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate2;
-import org.eclipse.debug.core.model.IPersistableSourceLocator;
-import org.eclipse.debug.core.sourcelookup.IPersistableSourceLocator2;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Launch configuration handle.
- * 
- * @see ILaunchConfiguration
- */
-public class LaunchConfiguration extends PlatformObject implements ILaunchConfiguration {
-	
-	/**
-	 * Launch configuration attribute that specifies the resources paths mapped to it.
-	 * Not all launch configurations will have a mapped resource unless migrated.
-	 * Value is a list of resource paths stored as portable strings, or <code>null</code>
-	 * if none.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String ATTR_MAPPED_RESOURCE_PATHS = DebugPlugin.getUniqueIdentifier() + ".MAPPED_RESOURCE_PATHS"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute that specifies the resources types mapped to it.
-	 * Not all launch configurations will have a mapped resource unless migrated.
-	 * Value is a list of resource type integers, or <code>null</code> if none.
-	 * 
-	 * @since 3.2
-	 */	
-	public static final String ATTR_MAPPED_RESOURCE_TYPES = DebugPlugin.getUniqueIdentifier() + ".MAPPED_RESOURCE_TYPES"; //$NON-NLS-1$
-	
-	/**
-	 * The launch modes set on this configuration.
-	 * 
-	 * @since 3.3
-	 */
-	public static final String ATTR_LAUNCH_MODES = DebugPlugin.getUniqueIdentifier() + ".LAUNCH_MODES"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute storing a list 
-	 * of preferred launchers for associated mode sets.
-	 * This attribute is a list of launchers stored by mode set
-	 * and relating to the id of the preferred launcher, which happens to be an <code>ILaunchDelegate</code>
-	 * 
-	 * @since 3.3
-	 */
-	public static final String ATTR_PREFERRED_LAUNCHERS = DebugPlugin.getUniqueIdentifier() + ".preferred_launchers"; //$NON-NLS-1$	
-	
-	/**
-	 * Status handler to prompt in the UI thread
-	 * 
-	 * @since 3.3
-	 */
-	protected static final IStatus promptStatus = new Status(IStatus.INFO, "org.eclipse.debug.ui", 200, "", null);  //$NON-NLS-1$//$NON-NLS-2$
-	
-	/**
-	 * Status handler to prompt the user to resolve the missing launch delegate issue
-	 * @since 3.3
-	 */
-	protected static final IStatus delegateNotAvailable = new Status(IStatus.INFO, "org.eclipse.debug.core", 226, "", null); //$NON-NLS-1$ //$NON-NLS-2$
-	
-	/**
-	 * Status handle to prompt the user to resolve duplicate launch delegates being detected
-	 * 
-	 *  @since 3.3
-	 */
-	protected static final IStatus duplicateDelegates = new Status(IStatus.INFO, "org.eclipse.debug.core", 227, "", null);  //$NON-NLS-1$//$NON-NLS-2$
-	
-	/**
-	 * Location this configuration is stored in. This 
-	 * is the key for a launch configuration handle.
-	 */
-	private IPath fLocation;
-
-	/**
-	 * Constructs a launch configuration in the given location.
-	 * 
-	 * @param location path to where this launch configuration's
-	 *  underlying file is located
-	 */
-	protected LaunchConfiguration(IPath location) {
-		setLocation(location);
-	}
-	
-	/**
-	 * Constructs a launch configuration from the given
-	 * memento.
-	 * 
-	 * @param memento launch configuration memento
-	 * @exception CoreException if the memento is invalid or
-	 * 	an exception occurs reading the memento
-	 */
-	protected LaunchConfiguration(String memento) throws CoreException {
-		Exception ex = null;
-		try {
-			Element root = null;
-			DocumentBuilder parser =
-				DocumentBuilderFactory.newInstance().newDocumentBuilder();
-			parser.setErrorHandler(new DefaultHandler());
-			StringReader reader = new StringReader(memento);
-			InputSource source = new InputSource(reader);
-			root = parser.parse(source).getDocumentElement();
-			
-			String localString = root.getAttribute(IConfigurationElementConstants.LOCAL); 
-			String path = root.getAttribute(IConfigurationElementConstants.PATH);
-
-			String message = null;				
-			if (path == null) {
-				message = DebugCoreMessages.LaunchConfiguration_18;  
-			} else if (localString == null) {
-				message = DebugCoreMessages.LaunchConfiguration_19;  
-			}
-			if (message != null) {
-				IStatus s = newStatus(message, DebugException.INTERNAL_ERROR, null);
-				throw new CoreException(s);
-			}
-			
-			IPath location = null;
-			boolean local = (Boolean.valueOf(localString)).booleanValue();
-			if (local) {
-				location = LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH.append(path);
-			} else {
-				location = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path)).getLocation();
-			}
-			setLocation(location);
-			if (location == null) {
-				IStatus s = newStatus(MessageFormat.format(DebugCoreMessages.LaunchConfiguration_1, new String[]{path}), DebugPlugin.INTERNAL_ERROR, null); 
-				throw new CoreException(s);
-			}
-			return;
-		} catch (ParserConfigurationException e) {
-			ex = e;			
-		} catch (SAXException e) {
-			ex = e;
-		} catch (IOException e) {
-			ex = e;
-		}
-		IStatus s = newStatus(DebugCoreMessages.LaunchConfiguration_17, DebugException.INTERNAL_ERROR, ex); 
-		throw new CoreException(s);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#contentsEqual(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public boolean contentsEqual(ILaunchConfiguration object) {
-		try {
-			if (object instanceof LaunchConfiguration) {
-				LaunchConfiguration otherConfig = (LaunchConfiguration) object;
-				return getName().equals(otherConfig.getName())
-				 	 && getType().equals(otherConfig.getType())
-				 	 && getLocation().equals(otherConfig.getLocation())
-					 && getInfo().equals(otherConfig.getInfo());
-			}
-			return false;
-		} catch (CoreException ce) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#copy(java.lang.String)
-	 */
-	public ILaunchConfigurationWorkingCopy copy(String name) throws CoreException {
-		ILaunchConfigurationWorkingCopy copy = new LaunchConfigurationWorkingCopy(this, name);
-		return copy;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#delete()
-	 */
-	public void delete() throws CoreException {
-		if (exists()) {
-			if (isLocal()) {
-				if (!(getLocation().toFile().delete())) {
-					throw new DebugException(
-						new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-						 DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchConfiguration_Failed_to_delete_launch_configuration__1, null) 
-					);
-				}
-				// manually update the launch manager cache since there
-				// will be no resource delta
-				getLaunchManager().launchConfigurationDeleted(this);
-			} else {
-				// delete the resource using IFile API such that
-				// resource deltas are fired.
-				IFile file = getFile();
-				if (file != null) {
-					// validate edit
-					if (file.isReadOnly()) {
-						IStatus status = ResourcesPlugin.getWorkspace().validateEdit(new IFile[] {file}, null);
-						if (!status.isOK()) {
-							throw new CoreException(status);
-						}
-					}
-					file.delete(true, null);
-				} else {
-					// Error - the exists test passed, but could not locate file 
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns whether this configuration is equal to the
-	 * given configuration. Two configurations are equal if
-	 * they are stored in the same location (and neither one
-	 * is a working copy).
-	 * 
-	 * @return whether this configuration is equal to the
-	 *  given configuration
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object object) {
-		if (object instanceof ILaunchConfiguration) {
-			if (isWorkingCopy()) {
-				return this == object;
-			} 
-			ILaunchConfiguration config = (ILaunchConfiguration) object;
-			if (!config.isWorkingCopy()) {
-				return config.getLocation().equals(getLocation());
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#exists()
-	 */
-	public boolean exists() {
-		if (isLocal()) {
-			return getLocation().toFile().exists();
-		}
-
-		IFile file = getFile();
-		return file != null && file.exists();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttribute(java.lang.String, boolean)
-	 */
-	public boolean getAttribute(String attributeName, boolean defaultValue) throws CoreException {
-		return getInfo().getBooleanAttribute(attributeName, defaultValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttribute(java.lang.String, int)
-	 */
-	public int getAttribute(String attributeName, int defaultValue) throws CoreException {
-		return getInfo().getIntAttribute(attributeName, defaultValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttribute(java.lang.String, java.util.List)
-	 */
-	public List getAttribute(String attributeName, List defaultValue) throws CoreException {
-		return getInfo().getListAttribute(attributeName, defaultValue);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttribute(java.lang.String, java.util.Set)
-	 */
-	public Set getAttribute(String attributeName, Set defaultValue) throws CoreException {
-		return getInfo().getSetAttribute(attributeName, defaultValue);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttribute(java.lang.String, java.util.Map)
-	 */
-	public Map getAttribute(String attributeName, Map defaultValue) throws CoreException {
-		return getInfo().getMapAttribute(attributeName, defaultValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttribute(java.lang.String, java.lang.String)
-	 */
-	public String getAttribute(String attributeName, String defaultValue) throws CoreException {
-		return getInfo().getStringAttribute(attributeName, defaultValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getAttributes()
-	 */
-	public Map getAttributes() throws CoreException {
-		LaunchConfigurationInfo info = getInfo();
-		return info.getAttributes();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getCategory()
-	 */
-	public String getCategory() throws CoreException {
-		return getType().getCategory();
-	}
-
-	/**
-	 * Returns the container this launch configuration is 
-	 * stored in, or <code>null</code> if this launch configuration
-	 * is stored locally.
-	 * 
-	 * @return the container this launch configuration is 
-	 * stored in, or <code>null</code> if this launch configuration
-	 * is stored locally
-	 */
-	protected IContainer getContainer() {
-		IFile file = getFile();
-		if (file != null) {
-			return file.getParent();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getFile()
-	 */
-	public IFile getFile() {
-		if (isLocal()) {
-			return null;
-		}
-		IFile[] files= ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(getLocation());
-		if (files.length > 0) {
-			return files[0];
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the info object containing the attributes
-	 * of this configuration
-	 * 
-	 * @return info for this handle
-	 * @exception CoreException if unable to retrieve the
-	 *  info object
-	 */
-	protected LaunchConfigurationInfo getInfo() throws CoreException {
-		return getLaunchManager().getInfo(this);
-	}
-
-	/**
-	 * Returns the last segment from the location
-	 * @return the last segment from the location
-	 */
-	private String getLastLocationSegment() {
-		String name = getLocation().lastSegment();
-		if (name.length() > LAUNCH_CONFIGURATION_FILE_EXTENSION.length()) {
-			name = name.substring(0, name.length() - (LAUNCH_CONFIGURATION_FILE_EXTENSION.length() + 1));
-		}
-		return name;
-	}
-	
-	/**
-	 * Returns the launch manager
-	 * 
-	 * @return launch manager
-	 */
-	protected LaunchManager getLaunchManager() {
-		return (LaunchManager)DebugPlugin.getDefault().getLaunchManager();
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getLocation()
-	 */
-	public IPath getLocation() {
-		return fLocation;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getResource()
-	 */
-	public IResource[] getMappedResources() throws CoreException {
-		List paths = getAttribute(ATTR_MAPPED_RESOURCE_PATHS, (List)null);
-		if (paths == null || paths.size() == 0) {
-			return null;
-		}
-		List types = getAttribute(ATTR_MAPPED_RESOURCE_TYPES, (List)null);
-		if (types == null || types.size() != paths.size()) {
-			throw new CoreException(newStatus(DebugCoreMessages.LaunchConfiguration_0, DebugPlugin.INTERNAL_ERROR, null)); 
-		}
-		ArrayList list = new ArrayList();
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		for(int i = 0; i < paths.size(); i++) {
-			String pathStr = (String) paths.get(i);
-			String typeStr= (String) types.get(i);
-			int type = -1;
-			try {
-				type = Integer.decode(typeStr).intValue();
-			} catch (NumberFormatException e) {
-				throw new CoreException(newStatus(DebugCoreMessages.LaunchConfiguration_0, DebugPlugin.INTERNAL_ERROR, e)); 
-			}
-			IPath path = Path.fromPortableString(pathStr);
-			IResource res = null;
-			switch (type) {
-			case IResource.FILE:
-				res = root.getFile(path);
-				break;
-			case IResource.PROJECT:
-				res = root.getProject(pathStr);
-				break;
-			case IResource.FOLDER:
-				res = root.getFolder(path);
-				break;
-			case IResource.ROOT:
-				res = root;
-				break;
-			default:
-				throw new CoreException(newStatus(DebugCoreMessages.LaunchConfiguration_0, DebugPlugin.INTERNAL_ERROR, null));
-			}
-			if(res != null) {
-				list.add(res);
-			}
-		}
-		if (list.isEmpty()) {
-			return null;
-		}
-		return (IResource[])list.toArray(new IResource[list.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getMemento()
-	 */
-	public String getMemento() throws CoreException {
-		IPath relativePath = null;
-		if (isLocal()) {
-			IPath rootPath = LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH;
-			IPath configPath = getLocation();
-			relativePath = configPath.removeFirstSegments(rootPath.segmentCount());
-			relativePath = relativePath.setDevice(null);
-		} else {
-			IFile file = getFile();
-			if (file == null) {
-				// cannot generate memento - missing file
-				IStatus status = newStatus(MessageFormat.format(DebugCoreMessages.LaunchConfiguration_15, new String[]{getName()}), DebugException.INTERNAL_ERROR, null);
-				throw new CoreException(status); 
-			}
-			relativePath = file.getFullPath();
-		}
-		Exception e= null;
-		try {
-			Document doc = LaunchManager.getDocument();
-			Element node = doc.createElement(IConfigurationElementConstants.LAUNCH_CONFIGURATION);
-			doc.appendChild(node);
-			node.setAttribute(IConfigurationElementConstants.LOCAL, (Boolean.valueOf(isLocal())).toString());
-			node.setAttribute(IConfigurationElementConstants.PATH, relativePath.toString());
-			return LaunchManager.serializeDocument(doc);
-		} catch (IOException ioe) {
-			e= ioe;
-		} catch (ParserConfigurationException pce) {
-			e= pce;
-		} catch (TransformerException te) {
-			e= te;
-		}
-		IStatus status = newStatus(DebugCoreMessages.LaunchConfiguration_16, DebugException.INTERNAL_ERROR,  e);  
-		throw new CoreException(status);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getName()
-	 */
-	public String getName() {
-		return getLastLocationSegment();
-	}
-
-	public Set getModes() throws CoreException {
-		Set options = getAttribute(ATTR_LAUNCH_MODES, (Set)null); 
-		return (options != null ? new HashSet(options) : new HashSet(0));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getType()
-	 */
-	public ILaunchConfigurationType getType() throws CoreException {
-		return getInfo().getType();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getWorkingCopy()
-	 */
-	public ILaunchConfigurationWorkingCopy getWorkingCopy() throws CoreException {
-		return new LaunchConfigurationWorkingCopy(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getLocation().hashCode();
-	}
-
-	/**
-	 * Set the source locator to use with the launch, if specified 
-	 * by this configuration.
-	 * 
-	 * @param launch the launch on which to set the source locator
-	 */
-	protected void initializeSourceLocator(ILaunch launch) throws CoreException {
-		if (launch.getSourceLocator() == null) {
-			String type = getAttribute(ATTR_SOURCE_LOCATOR_ID, (String)null);
-			if (type == null) {
-				type = getType().getSourceLocatorId();
-			}
-			if (type != null) {
-				IPersistableSourceLocator locator = getLaunchManager().newSourceLocator(type);
-				String memento = getAttribute(ATTR_SOURCE_LOCATOR_MEMENTO, (String)null);
-				if (memento == null) {
-					locator.initializeDefaults(this);
-				} else {
-					if(locator instanceof IPersistableSourceLocator2)
-						((IPersistableSourceLocator2)locator).initializeFromMemento(memento, this);
-					else
-						locator.initializeFromMemento(memento);
-				}
-				launch.setSourceLocator(locator);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#isLocal()
-	 */
-	public boolean isLocal() {
-		IPath localPath = LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH;
-		return localPath.isPrefixOf(getLocation());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#isMigrationCandidate()
-	 */
-	public boolean isMigrationCandidate() throws CoreException {
-		return ((LaunchConfigurationType)getType()).isMigrationCandidate(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#isWorkingCopy()
-	 */
-	public boolean isWorkingCopy() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#launch(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ILaunch launch(String mode, IProgressMonitor monitor) throws CoreException {
-		return launch(mode, monitor, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#launch(java.lang.String, org.eclipse.core.runtime.IProgressMonitor, boolean)
-	 */
-	public ILaunch launch(String mode, IProgressMonitor monitor, boolean build) throws CoreException {
-	    return launch(mode, monitor, build, true);
-	}
-
-	/* (non-Javadoc)
-     * @see org.eclipse.debug.core.ILaunchConfiguration#launch(java.lang.String, org.eclipse.core.runtime.IProgressMonitor, boolean, boolean)
-     */
-    public ILaunch launch(String mode, IProgressMonitor monitor, boolean build, boolean register) throws CoreException {
-    	if (monitor == null) {
-			monitor = new NullProgressMonitor();
-    	}
-    	/* Setup progress monitor
-    	 * - Prepare delegate (0)
-    	 * - Pre-launch check (1)
-    	 * - [Build before launch (7)]					if build
-    	 * - [Incremental build before launch (3)]		if build
-    	 * - Final launch validation (1)
-    	 * - Initialize source locator (1)
-    	 * - Launch delegate (10) */
-    	if (build) {
-    		monitor.beginTask("", 23); //$NON-NLS-1$
-    	}
-    	else {
-    		monitor.beginTask("", 13); //$NON-NLS-1$
-    	}
-		monitor.subTask(DebugCoreMessages.LaunchConfiguration_9);
-    	try {
-			// bug 28245 - force the delegate to load in case it is interested in launch notifications
-	    	Set modes = getModes();
-	    	modes.add(mode);
-	    	ILaunchDelegate[] delegates = getType().getDelegates(modes);
-	    	ILaunchConfigurationDelegate delegate = null;
-	    	if (delegates.length == 1) {
-	    		delegate = delegates[0].getDelegate();
-	    	} else if (delegates.length == 0) {
-	    		monitor.setCanceled(true);
-	    		IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(promptStatus);
-	    		if (handler != null) {
-	    			handler.handleStatus(delegateNotAvailable, new Object[] {this, mode});
-	    		}
-	    		IStatus status = new Status(IStatus.CANCEL, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, DebugCoreMessages.LaunchConfiguration_11, null); 
-	    		throw new CoreException(status);
-	    	} else {
-	    		ILaunchDelegate del = getPreferredDelegate(modes);
-	    		if(del == null) {
-	    			del = getType().getPreferredDelegate(modes);
-	    		}
-	    		if(del == null) {
-	    			IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(promptStatus);
-	    			IStatus status = null;
-	    			if (handler != null) {
-	    				status = (IStatus) handler.handleStatus(duplicateDelegates, new Object[] {this, mode});
-	    			}
-					if(status != null && status.isOK()) {
-						del = getPreferredDelegate(modes);
-						if(del == null) {
-							del = getType().getPreferredDelegate(modes);
-						}
-						if(del != null) {
-							delegate = del.getDelegate();
-						}
-						else {
-							monitor.setCanceled(true);
-							status = new Status(IStatus.CANCEL, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, DebugCoreMessages.LaunchConfiguration_13, null); 
-				    		throw new CoreException(status);
-						}
-					}
-					else {
-						monitor.setCanceled(true);
-						status = new Status(IStatus.CANCEL, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, DebugCoreMessages.LaunchConfiguration_13, null); 
-			    		throw new CoreException(status);
-					}
-	    		}
-	    		else {
-	    			delegate = del.getDelegate();
-	    		}
-	    	}
-	    	
-			ILaunchConfigurationDelegate2 delegate2 = null;
-			if (delegate instanceof ILaunchConfigurationDelegate2) {
-				delegate2 = (ILaunchConfigurationDelegate2) delegate;
-			}
-			// allow the delegate to provide a launch implementation
-			ILaunch launch = null;
-			if (delegate2 != null) {
-				launch = delegate2.getLaunch(this, mode);
-			}
-			if (launch == null) {
-				launch = new Launch(this, mode, null);
-			} else {
-				// ensure the launch mode is valid
-				if (!mode.equals(launch.getLaunchMode())) {
-					IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, 
-							MessageFormat.format(DebugCoreMessages.LaunchConfiguration_14, new String[]{mode, launch.getLaunchMode()}), null); 
-					throw new CoreException(status);
-				}
-			}
-			boolean captureOutput = getAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, true);
-			if(!captureOutput) {
-			    launch.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, "false"); //$NON-NLS-1$
-			} else {
-			    launch.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, null);
-			}
-			String attribute = getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null);
-			if(attribute == null) {
-				attribute = ResourcesPlugin.getEncoding();
-			}
-			launch.setAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, attribute);
-			
-		// perform initial pre-launch sanity checks
-			monitor.subTask(DebugCoreMessages.LaunchConfiguration_8);
-			
-			if (delegate2 != null) {
-				if (!(delegate2.preLaunchCheck(this, mode, new SubProgressMonitor(monitor, 1)))) {
-					// canceled
-					monitor.setCanceled(true);
-					return launch;
-				}
-			}
-			else {
-				monitor.worked(1); /* No pre-launch-check */
-			}
-		// perform pre-launch build
-			if (build) {
-				IProgressMonitor buildMonitor = new SubProgressMonitor(monitor, 10, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
-				buildMonitor.beginTask(DebugCoreMessages.LaunchConfiguration_7, 10);			
-				buildMonitor.subTask(DebugCoreMessages.LaunchConfiguration_6);
-				if (delegate2 != null) {
-					build = delegate2.buildForLaunch(this, mode, new SubProgressMonitor(buildMonitor, 7));
-				}
-				if (build) {
-					buildMonitor.subTask(DebugCoreMessages.LaunchConfiguration_5);
-					ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new SubProgressMonitor(buildMonitor, 3));				
-				}
-				else {
-					buildMonitor.worked(3); /* No incremental build required */
-				}
-			}
-		// final validation
-			monitor.subTask(DebugCoreMessages.LaunchConfiguration_4);
-			if (delegate2 != null) {
-				if (!(delegate2.finalLaunchCheck(this, mode, new SubProgressMonitor(monitor, 1)))) {
-					// canceled
-					monitor.setCanceled(true);
-					return launch;
-				}
-			}
-			else {
-				monitor.worked(1); /* No validation */
-			}
-			if (register) {
-			    getLaunchManager().addLaunch(launch);
-			}
-			
-			try {
-				//initialize the source locator
-				monitor.subTask(DebugCoreMessages.LaunchConfiguration_3);
-				initializeSourceLocator(launch);
-				monitor.worked(1);
-
-				/* Launch the delegate */
-				monitor.subTask(DebugCoreMessages.LaunchConfiguration_2);
-				delegate.launch(this, mode,	launch,	new SubProgressMonitor(monitor, 10));
-			} catch (CoreException e) {
-				// if there was an exception, and the launch is empty, remove it
-				if (!launch.hasChildren()) {
-					getLaunchManager().removeLaunch(launch);
-				}
-				monitor.setCanceled(true);
-				throw e;
-			}
-			if (monitor.isCanceled()) {
-				getLaunchManager().removeLaunch(launch);
-			}
-			return launch;
-    	}
-    	finally {
-   			monitor.done();
-    	}
-    }
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.ILaunchConfiguration#migrate()
-     */
-    public void migrate() throws CoreException {
-		((LaunchConfigurationType)getType()).migrate(this);
-	}
-
-	/**
-	 * Creates and returns a new error status based on 
-	 * the given message, code, and exception.
-	 * 
-	 * @param message error message
-	 * @param code error code
-	 * @param e exception or <code>null</code>
-	 * @return status
-	 */
-	protected IStatus newStatus(String message, int code, Throwable e) {
-		return new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), code, message, e);
-	}
-
-	/**
-	 * Sets the location of this configuration's underlying
-	 * file.
-	 * 
-	 * @param location the location of this configuration's underlying
-	 *  file
-	 */
-	private void setLocation(IPath location) {
-		fLocation = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#supportsMode(java.lang.String)
-	 */
-	public boolean supportsMode(String mode) throws CoreException {
-		return getType().supportsMode(mode);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#isReadOnly()
-	 */
-	public boolean isReadOnly() {
-		if(!isLocal()) {
-			IFile file = getFile();
-			if(file != null) {
-				return file.isReadOnly();
-			}
-		}
-		else {
-			File file = getLocation().toFile();
-			if(file != null) {
-				return file.exists() && !file.canWrite();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getPreferredDelegate(java.util.Set)
-	 */
-	public ILaunchDelegate getPreferredDelegate(Set modes) throws CoreException {
-		Map delegates = getAttribute(LaunchConfiguration.ATTR_PREFERRED_LAUNCHERS, (Map)null);
-		if(delegates != null) {
-			String id = (String) delegates.get(modes.toString());
-			if(id != null) {
-				return getLaunchManager().getLaunchDelegate(id);
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getName();
-	}
-	
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationComparator.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationComparator.java
deleted file mode 100644
index 810ffeb..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationComparator.java
+++ /dev/null
@@ -1,69 +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.debug.internal.core;
-
- 
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * Proxy to a runtime classpath entry resolver extension.
- * 
- * @see IConfigurationElementConstants
- */
-public class LaunchConfigurationComparator implements Comparator {
-
-	private IConfigurationElement fConfigurationElement;
-	
-	private Comparator fDelegate;
-	
-	/**
-	 * Constructs a new resolver on the given configuration element
-	 * 
-	 * @param element configuration element
-	 */
-	public LaunchConfigurationComparator(IConfigurationElement element) {
-		fConfigurationElement = element;
-	}
-		
-	/**
-	 * Returns the resolver delegate (and creates if required) 
-	 */
-	protected Comparator getComparator() {
-		if (fDelegate == null) {
-			try {
-				fDelegate = (Comparator)fConfigurationElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			} catch (CoreException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		return fDelegate;
-	}
-	
-
-	/**
-	 * @see Comparator#compare(Object, Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		return getComparator().compare(o1, o2);
-	}
-
-	/**
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object obj) {
-		return getComparator().equals(obj);
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
deleted file mode 100644
index b77d1ed..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
+++ /dev/null
@@ -1,768 +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.debug.internal.core;
-
- 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-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 javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import com.ibm.icu.text.MessageFormat;
- 
-/**
- * The information associated with a launch configuration handle.
- */
-public class LaunchConfigurationInfo {
-	
-	/**
-	 * Constants fo XML element names and attrbiutes
-	 */
-	private static final String KEY = "key"; //$NON-NLS-1$
-	private static final String VALUE = "value"; //$NON-NLS-1$
-	private static final String SET_ENTRY = "setEntry"; //$NON-NLS-1$
-	private static final String LAUNCH_CONFIGURATION = "launchConfiguration"; //$NON-NLS-1$
-	private static final String MAP_ENTRY = "mapEntry"; //$NON-NLS-1$
-	private static final String LIST_ENTRY = "listEntry"; //$NON-NLS-1$
-	private static final String SET_ATTRIBUTE = "setAttribute"; //$NON-NLS-1$
-	private static final String MAP_ATTRIBUTE = "mapAttribute"; //$NON-NLS-1$
-	private static final String LIST_ATTRIBUTE = "listAttribute"; //$NON-NLS-1$
-	private static final String BOOLEAN_ATTRIBUTE = "booleanAttribute"; //$NON-NLS-1$
-	private static final String INT_ATTRIBUTE = "intAttribute"; //$NON-NLS-1$
-	private static final String STRING_ATTRIBUTE = "stringAttribute"; //$NON-NLS-1$
-	private static final String TYPE = "type"; //$NON-NLS-1$
-	
-	/**
-	 * This configurations attribute table. Keys are <code>String</code>s and
-	 * values are one of <code>String</code>, <code>Integer</code>, or
-	 * <code>Boolean</code>.
-	 */
-	private TreeMap fAttributes;
-	
-	/**
-	 * This launch configuration's type
-	 */
-	private ILaunchConfigurationType fType;
-	
-	/**
-	 * Whether running on Sun 1.4 VM - see bug 110215
-	 */
-	private static boolean fgIsSun14x = false;
-	
-	static {
-		String vendor = System.getProperty("java.vm.vendor"); //$NON-NLS-1$
-		if (vendor.startsWith("Sun Microsystems")) { //$NON-NLS-1$
-			String version = System.getProperty("java.vm.version"); //$NON-NLS-1$
-			if (version.startsWith("1.4")) { //$NON-NLS-1$
-				fgIsSun14x = true;
-			}
-		}
-	}
-	
-	/**
-	 * Constructs a new empty info
-	 */
-	protected LaunchConfigurationInfo() {
-		setAttributeTable(new TreeMap());
-	}
-	
-	/**
-	 * Returns this configuration's attribute table.
-	 * 
-	 * @return attribute table
-	 */
-	private TreeMap getAttributeTable() {
-		return fAttributes;
-	}
-
-	/**
-	 * Sets this configuration's attribute table.
-	 * 
-	 * @param table
-	 *            attribute table
-	 */	
-	private void setAttributeTable(TreeMap table) {
-		fAttributes = table;
-	}
-	
-	/**
-	 * Sets the attributes in this info to those in the given map.
-	 * 
-	 * @param map
-	 */
-	protected void setAttributes(Map map) {
-		if (map == null) {
-			setAttributeTable(new TreeMap());
-			return;
-		}
-		setAttributeTable(new TreeMap(map));
-	}
-	
-	/**
-	 * Returns the <code>String</code> attribute with the given key or the
-	 * given default value if undefined.
-	 * 
-	 * @return attribute specified by given key or the defaultValue if undefined
-	 * @throws CoreException
-	 *             if the attribute with the given key exists but is not a
-	 *             <code>String</code>
-	 */
-	protected String getStringAttribute(String key, String defaultValue) throws CoreException {
-		Object attr = getAttributeTable().get(key);
-		if (attr != null) {
-			if (attr instanceof String) {
-				return (String)attr;
-			} 
-			throw new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_lang_String__1, new String[] {key}), null 
-				)
-			);
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * Returns the <code>int</code> attribute with the given key or the given
-	 * default value if undefined.
-	 * 
-	 * @return attribute specified by given key or the defaultValue if undefined
-	 * @throws CoreException
-	 *             if the attribute with the given key exists but is not an
-	 *             <code>int</code>
-	 */
-	protected int getIntAttribute(String key, int defaultValue) throws CoreException {
-		Object attr = getAttributeTable().get(key);
-		if (attr != null) {
-			if (attr instanceof Integer) {
-				return ((Integer)attr).intValue();
-			} 
-			throw new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_Attribute__0__is_not_of_type_int__2, new String[] {key}), null 
-				)
-			);
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * Returns the <code>boolean</code> attribute with the given key or the
-	 * given default value if undefined.
-	 * 
-	 * @return attribute specified by given key or the defaultValue if undefined
-	 * @throws CoreException
-	 *             if the attribute with the given key exists but is not a
-	 *             <code>boolean</code>
-	 */
-	protected boolean getBooleanAttribute(String key, boolean defaultValue) throws CoreException {
-		Object attr = getAttributeTable().get(key);
-		if (attr != null) {
-			if (attr instanceof Boolean) {
-				return ((Boolean)attr).booleanValue();
-			} 
-			throw new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_Attribute__0__is_not_of_type_boolean__3, new String[] {key}), null 
-				)
-			);
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * Returns the <code>java.util.List</code> attribute with the given key or
-	 * the given default value if undefined.
-	 * 
-	 * @return attribute specified by given key or the defaultValue if undefined
-	 * @throws CoreException
-	 *             if the attribute with the given key exists but is not a
-	 *             <code>java.util.List</code>
-	 */
-	protected List getListAttribute(String key, List defaultValue) throws CoreException {
-		Object attr = getAttributeTable().get(key);
-		if (attr != null) {
-			if (attr instanceof List) {
-				return (List)attr;
-			} 
-			throw new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_util_List__1, new String[] {key}), null 
-				)
-			);
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * Returns the <code>java.util.Set</code> attribute with the given key or
-	 * the given default value if undefined.
-	 * 
-	 * @return attribute specified by given key or the defaultValue if undefined
-	 * @throws CoreException
-	 *             if the attribute with the given key exists but is not a
-	 *             <code>java.util.Set</code>
-	 * 
-	 * @since 3.3
-	 */
-	protected Set getSetAttribute(String key, Set defaultValue) throws CoreException {
-		Object attr = getAttributeTable().get(key);
-		if (attr != null) {
-			if (attr instanceof Set) {
-				return (Set)attr;
-			} 
-			throw new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_35, new String[] {key}), null 
-				)
-			);
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * Returns the <code>java.util.Map</code> attribute with the given key or
-	 * the given default value if undefined.
-	 * 
-	 * @return attribute specified by given key or the defaultValue if undefined
-	 * @throws CoreException
-	 *             if the attribute with the given key exists but is not a
-	 *             <code>java.util.Map</code>
-	 */
-	protected Map getMapAttribute(String key, Map defaultValue) throws CoreException {
-		Object attr = getAttributeTable().get(key);
-		if (attr != null) {
-			if (attr instanceof Map) {
-				return (Map)attr;
-			} 
-			throw new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_Attribute__0__is_not_of_type_java_util_Map__1, new String[] {key}), null 
-				)
-			);
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * Sets this configuration's type.
-	 * 
-	 * @param type
-	 *            launch configuration type
-	 */
-	protected void setType(ILaunchConfigurationType type) {
-		fType = type;
-	}
-	
-	/**
-	 * Returns this configuration's type.
-	 * 
-	 * @return launch configuration type
-	 */
-	protected ILaunchConfigurationType getType() {
-		return fType;
-	}	
-	
-	
-	/**
-	 * Returns a copy of this info object
-	 * 
-	 * @return copy of this info
-	 */
-	protected LaunchConfigurationInfo getCopy() {
-		LaunchConfigurationInfo copy = new LaunchConfigurationInfo();
-		copy.setType(getType());
-		copy.setAttributeTable(getAttributes());
-		return copy;
-	}
-	
-	/**
-	 * Returns a copy of this info's attribute map.
-	 * 
-	 * @return a copy of this info's attribute map
-	 */
-	protected TreeMap getAttributes() {
-		return (TreeMap)getAttributeTable().clone();
-	}
-	
-	/**
-	 * Sets the given attribute to the given value. Only working copy's should
-	 * use this API.
-	 * 
-	 * @param key
-	 *            attribute key
-	 * @param value
-	 *            attribute value
-	 */
-	protected void setAttribute(String key, Object value) {
-		if (value == null) {
-			getAttributeTable().remove(key);
-		} else {
-			getAttributeTable().put(key, value);
-		}
-	}
-	
-	/**
-	 * Returns the content of this info as XML
-	 * 
-	 * @return the content of this info as XML
-	 * @throws CoreException
-	 *             if a attribute has been set with a null key
-	 * @throws IOException
-	 *             if an exception occurs creating the XML
-	 * @throws ParserConfigurationException
-	 *             if an exception occurs creating the XML
-	 * @throws TransformerException
-	 *             if an exception occurs creating the XML
-	 */
-	protected String getAsXML() throws CoreException, IOException, ParserConfigurationException, TransformerException {
-
-		Document doc = LaunchManager.getDocument();
-		Element configRootElement = doc.createElement(LAUNCH_CONFIGURATION); 
-		doc.appendChild(configRootElement);
-		
-		configRootElement.setAttribute(TYPE, getType().getIdentifier()); 
-		
-		Iterator keys = getAttributeTable().keySet().iterator();
-		while (keys.hasNext()) {
-			String key = (String)keys.next();
-			if (key == null) {
-				throw new DebugException(
-					new Status(
-						IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-						DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchConfigurationInfo_36, null 
-					)
-				);
-			}
-			Object value = getAttributeTable().get(key);
-			if (value == null) {
-				continue;
-			}
-			Element element = null;
-			String valueString = null;
-			if (value instanceof String) {
-				valueString = (String)value;
-				element = createKeyValueElement(doc, STRING_ATTRIBUTE, key, valueString); 
-			} else if (value instanceof Integer) {
-				valueString = ((Integer)value).toString();
-				element = createKeyValueElement(doc, INT_ATTRIBUTE, key, valueString); 
-			} else if (value instanceof Boolean) {
-				valueString = ((Boolean)value).toString();
-				element = createKeyValueElement(doc, BOOLEAN_ATTRIBUTE, key, valueString); 
-			} else if (value instanceof List) {				
-				element = createListElement(doc, LIST_ATTRIBUTE, key, (List)value); 
-			} else if (value instanceof Map) {				
-				element = createMapElement(doc, MAP_ATTRIBUTE, key, (Map)value); 
-			} else if(value instanceof Set) {
-				element = createSetElement(doc, SET_ATTRIBUTE, key, (Set)value); 
-			}
-			configRootElement.appendChild(element);
-		}
-
-		return LaunchManager.serializeDocument(doc);
-	}
-	
-	/**
-	 * Helper method that creates a 'key value' element of the specified type
-	 * with the specified attribute values.
-	 */
-	protected Element createKeyValueElement(Document doc, String elementType, String key, String value) {
-		Element element = doc.createElement(elementType);
-		element.setAttribute(KEY, key); 
-		element.setAttribute(VALUE, value);
-		return element;
-	}
-	
-	/**
-	 * Creates a new <code>Element</code> for the specified
-	 * <code>java.util.List</code>
-	 * 
-	 * @param doc the doc to add the element to
-	 * @param elementType the type of the element
-	 * @param setKey the key for the element
-	 * @param list the list to fill the new element with
-	 * @return the new element
-	 */
-	protected Element createListElement(Document doc, String elementType, String listKey, List list) {
-		Element listElement = doc.createElement(elementType);
-		listElement.setAttribute(KEY, listKey); 
-		Iterator iterator = list.iterator();
-		while (iterator.hasNext()) {
-			String value = (String) iterator.next();
-			Element element = doc.createElement(LIST_ENTRY); 
-			element.setAttribute(VALUE, value);
-			listElement.appendChild(element);
-		}		
-		return listElement;
-	}
-	
-	/**
-	 * Creates a new <code>Element</code> for the specified
-	 * <code>java.util.Set</code>
-	 * 
-	 * @param doc the doc to add the element to
-	 * @param elementType the type of the element
-	 * @param setKey the key for the element
-	 * @param set the set to fill the new element with
-	 * @return the new element
-	 * 
-	 * @since 3.3
-	 */
-	protected Element createSetElement(Document doc, String elementType, String setKey, Set set) {
-		Element setElement = doc.createElement(elementType);
-		setElement.setAttribute(KEY, setKey);
-		Element element = null;
-		for(Iterator iter = set.iterator(); iter.hasNext();) {
-			element = doc.createElement(SET_ENTRY);
-			element.setAttribute(VALUE, (String) iter.next());
-			setElement.appendChild(element);
-		}
-		return setElement;
-	}
-	
-	/**
-	 * Creates a new <code>Element</code> for the specified
-	 * <code>java.util.Map</code>
-	 * 
-	 * @param doc the doc to add the element to
-	 * @param elementType the type of the element
-	 * @param setKey the key for the element
-	 * @param map the map to fill the new element with
-	 * @return the new element
-	 * 
-	 */
-	protected Element createMapElement(Document doc, String elementType, String mapKey, Map map) {
-		Element mapElement = doc.createElement(elementType);
-		mapElement.setAttribute(KEY, mapKey); 
-		Iterator iterator = map.keySet().iterator();
-		while (iterator.hasNext()) {
-			String key = (String) iterator.next();
-			String value = (String) map.get(key);
-			Element element = doc.createElement(MAP_ENTRY); 
-			element.setAttribute(KEY, key); 
-			element.setAttribute(VALUE, value); 
-			mapElement.appendChild(element);
-		}		
-		return mapElement;		
-	}
-	
-	/**
-	 * Initializes the mapping of attributes from the XML file
-	 * @param root the root node from the XML document
-	 * @throws CoreException 
-	 */
-	protected void initializeFromXML(Element root) throws CoreException {
-		if (!root.getNodeName().equalsIgnoreCase(LAUNCH_CONFIGURATION)) { 
-			throw getInvalidFormatDebugException();
-		}
-		
-		// read type
-		String id = root.getAttribute(TYPE); 
-		if (id == null) {
-			throw getInvalidFormatDebugException();
-		} 
-		
-		ILaunchConfigurationType type = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(id);
-		if (type == null) {
-			String message= MessageFormat.format(DebugCoreMessages.LaunchConfigurationInfo_missing_type, new Object[]{id}); 
-			throw new DebugException(
-					new Status(
-					 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-					 DebugException.MISSING_LAUNCH_CONFIGURATION_TYPE, message, null)
-				);
-		}
-		setType(type);
-		
-		NodeList list = root.getChildNodes();
-		Node node = null;
-		Element element = null;
-		String nodeName = null;
-		for (int i = 0; i < list.getLength(); ++i) {
-			node = list.item(i);
-			short nodeType = node.getNodeType();
-			if (nodeType == Node.ELEMENT_NODE) {
-				element = (Element) node;
-				nodeName = element.getNodeName();
-				if (nodeName.equalsIgnoreCase(STRING_ATTRIBUTE)) { 
-					setStringAttribute(element);
-				} else if (nodeName.equalsIgnoreCase(INT_ATTRIBUTE)) { 
-					setIntegerAttribute(element);
-				} else if (nodeName.equalsIgnoreCase(BOOLEAN_ATTRIBUTE))  { 
-					setBooleanAttribute(element);
-				} else if (nodeName.equalsIgnoreCase(LIST_ATTRIBUTE)) {   
-					setListAttribute(element);					
-				} else if (nodeName.equalsIgnoreCase(MAP_ATTRIBUTE)) {    
-					setMapAttribute(element);										
-				} else if(nodeName.equalsIgnoreCase(SET_ATTRIBUTE)) { 
-					setSetAttribute(element);
-				}
-			}
-		}
-	}	
-	
-	/**
-	 * Loads a <code>String</code> from the specified element into the local attribute mapping
-	 * @param element the element to load from
-	 * @throws CoreException
-	 */
-	protected void setStringAttribute(Element element) throws CoreException {
-		setAttribute(getKeyAttribute(element), getValueAttribute(element));
-	}
-	
-	/**
-	 * Loads an <code>Integer</code> from the specified element into the local attribute mapping
-	 * @param element the element to load from
-	 * @throws CoreException
-	 */
-	protected void setIntegerAttribute(Element element) throws CoreException {
-		setAttribute(getKeyAttribute(element), new Integer(getValueAttribute(element)));
-	}
-	
-	/**
-	 * Loads a <code>Boolean</code> from the specified element into the local attribute mapping
-	 * @param element the element to load from
-	 * @throws CoreException
-	 */
-	protected void setBooleanAttribute(Element element) throws CoreException {
-		setAttribute(getKeyAttribute(element), Boolean.valueOf(getValueAttribute(element)));
-	}
-	
-	/**
-	 * Reads a <code>List</code> attribute from the specified XML node and
-	 * loads it into the mapping of attributes
-	 * 
-	 * @param element the element to read the list attribute from
-	 * @throws CoreException if the element has an invalid format
-	 */
-	protected void setListAttribute(Element element) throws CoreException {
-		String listKey = element.getAttribute(KEY);  
-		NodeList nodeList = element.getChildNodes();
-		int entryCount = nodeList.getLength();
-		List list = new ArrayList(entryCount);
-		Node node = null;
-		Element selement = null;
-		for (int i = 0; i < entryCount; i++) {
-			node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				selement = (Element) node;		
-				if (!selement.getNodeName().equalsIgnoreCase(LIST_ENTRY)) { 
-					throw getInvalidFormatDebugException();
-				}
-				list.add(getValueAttribute(selement));
-			}
-		}
-		setAttribute(listKey, list);
-	}
-		
-	/**
-	 * Reads a <code>Set</code> attribute from the specified XML node and
-	 * loads it into the mapping of attributes
-	 * 
-	 * @param element the element to read the set attribute from
-	 * @throws CoreException if the element has an invalid format
-	 * 
-	 * @since 3.3
-	 */
-	protected void setSetAttribute(Element element) throws CoreException {
-		String setKey = element.getAttribute(KEY);
-		NodeList nodeList = element.getChildNodes();
-		int entryCount = nodeList.getLength();
-		Set set = new HashSet(entryCount);
-		Node node = null;
-		Element selement = null;
-		for(int i = 0; i < entryCount; i++) {
-			node = nodeList.item(i);
-			if(node.getNodeType() == Node.ELEMENT_NODE) {
-				selement = (Element)node;
-				if(!selement.getNodeName().equalsIgnoreCase(SET_ENTRY)) { 
-					throw getInvalidFormatDebugException();
-				}
-				set.add(getValueAttribute(selement));
-			}
-		}
-		setAttribute(setKey, set);
-	}
-	
-	/**
-	 * Reads a <code>Map</code> attribute from the specified XML node and
-	 * loads it into the mapping of attributes
-	 * 
-	 * @param element the element to read the map attribute from
-	 * @throws CoreException if the element has an invalid format
-	 */
-	protected void setMapAttribute(Element element) throws CoreException {
-		String mapKey = element.getAttribute(KEY);  
-		NodeList nodeList = element.getChildNodes();
-		int entryCount = nodeList.getLength();
-		Map map = new HashMap(entryCount);
-		Node node = null;
-		Element selement = null;
-		for (int i = 0; i < entryCount; i++) {
-			node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				selement = (Element) node;		
-				if (!selement.getNodeName().equalsIgnoreCase(MAP_ENTRY)) { 
-					throw getInvalidFormatDebugException();
-				}
-				map.put(getKeyAttribute(selement), getValueAttribute(selement));
-			}
-		}
-		setAttribute(mapKey, map);
-	}
-		
-	/**
-	 * Returns the <code>String</code> representation of the 'key' attribute from the specified element
-	 * @param element the element to read from
-	 * @return the value
-	 * @throws CoreException
-	 */
-	protected String getKeyAttribute(Element element) throws CoreException {
-		String key = element.getAttribute(KEY);
-		if (key == null) {
-			throw getInvalidFormatDebugException();
-		}
-		return key;
-	}
-	
-	/**
-	 * Returns the <code>String</code> representation of the 'value' attribute from the specified element
-	 * @param element the element to read from
-	 * @return the value
-	 * @throws CoreException
-	 */
-	protected String getValueAttribute(Element element) throws CoreException {
-		String value = element.getAttribute(VALUE);   
-		if (value == null) {
-			throw getInvalidFormatDebugException();
-		}
-		return value;
-	}
-	
-	/**
-	 * Returns an invalid format exception for reuse
-	 * @return an invalid format exception
-	 */
-	protected DebugException getInvalidFormatDebugException() {
-		return 
-			new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchConfigurationInfo_Invalid_launch_configuration_XML__10, null 
-				)
-			);
-	}
-	
-	/**
-	 * Two <code>LaunchConfigurationInfo</code> objects are equal if and only
-	 * if they have the same type and they have the same set of attributes with
-	 * the same values.
-	 * 
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object obj) {
-		
-		// Make sure it's a LaunchConfigurationInfo object
-		if (!(obj instanceof LaunchConfigurationInfo)) {
-			return false;
-		}
-		
-		// Make sure the types are the same
-		LaunchConfigurationInfo other = (LaunchConfigurationInfo) obj;
-		if (!fType.getIdentifier().equals(other.getType().getIdentifier())) {
-			return false;
-		}
-		
-		// Make sure the attributes are the same
-		return compareAttributes(fAttributes, other.getAttributeTable());
-	}
-	
-	/**
-	 * Returns whether the two attribute maps are equal, consulting registered
-	 * comparator extensions.
-	 * 
-	 * @param map1  attribute map
-	 * @param map2 attribute map
-	 * @return whether the two attribute maps are equal
-	 */
-	protected boolean compareAttributes(TreeMap map1, TreeMap map2) {
-		LaunchManager manager = (LaunchManager)DebugPlugin.getDefault().getLaunchManager();
-		if (map1.size() == map2.size()) {
-			Iterator attributes = map1.keySet().iterator();
-			while (attributes.hasNext()) {
-				String key = (String)attributes.next();
-				Object attr1 = map1.get(key);
-				Object attr2 = map2.get(key);
-				if (attr2 == null) {
-					return false;
-				}
-				Comparator comp = manager.getComparator(key);
-				if (comp == null) {
-					if (fgIsSun14x) {
-						if(attr2 instanceof String & attr1 instanceof String) {
-							// this is a hack for bug 110215, on SUN 1.4.x, \r
-							// is stripped off when the stream is written to the
-							// DOM
-							// this is not the case for 1.5.x, so to be safe we
-							// are stripping \r off all strings before we
-							// compare for equality
-							attr1 = ((String)attr1).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
-							attr2 = ((String)attr2).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-					}
-					if (!attr1.equals(attr2)) {
-						return false;
-					}
-				} else {
-					if (comp.compare(attr1, attr2) != 0) {
-						return false;
-					}
-				}
-			}
-			return true;	
-		}
-		return false;
-	}
-	
-	/**
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return fType.hashCode() + fAttributes.size();
-	}
-
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
deleted file mode 100644
index a33a579..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
+++ /dev/null
@@ -1,491 +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.debug.internal.core;
-
- 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputer;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * A launch configuration type wrappers a configuration
- * element for a <code>launchConfigurationType</code>
- * extension.
- */
-public class LaunchConfigurationType extends PlatformObject implements ILaunchConfigurationType {
-	
-	/**
-	 * The configuration element of the extension.
-	 */
-	private IConfigurationElement fElement;
-	
-	/**
-	 *  a listing of modes contributed to this launch configuration type
-	 *  
-	 *  @since 3.3
-	 */
-	private Set fModes = null;
-	
-	/**
-	 * A set of sets containing all of the supported mode combinations of this type
-	 * 
-	 * @since 3.3
-	 */
-	private Set fModeCombinations = null;
-	
-	/**
-	 * the default source path computer for this config type
-	 * 
-	 * @since 3.3
-	 */
-	private ISourcePathComputer fSourcePathComputer = null;
-	
-	/**
-	 * Cache for the migration delegate
-	 * 
-	 * @since 3.3
-	 */
-	private ILaunchConfigurationMigrationDelegate fMigrationDelegate = null;
-	
-	/**
-	 * The source locator id for this config type
-	 */
-	private String fSourceLocator = null;
-	
-	/**
-	 * The delegates for launch configurations of this type.
-	 * Delegates are instantiated lazily as required. There may
-	 * be different delegates for different modes (since 3.0).
-	 * Map of modes (Set of modes) to list of delegates
-	 */
-	private Map fDelegates = null;
-	
-	/**
-	 * The source provider cache entry
-	 */
-	private LaunchDelegate fSourceProvider = null;
-	
-	/**
-	 * A map of preferred launch delegates for mode combinations
-	 * 
-	 *  @since 3.3
-	 */
-	private Map fPreferredDelegates = null;
-	
-	/**
-	 * Constructs a new launch configuration type on the
-	 * given configuration element.
-	 * 
-	 * @param element configuration element
-	 */
-	protected LaunchConfigurationType(IConfigurationElement element) {
-		fElement = element;
-		initializePreferredDelegates();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getAttribute(java.lang.String)
-	 */
-	public String getAttribute(String attributeName) {
-		return fElement.getAttribute(attributeName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getCategory()
-	 */
-	public String getCategory() {
-		return fElement.getAttribute(IConfigurationElementConstants.CATEGORY);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getDelegate()
-	 */
-	public ILaunchConfigurationDelegate getDelegate() throws CoreException {
-		return getDelegate(ILaunchManager.RUN_MODE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getDelegate(java.lang.String)
-	 */
-	public ILaunchConfigurationDelegate getDelegate(String mode) throws CoreException {
-		Set modes = new HashSet();
-		modes.add(mode);
-		ILaunchDelegate[] delegates = getDelegates(modes);
-		if (delegates.length > 0) {
-			return delegates[0].getDelegate();
-		}
-		IStatus status = null;
-		ILaunchMode launchMode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(mode);
-		if (launchMode == null) {
-			status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-					MessageFormat.format(DebugCoreMessages.LaunchConfigurationType_7,
-							new String[]{mode}));
-		} else {
-			status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				MessageFormat.format(DebugCoreMessages.LaunchConfigurationType_7,
-						new String[]{((LaunchManager)DebugPlugin.getDefault().getLaunchManager()).getLaunchModeName(mode)}));
-		}
-		throw new CoreException(status);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getDelegates(java.util.Set)
-	 */
-	public ILaunchDelegate[] getDelegates(Set modes) throws CoreException {
-		initializeDelegates();
-		Set delegates = (Set) fDelegates.get(modes);
-		if (delegates == null) {
-			delegates = Collections.EMPTY_SET;
-		}
-		return (ILaunchDelegate[]) delegates.toArray(new ILaunchDelegate[delegates.size()]);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#setPreferredDelegate(java.util.Set, org.eclipse.debug.core.ILaunchDelegate)
-	 */
-	public void setPreferredDelegate(Set modes, ILaunchDelegate delegate) {
-		if(fPreferredDelegates == null) {
-			fPreferredDelegates = new HashMap();
-		}
-		if (delegate == null) {
-			fPreferredDelegates.remove(modes);
-		} else {
-			fPreferredDelegates.put(modes, delegate);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getPreferredDelegate(java.util.Set)
-	 */
-	public ILaunchDelegate getPreferredDelegate(Set modes) {
-		return (ILaunchDelegate) fPreferredDelegates.get(modes);
-	}
-	
-	/**
-	 * Internal use method to allow access to the listing of preferred delegates. Delegates are stored in the map by their mode set combinations.
-	 * <p>
-	 * preferred delegates are stored as:
-	 * <pre>
-	 *  Map&lt;modeset, delegate&gt;
-	 * </pre>
-	 * </p>
-	 * @return the <code>java.util.Map</code> of preferred delegates or an empty <code>java.util.Map</code> if no preferred delegates are specified, never <code>null</code>
-	 * 
-	 * @since 3.3
-	 */
-	public Map getPreferredDelegates() {
-		return fPreferredDelegates;
-	}
-	
-	/**
-	 * This method is used to initialize the listing of preferred launch delegates for this type
-	 * 
-	 * <p>
-	 * Undecided if this code should live in the launch manager and have it load a listing of all preferred launch 
-	 * delegates that each config type could then query as needed when looking for their preferred delegate. 
-	 * Seems like it would be alot less work...
-	 * </p>
-	 * @since 3.3
-	 */
-	private synchronized void initializePreferredDelegates() {
-		if(fPreferredDelegates == null) {
-			fPreferredDelegates = new HashMap();
-			initializeDelegates();
-			LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
-			ILaunchDelegate delegate = null;
-			Set modes = null;
-			for(Iterator iter = fDelegates.keySet().iterator(); iter.hasNext();) {
-				modes = (Set) iter.next();
-				delegate = lm.getPreferredDelegate(getIdentifier(), modes);
-				if(delegate != null) {
-					fPreferredDelegates.put(modes, delegate);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Initializes the listing of launch delegates for this type
-	 */
-	private synchronized void initializeDelegates() {
-		if (fDelegates == null) {
-			// initialize delegate
-			fDelegates = new Hashtable();
-			LaunchDelegate[] launchDelegates = getLaunchDelegateExtensions();
-			LaunchDelegate delegate = null;
-			List modelist = null;
-			Set modes = null, tmp = null;
-			for (int i = 0; i < launchDelegates.length; i++) {
-				delegate = launchDelegates[i];
-				modelist = delegate.getModes();
-				for(int j = 0; j < modelist.size(); j++) {
-					//cache the delegate based on its set of modes and delegate
-					modes = (Set) modelist.get(j);
-					tmp = (Set) fDelegates.get(modes);
-					if (tmp == null) {
-						tmp = new HashSet();
-						fDelegates.put(modes, tmp);
-					}
-					tmp.add(delegate);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Returns all launch delegate extensions registered for this configuration type.
-	 * 
-	 * @return all launch delegate extensions
-	 */
-	private LaunchDelegate[] getLaunchDelegateExtensions() {
-		return ((LaunchManager) DebugPlugin.getDefault().getLaunchManager()).getLaunchDelegates(getIdentifier());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getIdentifier()
-	 */
-	public String getIdentifier() {
-		return fElement.getAttribute(IConfigurationElementConstants.ID);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getName()
-	 */
-	public String getName() {
-		return fElement.getAttribute(IConfigurationElementConstants.NAME);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getPluginId()
-	 */
-	public String getPluginIdentifier() {
-		return fElement.getContributor().getName();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getSourceLocatorId()
-	 */
-	public String getSourceLocatorId() {
-		if(fSourceLocator == null) {
-			fSourceLocator = getAttribute(IConfigurationElementConstants.SOURCE_LOCATOR);
-			//see if the cached source provider knows about it
-			if(fSourceProvider != null) {
-				fSourceLocator = fSourceProvider.getSourceLocatorId();
-			}
-			//if not provided check all the applicable delegates for one and record the delegate if found,
-			//so it can be reused to try and find the source path computer
-			if(fSourceLocator == null) {
-				LaunchDelegate[] delegates = getLaunchDelegateExtensions();
-				for(int i = 0; i < delegates.length; i++) {
-					fSourceLocator = delegates[i].getSourceLocatorId();
-					if(fSourceLocator != null) {
-						fSourceProvider = delegates[i];
-						return fSourceLocator;
-					}
-				}
-				fSourceProvider = null;
-			}
-		}
-		return fSourceLocator;
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getSourcePathComputer()
-	 */
-	public ISourcePathComputer getSourcePathComputer() {
-		if(fSourcePathComputer == null) {
-			//get the id
-			String id = fElement.getAttribute(IConfigurationElementConstants.SOURCE_PATH_COMPUTER);
-			//ask if the source provider knows about it
-			if(fSourceProvider != null) {
-				id = fSourceProvider.getSourcePathComputerId();
-			}
-			if(id != null) {
-				fSourcePathComputer = DebugPlugin.getDefault().getLaunchManager().getSourcePathComputer(id);
-			}
-			else { 
-			//if not provided check all the applicable delegates for one and record the delegate if found,
-			//so it can be reused to try and find the source path computer
-				LaunchDelegate[] delegates = getLaunchDelegateExtensions();
-				for(int i = 0; i < delegates.length; i++) {
-					id = delegates[i].getSourcePathComputerId();
-					if(id != null) {
-						fSourceProvider = delegates[i];
-						fSourcePathComputer = DebugPlugin.getDefault().getLaunchManager().getSourcePathComputer(id);
-						if(fSourcePathComputer != null) {
-							return fSourcePathComputer;
-						}
-					}
-				}
-				fSourceProvider = null;
-			}
-			
-		}
-		return fSourcePathComputer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getSupportedModes()
-	 */
-	public Set getSupportedModes() {
-		if(fModes == null) {
-			fModes = new HashSet();
-			LaunchDelegate[] delegates = getLaunchDelegateExtensions();
-			List modesets = null;
-			for(int i= 0; i < delegates.length; i++) {
-				modesets = delegates[i].getModes();
-				for(Iterator iter = modesets.iterator(); iter.hasNext();) {
-					fModes.addAll((Set) iter.next());
-				}
-			}
-		}
-		return fModes;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getSupportedModeCombinations()
-	 */
-	public Set getSupportedModeCombinations() {
-		if(fModeCombinations == null) {
-			initializeDelegates();
-			fModeCombinations = new HashSet();
-			fModeCombinations = fDelegates.keySet();
-		}
-		//return a clone or bad things happen
-		HashSet set = new HashSet();
-		for(Iterator iter = fModeCombinations.iterator(); iter.hasNext();) {
-			set.add(new HashSet((Set) iter.next()));
-		}
-		return set;
-	}
-	
-	/**
-	 * determines if the specified candidate is suitable for migration by loading its delegate.
-	 * if we initialize the delegate and it has not been provided, return false instead of failing
-	 * @param candidate the candidate to inspect for migration suitability
-	 * @return true if the specified launch configuration is suitable for migration, false otherwise
-	 * @throws CoreException
-	 * 
-	 * @since 3.2
-	 */
-	public boolean isMigrationCandidate(ILaunchConfiguration candidate) throws CoreException {
-		initializeMigrationDelegate();
-		if(fMigrationDelegate != null) {
-			return fMigrationDelegate.isCandidate(candidate);
-		}
-		return false;
-	}
-	
-	/**
-	 * This method initializes the migration delegate
-	 * @throws CoreException
-	 */
-	private synchronized void initializeMigrationDelegate() throws CoreException {
-		if(fElement.getAttribute(IConfigurationElementConstants.MIGRATION_DELEGATE) != null && fMigrationDelegate == null) {
-			fMigrationDelegate = (ILaunchConfigurationMigrationDelegate) fElement.createExecutableExtension(IConfigurationElementConstants.MIGRATION_DELEGATE);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#isPublic()
-	 */
-	public boolean isPublic() {
-		String publicString = fElement.getAttribute(IConfigurationElementConstants.PUBLIC);
-		if (publicString != null) {
-			if (publicString.equalsIgnoreCase("false")) { //$NON-NLS-1$
-				return false;
-			}
-		} 
-		return true;
-	}
-
-	/**
-	 * Migrates the specified launch configuration by loading its delegate.
-	 * In the event the migration delegate has not been provided do nothing.
-	 * @param candidate the candidate launch configuration to migrate
-	 * @throws CoreException
-	 * 
-	 * @since 3.2
-	 */
-	public void migrate(ILaunchConfiguration candidate) throws CoreException {
-		initializeMigrationDelegate();
-		if(fMigrationDelegate != null) {
-			fMigrationDelegate.migrate(candidate);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#newInstance(org.eclipse.core.resources.IContainer, java.lang.String)
-	 */
-	public ILaunchConfigurationWorkingCopy newInstance(IContainer container, String name) {
-		return new LaunchConfigurationWorkingCopy(container, name, this);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#supportsMode(java.lang.String)
-	 */
-	public boolean supportsMode(String mode) {
-		if(fModeCombinations == null) {
-			getSupportedModeCombinations();
-		}
-		Set modes = null;
-		for(Iterator iter = fModeCombinations.iterator(); iter.hasNext();) {
-			modes = (Set) iter.next();
-			if(modes.size() == 1 && modes.contains(mode)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getContributorName()
-	 */
-	public String getContributorName() {
-		return fElement.getContributor().getName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#supportsModeCombination(java.util.Set)
-	 */
-	public boolean supportsModeCombination(Set modes) {
-		if(fModeCombinations == null) {
-			getSupportedModeCombinations();
-		}
-		return fModeCombinations.contains(modes);
-	}
-
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
deleted file mode 100644
index 5bc02cd..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
+++ /dev/null
@@ -1,739 +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.debug.internal.core;
-
- 
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.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.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * A working copy launch configuration
- */
-public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implements ILaunchConfigurationWorkingCopy {
-	
-	/**
-	 * Handle of original launch configuration this
-	 * working copy is based on
-	 */
-	private LaunchConfiguration fOriginal;
-	
-	/**
-	 * Handle to a parent working copy
-	 * @since 3.3
-	 */
-	private LaunchConfigurationWorkingCopy fParent =  null;
-	
-	/**
-	 * Working copy of attributes.
-	 */
-	private LaunchConfigurationInfo fInfo;
-	
-	/**
-	 * Whether this working copy has been modified since
-	 * it was created
-	 */
-	private boolean fDirty = false;
-	
-	/**
-	 * The name for this configuration.
-	 */
-	private String fName;
-	
-	/**
-	 * Indicates whether this working copy has been explicitly renamed.
-	 */
-	private boolean fRenamed = false;
-	
-	/**
-	 * Suppress change notification until created
-	 */
-	private boolean fSuppressChange = true;
-	
-	/**
-	 * The container this working copy will be
-	 * stored in when saved.
-	 */
-	private IContainer fContainer;
-	
-	/**
-	 * Constructs a working copy of the specified launch 
-	 * configuration.
-	 * 
-	 * @param original launch configuration to make
-	 *  a working copy of
-	 * @exception CoreException if unable to initialize this
-	 *  working copy's attributes based on the original configuration
-	 */
-	protected LaunchConfigurationWorkingCopy(LaunchConfiguration original) throws CoreException {
-		super(original.getLocation());
-		setName(original.getName());
-		copyFrom(original);
-		setOriginal(original);
-		fSuppressChange = false;
-	}
-	
-	/**
-	 * Constructs a working copy of the specified launch configuration as its parent.
-	 * 
-	 * @param parent launch configuration to make
-	 *  a working copy of
-	 * @exception CoreException if unable to initialize this
-	 *  working copy's attributes based on the original configuration
-	 */
-	protected LaunchConfigurationWorkingCopy(LaunchConfigurationWorkingCopy parent) throws CoreException {
-		super(parent.getLocation());
-		setName(parent.getName());
-		copyFrom(parent);
-		setOriginal((LaunchConfiguration) parent.getOriginal());
-		fParent = parent;
-		fSuppressChange = false;
-	}	
-	
-	/**
-	 * Constructs a copy of the specified launch 
-	 * configuration, with the given (new) name.
-	 * 
-	 * @param original launch configuration to make
-	 *  a working copy of
-	 * @param name the new name for the copy of the launch
-	 *  configuration
-	 * @exception CoreException if unable to initialize this
-	 *  working copy's attributes based on the original configuration
-	 */
-	protected LaunchConfigurationWorkingCopy(LaunchConfiguration original, String name) throws CoreException {
-		super(original.getLocation());
-		copyFrom(original);
-		setName(name);
-		fSuppressChange = false;
-	}
-	
-	/**
-	 * Constructs a new working copy to be created in the specified
-	 * location.
-	 * 
-	 * @param container the container that the configuration will be created in
-	 *  or <code>null</code> if to be local
-	 * @param name the name of the new launch configuration
-	 * @param type the type of this working copy
-	 */
-	protected LaunchConfigurationWorkingCopy(IContainer container, String name, ILaunchConfigurationType type) {
-		super((IPath)null);
-		setName(name);
-		setInfo(new LaunchConfigurationInfo());
-		getInfo().setType(type);
-		setContainer(container);
-		fSuppressChange = false;
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#isDirty()
-	 */
-	public boolean isDirty() {
-		return fDirty;
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#doSave()
-	 */
-	public synchronized ILaunchConfiguration doSave() throws CoreException {
-		return doSave(new NullProgressMonitor());
-	}
-
-	/**
-	 * Saves with progress.
-	 * 
-	 * @param monitor
-	 * @return the saved <code>ILaunchConfiguration</code>
-	 * @throws CoreException
-	 * 
-	 * @since 3.3
-	 */
-	public synchronized ILaunchConfiguration doSave(IProgressMonitor monitor) throws CoreException {
-		if (getParent() != null) {
-			// save to parent working copy
-			LaunchConfigurationWorkingCopy wc = (LaunchConfigurationWorkingCopy) getParent();
-			if(isMoved()) {
-				wc.rename(getName());
-				wc.setContainer(getContainer());
-			}
-			wc.setAttributes(getInfo().getAttributes());
-			return wc;
-		}
-		else {
-			boolean useRunnable= true;
-			if (isLocal()) {
-				if (isMoved()) {
-					// If this config was moved from a shared location, saving
-					// it will delete the original from the workspace. Use runnable.
-					useRunnable= !isNew() && !getOriginal().isLocal();
-				} else {
-					useRunnable= false;
-				}
-			}
-			if (useRunnable) {
-				IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-					public void run(IProgressMonitor pm) throws CoreException {
-						doSave0(pm);
-					}
-				};
-				ResourcesPlugin.getWorkspace().run(wr, null, 0, monitor);
-			} else {
-				//file is persisted in the metadata not the workspace
-				doSave0(monitor);
-			}
-			getLaunchManager().setMovedFromTo(null, null);
-		}
-		return new LaunchConfiguration(getLocation());
-	}
-	
-	/**
-	 * Performs the actual saving of the launch configuration.
-	 * @throws CoreException
-	 */
-	private void doSave0(IProgressMonitor monitor) throws CoreException {
-		// set up from/to information if this is a move
-		boolean moved = (!isNew() && isMoved());
-		if (moved) {
-			ILaunchConfiguration to = new LaunchConfiguration(getLocation());
-			ILaunchConfiguration from = getOriginal();
-			getLaunchManager().setMovedFromTo(from, to);
-		}
-		// delete the old file if this is not a new configuration
-		// or the file was renamed/moved
-		if (moved) {
-			getOriginal().delete();
-		}
-		// write the new file
-		if(monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		monitor.beginTask(MessageFormat.format(DebugCoreMessages.LaunchConfigurationWorkingCopy_0, new String[] {getName()}), 2);
-		writeNewFile(monitor);
-		monitor.done();
-		fDirty = false;
-	}
-	
-	/**
-	 * Writes the new configuration information to a file.
-	 * 
-	 * @exception CoreException if writing the file fails
-	 */
-	protected void writeNewFile(IProgressMonitor monitor) throws CoreException {
-		String xml = null;
-		Exception e= null;
-		try {
-			xml = getInfo().getAsXML();
-		} catch (IOException ioe) {
-			e= ioe;			
-		} catch (ParserConfigurationException pce) {
-			e= pce;
-		} catch (TransformerException te) {
-			e= te;		
-		}
-		if (e != null) {
-			throw new DebugException(
-				new Status(
-					IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-					DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationWorkingCopy__0__occurred_generating_launch_configuration_XML__1, new String[]{e.toString()}), null 
-					)
-				);		
-		}
-		
-		if (isLocal()) {
-			// use java.io to update configuration file
-			try {
-				boolean added = false;
-				monitor.subTask(DebugCoreMessages.LaunchConfigurationWorkingCopy_1);
-				File file = getLocation().toFile();
-				File dir = getLocation().removeLastSegments(1).toFile();
-				dir.mkdirs();
-				if (!file.exists()) {
-					added = true;
-					file.createNewFile();
-					monitor.worked(1);
-				}
-				FileOutputStream stream = new FileOutputStream(file);
-				stream.write(xml.getBytes("UTF8")); //$NON-NLS-1$
-				stream.close();
-				
-				if (added) {
-					getLaunchManager().launchConfigurationAdded(new LaunchConfiguration(getLocation()));
-				} else {
-					getLaunchManager().launchConfigurationChanged(new LaunchConfiguration(getLocation()));
-				}
-				//notify file saved
-				monitor.worked(1);
-			} catch (IOException ie) {
-				monitor.setCanceled(true);
-				throw new DebugException(
-					new Status(
-					 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-					 DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.LaunchConfigurationWorkingCopy__0__occurred_generating_launch_configuration_XML__1, new String[]{ie.toString()}), null 
-					)
-				);				
-			}
-		} else {
-			// use resource API to update configuration file
-			IFile file = getFile();
-			if (file == null) {
-				monitor.setCanceled(true);
-				throw new DebugException(
-						new Status(
-							 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-							 DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchConfigurationWorkingCopy_5, null 
-						));
-			}
-			IContainer dir = file.getParent();
-			if (!dir.exists()) {
-				monitor.setCanceled(true);
-				throw new DebugException(
-					new Status(
-					 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-					 DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchConfigurationWorkingCopy_Specified_container_for_launch_configuration_does_not_exist_2, null 
-					)
-				);				
-			}
-			ByteArrayInputStream stream = null;
-			try {
-				stream = new ByteArrayInputStream(xml.getBytes("UTF8")); //$NON-NLS-1$
-			} catch (UnsupportedEncodingException ue) {
-				monitor.setCanceled(true);
-				throw new DebugException(
-					new Status(
-						 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-						 DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchConfigurationWorkingCopy_5, ue 
-					));
-			}
-			SubProgressMonitor spm = null;
-			if (!file.exists()) {
-	//create file input stream: work one unit in a sub monitor
-				spm = new SubProgressMonitor(monitor, 1);
-				spm.setTaskName(MessageFormat.format(DebugCoreMessages.LaunchConfigurationWorkingCopy_2, new String[] {getName()}));
-				file.create(stream, false, spm);
-			} else {
-				// validate edit
-				if (file.isReadOnly()) {
-					IStatus status = ResourcesPlugin.getWorkspace().validateEdit(new IFile[] {file}, null);
-					if (!status.isOK()) {
-						monitor.setCanceled(true);
-						throw new CoreException(status);
-					}
-				}				
-	//set the contents of the file: work 1 unit in a sub monitor
-				spm = new SubProgressMonitor(monitor, 1);
-				spm.setTaskName(MessageFormat.format(DebugCoreMessages.LaunchConfigurationWorkingCopy_3, new String[] {getName()}));
-				file.setContents(stream, true, false, spm);
-			}
-		}
-		if(monitor.isCanceled()) {
-			return;
-		}
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#setAttribute(String, int)
-	 */
-	public void setAttribute(String attributeName, int value) {
-		getInfo().setAttribute(attributeName, new Integer(value));
-		setDirty();
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#setAttribute(String, String)
-	 */
-	public void setAttribute(String attributeName, String value) {
-		getInfo().setAttribute(attributeName, value);
-		setDirty();
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#setAttribute(String, boolean)
-	 */
-	public void setAttribute(String attributeName, boolean value) {
-		getInfo().setAttribute(attributeName, Boolean.valueOf(value));
-		setDirty();	
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#setAttribute(String, List)
-	 */
-	public void setAttribute(String attributeName, List value) {
-		getInfo().setAttribute(attributeName, value);
-		setDirty();
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#setAttribute(String, Map)
-	 */
-	public void setAttribute(String attributeName, Map value) {
-		getInfo().setAttribute(attributeName, value);
-		setDirty();
-	}
-
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#getOriginal()
-	 */
-	public ILaunchConfiguration getOriginal() {
-		ILaunchConfiguration config = fOriginal;
-		ILaunchConfigurationWorkingCopy parent = fParent;
-		while(parent != null) {
-			config = parent.getOriginal();
-			parent = parent.getParent();
-		}
-		return config;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#getParent()
-	 */
-	public ILaunchConfigurationWorkingCopy getParent() {
-		return fParent;
-	}
-	
-	/**
-	 * Sets the launch configuration this working copy
-	 * is based on. Initializes the attributes of this
-	 * working copy to the current values of the given
-	 * configuration.
-	 * 
-	 * @param original the launch configuration this working
-	 *  copy is based on.
-	 * @exception CoreException if unable to initialize this
-	 *  working copy based on the original's current attribute
-	 *  set
-	 */
-	private void copyFrom(LaunchConfiguration original) throws CoreException {
-		LaunchConfigurationInfo info = original.getInfo();
-		setInfo(info.getCopy());
-		setContainer(original.getContainer());
-		fDirty = false;
-	}
-	
-	/**
-	 * Sets the launch configuration this working copy
-	 * is based on.
-	 * 
-	 * @param original the launch configuration this working 
-	 *  copy is based on.
-	 */
-	private void setOriginal(LaunchConfiguration original) {
-		fOriginal = original;
-	}	
-	
-	/**
-	 * Sets the working copy info object for this working copy.
-	 * 
-	 * @param info a copy of attributes from this working copy's
-	 * 	original launch configuration
-	 */
-	protected void setInfo(LaunchConfigurationInfo info) {
-		fInfo = info;
-	}
-
-	/**
-	 * @see ILaunchConfiguration#isWorkingCopy()
-	 */
-	public boolean isWorkingCopy() {
-		return true;
-	}
-	
-	/**
-	 * A working copy keeps a local info object that is not
-	 * cached with the launch manager.
-	 * 
-	 * @see LaunchConfiguration#getInfo()
-	 */
-	protected LaunchConfigurationInfo getInfo() {
-		return fInfo;
-	}
-	
-	/**
-	 * Sets this working copy's state to dirty.
-	 * Notifies listeners that this working copy has
-	 * changed.
-	 */
-	private void setDirty() {
-		fDirty = true;
-		if (!suppressChangeNotification()) {
-			getLaunchManager().getConfigurationNotifier().notify(this, LaunchManager.CHANGED);
-		}	
-	}
-		
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#setModes(java.util.Set)
-	 */
-	public void setModes(Set modes) {
-		getInfo().setAttribute(ATTR_LAUNCH_MODES, (modes.size() > 0 ? modes : null));
-		setDirty();
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#addModes(java.util.Set)
-	 */
-	public void addModes(Set modes) {
-		try {
-			Set opts = getModes();
-			if(opts.addAll(modes)) {
-				getInfo().setAttribute(ATTR_LAUNCH_MODES, opts);
-				setDirty();
-			}
-		} 
-		catch (CoreException e) {
-			DebugPlugin.log(e);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#removeModes(java.util.Set)
-	 */
-	public void removeModes(Set options) {
-		try {
-			Set opts = getModes();
-			if(opts.removeAll(options)) {
-				getInfo().setAttribute(ATTR_LAUNCH_MODES, (opts.size() < 1 ? null : opts));
-				setDirty();
-			}
-		} 
-		catch (CoreException e) {
-			DebugPlugin.log(e);
-		}
-	}
-	
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#rename(String)
-	 */
-	public void rename(String name) {
-		if (!getName().equals(name)) {
-			setName(name);
-			fRenamed = isNew() || !(getOriginal().getName().equals(name));
-		}
-	}
-
-	/**
-	 * Sets the new name for this configuration.
-	 * 
-	 * @param name the new name for this configuration
-	 */
-	private void setName(String name) {
-		fName = name;
-		setDirty();
-	}
-	
-	/**
-	 * @see ILaunchConfiguration#getName()
-	 */
-	public String getName() {
-		return fName;
-	}
-	
-	/**
-	 * @see ILaunchConfiguration#isLocal()
-	 */
-	public boolean isLocal() {
-		return getContainer() == null;
-	}	
-	
-	/**
-	 * Returns the location this launch configuration will reside at
-	 * when saved.
-	 * 
-	 * @see ILaunchConfiguration#getLocation()
-	 */
-	public IPath getLocation() {
-		if (isMoved()) {
-			IPath path = null;
-			if (isLocal()) {
-				path = LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH;
-			} else {
-				path = getContainer().getLocation();
-			}
-			path = path.append(getName() + "." + LAUNCH_CONFIGURATION_FILE_EXTENSION); //$NON-NLS-1$
-			return path;
-		} 
-		return getOriginal().getLocation();
-	}
-	
-	/**
-	 * Returns whether this working copy is new, or is a
-	 * working copy of another launch configuration.
-	 * 
-	 * @return whether this working copy is new, or is a
-	 *  working copy of another launch configuration
-	 */
-	protected boolean isNew() {
-		return getOriginal() == null;
-	}
-	
-	/**
-	 * Returns whether this working copy is new or if its
-	 * location has changed from that of its original.
-	 * 
-	 * @return whether this working copy is new or if its
-	 * location has changed from that of its original
-	 */
-	protected boolean isMoved() {
-		if (isNew() || fRenamed) {
-			return true;
-		}
-		IContainer newContainer = getContainer();
-		IContainer originalContainer = ((LaunchConfiguration)getOriginal()).getContainer();
-		if (newContainer == originalContainer) {
-			return false;
-		}
-		if (newContainer == null) {
-			return !originalContainer.equals(newContainer);
-		} 
-		return !newContainer.equals(originalContainer);
-	}		
-	
-	/**
-	 * A working copy cannot generate a memento.
-	 * 
-	 * @see ILaunchConfiguration#getMemento()
-	 */
-	public String getMemento() {
-		return null;
-	}	
-	
-	/**
-	 * Returns whether change notification should be
-	 * suppressed
-	 */
-	protected boolean suppressChangeNotification() {
-		return fSuppressChange;
-	}
-	
-	/**
-	 * @see ILaunchConfigurationWorkingCopy#setContainer(IContainer)
-	 */
-	public void setContainer(IContainer container) {
-		if (container == fContainer) {
-			return;
-		}
-		if (container != null) {
-			if (container.equals(fContainer)) {
-				return;
-			}
-		} else {
-			if (fContainer.equals(container)) {
-				return;
-			}
-		}
-		fContainer = container;
-		setDirty();
-	}
-	
-	/**
-	 * Returns the container this working copy will be
-	 * stored in when saved, or <code>null</code> if
-	 * this working copy is local.
-	 * 
-	 * @return the container this working copy will be
-	 *  stored in when saved, or <code>null</code> if
-	 *  this working copy is local
-	 */
-	protected IContainer getContainer() {
-		return fContainer;
-	}	
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#setAttributes(java.util.Map)
-	 */
-	public void setAttributes(Map attributes) {
-		getInfo().setAttributes(attributes);
-		setDirty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#setResource(org.eclipse.core.resources.IResource)
-	 */
-	public void setMappedResources(IResource[] resources) {
-		ArrayList paths = null;
-		ArrayList types = null;
-		if(resources != null && resources.length > 0) {
-			paths = new ArrayList(resources.length);
-			types = new ArrayList(resources.length);
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
-				if(resource != null) {
-					paths.add(resource.getFullPath().toPortableString());
-					types.add(new Integer(resource.getType()).toString());
-				}
-			}
-		}
-		setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_PATHS, paths);
-		setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_TYPES, types);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#setPreferredLaunchDelegate(java.util.Set, java.lang.String)
-	 */
-	public void setPreferredLaunchDelegate(Set modes, String delegateId) {
-		if(modes != null) {
-			try {
-				Map delegates = getAttribute(LaunchConfiguration.ATTR_PREFERRED_LAUNCHERS, (Map)null);
-					//copy map to avoid pointer issues
-					Map map = new HashMap();
-					if(delegates != null) {
-						map.putAll(delegates);
-					}
-					if(delegateId == null) {
-						map.remove(modes.toString());
-					}
-					else {
-						map.put(modes.toString(), delegateId);
-					}
-					setAttribute(LaunchConfiguration.ATTR_PREFERRED_LAUNCHERS, map);
-			}
-			catch (CoreException ce) {DebugPlugin.log(ce);}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.LaunchConfiguration#getWorkingCopy()
-	 * CONTEXTLAUNCHING
-	 */
-	public ILaunchConfigurationWorkingCopy getWorkingCopy() throws CoreException {
-		return new LaunchConfigurationWorkingCopy(this);
-	}
-}
-
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchDelegate.java
deleted file mode 100644
index 25edb6c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchDelegate.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.debug.internal.core;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Proxy to a launch delegate extension
- * Clients can contribute launch delegates through the <code>launchDelegates</code> extension point
- * 
- * Example contribution of the local java launch delegate
- * <pre>
- * <extension point="org.eclipse.debug.core.launchDelegates">
-      <launchDelegate
-            delegate="org.eclipse.jdt.launching.JavaLaunchDelegate"
-            id="org.eclipse.jdt.launching.localJavaApplicationDelegate"
-            modes="run, debug"
-            name="%localJavaApplication"
-            type="org.eclipse.jdt.launching.localJavaApplication">
-          <modeCombination 
-    		modes="run, profile">
-    		perspective="com.example.Perspective">
-   		  </modeCombination>
-      </launchDelegate>
- * </pre>
- * 
- * Clients are NOT intended to subclass this class
- * 
- * @see IConfigurationElementConstants
- * 
- * @since 3.3
- */
-public final class LaunchDelegate implements ILaunchDelegate {
-	
-	/**
-	 * The configuration element for this delegate
-	 */
-	private IConfigurationElement fElement = null;
-	
-	/**
-	 * The cached delegate. Remains null until asked for, then persisted
-	 */
-	private ILaunchConfigurationDelegate fDelegate = null;
-	
-	//a listing of sets of 
-	private List fLaunchModes = null;
-	private String fType = null;
-	private HashMap fPerspectiveIds = null;
-	
-	/**
-	 * Constructor
-	 * @param element the configuration element to associate with this launch delegate
-	 */
-	public LaunchDelegate(IConfigurationElement element) {
-		fElement = element;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchDelegateProxy#getDelegate()
-	 */
-	public ILaunchConfigurationDelegate getDelegate() throws CoreException {
-		if(fDelegate == null) {
-			Object obj = fElement.createExecutableExtension(IConfigurationElementConstants.DELEGATE);
-			if(obj instanceof ILaunchConfigurationDelegate) {
-				fDelegate = (ILaunchConfigurationDelegate)obj;
-			} else {
-				throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, MessageFormat.format("Launch delegate for {0} does not implement required interface ILaunchConfigurationDelegate.", new String[]{getId()}), null)); //$NON-NLS-1$
-			}
-		}
-		return fDelegate;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchDelegateProxy#getId()
-	 */
-	public String getId() {
-		return fElement.getAttribute(IConfigurationElementConstants.ID);
-	}
-
-	/**
-	 * Returns the id of the associated <code>ILaunchConfigurationType</code> or <code>null</code> if none provided
-	 * @return the id of the <code>ILaunchConfigurationType</code> associated with this delegate
-	 */
-	public String getLaunchConfigurationTypeId() {
-		if(fType == null) {
-			//fall back to single association if no appliesTo
-			fType = fElement.getAttribute(IConfigurationElementConstants.TYPE);
-			if(fType == null) {
-				//the case when we have passed a launch configuration type to the launch delegate
-				fType = fElement.getAttribute(IConfigurationElementConstants.ID);
-			}
-		}
-		return fType;
-	}
-	
-	/**
-	 * Simple method to parse mode strings (separated by commas)
-	 * @param element the config element to read the mode string from
-	 * @return a set of the parsed strings or an empty collection
-	 * @since 3.3
-	 */
-	private Set parseModes(IConfigurationElement element) {
-		HashSet set = new HashSet();
-		String modes = element.getAttribute(IConfigurationElementConstants.MODES); 
-		if (modes != null) {
-			String[] strings = modes.split(","); //$NON-NLS-1$
-			for (int i = 0; i < strings.length; i++) {
-				set.add(strings[i].trim());
-			}
-		}
-		return set;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchDelegateProxy#getModes()
-	 */
-	public List getModes() {
-		if(fLaunchModes == null) {
-			fLaunchModes = new ArrayList();
-			fPerspectiveIds = new HashMap();
-			IConfigurationElement[] children = fElement.getChildren(IConfigurationElementConstants.MODE_COMBINATION);
-			Set modeset = null;
-			for (int i = 0; i < children.length; i++) {
-				modeset = parseModes(children[i]);
-				fLaunchModes.add(modeset);
-				fPerspectiveIds.put(modeset, children[i].getAttribute(IConfigurationElementConstants.PERSPECTIVE));
-			}
-			//try to get the modes from the old definition and make each one
-			//a separate set of one element
-			modeset = null;
-			String modes = fElement.getAttribute(IConfigurationElementConstants.MODES); 
-			if (modes != null) {
-				String[] strings = modes.split(","); //$NON-NLS-1$
-				for (int i = 0; i < strings.length; i++) {
-					modeset = new HashSet();
-					modeset.add(strings[i].trim());
-					fLaunchModes.add(modeset);
-				}
-			}
-		}
-		return fLaunchModes;
-	}
-	
-	/**
-	 * Returns the human readable name for this launch delegate
-	 * @return the human readable name for this launch delegate, or <code>null</code> if none
-	 */
-	public String getName() {
-		//try a delegateName attribute first, in the event this delegate was made from an ILaunchConfigurationType
-		String name = fElement.getAttribute(IConfigurationElementConstants.DELEGATE_NAME);
-		if(name == null) {
-			name = fElement.getAttribute(IConfigurationElementConstants.NAME);
-			if (name == null) {
-				name = getContributorName();
-			}
-			name = name.trim();
-			if (Character.isUpperCase(name.charAt(0))) {
-				name =  MessageFormat.format(DebugCoreMessages.LaunchDelegate_1, new String[]{name});
-			} else {
-				name = MessageFormat.format(DebugCoreMessages.LaunchDelegate_2, new String[]{name});
-			}
-		}
-		return name;
-	}
-	
-	/**
-	 * Returns the contributor name of this delegate (plug-in name).
-	 * 
-	 * @return contributor name
-	 */
-	public String getContributorName() {
-		return fElement.getContributor().getName();
-	}
-	
-	/**
-	 * Returns the associated source locator id or <code>null</code>
-	 * @return the associated source locator id or <code>null</code> if not provided
-	 */
-	public String getSourceLocatorId() {
-		return fElement.getAttribute(IConfigurationElementConstants.SOURCE_LOCATOR);
-	}
-
-	/**
-	 * Returns the associated source path computer id or <code>null</code>
-	 * @return the associated source path computer id or <code>null</code> if not provided
-	 */
-	public String getSourcePathComputerId() {
-		return fElement.getAttribute(IConfigurationElementConstants.SOURCE_PATH_COMPUTER);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchDelegate#getDescription()
-	 */
-	public String getDescription() {
-		String desc = fElement.getAttribute(IConfigurationElementConstants.DELEGATE_DESCRIPTION);
-		if(desc == null) {
-			return DebugCoreMessages.LaunchDelegate_0;
-		}
-		return desc;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchDelegate#getPluginIdentifier()
-	 */
-	public String getPluginIdentifier() {
-		return fElement.getContributor().getName();
-	}
-
-	/**
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj == null) {
-			return false;
-		}
-		return obj instanceof ILaunchDelegate && getId() != null && getId().equals(((ILaunchDelegate)obj).getId());
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchDelegate#getPerspectiveId(java.util.Set)
-	 */
-	public String getPerspectiveId(Set modes) {
-		if(fPerspectiveIds == null) {
-			getModes();
-		}
-		return (String) fPerspectiveIds.get(modes);
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
deleted file mode 100644
index 9818763..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
+++ /dev/null
@@ -1,2450 +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 - bug 50567 Eclipse native environment support on Win98
- *     Pawel Piech - Bug 82001: When shutting down the IDE, the debugger should first
- *     attempt to disconnect debug targets before terminating them
- *******************************************************************************/
-package org.eclipse.debug.internal.core;
-
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-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.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceProxy;
-import org.eclipse.core.resources.IResourceProxyVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationListener;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.core.ILaunchesListener;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IPersistableSourceLocator;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceContainerType;
-import org.eclipse.debug.internal.core.sourcelookup.SourcePathComputer;
-import org.eclipse.osgi.service.environment.Constants;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Manages launch configurations, launch configuration types, and registered launches.
- *
- * @see ILaunchManager
- */
-public class LaunchManager extends PlatformObject implements ILaunchManager, IResourceChangeListener {
-	
-	protected static final String PREF_PREFERRED_DELEGATES = DebugPlugin.getUniqueIdentifier() + ".PREFERRED_DELEGATES"; //$NON-NLS-1$
-	
-	/**
-	 * Boolean preference on whether to delete associated configurations when a project is deleted.
-	 * 
-	 * @since 3.3
-	 */
-	public static final String PREF_DELETE_CONFIGS_ON_PROJECT_DELETE = DebugPlugin.getUniqueIdentifier() + ".PREF_DELETE_CONFIGS_ON_PROJECT_DELETE"; //$NON-NLS-1$
-	
-	/**
-	 * Constant to define debug.ui for the status codes
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DEBUG_UI = "org.eclipse.debug.ui"; //$NON-NLS-1$
-	
-	/**
-	 * Constant to represent the empty string
-	 * 
-	 * @since 3.2
-	 */
-	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-    
-	/**
-	 * Status code for which a UI prompter is registered.
-	 * 
-	 * @since 3.2
-	 */
-	protected static final IStatus promptStatus = new Status(IStatus.INFO, DEBUG_UI, 200, EMPTY_STRING, null);
-	
-	/**
-	 * Step filter manager
-	 */
-	private StepFilterManager fStepFilterManager = null;
-	
-	/**
-	 * Notifies a launch config listener in a safe runnable to handle
-	 * exceptions.
-	 */
-	class ConfigurationNotifier implements ISafeRunnable {
-		
-		private ILaunchConfigurationListener fListener;
-		private int fType;
-		private ILaunchConfiguration fConfiguration;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during launch configuration change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/**
-		 * Notifies the given listener of the add/change/remove
-		 * 
-		 * @param configuration the configuration that has changed
-		 * @param update the type of change
-		 */
-		public void notify(ILaunchConfiguration configuration, int update) {
-			fConfiguration = configuration;
-			fType = update;
-			if (fLaunchConfigurationListeners.size() > 0) {
-				Object[] listeners = fLaunchConfigurationListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					fListener = (ILaunchConfigurationListener)listeners[i];
-                    SafeRunner.run(this);
-				}
-			}
-			fConfiguration = null;
-			fListener = null;			
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.launchConfigurationAdded(fConfiguration);
-					break;
-				case REMOVED:
-					fListener.launchConfigurationRemoved(fConfiguration);
-					break;
-				case CHANGED:
-					fListener.launchConfigurationChanged(fConfiguration);
-					break;
-			}			
-		}
-	}
-	
-	/**
-	 * Notifies a launch listener (multiple launches) in a safe runnable to
-	 * handle exceptions.
-	 */
-	class LaunchesNotifier implements ISafeRunnable {
-		
-		private ILaunchesListener fListener;
-		private int fType;
-		private ILaunch[] fNotifierLaunches;
-		private ILaunch[] fRegistered;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during launch change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/**
-		 * Notifies the given listener of the adds/changes/removes
-		 * 
-		 * @param launches the launches that changed
-		 * @param update the type of change
-		 */
-		public void notify(ILaunch[] launches, int update) {
-			fNotifierLaunches = launches;
-			fType = update;
-			fRegistered = null;
-			Object[] copiedListeners= fLaunchesListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (ILaunchesListener)copiedListeners[i];
-                SafeRunner.run(this);
-			}	
-			fNotifierLaunches = null;
-			fRegistered = null;
-			fListener = null;			
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.launchesAdded(fNotifierLaunches);
-					break;
-				case REMOVED:
-					fListener.launchesRemoved(fNotifierLaunches);
-					break;
-				case CHANGED:
-				case TERMINATE:
-					if (fRegistered == null) {
-						List registered = null;
-						for (int j = 0; j < fNotifierLaunches.length; j++) {
-							if (isRegistered(fNotifierLaunches[j])) {
-								if (registered != null) {
-									registered.add(fNotifierLaunches[j]);
-								} 
-							} else {
-								if (registered == null) {
-									registered = new ArrayList(fNotifierLaunches.length);
-									for (int k = 0; k < j; k++) {
-										registered.add(fNotifierLaunches[k]);
-									}
-								}
-							}
-						}
-						if (registered == null) {
-							fRegistered = fNotifierLaunches;
-						} else {
-							fRegistered = (ILaunch[])registered.toArray(new ILaunch[registered.size()]);
-						}
-					}
-					if (fRegistered.length > 0) {
-						if (fType == CHANGED) {
-							fListener.launchesChanged(fRegistered);
-						}
-						if (fType == TERMINATE && fListener instanceof ILaunchesListener2) {
-							((ILaunchesListener2)fListener).launchesTerminated(fRegistered);
-						}
-					}
-					break;
-			}
-		}
-	}
-	
-	/**
-	 * Visitor for handling a resource begin deleted, and the need to check mapped configurations
-	 * for auto-deletion
-	 * @since 3.4
-	 */
-	class MappedResourceVisitor implements IResourceDeltaVisitor {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) throws CoreException {
-			if(delta.getKind() == IResourceDelta.REMOVED && delta.getFlags() != IResourceDelta.MOVED_TO) {
-				ArrayList configs = collectAssociatedLaunches(delta.getResource());
-				if(configs.size() > 0) {
-					for(Iterator iter = configs.iterator(); iter.hasNext();) {
-						try { 
-							((ILaunchConfiguration)iter.next()).delete();
-						} catch (CoreException e) {
-							DebugPlugin.log(e.getStatus());
-						}
-					}
-				}
-				return false;
-			}
-			return true;
-		}
-	}
-	
-	/**
-	 * Visitor for handling resource deltas.
-	 */
-	class LaunchManagerVisitor implements IResourceDeltaVisitor {
-	    
-	    /**
-	     * Map of files to associated (shared) launch configurations in a project
-	     * that is going to be deleted.
-	     */
-	    private Map fFileToConfig = new HashMap();
-	    
-	    
-		/**
-         * Builds a cache of configurations that will be deleted in the given project
-         * 
-         * @param project project that is going to be deleted
-         */
-        public void preDelete(IProject project) {
-            List list = findLaunchConfigurations(project);
-            Iterator configs = list.iterator();
-            while (configs.hasNext()) {
-                ILaunchConfiguration configuration = (ILaunchConfiguration) configs.next();
-                IFile file = configuration.getFile();
-                if (file != null) {
-                    fFileToConfig.put(file, configuration);
-                }
-            }
-        }	
-		
-		/**
-		 * Resets this resource delta visitor for a new pass.
-		 */
-		public void reset() {
-		      fFileToConfig.clear();
-		}
-
-        /**
-		 * @see IResourceDeltaVisitor#visit(IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			if (delta == null) {
-				return false;
-			}
-			if (0 != (delta.getFlags() & IResourceDelta.OPEN)) {
-				if (delta.getResource() instanceof IProject) {
-					IProject project = (IProject)delta.getResource();
-					if (project.isOpen()) {
-						LaunchManager.this.projectOpened(project);
-					} else { 
-					    LaunchManager.this.projectClosed(project);
-					}
-				}
-				return false;
-			}
-			IResource resource = delta.getResource();
-			if (resource instanceof IFile) {
-				IFile file = (IFile)resource;
-				if (ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equals(file.getFileExtension())) {
-					IPath configPath = file.getLocation();
-					ILaunchConfiguration handle = null;
-					// If the file has already been deleted, reconstruct the handle from our cache
-					if (configPath == null) {
-					    handle = (ILaunchConfiguration) fFileToConfig.get(file);
-					} else {
-					    handle = new LaunchConfiguration(configPath);
-					}
-					if (handle != null) {
-						switch (delta.getKind()) {						
-							case IResourceDelta.ADDED :
-								LaunchManager.this.launchConfigurationAdded(handle);
-								break;
-							case IResourceDelta.REMOVED :
-								LaunchManager.this.launchConfigurationDeleted(handle);
-								break;
-							case IResourceDelta.CHANGED :
-								LaunchManager.this.launchConfigurationChanged(handle);
-								break;
-						}
-					}
-				}
-				return false;
-			}
-			return true;
-		}
-	}
-	
-	/**
-	 * Notifies a launch listener (single launch) in a safe runnable to handle
-	 * exceptions.
-	 */
-	class LaunchNotifier implements ISafeRunnable {
-		
-		private ILaunchListener fListener;
-		private int fType;
-		private ILaunch fLaunch;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "An exception occurred during launch change notification.", exception);  //$NON-NLS-1$
-			DebugPlugin.log(status);
-		}
-
-		/**
-		 * Notifies listeners of the add/change/remove
-		 * 
-		 * @param launch the launch that has changed
-		 * @param update the type of change
-		 */
-		public void notify(ILaunch launch, int update) {
-			fLaunch = launch;
-			fType = update;
-			Object[] copiedListeners= fListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (ILaunchListener)copiedListeners[i];
-                SafeRunner.run(this);
-			}	
-			fLaunch = null;
-			fListener = null;		
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.launchAdded(fLaunch);
-					break;
-				case REMOVED:
-					fListener.launchRemoved(fLaunch);
-					break;
-				case CHANGED:
-					if (isRegistered(fLaunch)) {
-						fListener.launchChanged(fLaunch);
-					}
-					break;
-			}			
-		}
-	}
-	
-	/**
-	 * Collects files whose extension matches the launch configuration file
-	 * extension.
-	 */
-	class ResourceProxyVisitor implements IResourceProxyVisitor {
-		
-		private List fList;
-		
-		protected ResourceProxyVisitor(List list) {
-			fList= list;
-		}
-		/**
-		 * @see org.eclipse.core.resources.IResourceProxyVisitor#visit(org.eclipse.core.resources.IResourceProxy)
-		 */
-		public boolean visit(IResourceProxy proxy) {
-			if (proxy.getType() == IResource.FILE) {
-				if (ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equalsIgnoreCase(proxy.requestFullPath().getFileExtension())) {
-					fList.add(proxy.requestResource());
-				}
-				return false;
-			}
-			return true;
-		}
-	}
-	
-	/**
-	 * Internal class used to hold information about a preferred delegate
-	 * 
-	 * @since 3.3
-	 */
-	class PreferredDelegate {
-		private ILaunchDelegate fDelegate = null;
-		private String fTypeid = null;
-		private Set fModes = null;
-		
-		public PreferredDelegate(ILaunchDelegate delegate, String typeid, Set modes) {
-			fDelegate = delegate;
-			fTypeid = typeid;
-			fModes = modes;
-		}
-		
-		public String getTypeId() {
-			return fTypeid;
-		}
-		
-		public Set getModes() {
-			return fModes;
-		}
-		
-		public ILaunchDelegate getDelegate() {
-			return fDelegate;
-		}
-	}
-	
-	/**
-	 * Types of notifications
-	 */
-	public static final int ADDED = 0;
-	public static final int REMOVED= 1;
-	public static final int CHANGED= 2;
-	public static final int TERMINATE= 3;
-	
-	/**
-	 * The collection of native environment variables on the user's system. Cached
-	 * after being computed once as the environment cannot change.
-	 */
-	private static HashMap fgNativeEnv= null;
-	private static HashMap fgNativeEnvCasePreserved= null;
-	
-	/**
-	 * Path to the local directory where local launch configurations
-	 * are stored with the workspace.
-	 */
-	protected static final IPath LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH =
-		DebugPlugin.getDefault().getStateLocation().append(".launches"); //$NON-NLS-1$
-	/**
-	 * Returns a Document that can be used to build a DOM tree
-	 * @return the Document
-	 * @throws ParserConfigurationException if an exception occurs creating the document builder
-	 * @since 3.0
-	 */
-	public static Document getDocument() throws ParserConfigurationException {
-		DocumentBuilderFactory dfactory= DocumentBuilderFactory.newInstance();
-		DocumentBuilder docBuilder= dfactory.newDocumentBuilder();
-		Document doc= docBuilder.newDocument();
-		return doc;
-	}
-
-	/**
-	 * Serializes a XML document into a string - encoded in UTF8 format,
-	 * with platform line separators.
-	 * 
-	 * @param doc document to serialize
-	 * @return the document as a string
-	 * @throws TransformerException if an unrecoverable error occurs during the serialization
-	 * @throws IOException if the encoding attempted to be used is not supported
-	 */
-	public static String serializeDocument(Document doc) throws TransformerException, IOException {
-		ByteArrayOutputStream s = new ByteArrayOutputStream();
-		TransformerFactory factory = TransformerFactory.newInstance();
-		Transformer transformer = factory.newTransformer();
-		transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
-		transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-		DOMSource source = new DOMSource(doc);
-		StreamResult outputTarget = new StreamResult(s);
-		transformer.transform(source, outputTarget);
-		return s.toString("UTF8"); //$NON-NLS-1$			
-	}
-	
-	/**
-	 * Collection of defined launch configuration type
-	 * extensions.
-	 */
-	private List fLaunchConfigurationTypes = null; 
-
-	/**
-	 * Launch configuration cache. Keys are <code>LaunchConfiguration</code>,
-	 * values are <code>LaunchConfigurationInfo</code>.
-	 */
-	private Map fLaunchConfigurations = new HashMap(10);
-	
-	/**
-	 * A cache of launch configuration names currently in the workspace.
-	 */
-	private String[] fSortedConfigNames = null;
-	
-	/**
-	 * Collection of all launch configurations in the workspace.
-	 * <code>List</code> of <code>ILaunchConfiguration</code>.
-	 */
-	private List fLaunchConfigurationIndex = null;
-	
-	/**
-	 * Launch configuration comparator extensions,
-	 * keyed by attribute name.
-	 */
-	private Map fComparators = null;
-	
-	/**
-	 * Registered launch modes, or <code>null</code> if not initialized.
-	 * Keys are mode identifiers, values are <code>ILaunchMode</code>s.
-	 */
-	private Map fLaunchModes = null;
-		
-	/**
-	 * A map of LaunchDelegate objects stored by id of delegate, or launch config type
-	 */
-	private HashMap fLaunchDelegates = null;
-	
-	/**
-	 * Initial startup cache of preferred delegate so that the debug preferences are only parsed once
-	 * 
-	 * @since 3.3
-	 */
-	private Set fPreferredDelegates = null;
-	
-	/**
-	 * Collection of launches
-	 */
-	private List fLaunches= new ArrayList(10);
-	/**
-	 * Set of launches for efficient 'isRegistered()' check
-	 */
-	private Set fLaunchSet = new HashSet(10);
-	
-	/**
-	 * Collection of listeners
-	 */
-	private ListenerList fListeners = new ListenerList();
-	
-	/**
-	 * Collection of "plural" listeners.
-	 * @since 2.1
-	 */
-	private ListenerList fLaunchesListeners = new ListenerList();	
-	
-	/**
-	 * Visitor used to process resource deltas,
-	 * to update launch configuration index.
-	 */
-	private LaunchManagerVisitor fgVisitor;
-	
-	/**
-	 * Visitor used to process a deleted resource,
-	 * to remove mapped launch configurations in the event
-	 * auto-removal of launch configurations is enabled
-	 * 
-	 * @since 3.4
-	 */
-	private MappedResourceVisitor fgMRVisitor;
-	
-	/**
-	 * Whether this manager is listening for resource change events
-	 */
-	private boolean fListening = false;
-	
-	/**
-	 * Launch configuration listeners
-	 */
-	private ListenerList fLaunchConfigurationListeners = new ListenerList();
-			
-	/**
-	 * Table of source locator extensions. Keys
-	 * are identifiers, and values are associated
-	 * configuration elements.
-	 */
-	private Map fSourceLocators = null;
-
-	/**
-	 * The handles of launch configurations being moved, or <code>null</code>
-	 */
-	private ILaunchConfiguration fFrom;
-	
-	private ILaunchConfiguration fTo;
-
-    /**
-	 * Map of source container type extensions. Keys are extension ids
-	 * and values are associated configuration elements.
-	 */
-	private Map sourceContainerTypes;
-	
-	/**
-	 * Map of source path computer extensions. Keys are extension ids
-	 * and values are associated configuration elements.
-	 */
-	private Map sourcePathComputers;
-
-	/**
-	 * @see ILaunchManager#addLaunch(ILaunch)
-	 */
-	public void addLaunch(ILaunch launch) {
-		if (internalAddLaunch(launch)) {
-			fireUpdate(launch, ADDED);
-			fireUpdate(new ILaunch[] {launch}, ADDED);
-		}
-	}
-		
-	/**
-	 * @see ILaunchManager#addLaunchConfigurationListener(ILaunchConfigurationListener)
-	 */
-	public void addLaunchConfigurationListener(ILaunchConfigurationListener listener) {
-		fLaunchConfigurationListeners.add(listener);
-	}	
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#addLaunches(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void addLaunches(ILaunch[] launches) {
-		List added = new ArrayList(launches.length);
-		for (int i = 0; i < launches.length; i++) {
-			if (internalAddLaunch(launches[i])) {
-				added.add(launches[i]);
-			}
-		}
-		if (!added.isEmpty()) {
-			ILaunch[] addedLaunches = (ILaunch[])added.toArray(new ILaunch[added.size()]);
-			fireUpdate(addedLaunches, ADDED);
-			for (int i = 0; i < addedLaunches.length; i++) {
-				fireUpdate(launches[i], ADDED);
-			}
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#addLaunchListener(org.eclipse.debug.core.ILaunchesListener)
-	 */
-	public void addLaunchListener(ILaunchesListener listener) {
-		fLaunchesListeners.add(listener);
-	}	
-	
-	/**
-	 * @see ILaunchManager#addLaunchListener(ILaunchListener)
-	 */
-	public void addLaunchListener(ILaunchListener listener) {
-		fListeners.add(listener);
-	}	
-	
-	/**
-	 * Computes and caches the native system environment variables as a map of
-	 * variable names and values (Strings) in the given map.
-	 * <p>
-	 * Note that WIN32 system environment preserves
-	 * the case of variable names but is otherwise case insensitive.
-	 * Depending on what you intend to do with the environment, the
-	 * lack of normalization may or may not be create problems. This
-	 * method preserves mixed-case keys using the variable names 
-	 * recorded by the OS.
-	 * </p>
-	 * @since 3.1
-	 */	
-	private void cacheNativeEnvironment(Map cache) {
-		try {
-			String nativeCommand= null;
-			boolean isWin9xME= false; //see bug 50567
-			String fileName= null;
-			if (Platform.getOS().equals(Constants.OS_WIN32)) {
-				String osName= System.getProperty("os.name"); //$NON-NLS-1$
-				isWin9xME= osName != null && (osName.startsWith("Windows 9") || osName.startsWith("Windows ME")); //$NON-NLS-1$ //$NON-NLS-2$
-				if (isWin9xME) {
-					// Win 95, 98, and ME
-					// SET might not return therefore we pipe into a file
-					IPath stateLocation= DebugPlugin.getDefault().getStateLocation();
-					fileName= stateLocation.toOSString() + File.separator  + "env.txt"; //$NON-NLS-1$
-					nativeCommand= "command.com /C set > " + fileName; //$NON-NLS-1$
-				} else {
-					// Win NT, 2K, XP
-					nativeCommand= "cmd.exe /C set"; //$NON-NLS-1$
-				}
-			} else if (!Platform.getOS().equals(Constants.OS_UNKNOWN)){
-				nativeCommand= "env";		 //$NON-NLS-1$
-			}
-			if (nativeCommand == null) {
-				return;
-			}
-			Process process= Runtime.getRuntime().exec(nativeCommand);
-			if (isWin9xME) {
-				//read piped data on Win 95, 98, and ME
-				Properties p= new Properties();
-				File file= new File(fileName);
-				InputStream stream = new BufferedInputStream(new FileInputStream(file));
-				p.load(stream);
-				stream.close();
-				if (!file.delete()) {
-					file.deleteOnExit(); // if delete() fails try again on VM close
-				}
-				for (Enumeration enumeration = p.keys(); enumeration.hasMoreElements();) {
-					// Win32's environment variables are case insensitive. Put everything
-					// to uppercase so that (for example) the "PATH" variable will match
-					// "pAtH" correctly on Windows.
-					String key= (String) enumeration.nextElement();
-					//no need to cast value
-					cache.put(key, p.get(key));
-				}
-			} else {
-				//read process directly on other platforms
-				//we need to parse out matching '{' and '}' for function declarations in .bash environments
-				// pattern is [func name]=() { and we must find the '}' on its own line with no trailing ';'
-				InputStream stream = process.getInputStream();
-				InputStreamReader isreader = new InputStreamReader(stream);
-				BufferedReader reader = new BufferedReader(isreader);
-				String line = reader.readLine();
-				String key = null;
-				String value = null;
-				while (line != null) {
-					int func = line.indexOf("=()"); //$NON-NLS-1$
-					if(func > 0) {
-						key = line.substring(0, func);
-						//scan until we find the closing '}' with no following chars
-						value = line.substring(func+1);
-						while(line != null && !line.equals("}")) { //$NON-NLS-1$
-							line = reader.readLine();
-							if(line != null) {
-								value += line;
-							}
-						}
-						line = reader.readLine();
-					}
-					else {
-						int separator = line.indexOf('=');
-						if (separator > 0) {
-							key = line.substring(0, separator);
-							value = line.substring(separator + 1);
-							line = reader.readLine();
-							if(line != null) {
-								//this line has a '=' read ahead to check next line for '=', might be broken on more than one line
-								separator = line.indexOf('=');
-								while(separator < 0) {
-									value += line.trim();
-									line = reader.readLine();
-									if(line == null) {
-										//if next line read is the end of the file quit the loop
-										break;
-									}
-									separator = line.indexOf('=');
-								}
-							}
-						}
-					}
-					if(key != null) {
-						cache.put(key, value);
-						key = null;
-						value = null;
-					}
-					else {
-						line = reader.readLine();
-					}
-				}
-				reader.close();
-			}
-		} catch (IOException e) {
-			// Native environment-fetching code failed.
-			// This can easily happen and is not useful to log.
-		}
-	}
-
-	/**
-	 * Clears all launch configurations (if any have been accessed)
-	 */
-	private void clearAllLaunchConfigurations() {
-		if (fLaunchConfigurationTypes != null) {
-			fLaunchConfigurationTypes.clear();
-		}
-		if (fLaunchConfigurationIndex != null) {
-			fLaunchConfigurationIndex.clear();
-		}
-	}
-			
-	/**
-	 * The launch config name cache is cleared when a config is added, deleted or changed.
-	 */
-	protected void clearConfigNameCache() {
-		fSortedConfigNames = null;
-	}
-
-	/**
-	 * Return an instance of DebugException containing the specified message and Throwable.
-	 */
-	protected DebugException createDebugException(String message, Throwable throwable) {
-		return new DebugException(
-					new Status(
-					 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-					 DebugException.REQUEST_FAILED, message, throwable 
-					)
-				);
-	}
-	
-	/**
-	 * Return a LaunchConfigurationInfo object initialized from XML contained in
-	 * the specified stream.  Simply pass out any exceptions encountered so that
-	 * caller can deal with them.  This is important since caller may need access to the
-	 * actual exception.
-	 */
-	protected LaunchConfigurationInfo createInfoFromXML(InputStream stream) throws CoreException,
-																			 ParserConfigurationException,
-																			 IOException,
-																			 SAXException {
-		Element root = null;
-		DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		parser.setErrorHandler(new DefaultHandler());
-		root = parser.parse(new InputSource(stream)).getDocumentElement();
-		LaunchConfigurationInfo info = new LaunchConfigurationInfo();
-		info.initializeFromXML(root);
-		return info;
-	}	
-	
-	/**
-	 * Finds and returns all launch configurations in the given
-	 * container (and sub-containers)
-	 * 
-	 * @param container the container to search
-	 * @exception CoreException an exception occurs traversing
-	 *  the container.
-	 * @return all launch configurations in the given container
-	 */
-	protected List findLaunchConfigurations(IContainer container) {
-		List list = new ArrayList(10);
-		if (container instanceof IProject && !((IProject)container).isOpen()) {
-			return list;
-		}
-		ResourceProxyVisitor visitor= new ResourceProxyVisitor(list);
-		try {
-			container.accept(visitor, IResource.NONE);
-		} catch (CoreException ce) {
-			//Closed project...should not be possible with previous check
-		}
-		Iterator iter = list.iterator();
-		List configs = new ArrayList(list.size());
-		IFile file = null;
-		while (iter.hasNext()) {
-			file = (IFile)iter.next();
-			configs.add(getLaunchConfiguration(file));
-		}
-		return configs;
-	}
-	
-	/**
-	 * Finds and returns all local launch configurations.
-	 *
-	 * @return all local launch configurations
-	 * @exception CoreException if there is a lower level
-	 *  IO exception
-	 */
-	protected List findLocalLaunchConfigurations() {
-		IPath containerPath = LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH;
-		List configs = new ArrayList(10);
-		final File directory = containerPath.toFile();
-		if (directory.isDirectory()) {
-			FilenameFilter filter = new FilenameFilter() {
-				public boolean accept(File dir, String name) {
-					return dir.equals(directory) &&
-							name.endsWith(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION);
-				}
-			};
-			String[] files = directory.list(filter);
-			LaunchConfiguration config = null;
-			for (int i = 0; i < files.length; i++) {
-				config = new LaunchConfiguration(containerPath.append(files[i]));
-				configs.add(config);
-			}
-		}
-		return configs;
-	}
-		
-	/**
-	 * Fires notification to (single) listeners that a launch has been
-	 * added/changed/removed.
-	 * 
-	 * @param launch launch that has changed
-	 * @param update type of change
-	 */
-	public void fireUpdate(ILaunch launch, int update) {
-		new LaunchNotifier().notify(launch, update);
-	}
-
-	/**
-	 * Fires notification to (plural) listeners that a launch has been
-	 * added/changed/removed.
-	 * 
-	 * @param launches launches that have changed
-	 * @param update type of change
-	 */
-	public void fireUpdate(ILaunch[] launches, int update) {
-		new LaunchesNotifier().notify(launches, update);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#generateUniqueLaunchConfigurationNameFrom(String)
-	 */
-	public String generateUniqueLaunchConfigurationNameFrom(String baseName) {
-		int index = 1;
-		int length= baseName.length();
-		int copyIndex = baseName.lastIndexOf(" ("); //$NON-NLS-1$
-		if (copyIndex > -1 && length > copyIndex + 2 && baseName.charAt(length - 1) == ')') {
-			String trailer = baseName.substring(copyIndex + 2, length -1);
-			if (isNumber(trailer)) {
-				try {
-					index = Integer.parseInt(trailer);
-					baseName = baseName.substring(0, copyIndex);
-				} 
-				catch (NumberFormatException nfe) {}
-			}
-		} 
-		String newName = baseName;
-		while (isExistingLaunchConfigurationName(newName)) {
-			newName = MessageFormat.format(DebugCoreMessages.LaunchManager_31, new String[] {baseName, Integer.toString(index)});
-			index++;
-		}		
-			
-		return newName;
-	}
-	
-	/**
-	 * Return a String that can be used as the name of a launch configuration.  The name
-	 * is guaranteed to be unique (no existing or temporary launch configurations will have this name).
-	 * The name that is returned uses the <code>basename</code> as a starting point.  If 
-	 * there is no existing launch configuration with this name, then <code>basename</code>
-	 * is returned.  Otherwise, the value returned consists of the specified base plus
-	 * some suffix that guarantees uniqueness. Passing <code>null</code> as the set of reserved names will cause this
-	 * method to return <code>generateUniqueLaunchConfigurationNameFrom(String baseName)</code>.
-	 * 
-	 * By specifying a set of reserved names, you can further constrain the name that will be generated
-	 * by this method. For example you can give a base name of 'test' and a reserved set of [test(1), test(2)],
-	 * which will result in a name of 'test(3)' being returned iff a configuration with the name 'test' already exists.
-	 * 
-	 * @return launch configuration name
-	 * @param basename the String that the returned name must begin with
-	 * @param reservednames a set of strings that is further used to constrain what names can be generated
-	 * @since 3.3
-	 */
-	public String generateUniqueLaunchConfigurationNameFrom(String basename, Set reservednames) {
-		if(reservednames == null) {
-			return generateUniqueLaunchConfigurationNameFrom(basename);
-		}
- 		int index = 1;
-		int length= basename.length();
-		String base = basename;
-		int copyIndex = base.lastIndexOf(" ("); //$NON-NLS-1$
-		if (copyIndex > -1 && length > copyIndex + 2 && base.charAt(length - 1) == ')') {
-			String trailer = base.substring(copyIndex + 2, length -1);
-			if (isNumber(trailer)) {
-				try {
-					index = Integer.parseInt(trailer);
-					base = base.substring(0, copyIndex);
-				} 
-				catch (NumberFormatException nfe) {}
-			}
-		} 
-		String newname = base;
-		StringBuffer buffer = null;
-		while (isExistingLaunchConfigurationName(newname) || reservednames.contains(newname)) {
-			buffer = new StringBuffer(base);
-			buffer.append(" ("); //$NON-NLS-1$
-			buffer.append(String.valueOf(index));
-			index++;	
-			buffer.append(')');
-			newname = buffer.toString();
-		}		
-		return newname;
-	}
-	
-	/**
-	 * Returns a collection of all launch configuration handles in 
-	 * the workspace. This collection is initialized lazily.
-	 * 
-	 * @return all launch configuration handles
-	 */
-	private synchronized List getAllLaunchConfigurations() {
-		if (fLaunchConfigurationIndex == null) {
-			try {			
-				fLaunchConfigurationIndex = new ArrayList(20);
-				List configs = findLocalLaunchConfigurations();
-				verifyConfigurations(configs, fLaunchConfigurationIndex);
-				configs = findLaunchConfigurations(ResourcesPlugin.getWorkspace().getRoot());
-				verifyConfigurations(configs, fLaunchConfigurationIndex);
-			} finally {
-				hookResourceChangeListener();				
-			}
-		}
-		return fLaunchConfigurationIndex;
-	}
-	
-	/**
-	 * Return a sorted array of the names of all <code>ILaunchConfiguration</code>s in 
-	 * the workspace.  These are cached, and cache is cleared when a new config is added,
-	 * deleted or changed.
-	 */
-	protected String[] getAllSortedConfigNames() {
-		if (fSortedConfigNames == null) {
-			ILaunchConfiguration[] configs = getLaunchConfigurations();
-			fSortedConfigNames = new String[configs.length];
-			for (int i = 0; i < configs.length; i++) {
-				fSortedConfigNames[i] = configs[i].getName();
-			}
-			Arrays.sort(fSortedConfigNames);
-		}
-		return fSortedConfigNames;
-	}
-	
-	/**
-	 * Returns the comparator registered for the given attribute, or
-	 * <code>null</code> if none.
-	 * 
-	 * @param attributeName attribute for which a comparator is required
-	 * @return comparator, or <code>null</code> if none
-	 */
-	protected Comparator getComparator(String attributeName) {
-		 Map map = getComparators();
-		 return (Comparator)map.get(attributeName);
-	}
-	
-	/**
-	 * Returns comparators, loading if required
-	 */
-	protected Map getComparators() {
-		initializeComparators();
-		return fComparators;
-	}	
-	
-	/**
-	 * Returns the launch configurations specified by the given
-	 * XML document.
-	 * 
-	 * @param root XML document
-	 * @return list of launch configurations
-	 * @exception IOException if an exception occurs reading the XML
-	 */	
-	protected List getConfigsFromXML(Element root) throws CoreException {
-		DebugException invalidFormat = 
-			new DebugException(
-				new Status(
-				 IStatus.ERROR, DebugPlugin.getUniqueIdentifier(),
-				 DebugException.REQUEST_FAILED, DebugCoreMessages.LaunchManager_Invalid_launch_configuration_index__18, null 
-				)
-			);		
-			
-		if (!root.getNodeName().equalsIgnoreCase("launchConfigurations")) { //$NON-NLS-1$
-			throw invalidFormat;
-		}
-		
-		// read each launch configuration 
-		List configs = new ArrayList(4);	
-		NodeList list = root.getChildNodes();
-		int length = list.getLength();
-		Node node = null;
-		Element entry = null;
-		String memento = null;
-		for (int i = 0; i < length; ++i) {
-			node = list.item(i);
-			short type = node.getNodeType();
-			if (type == Node.ELEMENT_NODE) {
-				entry = (Element) node;
-				if (!entry.getNodeName().equals("launchConfiguration")) { //$NON-NLS-1$
-					throw invalidFormat;
-				}
-				memento = entry.getAttribute("memento"); //$NON-NLS-1$
-				if (memento == null) {
-					throw invalidFormat;
-				}
-				configs.add(getLaunchConfiguration(memento));
-			}
-		}
-		return configs;
-	}
-	
-	protected ConfigurationNotifier getConfigurationNotifier() {
-		return new ConfigurationNotifier();
-	}			
-	
-	/**
-	 * @see ILaunchManager#getDebugTargets()
-	 */
-	public IDebugTarget[] getDebugTargets() {
-		synchronized (fLaunches) {
-			List allTargets= new ArrayList(fLaunches.size());
-			if (fLaunches.size() > 0) {
-				Iterator e = fLaunches.iterator();
-				IDebugTarget[] targets = null;
-				while (e.hasNext()) {
-					targets = ((ILaunch) e.next()).getDebugTargets();
-					for (int i = 0; i < targets.length; i++) {
-						allTargets.add(targets[i]);
-					}
-				}
-			}
-			return (IDebugTarget[])allTargets.toArray(new IDebugTarget[allTargets.size()]);
-		}
-	}
-	
-	/**
-	 * Returns the resource delta visitor for the launch manager.
-	 * 
-	 * @return the resource delta visitor for the launch manager
-	 */
-	private LaunchManagerVisitor getDeltaVisitor() {
-	    if (fgVisitor == null) {
-			fgVisitor= new LaunchManagerVisitor();
-		}
-	    return fgVisitor;
-	}
-	
-	/**
-	 * Returns the resource delta visitor for auto-removal of mapped launch configurations
-	 * @return the resource delta visitor for auto-removal of mapped launch configurations
-	 * 
-	 * @since 3.4
-	 */
-	private MappedResourceVisitor getMappedResourceVisitor() {
-		if(fgMRVisitor == null) {
-			fgMRVisitor = new MappedResourceVisitor();
-		}
-		return fgMRVisitor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getEnvironment(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public String[] getEnvironment(ILaunchConfiguration configuration) throws CoreException {
-		Map configEnv = configuration.getAttribute(ATTR_ENVIRONMENT_VARIABLES, (Map) null);
-		if (configEnv == null) {
-			return null;
-		}
-		Map env = new HashMap();
-		// build base environment
-		boolean append = configuration.getAttribute(ATTR_APPEND_ENVIRONMENT_VARIABLES, true);
-		if (append) {
-			env.putAll(getNativeEnvironmentCasePreserved());
-		}
-		
-		// Add variables from config
-		Iterator iter= configEnv.entrySet().iterator();
-		boolean win32= Platform.getOS().equals(Constants.OS_WIN32);
-		Map.Entry entry = null;
-		String key = null;
-		String value = null;
-		Object nativeValue = null;
-		Iterator envIter = null;
-		Map.Entry nativeEntry = null;
-		String nativeKey = null;
-		while (iter.hasNext()) {
-			entry = (Map.Entry) iter.next();
-			key = (String) entry.getKey();
-            value = (String) entry.getValue();
-            // translate any string substitution variables
-            if (value != null) {
-                value = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(value);
-            }
-            boolean added= false;
-			if (win32) {
-                // First, check if the key is an exact match for an existing key.
-				nativeValue = env.get(key);
-                if (nativeValue != null) {
-                    // If an exact match is found, just replace the value
-                    env.put(key, value);
-                } else {
-                    // Win32 variables are case-insensitive. If an exact match isn't found, iterate to
-                    // check for a case-insensitive match. We maintain the key's case (see bug 86725),
-                    // but do a case-insensitive comparison (for example, "pAtH" will still override "PATH").
-                    envIter = env.entrySet().iterator();
-                    while (envIter.hasNext()) {
-                        nativeEntry = (Map.Entry) envIter.next();
-                        nativeKey = (String) (nativeEntry).getKey();
-                        if (nativeKey.equalsIgnoreCase(key)) {
-                            nativeEntry.setValue(value);
-                            added = true;
-                            break;
-                        }
-                    }
-                }
-			}
-            if (!added) {
-                env.put(key, value);
-            }
-		}		
-		
-		iter = env.entrySet().iterator();
-		List strings = new ArrayList(env.size());
-		StringBuffer buffer = null;
-		while (iter.hasNext()) {
-			entry = (Map.Entry) iter.next();
-			buffer = new StringBuffer((String) entry.getKey());
-			buffer.append('=').append((String) entry.getValue());
-			strings.add(buffer.toString());
-		}
-		return (String[]) strings.toArray(new String[strings.size()]);
-	}
-	
-	/**
-	 * Returns the info object for the specified launch configuration.
-	 * If the configuration exists, but is not yet in the cache,
-	 * an info object is built and added to the cache.
-	 * 
-	 * @exception CoreException if an exception occurs building
-	 *  the info object
-	 * @exception DebugException if the config does not exist
-	 */
-	protected LaunchConfigurationInfo getInfo(ILaunchConfiguration config) throws CoreException {
-		LaunchConfigurationInfo info = (LaunchConfigurationInfo)fLaunchConfigurations.get(config);
-		if (info == null) {
-			if (config.exists()) {
-				InputStream stream = null;
-				try {
-					if (config.isLocal()) {
-						IPath path = config.getLocation();
-						File file = path.toFile();				
-						stream = new BufferedInputStream(new FileInputStream(file));
-					} else {
-						IFile file = ((LaunchConfiguration) config).getFile();
-						if (file == null) {
-							throw createDebugException(MessageFormat.format(DebugCoreMessages.LaunchManager_30, new String[] {config.getName()}), null); 
-						}
-						stream = file.getContents(true);
-					}
-					info = createInfoFromXML(stream);
-					synchronized (this) {
-						fLaunchConfigurations.put(config, info);
-					}
-				} catch (FileNotFoundException e) {
-					throwException(config, e);					
-				} catch (SAXException e) {
-					throwException(config, e);					
-				} catch (ParserConfigurationException e) {
-					throwException(config, e);					
-				} catch (IOException e) {
-					throwException(config, e);					
-				} finally {
-					if (stream != null) {
-						try {
-							stream.close();
-						} catch (IOException e) {
-							throwException(config, e);					
-						}
-					}
-				}
-		
-			} else {
-				throw createDebugException(
-					MessageFormat.format(DebugCoreMessages.LaunchManager_does_not_exist, new String[]{config.getName(), config.getLocation().toOSString()}), null); 
-			}
-		}
-		return info;
-	}
-	
-	/**
-	 * @see ILaunchManager#getLaunchConfiguration(IFile)
-	 */
-	public ILaunchConfiguration getLaunchConfiguration(IFile file) {
-		hookResourceChangeListener();				
-		return new LaunchConfiguration(file.getLocation());
-	}
-	
-	/**
-	 * @see ILaunchManager#getLaunchConfiguration(String)
-	 */
-	public ILaunchConfiguration getLaunchConfiguration(String memento) throws CoreException {
-		hookResourceChangeListener();
-		return new LaunchConfiguration(memento);
-	}
-	
-	/**
-	 * @see ILaunchManager#getLaunchConfigurations()
-	 */
-	public synchronized ILaunchConfiguration[] getLaunchConfigurations() {
-		List allConfigs = getAllLaunchConfigurations();
-		return (ILaunchConfiguration[])allConfigs.toArray(new ILaunchConfiguration[allConfigs.size()]);
-	}	
-	
-	/**
-	 * @see ILaunchManager#getLaunchConfigurations(ILaunchConfigurationType)
-	 */
-	public synchronized ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type) throws CoreException {
-		Iterator iter = getAllLaunchConfigurations().iterator();
-		List configs = new ArrayList();
-		ILaunchConfiguration config = null;
-		while (iter.hasNext()) {
-			config = (ILaunchConfiguration)iter.next();
-			if (config.getType().equals(type)) {
-				configs.add(config);
-			}
-		}
-		return (ILaunchConfiguration[])configs.toArray(new ILaunchConfiguration[configs.size()]);
-	}
-	
-	/**
-	 * Returns all launch configurations that are stored as resources
-	 * in the given project.
-	 * 
-	 * @param project a project
-	 * @return collection of launch configurations that are stored as resources
-	 *  in the given project
-	 */
-	protected synchronized List getLaunchConfigurations(IProject project) {
-		Iterator iter = getAllLaunchConfigurations().iterator();
-		List configs = new ArrayList();
-		ILaunchConfiguration config = null;
-		IFile file = null;
-		while (iter.hasNext()) {
-			config = (ILaunchConfiguration)iter.next();
-			file = config.getFile();
-			if (file != null && file.getProject().equals(project)) {
-				configs.add(config);
-			}
-		}
-		return configs;
-	}
-	
-	/**
-	 * @see ILaunchManager#getLaunchConfigurationType(String)
-	 */
-	public ILaunchConfigurationType getLaunchConfigurationType(String id) {
-		ILaunchConfigurationType[] types = getLaunchConfigurationTypes();
-		for(int i = 0; i < types.length; i++) {
-			if (types[i].getIdentifier().equals(id)) {
-				return types[i];
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @see ILaunchManager#getLaunchConfigurationTypes()
-	 */
-	public ILaunchConfigurationType[] getLaunchConfigurationTypes() {
-		initializeLaunchConfigurationTypes();
-		return (ILaunchConfigurationType[])fLaunchConfigurationTypes.toArray(new ILaunchConfigurationType[fLaunchConfigurationTypes.size()]);
-	}
-	
-	/**
-	 * @see ILaunchManager#getLaunches()
-	 */
-	public ILaunch[] getLaunches() {
-		synchronized (fLaunches) {
-			return (ILaunch[])fLaunches.toArray(new ILaunch[fLaunches.size()]);
-		}
-	}
-	
-	/**)
-	 * @see org.eclipse.debug.core.ILaunchManager#getLaunchMode(java.lang.String)
-	 */
-	public ILaunchMode getLaunchMode(String mode) {
-		initializeLaunchModes();
-		return (ILaunchMode) fLaunchModes.get(mode);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#getLaunchModes()
-	 */
-	public ILaunchMode[] getLaunchModes() {
-		initializeLaunchModes();
-		Collection collection = fLaunchModes.values();
-		return (ILaunchMode[]) collection.toArray(new ILaunchMode[collection.size()]);
-	}
-	
-	/**
-	 * Returns all of the launch delegates. The returned listing of delegates cannot be directly used to launch,
-	 * instead the method <code>IlaunchDelegate.getDelegate</code> must be used to acquire an executable form of
-	 * the delegate, allowing us to maintain lazy loading of the delegates themselves.
-	 * @return all of the launch delegates
-	 * 
-	 * @since 3.3
-	 */
-	public ILaunchDelegate[] getLaunchDelegates() {
-		initializeLaunchDelegates();
-		Collection col = fLaunchDelegates.values();
-		return (ILaunchDelegate[]) col.toArray(new ILaunchDelegate[col.size()]);
-	}
-	
-	/**
-	 * Returns the listing of launch delegates that apply to the specified 
-	 * <code>ILaunchConfigurationType</code> id
-	 * @param typeid the id of the launch configuration type to get delegates for 
-	 * @return An array of <code>LaunchDelegate</code>s that apply to the specified launch configuration
-	 * type, or an empty array, never <code>null</code>
-	 * 
-	 * @since 3.3
-	 */
-	public LaunchDelegate[] getLaunchDelegates(String typeid) {
-		initializeLaunchDelegates();
-		ArrayList list = new ArrayList();
-		LaunchDelegate ld = null;
-		for(Iterator iter = fLaunchDelegates.keySet().iterator(); iter.hasNext();) {
-			ld = (LaunchDelegate) fLaunchDelegates.get(iter.next());
-			if(ld.getLaunchConfigurationTypeId().equals(typeid)) {
-				list.add(ld);
-			}
-		}
-		return (LaunchDelegate[]) list.toArray(new LaunchDelegate[list.size()]);
-	}
-	
-	/**
-	 * This method returns the <code>ILaunchDelegate</code> instance corresponding to the id 
-	 * of the launch delegate specified
-	 * @param id the id of the <code>ILaunchDelegate</code> to find 
-	 * @return the <code>ILaunchDelegate</code> or <code>null</code> if not found
-	 * 
-	 * @since 3.3
-	 */
-	public ILaunchDelegate getLaunchDelegate(String id) {
-		if(id != null) {
-			ILaunchDelegate[] delegates = getLaunchDelegates();
-			for(int i = 0; i < delegates.length; i++) {
-				if(id.equals(delegates[i].getId())) {
-					return delegates[i];
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Initializes the listing of delegates available to the launching framework
-	 * 
-	 * @since 3.3
-	 */
-	private synchronized void initializeLaunchDelegates() {
-		if(fLaunchDelegates == null) {
-			fLaunchDelegates = new HashMap();
-			//get all launch delegate contributions
-			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LAUNCH_DELEGATES);
-			IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
-			LaunchDelegate delegate = null;
-			for(int i = 0; i < infos.length; i++) {
-				delegate = new LaunchDelegate(infos[i]);
-				fLaunchDelegates.put(delegate.getId(), delegate);
-			}
-			//get all delegates from launch configuration type contributions
-			extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LAUNCH_CONFIGURATION_TYPES);
-			infos = extensionPoint.getConfigurationElements();
-			for(int i = 0; i < infos.length; i++) {
-				//must check to see if delegate is provided in contribution
-				if(infos[i].getAttribute(IConfigurationElementConstants.DELEGATE) != null) {
-					delegate = new LaunchDelegate(infos[i]);
-					fLaunchDelegates.put(delegate.getId(), delegate);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * This method is used to initialize a simple listing of all preferred delegates, which is then used by each
-	 * <code>ILaunchConfigurationType</code> to find if they have preferred delegates. Once an <code>ILaunchConfigurationType</code>
-	 * has used this listing to initialize its preferred delegates it will maintain changes to its preferred delegate, which are 
-	 * then written back to the preference store only when the launch manager shuts down.
-	 * <p>
-	 * This cache is not synchronized with the runtime preferred delegates stored in launch configuration types.
-	 * </p>
-	 * @since 3.3
-	 */
-	private synchronized void initializePreferredDelegates() {
-		if(fPreferredDelegates == null) {
-			fPreferredDelegates = new HashSet();
-			Preferences prefs = DebugPlugin.getDefault().getPluginPreferences();
-			String preferred = prefs.getString(LaunchManager.PREF_PREFERRED_DELEGATES);
-			if(!EMPTY_STRING.equals(preferred)) {
-				try {
-					Element root = DebugPlugin.parseDocument(preferred);
-					NodeList nodes = root.getElementsByTagName(IConfigurationElementConstants.DELEGATE);
-					Element element = null;
-					String typeid = null;
-					Set modeset = null;
-					List modesets = null;
-					LaunchDelegate[] extensions = null;
-					ILaunchDelegate delegate = null;
-					for(int i = 0; i < nodes.getLength(); i++) {
-						element = (Element) nodes.item(i);
-						typeid = element.getAttribute(IConfigurationElementConstants.TYPE_ID);
-						extensions = getLaunchDelegates(typeid);
-						for(int j = 0; j < extensions.length; j++) {
-							if(element.getAttribute(IConfigurationElementConstants.ID).equals(extensions[j].getId())) { 
-								modesets = extensions[j].getModes();
-								String[] modes = element.getAttribute(IConfigurationElementConstants.MODES).split(","); //$NON-NLS-1$
-								modeset = new HashSet(Arrays.asList(modes));
-								if(modesets.contains(modeset)) {
-									delegate = extensions[j]; 
-									break;
-								}
-							}
-						}
-						//take type id, modeset, delegate and create entry
-						if(delegate != null & !EMPTY_STRING.equals(typeid) & modeset != null) {
-							fPreferredDelegates.add(new PreferredDelegate(delegate, typeid, modeset));
-						}
-						delegate = null;
-					}
-				}
-				catch (CoreException e) {DebugPlugin.log(e);} 
-			}
-		}
-	}
-	
-	/**
-	 * Allows internal access to a preferred delegate for a given type and mode set
-	 * @param typeid the id of the <code>ILaunchConfigurationType</code> to find a delegate for
-	 * @param modes the set of modes for the delegate
-	 * @return the preferred delegate for the specified type id and mode set, or <code>null</code> if none
-	 * 
-	 * @since 3.3
-	 */
-	protected ILaunchDelegate getPreferredDelegate(String typeid, Set modes) {
-		initializePreferredDelegates();
-		PreferredDelegate pd = null;
-		for(Iterator iter = fPreferredDelegates.iterator(); iter.hasNext();) {
-			pd = (PreferredDelegate) iter.next();
-			if(pd.getModes().equals(modes) & pd.getTypeId().equals(typeid)) {
-				return pd.getDelegate();
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns all launch configurations that are stored locally.
-	 * 
-	 * @return collection of launch configurations stored locally
-	 */
-	protected synchronized List getLocalLaunchConfigurations() {
-		Iterator iter = getAllLaunchConfigurations().iterator();
-		List configs = new ArrayList();
-		ILaunchConfiguration config = null;
-		while (iter.hasNext()) {
-			config = (ILaunchConfiguration)iter.next();
-			if (config.isLocal()) {
-				configs.add(config);
-			}
-		}
-		return configs;
-	}
-	
-	/**
-	 * Returns the launch configurations mapping to the specified resource
-	 * @param resource the resource to collect mapped launch configurations for
-	 * @return a list of launch configurations if found or an empty list, never null
-	 * @since 3.2
-	 */
-	public ILaunchConfiguration[] getMappedConfigurations(IResource resource) {
-		List configurations = new ArrayList();
-		try {
-			ILaunchConfiguration[] configs = getLaunchConfigurations();
-			IResource[] resources = null;
-			for(int i = 0; i < configs.length; i++) {
-				resources = configs[i].getMappedResources();
-				if(resources != null) {
-					for(int j = 0; j < resources.length; j++) {
-						if(resources[j].equals(resource)) {
-							configurations.add(configs[i]);
-						}
-					}
-				}
-			}
-		}
-		catch(CoreException e) {DebugPlugin.log(e);}
-		return (ILaunchConfiguration[])configurations.toArray(new ILaunchConfiguration[configurations.size()]);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getMigrationCandidates()
-	 */
-	public ILaunchConfiguration[] getMigrationCandidates() throws CoreException {
-		List configs = new ArrayList();
-		ILaunchConfiguration[] candidates = getLaunchConfigurations();
-		for(int i = 0; i < candidates.length; i++) {
-			if(candidates[i].isMigrationCandidate()) {
-				configs.add(candidates[i]);
-			}
-		}
-		return (ILaunchConfiguration[])configs.toArray(new ILaunchConfiguration[configs.size()]);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#getMovedFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ILaunchConfiguration getMovedFrom(ILaunchConfiguration addedConfiguration) {
-		if (addedConfiguration.equals(fTo)) {
-			return fFrom;
-		}
-		return null;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#getMovedTo(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ILaunchConfiguration getMovedTo(ILaunchConfiguration removedConfiguration) {
-		if (removedConfiguration.equals(fFrom)) {
-			return fTo;
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getNativeEnvironment()
-	 */
-	public synchronized Map getNativeEnvironment() {
-		if (fgNativeEnv == null) {
-			Map casePreserved = getNativeEnvironmentCasePreserved();
-			if (Platform.getOS().equals(Constants.OS_WIN32)) {
-				fgNativeEnv= new HashMap();
-				Iterator entries = casePreserved.entrySet().iterator();
-				Map.Entry entry = null;
-				String key = null;
-				while (entries.hasNext()) {
-					entry = (Entry) entries.next();
-					key = ((String)entry.getKey()).toUpperCase();
-					fgNativeEnv.put(key, entry.getValue());
-				}
-			} else {
-				fgNativeEnv = new HashMap(casePreserved);
-			}
-		}
-		return new HashMap(fgNativeEnv);
-	}		
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getNativeEnvironmentCasePreserved()
-	 */
-	public synchronized Map getNativeEnvironmentCasePreserved() {
-		if (fgNativeEnvCasePreserved == null) {
-			fgNativeEnvCasePreserved= new HashMap();
-			cacheNativeEnvironment(fgNativeEnvCasePreserved);
-		}
-		return new HashMap(fgNativeEnvCasePreserved);
-	}
-	
-	/**
-	 * @see ILaunchManager#getProcesses()
-	 */
-	public IProcess[] getProcesses() {
-		synchronized (fLaunches) {
-			List allProcesses = new ArrayList(fLaunches.size());
-			Iterator e = fLaunches.iterator();
-			IProcess[] processes = null;
-			while (e.hasNext()) {
-				processes = ((ILaunch) e.next()).getProcesses();
-				for (int i= 0; i < processes.length; i++) {
-					allProcesses.add(processes[i]);
-				}
-			}
-			return (IProcess[])allProcesses.toArray(new IProcess[allProcesses.size()]);
-		}
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getSourceContainerType(java.lang.String)
-	 */
-	public ISourceContainerType getSourceContainerType(String id) {
-		initializeSourceContainerTypes();
-		return (ISourceContainerType) sourceContainerTypes.get(id);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getSourceContainerTypes()
-	 */
-	public ISourceContainerType[] getSourceContainerTypes() {
-		initializeSourceContainerTypes();
-		Collection containers = sourceContainerTypes.values();
-		return (ISourceContainerType[]) containers.toArray(new ISourceContainerType[containers.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#newSourcePathComputer(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourcePathComputer getSourcePathComputer(ILaunchConfiguration configuration) throws CoreException {
-		String id = null;
-		id = configuration.getAttribute(ISourcePathComputer.ATTR_SOURCE_PATH_COMPUTER_ID, (String)null);
-		
-		if (id == null) {
-			//use default computer for configuration type, if any			
-			return configuration.getType().getSourcePathComputer();							
-		}
-		return getSourcePathComputer(id);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getSourcePathComputer(java.lang.String)
-	 */
-	public ISourcePathComputer getSourcePathComputer(String id) {
-		initializeSourceContainerTypes();
-		return (ISourcePathComputer) sourcePathComputers.get(id);
-	}
-
-	/**
-     * Starts listening for resource change events
-     */
-    private synchronized void hookResourceChangeListener() {
-        if (!fListening) {
-        	ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE);
-            fListening = true;
-        }
-    }
-	
-	/**
-	 * Load comparator extensions.
-	 */
-	private synchronized void initializeComparators() {
-		if (fComparators == null) {
-			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LAUNCH_CONFIGURATION_COMPARATORS);
-			IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-			fComparators = new HashMap(infos.length);
-			IConfigurationElement configurationElement = null;
-			String attr = null;
-			for (int i= 0; i < infos.length; i++) {
-				configurationElement = infos[i];
-				attr = configurationElement.getAttribute("attribute"); //$NON-NLS-1$			
-				if (attr != null) {
-					fComparators.put(attr, new LaunchConfigurationComparator(configurationElement));
-				} else {
-					// invalid status handler
-					IStatus s = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugException.INTERNAL_ERROR,
-					MessageFormat.format("Invalid launch configuration comparator extension defined by plug-in {0} - attribute not specified.", new String[] {configurationElement.getContributor().getName()}), null);  //$NON-NLS-1$
-					DebugPlugin.log(s);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Initializes the listing of <code>LaunchConfigurationType</code>s.
-	 */
-	private synchronized void initializeLaunchConfigurationTypes() {
-		if (fLaunchConfigurationTypes == null) {
-			hookResourceChangeListener();
-			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LAUNCH_CONFIGURATION_TYPES);
-			IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
-			fLaunchConfigurationTypes = new ArrayList(infos.length);
-			for (int i= 0; i < infos.length; i++) {		
-				fLaunchConfigurationTypes.add(new LaunchConfigurationType(infos[i]));
-			}
-		}
-	}
-	
-	/**
-	 * Load comparator extensions.
-	 * 
-	 * @exception CoreException if an exception occurs reading
-	 *  the extensions
-	 *  
-	 */
-	private synchronized void initializeLaunchModes() {
-		if (fLaunchModes == null) {
-			try {
-				IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LAUNCH_MODES);
-				IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-				fLaunchModes = new HashMap();
-				ILaunchMode mode = null;
-				for (int i= 0; i < infos.length; i++) {
-					mode = new LaunchMode(infos[i]);
-					fLaunchModes.put(mode.getIdentifier(), mode);
-				}
-			} 
-			catch (CoreException e) {DebugPlugin.log(e);}
-		}
-	}
-	
-	/**
-	 * Initializes source container type and source path computer extensions.
-	 */
-	private synchronized void initializeSourceContainerTypes() {
-		if (sourceContainerTypes == null) {
-			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_SOURCE_CONTAINER_TYPES);
-			IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();
-			sourceContainerTypes = new HashMap();
-			for (int i = 0; i < extensions.length; i++) {
-				sourceContainerTypes.put(
-						extensions[i].getAttribute(IConfigurationElementConstants.ID),
-						new SourceContainerType(extensions[i]));
-			}
-			extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_SOURCE_PATH_COMPUTERS);
-			extensions = extensionPoint.getConfigurationElements();
-			sourcePathComputers = new HashMap();
-			for (int i = 0; i < extensions.length; i++) {
-				sourcePathComputers.put(
-						extensions[i].getAttribute(IConfigurationElementConstants.ID),
-						new SourcePathComputer(extensions[i]));
-			}
-		}
-	}
-
-	/**
-	 * Register source locators.
-	 * 
-	 * @exception CoreException if an exception occurs reading
-	 *  the extensions
-	 */
-	private synchronized void initializeSourceLocators() {
-		if (fSourceLocators == null) {
-			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_SOURCE_LOCATORS);
-			IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-			fSourceLocators= new HashMap(infos.length);
-			IConfigurationElement configurationElement = null;
-			String id = null;
-			for (int i= 0; i < infos.length; i++) {
-				configurationElement = infos[i];
-				id = configurationElement.getAttribute(IConfigurationElementConstants.ID);			
-				if (id != null) {
-					fSourceLocators.put(id,configurationElement);
-				} else {
-					// invalid status handler
-					IStatus s = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugException.INTERNAL_ERROR,
-					MessageFormat.format("Invalid source locator extension defined by plug-in \"{0}\": \"id\" not specified.", new String[] {configurationElement.getContributor().getName()} ), null);   //$NON-NLS-1$
-					DebugPlugin.log(s);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Adds the given launch object to the list of registered launches,
-	 * and returns whether the launch was added.
-	 * 
-	 * @param launch launch to register
-	 * @return whether the launch was added
-	 */
-	protected boolean internalAddLaunch(ILaunch launch) {
-		// ensure the step filter manager is created on the first launch
-		getStepFilterManager();
-		synchronized (fLaunches) {
-			if (fLaunches.contains(launch)) {
-				return false;
-			}
-			fLaunches.add(launch);
-			fLaunchSet.add(launch);
-			return true;
-		}
-	}
-
-	/**
-	 * Removes the given launch object from the collection of registered
-	 * launches. Returns whether the launch was removed.
-	 * 
-	 * @param launch the launch to remove
-	 * @return whether the launch was removed
-	 */
-	protected boolean internalRemoveLaunch(ILaunch launch) {
-		if (launch == null) {
-			return false;
-		}
-		synchronized (fLaunches) {
-			fLaunchSet.remove(launch);
-			return fLaunches.remove(launch);
-		}
-	}
-	/**
-	 * @see ILaunchManager#isExistingLaunchConfigurationName(String)
-	 */
-	public boolean isExistingLaunchConfigurationName(String name) {
-		String[] sortedConfigNames = getAllSortedConfigNames();
-		int index = Arrays.binarySearch(sortedConfigNames, name);
-		if (index < 0) {
-			return false;
-		} 
-		return true;
-	}
-	
-	/**
-	 * Returns whether the given String is composed solely of digits
-	 */
-	private boolean isNumber(String string) {
-		int numChars= string.length();
-		if (numChars == 0) {
-			return false;
-		}
-		for (int i= 0; i < numChars; i++) {
-			if (!Character.isDigit(string.charAt(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * Returns whether the user has selected to delete associated configurations when a
-	 * project is deleted.
-	 * 
-	 * @return whether to auto-delete configurations
-	 */
-	private boolean isDeleteConfigurations() {
-		return DebugPlugin.getDefault().getPluginPreferences().getBoolean(PREF_DELETE_CONFIGS_ON_PROJECT_DELETE);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#isRegistered(org.eclipse.debug.core.ILaunch)
-	 */
-	public boolean isRegistered(ILaunch launch) {
-		synchronized (fLaunches) {
-			return fLaunchSet.contains(launch);
-		}
-	}
-
-	/**
-	 * Returns whether the given launch configuration passes a basic
-	 * integrity test by retrieving its type.
-	 * 
-	 * @param config the configuration to verify
-	 * @return whether the config meets basic integrity constraints
-	 */
-	protected boolean isValid(ILaunchConfiguration config) {
-		try {
-			config.getType();
-		} catch (CoreException e) {
-			if (e.getStatus().getCode() != DebugException.MISSING_LAUNCH_CONFIGURATION_TYPE) {
-				// only log warnings due to something other than a missing
-				// launch config type
-				DebugPlugin.log(e);
-			}
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Notifies the launch manager that a launch configuration
-	 * has been added. The configuration is added to the index of
-	 * configurations by project, and listeners are notified.
-	 * 
-	 * @param config the launch configuration that was added
-	 */
-	protected void launchConfigurationAdded(ILaunchConfiguration config) {
-		if (config.isWorkingCopy()) {
-			return;
-		}
-		if (isValid(config)) {		
-			boolean added = false;
-			synchronized (this) {
-				List allConfigs = getAllLaunchConfigurations();
-				if (!allConfigs.contains(config)) {
-					allConfigs.add(config);
-					added = true;
-				}				
-			}
-			if (added) {
-				getConfigurationNotifier().notify(config, ADDED);
-				clearConfigNameCache();
-			}
-		} else {
-			launchConfigurationDeleted(config);
-		}
-	}
-	
-	/**
-	 * Notifies the launch manager that a launch configuration
-	 * has been changed. The configuration is removed from the
-	 * cache of info objects such that the new attributes will
-	 * be updated on the next access. Listeners are notified of
-	 * the change.
-	 * 
-	 * @param config the launch configuration that was changed
-	 */
-	protected void launchConfigurationChanged(ILaunchConfiguration config) {
-		synchronized(this) {
-			fLaunchConfigurations.remove(config);
-		}
-		clearConfigNameCache();
-		if (isValid(config)) {
-			// in case the config has been refreshed and it was removed from the
-			// index due to 'out of synch with local file system' (see bug 36147),
-			// add it back (will only add if required)
-			launchConfigurationAdded(config);
-			getConfigurationNotifier().notify(config, CHANGED);
-		} else {
-			launchConfigurationDeleted(config);
-		}								
-	}
-	
-	/**
-	 * Notifies the launch manager that a launch configuration
-	 * has been deleted. The configuration is removed from the
-	 * cache of info and from the index of configurations by
-	 * project, and listeners are notified.
-	 * 
-	 * @param config the launch configuration that was deleted
-	 */
-	protected void launchConfigurationDeleted(ILaunchConfiguration config) {
-		synchronized (this) {
-			fLaunchConfigurations.remove(config);
-			getAllLaunchConfigurations().remove(config);			
-		}
-		getConfigurationNotifier().notify(config, REMOVED);
-		clearConfigNameCache();			
-	}
-	
-	/**
-	 * @see ILaunchManager#newSourceLocator(String)
-	 */
-	public IPersistableSourceLocator newSourceLocator(String identifier) throws CoreException {
-		initializeSourceLocators();
-		IConfigurationElement config = (IConfigurationElement)fSourceLocators.get(identifier);
-		if (config == null) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugException.INTERNAL_ERROR,
-				MessageFormat.format(DebugCoreMessages.LaunchManager_Source_locator_does_not_exist___0__13, new String[] {identifier} ), null)); 
-		} 
-		IPersistableSourceLocator sourceLocator = (IPersistableSourceLocator)config.createExecutableExtension("class"); //$NON-NLS-1$
-		if (sourceLocator instanceof AbstractSourceLookupDirector) {
-			((AbstractSourceLookupDirector)sourceLocator).setId(identifier);
-		}
-		return sourceLocator;
-	}
-	
-	/**
-	 * The specified project has just closed - remove its
-	 * launch configurations from the cached index.
-	 * 
-	 * @param project the project that has been closed
-	 * @exception CoreException if writing the index fails
-	 */
-	protected void projectClosed(IProject project) {
-		List configs = getLaunchConfigurations(project);
-		if (!configs.isEmpty()) {
-			Iterator iterator = configs.iterator();
-			while (iterator.hasNext()) {
-				launchConfigurationDeleted((ILaunchConfiguration)iterator.next());
-			}
-		}
-		//bug 12134
-		terminateMappedConfigurations(project);
-	}
-	
-	/**
-	 * The specified project has just opened - add all launch
-	 * configs in the project to the index of all configs.
-	 * 
-	 * @param project the project that has been opened
-	 * @exception CoreException if reading the index fails
-	 */
-	protected void projectOpened(IProject project) {
-		List configs = findLaunchConfigurations(project);
-		if (!configs.isEmpty()) {
-			Iterator iterator = configs.iterator();
-			while (iterator.hasNext()) {
-				launchConfigurationAdded((ILaunchConfiguration) iterator.next());
-			}			
-		}
-	}
-	
-	/**
-	 * @see ILaunchManager#removeLaunch(ILaunch)
-	 */
-	public void removeLaunch(final ILaunch launch) {
-		if (internalRemoveLaunch(launch)) {
-			fireUpdate(launch, REMOVED);
-			fireUpdate(new ILaunch[] {launch}, REMOVED);
-		}
-	}
-	
-	/**
-	 * @see ILaunchManager#removeLaunchConfigurationListener(ILaunchConfigurationListener)
-	 */
-	public void removeLaunchConfigurationListener(ILaunchConfigurationListener listener) {
-		fLaunchConfigurationListeners.remove(listener);
-	}
-	
-	/** 
-	 * @see org.eclipse.debug.core.ILaunchManager#removeLaunches(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void removeLaunches(ILaunch[] launches) {
-		List removed = new ArrayList(launches.length);
-		for (int i = 0; i < launches.length; i++) {
-			if (internalRemoveLaunch(launches[i])) {
-				removed.add(launches[i]);
-			}
-		}
-		if (!removed.isEmpty()) {
-			ILaunch[] removedLaunches = (ILaunch[])removed.toArray(new ILaunch[removed.size()]);
-			fireUpdate(removedLaunches, REMOVED);
-			for (int i = 0; i < removedLaunches.length; i++) {
-				fireUpdate(removedLaunches[i], REMOVED);
-			}
-		}
-	}	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchManager#removeLaunchListener(org.eclipse.debug.core.ILaunchesListener)
-	 */
-	public void removeLaunchListener(ILaunchesListener listener) {
-		fLaunchesListeners.remove(listener);
-	}
-	
-	/**
-	 * @see ILaunchManager#removeLaunchListener(ILaunchListener)
-	 */
-	public void removeLaunchListener(ILaunchListener listener) {
-		fListeners.remove(listener);
-	}
-	
-	/**
-	 * Traverses the delta looking for added/removed/changed launch
-	 * configuration files.
-	 * 
-	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		if (delta == null) {
-		    // pre-delete
-		    LaunchManagerVisitor visitor = getDeltaVisitor();
-		    IResource resource = event.getResource();
-		    if (resource instanceof IProject) {
-                IProject project = (IProject) resource;
-                visitor.preDelete(project);
-            }
-		} else {
-		    LaunchManagerVisitor visitor = getDeltaVisitor();
-		    MappedResourceVisitor v = null;
-		    if (isDeleteConfigurations()) {
-		    	v = getMappedResourceVisitor();
-		    }
-		    try {
-		    	delta.accept(visitor);
-		    	if (v != null) {
-		    		delta.accept(v);
-		    	}
-		    } catch (CoreException e) {
-		    	DebugPlugin.log(e.getStatus());
-		    }
-			visitor.reset();
-		}
-	}
-	
-	/**
-	 * Gets the launch configuration associated with the specified <code>IResource</code>.
-	 * This method relies on the resource mapping existing, if no such mapping 
-	 * exists the launch configuration is ignored.
-	 * 
-	 * @param resource the resource to collect launch configurations for
-	 * @return the list of associated launch configurations
-	 */
-	private ArrayList collectAssociatedLaunches(IResource resource) {
-		ArrayList list = new ArrayList();
-		try { 
-			ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
-			IResource[] resources = null;
-			for(int i = 0; i < configs.length; i++) {
-				if(configs[i].isLocal()) {
-					resources = configs[i].getMappedResources();
-					if(resources != null) {
-						for(int j = 0; j < resources.length; j++){
-							if(resource.equals(resources[j]) || 
-									resource.getFullPath().isPrefixOf(resources[j].getFullPath())) {
-								list.add(configs[i]);
-							}
-						}
-					}
-				}
-			}
-		} catch (CoreException e) {
-		    DebugPlugin.log(e);
-        }
-		return list;
-	}
-	
-	/**
-	 * Indicates the given launch configuration is being moved from the given
-	 * location to the new location.
-	 * 
-	 * @param from the location a launch configuration is being moved from, or
-	 * <code>null</code>
-	 * @param to the location a launch configuration is being moved to,
-	 * or <code>null</code>
-	 */
-	protected void setMovedFromTo(ILaunchConfiguration from, ILaunchConfiguration to) {
-		fFrom = from;
-		fTo = to;
-	}
-	/**
-	 * Terminates/Disconnects any active debug targets/processes.
-	 * Clears launch configuration types.
-	 */
-	public void shutdown() {
-		fListeners = new ListenerList();
-        fLaunchesListeners = new ListenerList();
-        fLaunchConfigurationListeners = new ListenerList();
-		ILaunch[] launches = getLaunches();
-		ILaunch launch = null;
-		for (int i= 0; i < launches.length; i++) {
-			launch = launches[i];
-			try {
-                if (launch instanceof IDisconnect) {
-                    IDisconnect disconnect = (IDisconnect)launch;
-                    if (disconnect.canDisconnect()) {
-                        disconnect.disconnect();
-                    }
-                }
-                if (launch.canTerminate()) {
-                    launch.terminate();
-                }
-			} catch (DebugException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		
-		persistPreferredLaunchDelegates();
-		clearAllLaunchConfigurations();
-		fStepFilterManager = null;
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-	}
-
-	/**
-	 * Saves the listings of preferred launch delegates from all of the launch configuration types
-	 * 
-	 * @since 3.3
-	 */
-	private void persistPreferredLaunchDelegates() {
-		Preferences prefs = DebugPlugin.getDefault().getPluginPreferences();
-		try {
-			Document doc = DebugPlugin.newDocument();
-			Element root = doc.createElement(IConfigurationElementConstants.PREFERRED_DELEGATES);
-			doc.appendChild(root);
-			ILaunchConfigurationType[] types = getLaunchConfigurationTypes();
-			Map preferred = null;
-			Element child = null;
-			ILaunchDelegate delegate = null;
-			Set modes = null;
-			String modestr = EMPTY_STRING;
-			for(int i = 0; i < types.length; i++) {
-				preferred = ((LaunchConfigurationType)types[i]).getPreferredDelegates();
-				if(preferred != null && preferred.size() > 0) {
-					for(Iterator iter = preferred.keySet().iterator(); iter.hasNext();) {
-						modes = (Set) iter.next();
-						delegate = (ILaunchDelegate) preferred.get(modes);
-						if(delegate != null) {
-							child = doc.createElement(IConfigurationElementConstants.DELEGATE);
-							child.setAttribute(IConfigurationElementConstants.ID, delegate.getId());
-							child.setAttribute(IConfigurationElementConstants.TYPE_ID, types[i].getIdentifier());
-							for(Iterator iter2 = modes.iterator(); iter2.hasNext();) {
-								modestr += iter2.next();
-								if(iter2.hasNext()) {
-									modestr += ","; //$NON-NLS-1$
-								}
-							}
-							child.setAttribute(IConfigurationElementConstants.MODES, modestr);
-							modestr = EMPTY_STRING;
-							root.appendChild(child);
-						}
-					}
-				}
-			}
-			String pref = null;
-			if(root.hasChildNodes()) {
-				pref = serializeDocument(doc);
-			}
-			if(pref != null) {
-				prefs.setValue(PREF_PREFERRED_DELEGATES, pref);
-			}
-		} 
-		catch (CoreException e) {DebugPlugin.log(e);}
-		catch (IOException ioe) {DebugPlugin.log(ioe);}
-		catch (TransformerException te) {DebugPlugin.log(te);}
-	}
-	
-	/**
-	 * finds and terminates any running launch configurations associated with the given resource
-	 * @param resource the resource to search for launch configurations and hence launches for
-	 * @since 3.2
-	 */
-	protected void terminateMappedConfigurations(IResource resource) {
-		ILaunch[] launches = getLaunches();
-		ILaunchConfiguration[] configs = getMappedConfigurations(resource);
-		try {
-			for(int i = 0; i < launches.length; i++) {
-				for(int j = 0; j < configs.length; j++) {
-					if(configs[j].equals(launches[i].getLaunchConfiguration()) & launches[i].canTerminate()) {
-						launches[i].terminate();
-					}
-				}
-			}
-		}
-		catch(CoreException e) {DebugPlugin.log(e);}
-	}
-	
-	/**
-	 * Throws a debug exception with the given throwable that occurred
-	 * while processing the given configuration.
-	 */
-	private void throwException(ILaunchConfiguration config, Throwable e) throws DebugException {
-		IPath path = config.getLocation();
-		throw createDebugException(MessageFormat.format(DebugCoreMessages.LaunchManager__0__occurred_while_reading_launch_configuration_file__1___1, new String[]{e.toString(), path.toOSString()}), e); 
-	}
-
-	/**
-	 * Verify basic integrity of launch configurations in the given list,
-	 * adding valid configurations to the collection of all launch configurations.
-	 * Exceptions are logged for invalid configurations.
-	 * 
-	 * @param verify the list of configurations to verify
-	 * @param valid the list to place valid configurations in
-	 */
-	protected void verifyConfigurations(List verify, List valid) {
-		Iterator configs = verify.iterator();
-		ILaunchConfiguration config = null;
-		while (configs.hasNext()) {
-			config = (ILaunchConfiguration)configs.next();
-			if (isValid(config)) {
-				valid.add(config);
-			}
-		}		
-	}
-	
-	/**
-	 * Returns the name of the given launch mode with accelerators removed,
-	 * or <code>null</code> if none.
-	 * 
-	 * @param id launch mode identifier
-	 * @return launch mode name with accelerators removed or <code>null</code>
-	 */
-	public String getLaunchModeName(String id) {
-		ILaunchMode launchMode = getLaunchMode(id);
-		if (launchMode != null) {
-			return removeAccelerators(launchMode.getLabel());
-		}
-		return null;
-	}
-	/**
-	 * Returns the label with any accelerators removed.
-	 * 
-	 * @param label label to process
-	 * @return label without accelerators
-	 */
-    public static String removeAccelerators(String label) {
-        String title = label;
-        if (title != null) {
-            // strip out any '&' (accelerators)
-            int index = title.indexOf('&');
-            if (index == 0) {
-                title = title.substring(1);
-            } else if (index > 0) {
-                //DBCS languages use "(&X)" format
-                if (title.charAt(index - 1) == '(' && title.length() >= index + 3 && title.charAt(index + 2) == ')') {
-                    String first = title.substring(0, index - 1);
-                    String last = title.substring(index + 3);
-                    title = first + last;
-                } else if (index < (title.length() - 1)) {
-                    String first = title.substring(0, index);
-                    String last = title.substring(index + 1);
-                    title = first + last;
-                }
-            }
-        }
-        return title;
-    }	
-    
-	/**
-	 * Returns the singleton step filter manager.
-	 * 
-	 * @return the step filter manager
-	 */
-	public synchronized StepFilterManager getStepFilterManager() {
-		if (fStepFilterManager == null) {
-			fStepFilterManager = new StepFilterManager();
-		}
-		return fStepFilterManager;
-	}    
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchMode.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchMode.java
deleted file mode 100644
index b6c282f..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchMode.java
+++ /dev/null
@@ -1,95 +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.debug.internal.core;
-
-import com.ibm.icu.text.MessageFormat;
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchMode;
-
-/**
- * Proxy to a launch mode extension.
- * 
- * @see IConfigurationElementConstants
- */
-public class LaunchMode implements ILaunchMode {
-
-	private IConfigurationElement fConfigurationElement;
-	
-	/**
-	 * Constructs a new launch mode.
-	 * 
-	 * @param element configuration element
-	 * @exception CoreException if required attributes are missing
-	 */
-	public LaunchMode(IConfigurationElement element) throws CoreException {
-		fConfigurationElement = element;
-		verifyAttributes();
-	}
-
-	/**
-	 * Verifies required attributes.
-	 * 
-	 * @exception CoreException if required attributes are missing
-	 */
-	private void verifyAttributes() throws CoreException {
-		verifyAttributeExists(IConfigurationElementConstants.MODE);
-		verifyAttributeExists(IConfigurationElementConstants.LABEL);
-	}
-	
-	/**
-	 * Verifies the given attribute exists
-	 * 
-	 * @exception CoreException if attribute does not exist
-	 */
-	private void verifyAttributeExists(String name) throws CoreException {
-		if (fConfigurationElement.getAttribute(name) == null) {
-			missingAttribute(name);
-		}
-	}
-
-	/**
-	 * This method is used to create a new internal error describing that the specified attribute
-	 * is missing 
-	 * @param attrName the name of the attribute that is missing
-	 * @throws CoreException
-	 */
-	private void missingAttribute(String attrName) throws CoreException {
-		throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, MessageFormat.format(DebugCoreMessages.LaunchMode_1,new String[]{attrName}), null));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchMode#getIdentifier()
-	 */
-	public String getIdentifier() {
-		return fConfigurationElement.getAttribute(IConfigurationElementConstants.MODE);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchMode#getLabel()
-	 */
-	public String getLabel() {
-		return fConfigurationElement.getAttribute(IConfigurationElementConstants.LABEL);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchMode#getLaunchAsLabel()
-	 */
-	public String getLaunchAsLabel() {
-		String label = fConfigurationElement.getAttribute(IConfigurationElementConstants.LAUNCH_AS_LABEL);
-		if (label == null) {
-			return MessageFormat.format(DebugCoreMessages.LaunchMode_0, new String[]{getLabel()});
-		}
-		return label;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureManager.java
deleted file mode 100644
index 6f3fd03..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureManager.java
+++ /dev/null
@@ -1,282 +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.debug.internal.core;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILogicalStructureType;
-import org.eclipse.debug.core.model.IValue;
-
-/**
- * Manages logical structure extensions
- * 
- * @since 3.0
- */
-public class LogicalStructureManager {
-
-	private static LogicalStructureManager fgDefault;
-	private List fTypes = null;
-	private List fTypeProviders;
-
-    /**
-     * Map containing the user's selection for each combination of logical
-     * structure types.
-     * key: String - Comma-separated list of ints representing a combination of structure types.
-     *               These integers are indeces into the fStructureTypeIds array.
-     * value: Integer - One of the ints from the combo key (the one chosen by the user) or -1 if
-     *                  the user has chosen not to display any structures for this combination
-     */
-    private Map fStructureTypeSelections= null;
-    /**
-     * List of known type identifiers. An identifier's index in this list is used as
-     * its ID number. This list is maintained as a space-saving measure so that the various
-     * combinations of structure types can be persisted using indeces instead of storing the
-     * full index strings.
-     */
-    private List fStructureTypeIds= null;
-    
-    /**
-     * Preference key used for storing the user's selected structure for each combination
-     * or structures. The preference value is stored in the form:
-     * int,int,...,int|int,int,...int|...
-     * Where int is an integer index of a structure in the array of known structures.
-     */
-    public static final String PREF_STRUCTURE_SELECTIONS= "selectedStructures"; //$NON-NLS-1$
-    /**
-     * Preference key used for storing the array of known structures. The preference
-     * value is in the form:
-     * string,string,string,...,string,
-     * Where string is an identifier of a logical structure.
-     */
-    public static final String PREF_STRUCTURE_IDS= "allStructures"; //$NON-NLS-1$
-	
-	public static LogicalStructureManager getDefault() {
-		if (fgDefault == null) {
-			fgDefault = new LogicalStructureManager();
-		}
-		return fgDefault;
-	}
-	
-    /**
-     * Returns the logical structure types that are applicable to the given value.
-     * @param value the value
-     * @return the logical structure types that are applicable to the given value
-     */
-	public ILogicalStructureType[] getLogicalStructureTypes(IValue value) {
-		initialize();
-		// looks in the logical structure types
-		Iterator iterator = fTypes.iterator();
-		List select = new ArrayList();
-		while (iterator.hasNext()) {
-			ILogicalStructureType type = (ILogicalStructureType)iterator.next();
-			if (type.providesLogicalStructure(value)) {
-				select.add(type);
-			}
-		}
-		// asks the logical structure providers
-		for (Iterator iter= fTypeProviders.iterator(); iter.hasNext();) {
-			ILogicalStructureType[] logicalStructures= ((LogicalStructureProvider) iter.next()).getLogicalStructures(value);
-			for (int i= 0; i < logicalStructures.length; i++) {
-				select.add(logicalStructures[i]);
-			}
-		}
-		return (ILogicalStructureType[]) select.toArray(new ILogicalStructureType[select.size()]);
-	}
-    
-    /**
-     * Loads the map of structure selections from the preference store.
-     */
-    private void loadStructureTypeSelections() {
-        fStructureTypeSelections= new HashMap();
-        String selections= DebugPlugin.getDefault().getPluginPreferences().getString(PREF_STRUCTURE_SELECTIONS);
-    	// selections are stored in the form:
-    	// selection|selection|...selection|
-        StringTokenizer tokenizer= new StringTokenizer(selections, "|"); //$NON-NLS-1$
-        while (tokenizer.hasMoreTokens()) {
-            String selection = tokenizer.nextToken();
-            // selection string is of the form:
-            // id,id,...,selectedid
-            int i = selection.lastIndexOf(',');
-            if (i > 0 && i < selection.length() - 1) {
-                String comboKey= selection.substring(0, i + 1);
-                String selected= selection.substring(i + 1, selection.length());
-                fStructureTypeSelections.put(comboKey, new Integer(Integer.parseInt(selected)));
-            }
-        }
-    }
-    
-    /**
-     * Stores the map of structure selections to the preference store
-     */
-    private void storeStructureTypeSelections() {
-        StringBuffer buffer= new StringBuffer();
-        Iterator iter = fStructureTypeSelections.entrySet().iterator();
-        while (iter.hasNext()) {
-            Map.Entry entry = (Entry) iter.next();
-            buffer.append(entry.getKey());
-            buffer.append(entry.getValue());
-            buffer.append('|');
-        }
-        DebugPlugin.getDefault().getPluginPreferences().setValue(PREF_STRUCTURE_SELECTIONS, buffer.toString());
-    }
-    
-    /**
-     * Loads the collection of known structures identifiers from the preference store
-     */
-    private void loadStructureTypeIds() {
-        fStructureTypeIds= new ArrayList();
-    	// Types are stored as a comma-separated, ordered list.
-        String types= DebugPlugin.getDefault().getPluginPreferences().getString(PREF_STRUCTURE_IDS);
-        StringTokenizer tokenizer= new StringTokenizer(types, ","); //$NON-NLS-1$
-        while (tokenizer.hasMoreTokens()) {
-            String id= tokenizer.nextToken();
-            if (id.length() > 0) {
-                fStructureTypeIds.add(id);
-            }
-        }
-    }
-    
-    /**
-     * Stores the collection of known structure identifiers to the preference store
-     */
-    private void storeStructureTypeIds() {
-        StringBuffer buffer= new StringBuffer();
-        Iterator iter = fStructureTypeIds.iterator();
-        while (iter.hasNext()) {
-            buffer.append(iter.next()).append(',');
-        }
-        DebugPlugin.getDefault().getPluginPreferences().setValue(PREF_STRUCTURE_IDS, buffer.toString());
-    }
-    
-    /**
-     * Returns the structure that the user has chosen from among the given
-     * collection of structures or <code>null</code> if the user has chosen
-     * to display none.
-     * @param structureTypes the collection of structures available
-     * @return the structure that the user has chosen from among the given collection
-     *  or <code>null</code> if the user has chosen to display none
-     */
-    public ILogicalStructureType getSelectedStructureType(ILogicalStructureType[] structureTypes) {
-        if (structureTypes.length == 0) {
-            return null;
-        }
-        String combo= getComboString(structureTypes);
-        // Lookup the combo
-        Integer index = (Integer) fStructureTypeSelections.get(combo);
-        if (index == null) {
-            // If the user hasn't explicitly chosen anything for this
-            // combo yet, just return the first type.
-            return structureTypes[0];
-        } else if (index.intValue() == -1) {
-            // An index of -1 means the user has deselected all structures for this combo
-            return null;
-        }
-        // If an index is stored for this combo, retrieve the id at the index
-        String id= (String) fStructureTypeIds.get(index.intValue());
-        for (int i = 0; i < structureTypes.length; i++) {
-            // Return the type with the retrieved id
-            ILogicalStructureType type = structureTypes[i];
-            if (type.getId().equals(id)) {
-                return type;
-            }
-        }
-        return structureTypes[0];
-    }
-    
-    /**
-     * 
-     * @param types
-     * @param selected the type that is selected for the given combo or <code>null</code>
-     *  if the user has deselected any structure for the given combo
-     */
-    public void setEnabledType(ILogicalStructureType[] types, ILogicalStructureType selected) {
-        String combo= getComboString(types);
-        int index= -1; // Initialize to "none selected"
-        if (selected != null) {
-            index= fStructureTypeIds.indexOf(selected.getId());
-        }
-        Integer integer= new Integer(index);
-        fStructureTypeSelections.put(combo, integer);
-        storeStructureTypeSelections();
-        storeStructureTypeIds();
-    }
-    
-    /**
-     * Returns the string representing the given combination of logical
-     * structure types. This string will be a series of comma-separated
-     * indeces representing the various types. If any of the given types
-     * don't have indeces associated with them, this method will create
-     * the appropriate index.
-     * @param types the logical structure types
-     * @return the string representing the given combination of logical
-     *  structure types
-     */
-    protected String getComboString(ILogicalStructureType[] types) {
-        StringBuffer comboKey= new StringBuffer();
-        for (int i = 0; i < types.length; i++) {
-            ILogicalStructureType type = types[i];
-            int typeIndex = fStructureTypeIds.indexOf(type.getId());
-            if (typeIndex == -1) {
-                typeIndex= fStructureTypeIds.size();
-                fStructureTypeIds.add(type.getId());
-            }
-            comboKey.append(typeIndex).append(',');
-        }
-        return comboKey.toString();
-    }
-	
-	private synchronized void initialize() {
-		if (fTypes == null) {
-			//get the logical structure types from the extension points
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LOGICAL_STRUCTURE_TYPES);
-			IConfigurationElement[] extensions = point.getConfigurationElements();
-			fTypes = new ArrayList(extensions.length);
-			for (int i = 0; i < extensions.length; i++) {
-				IConfigurationElement extension = extensions[i];
-				LogicalStructureType type;
-				try {
-					type = new LogicalStructureType(extension);
-					fTypes.add(type);
-				} catch (CoreException e) {
-					DebugPlugin.log(e);
-				}
-			}
-			// get the logical structure providers from the extension point
-			point= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_LOGICAL_STRUCTURE_PROVIDERS);
-			extensions= point.getConfigurationElements();
-			fTypeProviders= new ArrayList(extensions.length);
-			for (int i= 0; i < extensions.length; i++) {
-				try {
-					fTypeProviders.add(new LogicalStructureProvider(extensions[i]));
-				} catch (CoreException e) {
-					DebugPlugin.log(e);
-				}
-			}
-		}
-        if (fStructureTypeSelections == null) {
-            loadStructureTypeSelections();
-        }
-        if (fStructureTypeIds == null) {
-            loadStructureTypeIds();
-        }
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureProvider.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureProvider.java
deleted file mode 100644
index f7e86f2..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureProvider.java
+++ /dev/null
@@ -1,75 +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.debug.internal.core;
-
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILogicalStructureProvider;
-import org.eclipse.debug.core.ILogicalStructureType;
-import org.eclipse.debug.core.model.IValue;
-
-/**
- * Manage logical structure provider extensions
- * 
- * @see IConfigurationElementConstants
- */
-public class LogicalStructureProvider {
-
-	private IConfigurationElement fConfigurationElement;
-	
-	private String fModelIdentifier;
-
-	private ILogicalStructureProvider fDelegate;
-
-	public LogicalStructureProvider(IConfigurationElement element) throws CoreException {
-		fConfigurationElement= element;
-		fModelIdentifier= fConfigurationElement.getAttribute(IConfigurationElementConstants.MODEL_IDENTIFIER);
-		if (fModelIdentifier == null) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, DebugCoreMessages.LogicalStructureProvider_0, null));
-		}
-		String className= fConfigurationElement.getAttribute(IConfigurationElementConstants.CLASS);
-		if (className == null) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, DebugCoreMessages.LogicalStructureProvider_1, null));
-		}
-	}
-	
-	/**
-	 * Return the logical structure type able to provide a logical structure for
-	 * the given value.
-	 * 
-	 * @param value value for which structure types are requested
-	 * @return logical structure types
-	 */
-	public ILogicalStructureType[] getLogicalStructures(IValue value) {
-		if (fModelIdentifier.equals(value.getModelIdentifier())) {
-			return getDelegate().getLogicalStructureTypes(value);
-		}
-		return new ILogicalStructureType[0];
-	}
-
-	/**
-	 * Return the ILogicalStructureProvider for this extension.
-	 */
-	protected ILogicalStructureProvider getDelegate() {
-		if (fDelegate == null) {
-			try {
-				fDelegate = (ILogicalStructureProvider) fConfigurationElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			} catch (CoreException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		return fDelegate;
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureType.java
deleted file mode 100644
index 83c31ad..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LogicalStructureType.java
+++ /dev/null
@@ -1,150 +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.debug.internal.core;
-
-import com.ibm.icu.text.MessageFormat;
-
-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.debug.core.*;
-import org.eclipse.debug.core.model.*;
-
-/**
- * Proxy to a logical structure type extension.
- * 
- * @see IConfigurationElementConstants
- */
-public class LogicalStructureType implements ILogicalStructureType {
-
-	private IConfigurationElement fConfigurationElement;
-	private ILogicalStructureTypeDelegate fDelegate;
-	private String fModelId;
-	// whether the 'description' attribute has been verified to exist: it is only
-	// required when the delegate does *not* implement ILogicalStructureTypeDelegate2.
-	private boolean fVerifiedDescription = false; 
-	
-	/**
-	 * Constructs a new logical structure type, and verifies required attributes.
-	 * 
-	 * @param element configuration element
-	 * @exception CoreException if required attributes are missing
-	 */
-	public LogicalStructureType(IConfigurationElement element) throws CoreException {
-		fConfigurationElement = element;
-		verifyAttributes();
-	}
-
-	/**
-	 * Verifies required attributes.
-	 * 
-	 * @exception CoreException if required attributes are missing
-	 */
-	private void verifyAttributes() throws CoreException {
-		verifyAttributeExists(IConfigurationElementConstants.ID);
-		verifyAttributeExists(IConfigurationElementConstants.CLASS);
-		fModelId = fConfigurationElement.getAttribute(IConfigurationElementConstants.MODEL_IDENTIFIER); 
-		if (fModelId == null) {
-			missingAttribute(IConfigurationElementConstants.MODEL_IDENTIFIER);
-		}
-	}
-	
-	/**
-	 * Verifies the given attribute exists
-	 * 
-	 * @exception CoreException if attribute does not exist
-	 */
-	private void verifyAttributeExists(String name) throws CoreException {
-		if (fConfigurationElement.getAttribute(name) == null) {
-			missingAttribute(name);
-		}
-	}
-
-	/**
-	 * Throws a new <code>CoreException</code> about the specified attribute being missing
-	 * @param attrName the name of the missing attribute
-	 * @throws CoreException
-	 */
-	private void missingAttribute(String attrName) throws CoreException {
-		throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, MessageFormat.format(DebugCoreMessages.LogicalStructureType_1, new String[]{attrName}), null));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.ILogicalStructureType#getDescription()
-	 */
-	public String getDescription() {
-		return fConfigurationElement.getAttribute(IConfigurationElementConstants.DESCRIPTION);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.ILogicalStructureType#getId()
-	 */
-	public String getId() {
-		return fConfigurationElement.getAttribute(IConfigurationElementConstants.ID);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.ILogicalStructureType#getLogicalStructure(org.eclipse.debug.core.model.IValue)
-	 */
-	public IValue getLogicalStructure(IValue value) throws CoreException {
-		return getDelegate().getLogicalStructure(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.ILogicalStructureType#providesLogicalStructure(org.eclipse.debug.core.model.IValue)
-	 */
-	public boolean providesLogicalStructure(IValue value) {
-		if (value.getModelIdentifier().equals(fModelId)) {
-			return getDelegate().providesLogicalStructure(value);
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the <code>ILogicalStructuresTypeDelegate</code> delegate
-	 * @return the delegate
-	 */
-	protected ILogicalStructureTypeDelegate getDelegate() {
-		if (fDelegate == null) {
-			try {
-				fDelegate = (ILogicalStructureTypeDelegate) fConfigurationElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			} catch (CoreException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		return fDelegate;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILogicalStructureTypeDelegate2#getDescription(org.eclipse.debug.core.model.IValue)
-	 */
-	public String getDescription(IValue value) {
-		ILogicalStructureTypeDelegate delegate = getDelegate();
-		if (delegate instanceof ILogicalStructureTypeDelegate2) {
-			ILogicalStructureTypeDelegate2 d2 = (ILogicalStructureTypeDelegate2) delegate;
-			return d2.getDescription(value);
-		}
-		if (!fVerifiedDescription) {
-		    fVerifiedDescription = true;
-		    try {
-                verifyAttributeExists(IConfigurationElementConstants.DESCRIPTION);
-            } catch (CoreException e) {
-                DebugPlugin.log(e);
-            }
-		}
-		String description = getDescription();
-		if (description == null) {
-		    return DebugCoreMessages.LogicalStructureType_0; 
-		}
-		return description;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/MemoryBlockManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/MemoryBlockManager.java
deleted file mode 100644
index faa2802..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/MemoryBlockManager.java
+++ /dev/null
@@ -1,298 +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.debug.internal.core;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.IMemoryBlockManager;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-
-
-/**
- * Implementation of IMemoryBlockManager
- * The manager is responsible to manage all memory blocks in the workbench.
- * 
- * @since 3.1
- * 
- */
-public class MemoryBlockManager implements IMemoryBlockManager, IDebugEventSetListener {
-	
-	private ArrayList listeners = new ArrayList();			// list of all IMemoryBlockListener
-	private ArrayList memoryBlocks = new ArrayList();	// list of all memory blocks 
-	
-	private static final int ADDED = 0;
-	private static final int REMOVED = 1;
-	/**
-	 * Notifies a memory block listener in a safe runnable to
-	 * handle exceptions.
-	 */
-	class MemoryBlockNotifier implements ISafeRunnable {
-		
-		private IMemoryBlockListener fListener;
-		private int fType;
-		private IMemoryBlock[] fMemoryBlocks;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			DebugPlugin.log(exception);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.memoryBlocksAdded(fMemoryBlocks);
-					break;
-				case REMOVED:
-					fListener.memoryBlocksRemoved(fMemoryBlocks);
-					break;
-			}			
-		}
-
-		/**
-		 * Notify listeners of added/removed memory block events
-		 * 
-		 * @param memBlocks blocks that have changed
-		 * @param update type of change
-		 */
-		public void notify(IMemoryBlock[] memBlocks, int update) {
-			if (listeners != null) {
-				fType = update;
-				Object[] copiedListeners= listeners.toArray(new IMemoryBlockListener[listeners.size()]);
-				for (int i= 0; i < copiedListeners.length; i++) {
-					fListener = (IMemoryBlockListener)copiedListeners[i];
-					fMemoryBlocks = memBlocks;
-                    SafeRunner.run(this);
-				}			
-			}
-			fListener = null;
-			fMemoryBlocks = null;
-		}
-	}
-	
-	/**
-	 * Returns the <code>MemoryBlockNotifier</code>
-	 * @return the <code>MemoryBlockNotifier</code>
-	 * 
-	 * TODO consider using only one of these, and sync where needed, 
-	 * this way we are not creating a new every single time.
-	 */
-	private MemoryBlockNotifier getMemoryBlockNotifier() {
-		return new MemoryBlockNotifier();
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockManager#addMemoryBlock(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void addMemoryBlocks(IMemoryBlock[] mem) {
-		if (memoryBlocks == null) {
-			return;
-		}
-		if (mem == null) {
-			DebugPlugin.logMessage("Null argument passed into IMemoryBlockManager.addMemoryBlock", null); //$NON-NLS-1$
-			return;			
-		}
-		
-		if(mem.length > 0) {
-			ArrayList newMemoryBlocks = new ArrayList();
-			for (int i=0; i<mem.length; i++) {
-				// do not allow duplicates
-				if (!memoryBlocks.contains(mem[i])) {
-					newMemoryBlocks.add(mem[i]);
-					memoryBlocks.add(mem[i]);
-					// add listener for the first memory block added
-					if (memoryBlocks.size() == 1) {
-						DebugPlugin.getDefault().addDebugEventListener(this);
-					}
-				}
-			}
-			notifyListeners((IMemoryBlock[])newMemoryBlocks.toArray(new IMemoryBlock[newMemoryBlocks.size()]), ADDED);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockManager#removeMemoryBlock(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void removeMemoryBlocks(IMemoryBlock[] memBlocks) {
-		if (memoryBlocks == null) {
-			return;
-		}
-		if (memBlocks == null){
-			DebugPlugin.logMessage("Null argument passed into IMemoryBlockManager.removeMemoryBlock", null); //$NON-NLS-1$
-			return;			
-		}		
-		
-		if(memBlocks.length > 0) {
-			for (int i=0; i<memBlocks.length; i++) {
-				memoryBlocks.remove(memBlocks[i]);
-				// remove listener after the last memory block has been removed
-				if (memoryBlocks.size() == 0) {
-					DebugPlugin.getDefault().removeDebugEventListener(this);
-				}
-				if (memBlocks[i] instanceof IMemoryBlockExtension) { 
-					try {
-						((IMemoryBlockExtension)memBlocks[i]).dispose();
-					} catch (DebugException e) {
-						DebugPlugin.log(e);
-					}
-				}
-			}
-			notifyListeners(memBlocks, REMOVED);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockManager#addListener(org.eclipse.debug.ui.IMemoryBlockListener)
-	 */
-	public void addListener(IMemoryBlockListener listener) {
-		
-		if(listeners == null) {
-			return;
-		}
-		if(listener == null) {
-			DebugPlugin.logMessage("Null argument passed into IMemoryBlockManager.addListener", null); //$NON-NLS-1$
-			return;
-		}
-		if (!listeners.contains(listener)) {
-			listeners.add(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockManager#removeListener(org.eclipse.debug.ui.IMemoryBlockListener)
-	 */
-	public void removeListener(IMemoryBlockListener listener) {
-		
-		if(listeners == null) {
-			return;
-		}
-		if(listener == null) {
-			DebugPlugin.logMessage("Null argument passed into IMemoryBlockManager.removeListener", null); //$NON-NLS-1$
-			return;
-		}
-		if (listeners.contains(listener)) {
-			listeners.remove(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IMemoryBlockManager#getMemoryBlocks()
-	 */
-	public IMemoryBlock[] getMemoryBlocks() {
-		return (IMemoryBlock[])memoryBlocks.toArray(new IMemoryBlock[memoryBlocks.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockManager#getMemoryBlocks(org.eclipse.debug.core.model.IDebugTarget)
-	 */
-	public IMemoryBlock[] getMemoryBlocks(IDebugTarget debugTarget) {
-		IMemoryBlock[] blocks = (IMemoryBlock[])memoryBlocks.toArray(new IMemoryBlock[memoryBlocks.size()]);
-		ArrayList memoryBlocksList = new ArrayList();
-		for (int i=0; i<blocks.length; i++) {
-			if (blocks[i].getDebugTarget() == debugTarget) {
-				memoryBlocksList.add(blocks[i]);
-			}
-		}
-		return (IMemoryBlock[])memoryBlocksList.toArray(new IMemoryBlock[memoryBlocksList.size()]);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockManager#getMemoryBlocks(org.eclipse.debug.core.model.IMemoryBlockRetrieval)
-	 */
-	public IMemoryBlock[] getMemoryBlocks(IMemoryBlockRetrieval retrieve) {
-		IMemoryBlock[] blocks = (IMemoryBlock[])memoryBlocks.toArray(new IMemoryBlock[memoryBlocks.size()]);
-		ArrayList memoryBlocksList = new ArrayList(blocks.length);
-		for (int i=0; i<blocks.length; i++)	{
-			if (blocks[i] instanceof IMemoryBlockExtension)	{	
-				if (((IMemoryBlockExtension)blocks[i]).getMemoryBlockRetrieval() == retrieve) {	
-					memoryBlocksList.add(blocks[i]);
-				}
-			}
-			else {	
-				// standard memory block always uses the debug target as the memory block retrieval
-				if (blocks[i].getDebugTarget() == retrieve) {
-					memoryBlocksList.add(blocks[i]);
-				}
-			}
-		}
-		return (IMemoryBlock[])memoryBlocksList.toArray(new IMemoryBlock[memoryBlocksList.size()]);
-	}
-	
-	/**
-	 * Notifies the listeners about the given memory blocks and the event to be sent
-	 * @param memBlocks
-	 * @param event
-	 */
-	private void notifyListeners(IMemoryBlock[] memBlocks, int event) {
-		getMemoryBlockNotifier().notify(memBlocks, event);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i=0; i < events.length; i++) {
-			handleDebugEvent(events[i]);
-		}
-	}
-	
-	/**
-	 * Handles a debug event
-	 * @param event
-	 */
-	public void handleDebugEvent(DebugEvent event) {
-		Object obj = event.getSource();
-		IDebugTarget dt = null;
-		
-		if (event.getKind() == DebugEvent.TERMINATE) {
-			// a terminate event could happen from an IThread or IDebugTarget
-			// only handle a debug event from the debug target
-			if (obj instanceof IDebugTarget) {
-				dt = ((IDebugTarget)obj);
-				
-				// getMemoryBlocks will return an empty array if it is null
-				IMemoryBlock[] deletedMemoryBlocks = getMemoryBlocks(dt);
-				removeMemoryBlocks(deletedMemoryBlocks);
-			}
-		}
-	}
-	
-	/**
-	 * Clean up when the plugin is shut down
-	 */
-	public void shutdown() {
-		if (listeners != null) {
-			listeners.clear();
-			listeners = null;
-		}
-		
-		if (memoryBlocks != null) {
-			memoryBlocks.clear();
-			memoryBlocks = null;
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java
deleted file mode 100644
index 5d0dab3..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java
+++ /dev/null
@@ -1,99 +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.debug.internal.core;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.debug.core.model.IStreamsProxy2;
-
-public class NullStreamsProxy implements IStreamsProxy2 {
-    private NullStreamMonitor outputStreamMonitor;
-    private NullStreamMonitor errorStreamMonitor;
-    
-    public NullStreamsProxy(Process process) {
-        outputStreamMonitor = new NullStreamMonitor(process.getInputStream());
-        errorStreamMonitor = new NullStreamMonitor(process.getErrorStream());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.model.IStreamsProxy2#closeInputStream()
-     */
-    public void closeInputStream() throws IOException {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.model.IStreamsProxy#getErrorStreamMonitor()
-     */
-    public IStreamMonitor getErrorStreamMonitor() {
-        return errorStreamMonitor;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.model.IStreamsProxy#getOutputStreamMonitor()
-     */
-    public IStreamMonitor getOutputStreamMonitor() {
-        return outputStreamMonitor;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.model.IStreamsProxy#write(java.lang.String)
-     */
-    public void write(String input) throws IOException {
-    }
-
-    private class NullStreamMonitor implements IStreamMonitor {
-        private InputStream fStream;
-
-        public NullStreamMonitor(InputStream stream) {
-            fStream = stream;
-            startReaderThread();
-        }
-
-        private void startReaderThread() {
-            Thread thread = new Thread(new Runnable() {
-                public void run() {
-                    byte[] bytes = new byte[1024];
-                    try {
-                        while(fStream.read(bytes) >= 0) {
-                            //do nothing
-                        }
-                    } catch (IOException e) {
-                    }
-                }
-            }, DebugCoreMessages.NullStreamsProxy_0); 
-            thread.setDaemon(true);
-            thread.start();
-            
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IStreamMonitor#addListener(org.eclipse.debug.core.IStreamListener)
-         */
-        public void addListener(IStreamListener listener) {    
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IStreamMonitor#getContents()
-         */
-        public String getContents() {
-            return ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IStreamMonitor#removeListener(org.eclipse.debug.core.IStreamListener)
-         */
-        public void removeListener(IStreamListener listener) {
-        }
-    }
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
deleted file mode 100644
index c5fa6da..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core;
-
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IFlushableStreamMonitor;
-
-/**
- * Monitors the output stream of a system process and notifies 
- * listeners of additions to the stream.
- * 
- * The output stream monitor reads system out (or err) via
- * and input stream.
- */
-public class OutputStreamMonitor implements IFlushableStreamMonitor {
-	/**
-	 * The stream being monitored (connected system out or err).
-	 */
-	private InputStream fStream;
-
-	/**
-	 * A collection of listeners
-	 */
-	private ListenerList fListeners= new ListenerList();
-	
-	/**
-	 * Whether content is being buffered
-	 */
-	private boolean fBuffered = true;
-
-	/**
-	 * The local copy of the stream contents
-	 */
-	private StringBuffer fContents;
-
-	/**
-	 * The thread which reads from the stream
-	 */
-	private Thread fThread;
-
-	/**
-	 * The size of the read buffer
-	 */
-	private static final int BUFFER_SIZE= 8192;
-
-	/**
-	 * Whether or not this monitor has been killed.
-	 * When the monitor is killed, it stops reading
-	 * from the stream immediately.
-	 */
-	private boolean fKilled= false;
-	
-    private long lastSleep;
-
-	private String fEncoding;
-    
-	/**
-	 * Creates an output stream monitor on the
-	 * given stream (connected to system out or err).
-	 * 
-	 * @param stream input stream to read from
-	 * @param encoding stream encoding or <code>null</code> for system default
-	 */
-	public OutputStreamMonitor(InputStream stream, String encoding) {
-        fStream = new BufferedInputStream(stream, 8192);
-        fEncoding = encoding;
-		fContents= new StringBuffer();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IStreamMonitor#addListener(org.eclipse.debug.core.IStreamListener)
-	 */
-	public synchronized void addListener(IStreamListener listener) {
-		fListeners.add(listener);
-	}
-
-	/**
-	 * Causes the monitor to close all
-	 * communications between it and the
-	 * underlying stream by waiting for the thread to terminate.
-	 */
-	protected void close() {
-		if (fThread != null) {
-			Thread thread= fThread;
-			fThread= null;
-			try {
-				thread.join();
-			} catch (InterruptedException ie) {
-			}
-			fListeners = new ListenerList();
-		}
-	}
-
-	/**
-	 * Notifies the listeners that text has
-	 * been appended to the stream.
-	 */
-	private void fireStreamAppended(String text) {
-		getNotifier().notifyAppend(text);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IStreamMonitor#getContents()
-	 */
-	public synchronized String getContents() {
-		return fContents.toString();
-	}
-
-	/**
-	 * Continually reads from the stream.
-	 * <p>
-	 * This method, along with the <code>startReading</code>
-	 * method is used to allow <code>OutputStreamMonitor</code>
-	 * to implement <code>Runnable</code> without publicly
-	 * exposing a <code>run</code> method.
-	 */
-	private void read() {
-        lastSleep = System.currentTimeMillis();
-        long currentTime = lastSleep;
-		byte[] bytes= new byte[BUFFER_SIZE];
-		int read = 0;
-		while (read >= 0) {
-			try {
-				if (fKilled) {
-					break;
-				}
-				read= fStream.read(bytes);
-				if (read > 0) {
-					String text;
-					if (fEncoding != null) {
-						text = new String(bytes, 0, read, fEncoding);
-					} else {
-						text = new String(bytes, 0, read);
-					}
-					synchronized (this) {
-						if (isBuffered()) {
-							fContents.append(text);
-						}
-						fireStreamAppended(text);
-					}
-				}
-			} catch (IOException ioe) {
-				if (!fKilled) {
-					DebugPlugin.log(ioe);
-				}
-				return;
-			} catch (NullPointerException e) {
-				// killing the stream monitor while reading can cause an NPE
-				// when reading from the stream
-				if (!fKilled && fThread != null) {
-					DebugPlugin.log(e);
-				}
-				return;
-			}
-            
-            currentTime = System.currentTimeMillis();
-            if (currentTime - lastSleep > 1000) {
-                lastSleep = currentTime;
-                try {
-                    Thread.sleep(1); // just give up CPU to maintain UI responsiveness.
-                } catch (InterruptedException e) {
-                } 
-            }
-		}
-		try {
-			fStream.close();
-		} catch (IOException e) {
-			DebugPlugin.log(e);
-		}
-	}
-	
-	protected void kill() {
-		fKilled= true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IStreamMonitor#removeListener(org.eclipse.debug.core.IStreamListener)
-	 */
-	public synchronized void removeListener(IStreamListener listener) {
-		fListeners.remove(listener);
-	}
-
-	/**
-	 * Starts a thread which reads from the stream
-	 */
-	protected void startMonitoring() {
-		if (fThread == null) {
-			fThread= new Thread(new Runnable() {
-				public void run() {
-					read();
-				}
-			}, DebugCoreMessages.OutputStreamMonitor_label); 
-            fThread.setDaemon(true);
-            fThread.setPriority(Thread.MIN_PRIORITY);
-			fThread.start();
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.model.IFlushableStreamMonitor#setBuffered(boolean)
-	 */
-	public synchronized void setBuffered(boolean buffer) {
-		fBuffered = buffer;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IFlushableStreamMonitor#flushContents()
-	 */
-	public synchronized void flushContents() {
-		fContents.setLength(0);
-	}
-	
-	/**
-	 * @see IFlushableStreamMonitor#isBuffered()
-	 */
-	public synchronized boolean isBuffered() {
-		return fBuffered;
-	}
-
-	private ContentNotifier getNotifier() {
-		return new ContentNotifier();
-	}
-	
-	class ContentNotifier implements ISafeRunnable {
-		
-		private IStreamListener fListener;
-		private String fText;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			DebugPlugin.log(exception);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			fListener.streamAppended(fText, OutputStreamMonitor.this);
-		}
-
-		public void notifyAppend(String text) {
-			if (text == null)
-				return;
-			fText = text;
-			Object[] copiedListeners= fListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IStreamListener) copiedListeners[i];
-                SafeRunner.run(this);
-			}
-			fListener = null;
-			fText = null;		
-		}
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StepFilterManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StepFilterManager.java
deleted file mode 100644
index 7723837..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StepFilterManager.java
+++ /dev/null
@@ -1,87 +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.debug.internal.core;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.commands.IStepFiltersHandler;
-import org.eclipse.debug.internal.core.commands.DebugCommandRequest;
-
-/**
- * As targets are launched, this manager sets its step filter
- * support settings according to the "use step filter" setting.
- * 
- * @since 3.0
- */
-public class StepFilterManager implements ILaunchListener {
-	
-	public static final String PREF_USE_STEP_FILTERS = DebugPlugin.getUniqueIdentifier() + ".USE_STEP_FILTERS"; //$NON-NLS-1$
-	
-	/**
-	 * The step filter manager is instantiated by the debug UI plug-in,
-	 * and should be accessed from the <code>DebugUIPlugin</code> class.
-	 */
-	protected StepFilterManager() {
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-	}
-	
-	/**
-	 * This method is called by the debug UI plug-in at shutdown.
-	 */
-	public void shutdown() {
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		launchChanged(launch);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {
-		IStepFiltersHandler command = (IStepFiltersHandler)launch.getAdapter(IStepFiltersHandler.class);
-		if (command != null) {
-			command.execute(new DebugCommandRequest(new Object[]{launch}));
-		}
-	}
-	
-	/**
-	 * Returns whether the 'use step filters' preference is on.
-	 * 
-	 * @return whether to use step filters
-	 */
-	public boolean isUseStepFilters() {
-		return DebugPlugin.getDefault().getPluginPreferences().getBoolean(PREF_USE_STEP_FILTERS);
-	}
-	
-	/**
-	 * Sets whether to use step filters.
-	 * 
-	 * @param useFilters whether to use step filters
-	 */
-	public void setUseStepFilters(boolean useFilters) {
-		DebugPlugin.getDefault().getPluginPreferences().setValue(PREF_USE_STEP_FILTERS, useFilters);
-		ILaunch[] launchs = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-		for (int i = 0; i < launchs.length; i++) {
-			ILaunch launch = launchs[i];
-			launchChanged(launch);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
deleted file mode 100644
index 8820f68..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
+++ /dev/null
@@ -1,127 +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.debug.internal.core;
-
- 
-import java.io.IOException;
-
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.core.model.IStreamsProxy2;
-
-/**
- * Standard implementation of a streams proxy for s 
- * StreamsProxy
- */
-
-public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 {
-	/**
-	 * The monitor for the output stream (connected to standard out of the process)
-	 */
-	private OutputStreamMonitor fOutputMonitor;
-	/**
-	 * The monitor for the error stream (connected to standard error of the process)
-	 */
-	private OutputStreamMonitor fErrorMonitor;
-	/**
-	 * The monitor for the input stream (connected to standard in of the process)
-	 */
-	private InputStreamMonitor fInputMonitor;
-	/**
-	 * Records the open/closed state of communications with
-	 * the underlying streams.
-	 */
-	private boolean fClosed= false;
-	/**
-	 * Creates a <code>StreamsProxy</code> on the streams
-	 * of the given system process.
-	 * 
-	 * @param process system process to create a streams proxy on
-	 * @param encoding the process's encoding or <code>null</code> if default
-	 */
-	public StreamsProxy(Process process, String encoding) {
-		if (process == null) {
-			return;
-		}
-		fOutputMonitor= new OutputStreamMonitor(process.getInputStream(), encoding);
-		fErrorMonitor= new OutputStreamMonitor(process.getErrorStream(), encoding);
-		fInputMonitor= new InputStreamMonitor(process.getOutputStream());
-		fOutputMonitor.startMonitoring();
-		fErrorMonitor.startMonitoring();
-		fInputMonitor.startMonitoring();
-	}
-
-	/**
-	 * Causes the proxy to close all
-	 * communications between it and the
-	 * underlying streams after all remaining data
-	 * in the streams is read.
-	 */
-	public void close() {
-		if (!fClosed) {
-			fClosed= true;
-			fOutputMonitor.close();
-			fErrorMonitor.close();
-			fInputMonitor.close();
-		}
-	}
-
-	/**
-	 * Causes the proxy to close all
-	 * communications between it and the
-	 * underlying streams immediately.
-	 * Data remaining in the streams is lost.
-	 */	
-	public void kill() {
-		fClosed= true;
-		fOutputMonitor.kill();
-		fErrorMonitor.kill();
-		fInputMonitor.close();
-	}
-
-	/**
-	 * @see IStreamsProxy#getErrorStreamMonitor()
-	 */
-	public IStreamMonitor getErrorStreamMonitor() {
-		return fErrorMonitor;
-	}
-
-	/**
-	 * @see IStreamsProxy#getOutputStreamMonitor()
-	 */
-	public IStreamMonitor getOutputStreamMonitor() {
-		return fOutputMonitor;
-	}
-
-	/**
-	 * @see IStreamsProxy#write(String)
-	 */
-	public void write(String input) throws IOException {
-		if (!fClosed) {
-			fInputMonitor.write(input);
-		} else {
-			throw new IOException();
-		}
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.model.IStreamsProxy2#closeInputStream()
-     */
-    public void closeInputStream() throws IOException {
-        if (!fClosed) {
-            fInputMonitor.closeInputStream();
-        } else {
-            throw new IOException();
-        }
-        
-    }
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/SystemPropertyResolver.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/SystemPropertyResolver.java
deleted file mode 100644
index 01c5d19..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/SystemPropertyResolver.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.debug.internal.core;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.debug.core.DebugPlugin;
-
-/**
- * Resolves the value of system properties from the Eclipse SDK runtime. 
- */
-public class SystemPropertyResolver implements IDynamicVariableResolver {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IDynamicVariableResolver#resolveValue(org.eclipse.core.variables.IDynamicVariable, java.lang.String)
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		if (argument == null) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), IStatus.ERROR, DebugCoreMessages.SystemPropertyResolver_0, null)); 
-		}
-		return System.getProperty(argument);
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/SystemVariableResolver.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/SystemVariableResolver.java
deleted file mode 100644
index da4d5e5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/SystemVariableResolver.java
+++ /dev/null
@@ -1,77 +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.debug.internal.core;
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-
-/**
- * Resolves common system variables. The current set of variables
- * supported (referenced as an argument to this variable) are:
- * <ul>
- * <li>ARCH - value of <code>BootLoader.getOSArch()</code></li>
- * <li>ECLIPSE_HOME - location of the Eclipse installation</li>
- * <li>NL - value of <code>BootLoader.getNL()</code></li>
- * <li>OS - value of <code>BootLoader.getOS()</code></li>
- * <li>WS - value of <code>BootLoader.getWS()</code></li>
- * </ul>
- * @since 3.0
- */
-public class SystemVariableResolver implements IDynamicVariableResolver {
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IDynamicVariableResolver#resolveValue(org.eclipse.core.variables.IDynamicVariable, java.lang.String)
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		if ("ARCH".equals(argument)) { //$NON-NLS-1$
-			return Platform.getOSArch();
-		} else if ("ECLIPSE_HOME".equals(argument)) { //$NON-NLS-1$
-			URL installURL = Platform.getInstallLocation().getURL();
-			IPath ppath = new Path(installURL.getFile()).removeTrailingSeparator();
-			return getCorrectPath(ppath.toOSString());
-		} else if ("NL".equals(argument)) { //$NON-NLS-1$
-			return Platform.getNL();
-		} else if ("OS".equals(argument)) { //$NON-NLS-1$
-			return Platform.getOS();
-		} else if ("WS".equals(argument)) { //$NON-NLS-1$
-			return Platform.getWS();
-		}
-		return null;
-	}
-	
-	private static String getCorrectPath(String path) {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < path.length(); i++) {
-			char c = path.charAt(i);
-			if (Platform.getOS().equals("win32")) { //$NON-NLS-1$
-				if (i == 0 && c == '/')
-					continue;
-			}
-			// Some VMs may return %20 instead of a space
-			if (c == '%' && i + 2 < path.length()) {
-				char c1 = path.charAt(i + 1);
-				char c2 = path.charAt(i + 2);
-				if (c1 == '2' && c2 == '0') {
-					i += 2;
-					buf.append(" "); //$NON-NLS-1$
-					continue;
-				}
-			}
-			buf.append(c);
-		}
-		return buf.toString();
-	}	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/WatchExpression.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/WatchExpression.java
deleted file mode 100644
index e2b0316..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/WatchExpression.java
+++ /dev/null
@@ -1,282 +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.debug.internal.core;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.core.model.IWatchExpressionDelegate;
-import org.eclipse.debug.core.model.IWatchExpressionListener;
-import org.eclipse.debug.core.model.IWatchExpressionResult;
-
-/**
- * Base watch expression implementation.
- * 
- * @since 3.0
- */
-public class WatchExpression implements IWatchExpression {
-	
-	protected String fExpressionText;
-	protected IWatchExpressionResult fResult;
-	protected IDebugElement fCurrentContext;
-	private boolean fEnabled= true;
-	private boolean fPending= false;
-	
-	/**
-	 * Creates a new watch expression with the given expression
-	 * text.
-	 * @param expression the text of the expression to be evaluated.
-	 */
-	public WatchExpression(String expression) {
-		fExpressionText= expression;
-	}
-
-	/**
-	 * Creates a new watch expression with the given expression
-	 * and the given enablement;
-	 * 
-	 * @param expressionText the text of the expression to be evaluated
-	 * @param enabled whether or not the new expression should be enabled
-	 */
-	public WatchExpression(String expressionText, boolean enabled) {
-		this(expressionText);
-		fEnabled= enabled;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.model.IWatchExpression#evaluate()
-	 */
-	public void evaluate() {
-		IDebugElement context= fCurrentContext;
-		if (context == null) {
-			return;
-		}
-			
-		IWatchExpressionListener listener= new IWatchExpressionListener() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.core.model.IWatchExpressionListener#watchEvaluationFinished(org.eclipse.debug.core.model.IWatchExpressionResult)
-			 */
-			public void watchEvaluationFinished(IWatchExpressionResult result) {
-				setPending(false);
-				setResult(result);
-			}
-		};
-		setPending(true);
-		IWatchExpressionDelegate delegate= DebugPlugin.getDefault().getExpressionManager().newWatchExpressionDelegate(context.getModelIdentifier());
-		if (delegate != null) {
-			delegate.evaluateExpression(getExpressionText(), context, listener);
-		} else {
-			// No delegate provided
-			listener.watchEvaluationFinished(new IWatchExpressionResult() {
-				public IValue getValue() {
-					return null;
-				}
-				public boolean hasErrors() {
-					return true;
-				}
-				public String[] getErrorMessages() {
-					return new String[] { DebugCoreMessages.WatchExpression_0 }; 
-				}
-				public String getExpressionText() {
-					return WatchExpression.this.getExpressionText();
-				}
-				public DebugException getException() {
-					return null;
-				}
-			});
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#setExpressionContext(org.eclipse.debug.core.model.IDebugElement)
-	 */
-	public void setExpressionContext(IDebugElement context) {
-		fCurrentContext= context;
-		if (context == null) {
-			setResult(null);
-			return;
-		}
-		if (!isEnabled()) {
-			return;
-		}
-		
-		evaluate();
-	}
-
-	/**
-	 * Sets the result of the last expression and fires notification that
-	 * this expression's value has changed.
-	 * 
-	 * @param result result of a watch expression
-	 */
-	public void setResult(IWatchExpressionResult result) {
-		fResult= result;
-		fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CONTENT));
-	}
-
-	/**
-	 * Fires the given debug event
-	 * @param event
-	 */
-	protected void fireEvent(DebugEvent event) {
-		DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
-	}
-	
-	/**
-	 * Notifies the expression manager that this watch expression's
-	 * values have changed so the manager can update the
-	 * persisted expression.
-	 * 
-	 * @param persist whether to persist the expression
-	 */
-	private void watchExpressionChanged(boolean persist) {
-		((ExpressionManager)DebugPlugin.getDefault().getExpressionManager()).watchExpressionChanged(this, persist);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IExpression#getExpressionText()
-	 */
-	public String getExpressionText() {
-		return fExpressionText;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IExpression#getValue()
-	 */
-	public IValue getValue() {
-		if (fResult == null) {
-			return null;
-		}
-		return fResult.getValue();
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		IDebugElement element = fCurrentContext;
-		if (element != null) {
-			return element.getDebugTarget();
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IExpression#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		if (fCurrentContext != null) {
-			return fCurrentContext.getModelIdentifier();
-		}
-		return DebugPlugin.getUniqueIdentifier();
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		IDebugTarget debugTarget = getDebugTarget();
-		if (debugTarget != null) {
-		    return debugTarget.getLaunch();
-		}
-		return null; 
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		//CONTEXTLAUNCHING
-		if(adapter.equals(ILaunchConfiguration.class)) {
-			ILaunch launch = getLaunch();
-			if(launch != null) {
-				return launch.getLaunchConfiguration();
-			}
-		}
-		return Platform.getAdapterManager().getAdapter(this, adapter);
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setEnabled(boolean enabled) {
-		fEnabled= enabled;
-		watchExpressionChanged(true);
-		evaluate();
-	}
-
-	/**
-	 * @param expression
-	 */
-	public void setExpressionText(String expression) {
-		fExpressionText= expression;
-		watchExpressionChanged(true);
-		evaluate();
-	}
-
-	/**
-	 * @return Whether or not this watch expression is currently enabled.
-	 * 		Enabled watch expressions will continue to update their value
-	 * 		automatically. Disabled expressions require a manual update.
-	 */
-	public boolean isEnabled() {
-		return fEnabled;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.model.IWatchExpression#isPending()
-	 */
-	public boolean isPending() {
-		return fPending;
-	}
-	
-	/**
-	 * Sets the pending state of this expression.
-	 * 
-	 * @param pending whether or not this expression should be
-	 * 		flagged as pending
-	 */
-	protected void setPending(boolean pending) {
-		fPending= pending;
-		fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.STATE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IErrorReportingExpression#hasErrors()
-	 */
-	public boolean hasErrors() {
-		return fResult != null && fResult.hasErrors();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IErrorReportingExpression#getErrorMessages()
-	 */
-	public String[] getErrorMessages() {
-		if (fResult == null) {
-			return new String[0];
-		}
-		return fResult.getErrorMessages();
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/CommandAdapterFactory.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/CommandAdapterFactory.java
deleted file mode 100644
index 5d47e7b..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/CommandAdapterFactory.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.commands.IDisconnectHandler;
-import org.eclipse.debug.core.commands.IDropToFrameHandler;
-import org.eclipse.debug.core.commands.IResumeHandler;
-import org.eclipse.debug.core.commands.IStepFiltersHandler;
-import org.eclipse.debug.core.commands.IStepIntoHandler;
-import org.eclipse.debug.core.commands.IStepOverHandler;
-import org.eclipse.debug.core.commands.IStepReturnHandler;
-import org.eclipse.debug.core.commands.ISuspendHandler;
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IDropToFrame;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStep;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.core.model.ITerminate;
-
-/**
- * Adapter factory for debug commands.
- * 
- * @since 3.3
- *
- */
-public class CommandAdapterFactory implements IAdapterFactory {
-	
-	
-	private static ITerminateHandler fgTerminateCommand = new TerminateCommand();
-	private static IStepOverHandler fgStepOverCommand = new StepOverCommand();
-	private static IStepIntoHandler fgStepIntoCommand = new StepIntoCommand();
-	private static IStepReturnHandler fgStepReturnCommand = new StepReturnCommand();
-	private static IDropToFrameHandler fgDropToFrameCommand = new DropToFrameCommand();
-	private static IDisconnectHandler fgDisconnectCommand = new DisconnectCommand();
-	private static ISuspendHandler fgSuspendCommand = new SuspendCommand();
-	private static IResumeHandler fgResumeCommand = new ResumeCommand();
-	private static IStepFiltersHandler fgStepFiltersCommand = new StepFiltersCommand();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (IStepFiltersHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof IDebugElement ||
-				adaptableObject instanceof ILaunch || 
-				adaptableObject instanceof IProcess) {
-				return fgStepFiltersCommand;
-			}
-		}
-		
-		if (ITerminateHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof ITerminate) {
-				return fgTerminateCommand;
-			}
-		}
-		if (IStepOverHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof IStep) {
-				return fgStepOverCommand;
-			}
-		}
-		if (IStepIntoHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof IStep) {
-				return fgStepIntoCommand;
-			}
-		}
-		if (IStepReturnHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof IStep) {
-				return fgStepReturnCommand;
-			}
-		}
-		if (ISuspendHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof ISuspendResume) {
-				return fgSuspendCommand;
-			}
-		}
-		if (IResumeHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof ISuspendResume) {
-				return fgResumeCommand;
-			}
-		}
-		if (IDisconnectHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof IDisconnect) {
-				return fgDisconnectCommand;
-			}
-		}
-		if (IDropToFrameHandler.class.equals(adapterType)) {
-			if (adaptableObject instanceof IDropToFrame) {
-				return fgDropToFrameCommand;
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[]{
-				ITerminateHandler.class,
-				IStepOverHandler.class,
-				IStepIntoHandler.class,
-				IStepReturnHandler.class,
-				ISuspendHandler.class,
-				IResumeHandler.class,
-				IDropToFrameHandler.class,
-				IDisconnectHandler.class,
-				IStepFiltersHandler.class};
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DebugCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DebugCommand.java
deleted file mode 100644
index dff79eb..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DebugCommand.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.commands;
-
-import java.util.LinkedHashSet;
-
-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.Job;
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.debug.core.commands.IDebugCommandHandler;
-import org.eclipse.debug.core.commands.IDebugCommandRequest;
-import org.eclipse.debug.core.commands.IEnabledStateRequest;
-import org.eclipse.debug.internal.core.DebugOptions;
-
-/**
- * Common function for standard debug commands.
- * 
- * @since 3.3
- *
- */
-public abstract class DebugCommand implements IDebugCommandHandler {
-	
-	/**
-	 * Scheduling rule to serialize commands on an object
-	 */
-   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 boolean execute(final IDebugCommandRequest request) {
-		Job job = new Job(getExecuteTaskName()) {
-			protected IStatus run(IProgressMonitor monitor) {
-				if (DebugOptions.DEBUG_COMMANDS) {
-					System.out.println("execute: " + DebugCommand.this); //$NON-NLS-1$
-				}
-				Object[] elements = request.getElements();
-				Object[] targets = new Object[elements.length];
-				for (int i = 0; i < elements.length; i++) {
-					targets[i]= getTarget(elements[i]);
-				}
-				targets = coalesce(targets);
-				monitor.beginTask(getExecuteTaskName(), targets.length);
-				try {
-					doExecute(targets, monitor, request);
-				} catch (CoreException e) {
-					request.setStatus(e.getStatus());
-					if (DebugOptions.DEBUG_COMMANDS) {
-						System.out.println("\t" + e.getStatus().getMessage()); //$NON-NLS-1$
-					}
-				}
-				request.done();
-				monitor.setCanceled(request.isCanceled());
-				monitor.done();
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.schedule();
-		return isRemainEnabled();
-	}	
-	
-	/**
-	 * Returns whether this command should remain enabled after execution is invoked.
-	 * 
-	 * @return whether to remain enabled
-	 */
-	protected boolean isRemainEnabled() {
-		return false;
-	}
-	
-	public void canExecute(final IEnabledStateRequest request) {
-		Job job = new Job(getEnablementTaskName()) {
-			protected IStatus run(IProgressMonitor monitor) {
-				if (DebugOptions.DEBUG_COMMANDS) {
-					System.out.print("can execute command: " + DebugCommand.this); //$NON-NLS-1$
-				}
-				Object[] elements = request.getElements();
-				Object[] targets = new Object[elements.length];
-				for (int i = 0; i < elements.length; i++) {
-					targets[i] = getTarget(elements[i]);
-					if (targets[i] == null) {
-						request.setEnabled(false);
-						request.cancel();
-						if (DebugOptions.DEBUG_COMMANDS) {
-							System.out.println(" >> false (no adapter)"); //$NON-NLS-1$
-						}
-					}
-				}
-				if (!request.isCanceled()) {
-					targets = coalesce(targets);
-					monitor.beginTask(getEnablementTaskName(), targets.length);
-					try {
-						boolean executable = isExecutable(targets, monitor, request);
-						if (DebugOptions.DEBUG_COMMANDS) {
-							System.out.println(" >> " + executable); //$NON-NLS-1$
-						}
-						request.setEnabled(executable);
-					} catch (CoreException e) {
-						request.setStatus(e.getStatus());
-						request.setEnabled(false);
-						if (DebugOptions.DEBUG_COMMANDS) {
-							System.out.println(" >> ABORTED"); //$NON-NLS-1$
-							System.out.println("\t" + e.getStatus().getMessage()); //$NON-NLS-1$
-						}
-					}
-				}
-				monitor.setCanceled(request.isCanceled());
-				request.done();
-				monitor.done();
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.setRule(createUpdateSchedulingRule(request));
-		job.schedule();
-		
-	}
-	
-	/**
-	 * Returns the name to use for jobs and progress monitor task names when checking
-	 * enabled state.
-	 * 
-	 * @return task name
-	 */
-	protected String getEnablementTaskName() {
-		// this is a system job name and does not need to be NLS'd
-		return "Check Debug Command"; //$NON-NLS-1$
-	}
-	
-	/**
-	 * Returns the name to use for jobs and progress monitor task names when executing
-	 * a debug command
-	 * 
-	 * @return task name
-	 */
-	protected String getExecuteTaskName() {
-		// this is a system job name and does not need to be NLS'd
-		return "Execute Debug Command"; //$NON-NLS-1$
-	}	
-
-	/**
-	 * Executes the actual operation.
-	 * 
-	 * @param targets objects to perform on
-	 * @param request request
-	 */
-	protected abstract void doExecute(Object[] targets, IProgressMonitor monitor, IRequest request) throws CoreException;
-
-	/**
-	 * Returns whether this command is executable.
-	 * 
-	 * @param targets objects to check command for
-	 * @param monitor progress monitor
-	 * @param request request
-	 * @return whether this command can be executed
-	 */
-	protected abstract boolean isExecutable(Object[] targets, IProgressMonitor monitor, IEnabledStateRequest request) throws CoreException;
-	
-	/**
-	 * Returns the appropriate command adapter from the given object.
-	 * 
-	 * @param element object to obtain adapter from
-	 * @return adapter
-	 */
-	protected abstract Object getTarget(Object element); 
-	
-	/**
-	 * Scheduling rule for updating command enabled state.
-	 * 
-	 * @return scheduling rule or <code>null</code>
-	 */
-	protected ISchedulingRule createUpdateSchedulingRule(IDebugCommandRequest request) {
-		return new SerialPerObjectRule(request.getElements()[0]);
-	}
-	
-	private Object[] coalesce(Object[] objects) {
-		if (objects.length == 1) {
-			return objects;
-		} else {
-			LinkedHashSet set = new LinkedHashSet(objects.length);
-			for (int i = 0; i < objects.length; i++) {
-				set.add(objects[i]);
-			}
-			return set.toArray();
-		}
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DebugCommandRequest.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DebugCommandRequest.java
deleted file mode 100644
index 5d447e5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DebugCommandRequest.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.debug.internal.core.commands;
-
-import org.eclipse.debug.core.commands.IDebugCommandRequest;
-
-/**
- * @since 3.3
- */
-public class DebugCommandRequest extends Request implements IDebugCommandRequest {
-	
-	private Object[] fElements;
-	
-	public DebugCommandRequest(Object[] elements) {
-		fElements = elements;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.commands.IDebugCommandRequest#getElements()
-	 */
-	public Object[] getElements() {
-		return fElements;
-	}
-
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DisconnectCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DisconnectCommand.java
deleted file mode 100644
index 66d33d4..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DisconnectCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.commands.IDisconnectHandler;
-import org.eclipse.debug.core.model.IDisconnect;
-
-/**
- * Default disconnect command for the standard debug model.
- * 
- * @since 3.3
- */
-public class DisconnectCommand extends ForEachCommand implements IDisconnectHandler {
-
-	protected Object getTarget(Object element) {
-		if (element instanceof IDisconnect) {
-			return element;
-		} else if (element instanceof IAdaptable) {
-			return ((IAdaptable) element).getAdapter(IDisconnect.class);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.ForEachCommand#execute(java.lang.Object)
-	 */
-	protected void execute(Object target) throws CoreException {
-		((IDisconnect)target).disconnect();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.ForEachCommand#isExecutable(java.lang.Object)
-	 */
-	protected boolean isExecutable(Object target) {
-		return ((IDisconnect)target).canDisconnect();
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DropToFrameCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DropToFrameCommand.java
deleted file mode 100644
index 06a3b93..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/DropToFrameCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.commands.IDropToFrameHandler;
-import org.eclipse.debug.core.model.IDropToFrame;
-
-/**
- * Default drop to frame command for the standard debug model.
- * 
- * @since 3.3
- */
-public class DropToFrameCommand extends StepCommand implements IDropToFrameHandler {
-
-	protected Object getTarget(Object element) {
-		if (element instanceof IDropToFrame) {
-			return element;
-		} else if (element instanceof IAdaptable) {
-			return ((IAdaptable) element).getAdapter(IDropToFrame.class);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.StepCommand#isSteppable(java.lang.Object)
-	 */
-	protected boolean isSteppable(Object target) throws CoreException {
-		return ((IDropToFrame)target).canDropToFrame();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.StepCommand#step(java.lang.Object)
-	 */
-	protected void step(Object target) throws CoreException {
-		((IDropToFrame)target).dropToFrame();
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/ForEachCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/ForEachCommand.java
deleted file mode 100644
index f536d90..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/ForEachCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.debug.core.commands.IEnabledStateRequest;
-
-/**
- * A command that operates on each element individually.
- * 
- * @since 3.3
- */
-public abstract class ForEachCommand extends DebugCommand {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.DebugCommand#doExecute(java.lang.Object[], org.eclipse.core.runtime.IProgressMonitor, org.eclipse.debug.core.IRequest)
-	 */
-	protected void doExecute(Object[] targets, IProgressMonitor monitor, IRequest request) throws CoreException {
-		for (int i = 0; i < targets.length; i++) {
-			execute(targets[i]);
-			monitor.worked(1);
-		}
-	}
-	
-	protected abstract void execute(Object target) throws CoreException;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.DebugCommand#isExecutable(java.lang.Object[], org.eclipse.core.runtime.IProgressMonitor, org.eclipse.debug.core.commands.IEnabledStateRequest)
-	 */
-	protected boolean isExecutable(Object[] targets, IProgressMonitor monitor, IEnabledStateRequest request) throws CoreException {
-		for (int i = 0; i < targets.length; i++) {
-			if (!isExecutable(targets[i])) {
-				return false;
-			}
-			monitor.worked(1);
-		}
-		return true;
-	}
-	
-	protected abstract boolean isExecutable(Object target);
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/Request.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/Request.java
deleted file mode 100644
index 29ac7b7..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/Request.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.IRequest;
-
-/**
- * @since 3.3
- */
-public class Request implements IRequest {
-	
-	private IStatus fStatus;
-	private boolean fCanceled = false;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.commands.IStatusCollector#done()
-	 */
-	public void done() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.commands.IStatusCollector#getStatus()
-	 */
-	public IStatus getStatus() {
-		return fStatus;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.commands.IStatusCollector#setStatus(org.eclipse.core.runtime.IStatus)
-	 */
-	public void setStatus(IStatus status) {
-		fStatus = status;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.commands.IRequest#cancel()
-	 */
-	public synchronized void cancel() {
-		fCanceled = true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.commands.IRequest#isCanceled()
-	 */
-	public synchronized boolean isCanceled() {
-		return fCanceled;
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/ResumeCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/ResumeCommand.java
deleted file mode 100644
index 3fbb24d..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/ResumeCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.commands.IResumeHandler;
-import org.eclipse.debug.core.model.ISuspendResume;
-
-/**
- * Default resume command for the standard debug model.
- * 
- * @since 3.3
- */
-public class ResumeCommand extends SuspendCommand implements IResumeHandler {
-
-	protected void execute(Object target) throws CoreException {
-		((ISuspendResume)target).resume();
-	}
-
-	protected boolean isExecutable(Object target) {
-		return ((ISuspendResume)target).canResume();
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepCommand.java
deleted file mode 100644
index 94dd065..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.commands;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.debug.core.commands.IEnabledStateRequest;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IStep;
-
-/**
- * Common function for step commands.
- * 
- * @since 3.3
- */
-public abstract class StepCommand extends DebugCommand {
-
-	protected void doExecute(Object[] targets, IProgressMonitor monitor, IRequest request) throws CoreException {
-		for (int i = 0; i < targets.length; i++) {
-			step(targets[i]);
-		}
-	}
-
-	protected abstract void step(Object target) throws CoreException ;
-	
-	protected boolean isExecutable(Object[] targets, IProgressMonitor monitor, IEnabledStateRequest collector) throws CoreException {
-		if (isThreadCompatible(targets)) {
-			for (int i = 0; i < targets.length; i++) {
-				if (!isSteppable(targets[i])) {
-					return false;
-				}
-			}
-			return true;
-		} else {
-			return false;
-		}
-	}
-	
-	protected abstract boolean isSteppable(Object target) throws CoreException;
-	
-	protected boolean isThreadCompatible(Object[] targets) {
-		if (targets.length == 1) {
-			return true;
-		}
-		// check if frames from same thread
-		Set threads = new HashSet(targets.length);
-		for (int i = 0; i < targets.length; i++) {
-			Object object = targets[i];
-			IStackFrame frame = null;
-			if (object instanceof IStackFrame) {
-				frame = (IStackFrame) object;
-			} else if (object instanceof IAdaptable) {
-				frame = (IStackFrame)((IAdaptable)object).getAdapter(IStackFrame.class);
-			}
-			if (frame != null) {
-				if (!threads.add(frame.getThread())) { 
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
-	protected Object getTarget(Object element) {
-		if (element instanceof IStep) {
-			return element;
-		} else if (element instanceof IAdaptable) {
-			return ((IAdaptable) element).getAdapter(IStep.class);
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepFiltersCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepFiltersCommand.java
deleted file mode 100644
index bf594f5..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepFiltersCommand.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.commands.IStepFiltersHandler;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStepFilters;
-
-/**
- * Default toggle step filters command for the standard debug model.
- * 
- * @since 3.3
- */
-public class StepFiltersCommand extends ForEachCommand implements IStepFiltersHandler {
-
-	protected Object getTarget(Object element) {
-		IDebugTarget[] targets = getDebugTargets(element);
-		if (targets.length > 0) {
-			IStepFilters[] filters = new IStepFilters[targets.length];
-			for (int i = 0; i < targets.length; i++) {
-				IDebugTarget target = targets[i];
-				if (target instanceof IStepFilters) {
-					filters[i] = (IStepFilters) target;
-				} else {
-					filters[i] = (IStepFilters) ((IAdaptable)element).getAdapter(IStepFilters.class);
-				}
-				if (filters[i] == null) {
-					return null;
-				}
-			}
-			return filters;
-		}
-        return null;
-	}
-	
-   private IDebugTarget[] getDebugTargets(Object element) {
-		if (element instanceof IDebugElement) {
-			IDebugElement debugElement = (IDebugElement) element;
-			return new IDebugTarget[] { debugElement.getDebugTarget() };
-		} else if (element instanceof ILaunch) {
-			ILaunch launch = (ILaunch) element;
-			return launch.getDebugTargets();
-		} else if (element instanceof IProcess) {
-			IProcess process = (IProcess) element;
-			return process.getLaunch().getDebugTargets();
-		} else {
-			return new IDebugTarget[0];
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.ForEachCommand#execute(java.lang.Object)
-	 */
-	protected void execute(Object target) throws CoreException {
-		if (target == null) {
-			return;
-		}
-		IStepFilters[] filters = (IStepFilters[]) target;
-		for (int i = 0; i < filters.length; i++) {
-			IStepFilters filter = filters[i];
-			filter.setStepFiltersEnabled(DebugPlugin.isUseStepFilters());
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.ForEachCommand#isExecutable(java.lang.Object)
-	 */
-	protected boolean isExecutable(Object target) {
-		IStepFilters[] filters = (IStepFilters[]) target;
-		for (int i = 0; i < filters.length; i++) {
-			IStepFilters filter = filters[i];
-			if (filter == null || !filter.supportsStepFilters()) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepIntoCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepIntoCommand.java
deleted file mode 100644
index d96b088..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepIntoCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.commands.IStepIntoHandler;
-import org.eclipse.debug.core.model.IStep;
-
-/**
- * Default step into command for the standard debug model.
- * 
- * @since 3.3
- */
-public class StepIntoCommand extends StepCommand implements IStepIntoHandler {
-
-	protected boolean isSteppable(Object target) {
-		return ((IStep)target).canStepInto();
-	}
-
-	protected void step(Object target) throws CoreException {
-		((IStep)target).stepInto();
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepOverCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepOverCommand.java
deleted file mode 100644
index fe48eb0..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepOverCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.commands.IStepOverHandler;
-import org.eclipse.debug.core.model.IStep;
-
-/**
- * Default step over command for the standard debug model.
- * 
- * @since 3.3
- */
-public class StepOverCommand extends StepCommand implements IStepOverHandler {
-
-
-	protected void step(Object target) throws CoreException {
-		((IStep)target).stepOver();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.commands.StepCommand#isSteppable(java.lang.Object)
-	 */
-	protected boolean isSteppable(Object target) {
-		return ((IStep)target).canStepOver();
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepReturnCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepReturnCommand.java
deleted file mode 100644
index 7110016..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/StepReturnCommand.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.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.commands.IStepReturnHandler;
-import org.eclipse.debug.core.model.IStep;
-
-/**
- * Default step return command for the standard debug model.
- * 
- * @since 3.3
- */
-public class StepReturnCommand extends StepCommand implements IStepReturnHandler {
-
-	protected boolean isSteppable(Object target) {
-		return ((IStep)target).canStepReturn();
-	}
-
-	protected void step(Object target) throws CoreException {
-		((IStep)target).stepReturn();
-	}
-
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/SuspendCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/SuspendCommand.java
deleted file mode 100644
index 49717bf..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/SuspendCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.commands.ISuspendHandler;
-import org.eclipse.debug.core.model.ISuspendResume;
-
-/**
- * Default suspend command for the standard debug model.
- * 
- * @since 3.3
- */
-public class SuspendCommand extends ForEachCommand implements ISuspendHandler {
-
-	protected Object getTarget(Object element) {
-		if (element instanceof ISuspendResume) {
-			return element;
-		} else if (element instanceof IAdaptable) {
-			return ((IAdaptable) element).getAdapter(ISuspendResume.class);
-		}
-		return null;
-	}
-
-	protected void execute(Object target) throws CoreException {
-		((ISuspendResume)target).suspend();
-	}
-	
-	protected boolean isExecutable(Object target) {
-		return ((ISuspendResume)target).canSuspend();
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/TerminateCommand.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/TerminateCommand.java
deleted file mode 100644
index 0cca664..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/commands/TerminateCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.commands;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.core.model.ITerminate;
-
-/**
- * Default terminate command for the standard debug model.
- * 
- * @since 3.3
- */
-public class TerminateCommand extends ForEachCommand implements ITerminateHandler {
-
-	protected Object getTarget(Object element) {
-		if (element instanceof ITerminate) {
-			return element;
-		} else if (element instanceof IAdaptable) {
-			return ((IAdaptable) element).getAdapter(ITerminate.class);
-		}
-		return null;
-	}
-
-	protected void execute(Object target) throws CoreException {
-		((ITerminate)target).terminate();
-	}
-
-	protected boolean isExecutable(Object target) {
-		return ((ITerminate)target).canTerminate();
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceContainerType.java
deleted file mode 100644
index de77de1..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceContainerType.java
+++ /dev/null
@@ -1,93 +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.debug.internal.core.sourcelookup;
-
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerTypeDelegate;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-
-/**
- * Proxy to contributed source container type extension.
- * 
- * @see IConfigurationElementConstants
- * 
- * @since 3.0
- */
-public class SourceContainerType implements ISourceContainerType {
-	
-	// lazily instantiated delegate
-	private ISourceContainerTypeDelegate fDelegate = null;
-	
-	// extension definition
-	private IConfigurationElement fElement = null;
-	
-	/**
-	 * Constructs a source container type on the given extension.
-	 * 
-	 * @param element extension definition
-	 */
-	public SourceContainerType(IConfigurationElement element) {
-		fElement = element;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		return getDelegate().createSourceContainer(memento);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		if (this.equals(container.getType())) {
-			return getDelegate().getMemento(container);
-		}
-		IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, SourceLookupMessages.SourceContainerType_0, null); 
-		throw new CoreException(status);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getName()
-	 */
-	public String getName() {
-		return fElement.getAttribute(IConfigurationElementConstants.NAME);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getId()
-	 */
-	public String getId() {
-		return fElement.getAttribute(IConfigurationElementConstants.ID);
-	}
-	
-	/**
-	 * Lazily instantiates and returns the underlying source container type.
-	 * 
-	 * @exception CoreException if unable to instantiate
-	 */
-	private ISourceContainerTypeDelegate getDelegate() throws CoreException {
-		if (fDelegate == null) {
-			fDelegate = (ISourceContainerTypeDelegate) fElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-		}
-		return fDelegate;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getDescription()
-	 */
-	public String getDescription() {
-		return fElement.getAttribute(IConfigurationElementConstants.DESCRIPTION);
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLocatorMementoComparator.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLocatorMementoComparator.java
deleted file mode 100644
index 159b816..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLocatorMementoComparator.java
+++ /dev/null
@@ -1,53 +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.debug.internal.core.sourcelookup;
-
-import java.util.Comparator;
-
-/**
- * Comparator for source locator mementors. Ignores whitespace differences.
- * 
- * @since 3.0
- */
-public class SourceLocatorMementoComparator implements Comparator {
-	/* (non-Javadoc)
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		String m1 = (String)o1;
-		String m2 = (String)o2;
-		int i1 = 0, i2 = 0;
-		while (i1 < m1.length()) {
-			i1 = skipWhitespace(m1, i1);
-			i2 = skipWhitespace(m2, i2);
-			if (i1 < m1.length() && i2 < m2.length()) {
-				if (m1.charAt(i1) != m2.charAt(i2)) {
-					return -1;
-				}
-				i1++;
-				i2++;
-			} else {
-				if (i2 < m2.length()) {
-					return -1;
-				} 
-				return 0;
-			}
-		}
-		return 0;
-	}
-	
-	private int skipWhitespace(String string, int offset) {
-		while (offset < string.length() && Character.isWhitespace(string.charAt(offset))) {
-			offset++;
-		}
-		return offset;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupMessages.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupMessages.java
deleted file mode 100644
index e63731c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupMessages.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.core.sourcelookup;
-
-import org.eclipse.osgi.util.NLS;
-
-public class SourceLookupMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages";//$NON-NLS-1$
-
-	public static String AbstractSourceLookupDirector_11;
-	public static String AbstractSourceLookupDirector_12;
-	public static String AbstractSourceLookupDirector_13;
-	public static String AbstractSourceLookupDirector_14;
-
-	public static String Source_Lookup_Error;
-
-	public static String ExternalArchiveSourceContainer_1;
-
-	public static String ExternalArchiveSourceContainer_2;
-
-	public static String ExternalArchiveSourceContainerType_10;
-	public static String ExternalArchiveSourceContainerType_11;
-	public static String ExternalArchiveSourceContainerType_12;
-
-	public static String DefaultSourceContainer_0;
-	public static String DefaultSourceContainerType_6;
-	public static String DefaultSourceContainerType_7;
-
-	public static String DirectorySourceContainerType_10;
-	public static String DirectorySourceContainerType_11;
-	public static String DirectorySourceContainerType_12;
-
-	public static String FolderSourceContainerType_10;
-	public static String FolderSourceContainerType_11;
-	public static String FolderSourceContainerType_12;
-
-	public static String LocalFileStorage_0;
-
-	public static String ProjectSourceContainerType_10;
-	public static String ProjectSourceContainerType_11;
-	public static String ProjectSourceContainerType_12;
-
-	public static String SourceContainerType_0;
-
-	public static String WorkspaceSourceContainer_0;
-
-	public static String WorkspaceSourceContainerType_3;
-	public static String WorkspaceSourceContainerType_4;
-
-	public static String ZipEntryStorage_0;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, SourceLookupMessages.class);
-	}
-
-	public static String AbstractSourceLookupDirector_10;
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupMessages.properties b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupMessages.properties
deleted file mode 100644
index 429f05e..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupMessages.properties
+++ /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
-###############################################################################
-
-AbstractSourceLookupDirector_11=Unable to restore source lookup path - expecting typeId attribute.
-AbstractSourceLookupDirector_12=Unable to restore source lookup path - unknown type source container type specified: {0}
-AbstractSourceLookupDirector_13=Unable to restore source lookup path - expecting memento attribute.
-AbstractSourceLookupDirector_14=Unable to read source lookup path - expecting sourceLookupDirector node.
-AbstractSourceLookupDirector_10=Exception occurred during source lookup
-
-ExternalArchiveSourceContainer_2=Unable to access archive {0}
-ExternalArchiveSourceContainer_1=Archive does not exist: {0}
-
-ExternalArchiveSourceContainerType_10=Invalid or missing <path> attribute in archive memento.
-ExternalArchiveSourceContainerType_11=Missing <archive> node in archive memento.
-ExternalArchiveSourceContainerType_12=Invalid archive memento
-
-DefaultSourceContainer_0=Default
-DefaultSourceContainerType_6=Unable to restore default source lookup path - expecting default element.
-DefaultSourceContainerType_7=Unable to restore default source lookup path - invalid memento.
-
-DirectorySourceContainerType_10=Unable to restore directory source lookup entry - missing path attribute.
-DirectorySourceContainerType_11=Unable to restore directory source lookup entry - expecting directory element.
-DirectorySourceContainerType_12=Unable to restore directory source lookup entry - invalid memento.
-
-FolderSourceContainerType_10=Unable to restore source lookup folder - missing path attribute.
-FolderSourceContainerType_11=Unable to restore source lookup folder - expecting folder element.
-FolderSourceContainerType_12=Unable to restore source lookup folder - invalid memento.
-
-LocalFileStorage_0=Exception occurred retrieving file contents.
-
-ProjectSourceContainerType_10=Unable to restore project source lookup entry - missing name attribute.
-ProjectSourceContainerType_11=Unable to restore project source lookup entry - expecting project element.
-ProjectSourceContainerType_12=Unable to restore project source lookup entry - invalid memento.
-
-WorkspaceSourceContainer_0=Workspace
-
-WorkspaceSourceContainerType_3=Unable to restore workspace source lookup entry - expecting workspace element.
-WorkspaceSourceContainerType_4=Unable to restore workspace source lookup entry - invalid memento.
-
-ZipEntryStorage_0=Unable to read ZipEntry contents
-Source_Lookup_Error=Source lookup error
-SourceContainerType_0=Unable to persist source lookup path.
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupUtils.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupUtils.java
deleted file mode 100644
index 67b2bb8..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourceLookupUtils.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.debug.internal.core.sourcelookup;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchesListener2;
-
-/**
- * Utility and supporting methods for source location. Most of these
- * utilities should be migrated to the DebugPlugin and LanuchManager
- * when this facility becomes public API.
- *
- * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector
- * @since 3.0
- */
-public class SourceLookupUtils {
-		
-	/**
-	 * Cache of shared zip files. Zip files are closed
-	 * when this class's plug-in is shutdown, when a project
-	 * is about to be closed or deleted, when a launch is
-	 * removed, and when a debug target or process terminates. 
-	 */
-	private static HashMap fgZipFileCache = new HashMap(5);
-	private static ArchiveCleaner fgCleaner = null;
-	
-	/**
-	 * Returns a zip file with the given name
-	 * 
-	 * @param name zip file name
-	 * @return The zip file with the given name
-	 * @exception IOException if unable to create the specified zip
-	 * 	file
-	 */
-	public static ZipFile getZipFile(String name) throws IOException {
-		synchronized (fgZipFileCache) {
-			if (fgCleaner == null) {
-				fgCleaner = new ArchiveCleaner();
-				DebugPlugin.getDefault().getLaunchManager().addLaunchListener(fgCleaner);
-				ResourcesPlugin.getWorkspace().addResourceChangeListener(fgCleaner, IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_CLOSE);
-			}
-			ZipFile zip = (ZipFile)fgZipFileCache.get(name);
-			if (zip == null) {
-				zip = new ZipFile(name);
-				fgZipFileCache.put(name, zip);
-			}
-			return zip;
-		}
-	}
-	
-	/**
-	 * Closes all zip files that have been opened,
-	 * and removes them from the zip file cache.
-	 * This method is only to be called by the debug
-	 * plug-in.
-	 */
-	public static void closeArchives() {
-		synchronized (fgZipFileCache) {
-			Iterator iter = fgZipFileCache.values().iterator();
-			while (iter.hasNext()) {
-				ZipFile file = (ZipFile)iter.next();
-				synchronized (file) {
-					try {
-						file.close();
-					} catch (IOException e) {
-						DebugPlugin.log(e);
-					}
-				}
-			}
-			fgZipFileCache.clear();
-		}
-	}	
-	
-	/**
-	 * Called when the debug plug-in shuts down.
-	 */
-	public static void shutdown() {
-		closeArchives();
-		if (fgCleaner != null) {
-			DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(fgCleaner);
-			ResourcesPlugin.getWorkspace().removeResourceChangeListener(fgCleaner);			
-		}
-	}
-	
-	/**
-	 * Clears the cache of open zip files when a launch terminates,
-	 * is removed, or when a project is about to be deleted or closed.
-	 */
-	static class ArchiveCleaner implements IResourceChangeListener, ILaunchesListener2 {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-		 */
-		public void launchesRemoved(ILaunch[] launches) {
-			for (int i = 0; i < launches.length; i++) {
-				ILaunch launch = launches[i];
-				if (!launch.isTerminated()) {	
-					SourceLookupUtils.closeArchives();
-					return;
-				}
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-		 */
-		public void launchesAdded(ILaunch[] launches) {			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-		 */
-		public void launchesChanged(ILaunch[] launches) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-			SourceLookupUtils.closeArchives();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-		 */
-		public void launchesTerminated(ILaunch[] launches) {
-			SourceLookupUtils.closeArchives();
-		}
-		
-	}	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourcePathComputer.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourcePathComputer.java
deleted file mode 100644
index 21bc87d..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/SourcePathComputer.java
+++ /dev/null
@@ -1,75 +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.debug.internal.core.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputer;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-
-/**
- * Proxy to contributed source path computer extension.
- * 
- * @see IConfigurationElementConstants
- */
-public class SourcePathComputer implements ISourcePathComputer {
-	
-	// lazily instantiated delegate
-	private ISourcePathComputerDelegate fDelegate = null;
-	
-	// extension definition
-	private IConfigurationElement fElement = null;
-	
-	/**
-	 * Constructs a source path computer on the given extension.
-	 * 
-	 * @param element extension definition
-	 */
-	public SourcePathComputer(IConfigurationElement element) {
-		fElement = element;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputer#getId()
-	 */
-	public String getId() {
-		return fElement.getAttribute(IConfigurationElementConstants.ID); 
-	}
-	
-	/**
-	 * Lazily instantiates and returns the underlying source container type.
-	 * 
-	 * @exception CoreException if unable to instantiate
-	 */
-	private ISourcePathComputerDelegate getDelegate() throws CoreException {
-		if (fDelegate == null) {
-			fDelegate = (ISourcePathComputerDelegate) fElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-		}
-		return fDelegate;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor) {
-		try {
-			return getDelegate().computeSourceContainers(configuration, monitor);
-		} catch (CoreException e) {
-			DebugPlugin.log(e);
-		}
-		return new ISourceContainer[0];
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ArchiveSourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ArchiveSourceContainerType.java
deleted file mode 100644
index 27c6d76..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ArchiveSourceContainerType.java
+++ /dev/null
@@ -1,70 +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.debug.internal.core.sourcelookup.containers;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.ArchiveSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Archive source container type for archives in the workspace.
- * 
- * @since 3.0
- */
-public class ArchiveSourceContainerType extends AbstractSourceContainerTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("archive".equals(element.getNodeName())) { //$NON-NLS-1$
-				String string = element.getAttribute("path"); //$NON-NLS-1$
-				if (string == null || string.length() == 0) {
-					abort(SourceLookupMessages.ExternalArchiveSourceContainerType_10, null); 
-				}
-				String detect = element.getAttribute("detectRoot"); //$NON-NLS-1$
-				boolean auto = "true".equals(detect); //$NON-NLS-1$
-				IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(string));
-				return new ArchiveSourceContainer(file, auto);
-			} 
-			abort(SourceLookupMessages.ExternalArchiveSourceContainerType_11, null); 
-		}
-		abort(SourceLookupMessages.ExternalArchiveSourceContainerType_12, null); 
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		ArchiveSourceContainer archive = (ArchiveSourceContainer) container;
-		Document document = newDocument();
-		Element element = document.createElement("archive"); //$NON-NLS-1$
-		element.setAttribute("path", archive.getFile().getFullPath().toString()); //$NON-NLS-1$
-		String detectRoot = "false"; //$NON-NLS-1$
-		if (archive.isDetectRoot()) {
-			detectRoot = "true"; //$NON-NLS-1$
-		}
-		element.setAttribute("detectRoot", detectRoot);  //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/DefaultSourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/DefaultSourceContainerType.java
deleted file mode 100644
index bea4453..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/DefaultSourceContainerType.java
+++ /dev/null
@@ -1,56 +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.debug.internal.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A default source lookup path. The default path is computed by a
- * source path computer.
- * 
- * @since 3.0
- */
-public class DefaultSourceContainerType extends AbstractSourceContainerTypeDelegate {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		Document document = newDocument();
-		Element element = document.createElement("default"); //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento)throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("default".equals(element.getNodeName())) { //$NON-NLS-1$
-				return new DefaultSourceContainer();
-			}
-			abort(SourceLookupMessages.DefaultSourceContainerType_6, null); 
-		}
-		abort(SourceLookupMessages.DefaultSourceContainerType_7, null); 
-		return null;		
-	}
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/DirectorySourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/DirectorySourceContainerType.java
deleted file mode 100644
index d25a0ff..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/DirectorySourceContainerType.java
+++ /dev/null
@@ -1,69 +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.debug.internal.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A folder in the local file system.
- * 
- * @since 3.0
- */
-public class DirectorySourceContainerType extends AbstractSourceContainerTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("directory".equals(element.getNodeName())) { //$NON-NLS-1$
-				String string = element.getAttribute("path"); //$NON-NLS-1$
-				if (string == null || string.length() == 0) {
-					abort(SourceLookupMessages.DirectorySourceContainerType_10, null); 
-				}
-				String nest = element.getAttribute("nest"); //$NON-NLS-1$
-				boolean nested = "true".equals(nest); //$NON-NLS-1$
-				return new DirectorySourceContainer(new Path(string), nested);
-			}
-			abort(SourceLookupMessages.DirectorySourceContainerType_11, null); 
-		}
-		abort(SourceLookupMessages.DirectorySourceContainerType_12, null); 
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		DirectorySourceContainer folder = (DirectorySourceContainer) container;
-		Document document = newDocument();
-		Element element = document.createElement("directory"); //$NON-NLS-1$
-		element.setAttribute("path", folder.getDirectory().getAbsolutePath()); //$NON-NLS-1$
-		String nest = "false"; //$NON-NLS-1$
-		if (folder.isComposite()) {
-			nest = "true"; //$NON-NLS-1$
-		}
-		element.setAttribute("nest", nest);  //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-	
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ExternalArchiveSourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ExternalArchiveSourceContainerType.java
deleted file mode 100644
index 43f295a..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ExternalArchiveSourceContainerType.java
+++ /dev/null
@@ -1,66 +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.debug.internal.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * External archive source container type.
- * 
- * @since 3.0
- */
-public class ExternalArchiveSourceContainerType extends AbstractSourceContainerTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("archive".equals(element.getNodeName())) { //$NON-NLS-1$
-				String string = element.getAttribute("path"); //$NON-NLS-1$
-				if (string == null || string.length() == 0) {
-					abort(SourceLookupMessages.ExternalArchiveSourceContainerType_10, null); 
-				}
-				String detect = element.getAttribute("detectRoot"); //$NON-NLS-1$
-				boolean auto = "true".equals(detect); //$NON-NLS-1$
-				return new ExternalArchiveSourceContainer(string, auto);
-			} 
-			abort(SourceLookupMessages.ExternalArchiveSourceContainerType_11, null); 
-		}
-		abort(SourceLookupMessages.ExternalArchiveSourceContainerType_12, null); 
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		ExternalArchiveSourceContainer archive = (ExternalArchiveSourceContainer) container;
-		Document document = newDocument();
-		Element element = document.createElement("archive"); //$NON-NLS-1$
-		element.setAttribute("path", archive.getName()); //$NON-NLS-1$
-		String detectRoot = "false"; //$NON-NLS-1$
-		if (archive.isDetectRoot()) {
-			detectRoot = "true"; //$NON-NLS-1$
-		}
-		element.setAttribute("detectRoot", detectRoot);  //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/FolderSourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/FolderSourceContainerType.java
deleted file mode 100644
index ce9ea08..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/FolderSourceContainerType.java
+++ /dev/null
@@ -1,73 +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.debug.internal.core.sourcelookup.containers;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A folder in the workspace.
- * 
- * @since 3.0
- */
-public class FolderSourceContainerType extends AbstractSourceContainerTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		FolderSourceContainer folderSourceContainer = (FolderSourceContainer)container;
-		Document document = newDocument();
-		Element element = document.createElement("folder"); //$NON-NLS-1$
-		element.setAttribute("path", folderSourceContainer.getContainer().getFullPath().toString()); //$NON-NLS-1$
-		String nest = "false"; //$NON-NLS-1$
-		if (folderSourceContainer.isComposite()) {
-			nest = "true"; //$NON-NLS-1$
-		}
-		element.setAttribute("nest", nest);  //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("folder".equals(element.getNodeName())) { //$NON-NLS-1$
-				String string = element.getAttribute("path"); //$NON-NLS-1$
-				if (string == null || string.length() == 0) {
-					abort(SourceLookupMessages.FolderSourceContainerType_10, null); 
-				}
-				String nest = element.getAttribute("nest"); //$NON-NLS-1$
-				boolean nested = "true".equals(nest); //$NON-NLS-1$
-				IWorkspace workspace = ResourcesPlugin.getWorkspace();
-				IFolder folder = workspace.getRoot().getFolder(new Path(string));
-				return new FolderSourceContainer(folder, nested);
-			} 
-			abort(SourceLookupMessages.FolderSourceContainerType_11, null); 
-		}
-		abort(SourceLookupMessages.FolderSourceContainerType_12, null); 
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ProjectSourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ProjectSourceContainerType.java
deleted file mode 100644
index 7dfbb6c..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/ProjectSourceContainerType.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.debug.internal.core.sourcelookup.containers;
-
-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.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * The type for creating/restoring a project source container.
- * 
- * @since 3.0
- */
-public class ProjectSourceContainerType extends AbstractSourceContainerTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		ProjectSourceContainer project = (ProjectSourceContainer) container;
-		Document document = newDocument();
-		Element element = document.createElement("project"); //$NON-NLS-1$
-		element.setAttribute("name", project.getContainer().getName()); //$NON-NLS-1$
-		String referenced = "false"; //$NON-NLS-1$
-		if (project.isSearchReferencedProjects()) {
-			referenced = "true"; //$NON-NLS-1$
-		}
-		element.setAttribute("referencedProjects", referenced);  //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("project".equals(element.getNodeName())) { //$NON-NLS-1$
-				String string = element.getAttribute("name"); //$NON-NLS-1$
-				if (string == null || string.length() == 0) {
-					abort(SourceLookupMessages.ProjectSourceContainerType_10, null); 
-				}
-				String nest = element.getAttribute("referencedProjects"); //$NON-NLS-1$
-				boolean ref = "true".equals(nest); //$NON-NLS-1$
-				IWorkspace workspace = ResourcesPlugin.getWorkspace();
-				IProject project = workspace.getRoot().getProject(string);
-				return new ProjectSourceContainer(project, ref);
-			} 
-			abort(SourceLookupMessages.ProjectSourceContainerType_11, null); 
-		}
-		abort(SourceLookupMessages.ProjectSourceContainerType_12, null); 
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/WorkspaceSourceContainerType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/WorkspaceSourceContainerType.java
deleted file mode 100644
index 460fadd..0000000
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/sourcelookup/containers/WorkspaceSourceContainerType.java
+++ /dev/null
@@ -1,53 +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.debug.internal.core.sourcelookup.containers;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.WorkspaceSourceContainer;
-import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * The type for creating/restoring workspace source containers.
- * 
- * @since 3.0
- */
-public class WorkspaceSourceContainerType extends AbstractSourceContainerTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento) throws CoreException {
-		Node node = parseDocument(memento);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			Element element = (Element)node;
-			if ("workspace".equals(element.getNodeName())) { //$NON-NLS-1$
-				return new WorkspaceSourceContainer();
-			} 
-			abort(SourceLookupMessages.WorkspaceSourceContainerType_3, null); 
-		}
-		abort(SourceLookupMessages.WorkspaceSourceContainerType_4, null); 
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */
-	public String getMemento(ISourceContainer container) throws CoreException {
-		Document document = newDocument();
-		Element element = document.createElement("workspace"); //$NON-NLS-1$
-		document.appendChild(element);
-		return serializeDocument(document);
-	}
-}
diff --git a/org.eclipse.debug.core/doc/.cvsignore b/org.eclipse.debug.core/doc/.cvsignore
deleted file mode 100644
index af3f463..0000000
--- a/org.eclipse.debug.core/doc/.cvsignore
+++ /dev/null
@@ -1,15 +0,0 @@
-book.css
-org_eclipse_debug_core_breakpoints.html
-org_eclipse_debug_core_launchConfigurationComparators.html
-org_eclipse_debug_core_launchConfigurationTypes.html
-org_eclipse_debug_core_launchDelegates.html
-org_eclipse_debug_core_launchers.html
-org_eclipse_debug_core_launchModes.html
-org_eclipse_debug_core_logicalStructureTypes.html
-org_eclipse_debug_core_processFactories.html
-org_eclipse_debug_core_sourceContainerTypes.html
-org_eclipse_debug_core_sourceLocators.html
-org_eclipse_debug_core_sourcePathComputers.html
-org_eclipse_debug_core_statusHandlers.html
-org_eclipse_debug_core_watchExpressionDelegates.html
-schema.css
diff --git a/org.eclipse.debug.core/doc/org_eclipse_debug_core_sourceContainerTypes.html b/org.eclipse.debug.core/doc/org_eclipse_debug_core_sourceContainerTypes.html
deleted file mode 100644
index 98981aa..0000000
--- a/org.eclipse.debug.core/doc/org_eclipse_debug_core_sourceContainerTypes.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HEAD><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<!-- default platform documentation stylesheets -->
-<style>@import url("book.css");</style>
-<!-- default schema documentation stylesheets -->
-<style>@import url("schema.css");</style>
-</HEAD>
-<HTML>
-<BODY>
-<H1><CENTER>Source Container Types</CENTER></H1>
-<p></p>
-<h6 class=CaptionFigColumn id=header>Identifier: </h6>org.eclipse.debug.core.sourceContainerTypes<p></p>
-<h6 class=CaptionFigColumn id=header>Since: </h6>3.0
-<p></p>
-
-<p>
-<h6 class=CaptionFigColumn id=header>Description: </h6>This extension point allows for an extensible set of source container types to be contributed by the debug platform
-         source lookup facilities.</p>
-<p><h6 class=CaptionFigColumn id=header>Configuration Markup:</h6></p>
-<p class=code id=dtd>&lt;!ELEMENT <a name="e.extension">extension</a> (<a href="#e.sourceContainerType">sourceContainerType</a>*)&gt;</p>
-<p class=code id=dtd>&lt;!ATTLIST extension</p>
-<p class=code id=dtdAttlist>point&nbsp;CDATA #REQUIRED<p class=code id=dtdAttlist>id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED<p class=code id=dtdAttlist>name&nbsp;&nbsp;CDATA #IMPLIED&gt;</p>
-<p></p>
-<ul class=ConfigMarkup id=attlistDesc>
-<li><b>point</b> - a fully qualified identifier of the target extension point</li>
-<li><b>id</b> - an optional identifier of the extension instance</li>
-<li><b>name</b> - an optional name of the extension instance</li>
-</ul>
-<br><p class=code id=dtd>&lt;!ELEMENT <a name="e.sourceContainerType">sourceContainerType</a> EMPTY&gt;</p>
-<p class=code id=dtd>&lt;!ATTLIST sourceContainerType</p>
-<p class=code id=dtdAttlist>id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED<p class=code id=dtdAttlist>name&nbsp;&nbsp;CDATA #REQUIRED<p class=code id=dtdAttlist>class&nbsp;CDATA #REQUIRED&gt;</p>
-<p></p>
-<ul class=ConfigMarkup id=attlistDesc>
-<li><b>id</b> - The unique id used to refer to this type</li>
-<li><b>name</b> - The name of this source container type use for presentation purposes.</li>
-<li><b>class</b> - A class that implements ISourceContainerType</li>
-</ul>
-<br><h6 class=CaptionFigColumn id=header>API Information: </h6>Value of the attribute <b>class</b> must be a fully qualified name of a Java class that implements the interface <b>ISourceContainerType</b>.
-<p></p>
-
-<br>
-<p class=note id=copyright>
-<p>
-  <a href="hglegal.htm">
-   <img SRC="ngibmcpy.gif"
-     ALT="Copyright (c) 2003 IBM Corporation and others. All Rights Reserved."
-     BORDER=0 height=14 width=324></a>
-  </p>
-<p></p>
-
-</p>
-</BODY>
-</HTML>
diff --git a/org.eclipse.debug.core/doc/org_eclipse_debug_core_sourcePathComputers.html b/org.eclipse.debug.core/doc/org_eclipse_debug_core_sourcePathComputers.html
deleted file mode 100644
index 9305403..0000000
--- a/org.eclipse.debug.core/doc/org_eclipse_debug_core_sourcePathComputers.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HEAD><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<!-- default platform documentation stylesheets -->
-<style>@import url("book.css");</style>
-<!-- default schema documentation stylesheets -->
-<style>@import url("schema.css");</style>
-</HEAD>
-<HTML>
-<BODY>
-<H1><CENTER>Source Path Computers</CENTER></H1>
-<p></p>
-<h6 class=CaptionFigColumn id=header>Identifier: </h6>org.eclipse.debug.core.sourcePathComputers<p></p>
-<h6 class=CaptionFigColumn id=header>Since: </h6>3.0
-<p></p>
-
-<p>
-<h6 class=CaptionFigColumn id=header>Description: </h6>Defines an extension point to register a computer that can describe a default source lookup path for
-         a launch configuration. Source path computers are associated with launch configuration types via the
-         launchConfigurationTypes extension point. As well, a source path computer can be associated with a
-         specific launch configuration via the launch configuration attribute ATTR_SOURCE_PATH_COMPUTER_ID.</p>
-<p><h6 class=CaptionFigColumn id=header>Configuration Markup:</h6></p>
-<p class=code id=dtd>&lt;!ELEMENT <a name="e.extension">extension</a> (<a href="#e.sourcePathComputer">sourcePathComputer</a>*)&gt;</p>
-<p class=code id=dtd>&lt;!ATTLIST extension</p>
-<p class=code id=dtdAttlist>point&nbsp;CDATA #REQUIRED<p class=code id=dtdAttlist>id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED<p class=code id=dtdAttlist>name&nbsp;&nbsp;CDATA #IMPLIED&gt;</p>
-<p></p>
-<ul class=ConfigMarkup id=attlistDesc>
-<li><b>point</b> - a fully qualified identifier of the target extension point</li>
-<li><b>id</b> - an optional identifier of the extension instance</li>
-<li><b>name</b> - an optional name of the extension instance</li>
-</ul>
-<br><p class=code id=dtd>&lt;!ELEMENT <a name="e.sourcePathComputer">sourcePathComputer</a> EMPTY&gt;</p>
-<p class=code id=dtd>&lt;!ATTLIST sourcePathComputer</p>
-<p class=code id=dtdAttlist>id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED<p class=code id=dtdAttlist>class&nbsp;CDATA #REQUIRED&gt;</p>
-<p></p>
-<p class=ConfigMarkup id=elementDesc>
-Defines an extension point to register a computer that can describe a default source lookup path
-            for a launch configuration.</p>
-<br>
-<ul class=ConfigMarkup id=attlistDesc>
-<li><b>id</b> - The unique id used to refer to this computer.</li>
-<li><b>class</b> - A class that implements ISourcePathComputer.</li>
-</ul>
-<br><h6 class=CaptionFigColumn id=header>API Information: </h6>Value of the attribute <b>class</b> must be a fully qualified name of a Java class that implements the interface <b>ISourcePathComputer</b>.
-<p></p>
-
-<br>
-<p class=note id=copyright>
-<p>
-  <a href="hglegal.htm">
-   <img SRC="ngibmcpy.gif"
-     ALT="Copyright (c) 2003 IBM Corporation and others. All Rights Reserved."
-     BORDER=0 height=14 width=324></a>
-  </p>
-<p></p>
-
-</p>
-</BODY>
-</HTML>
diff --git a/org.eclipse.debug.core/hglegal2003.htm b/org.eclipse.debug.core/hglegal2003.htm
deleted file mode 100644
index 47c8540..0000000
--- a/org.eclipse.debug.core/hglegal2003.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-  <LINK REL="stylesheet" HREF="book.css" CHARSET="ISO-8859-1" TYPE="text/css">
-  <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright (c) 2000, 2003 IBM Corporation and others. All Rights Reserved.
-</body>
-</html>
diff --git a/org.eclipse.debug.core/ngibmcpy2003.gif b/org.eclipse.debug.core/ngibmcpy2003.gif
deleted file mode 100644
index c786e43..0000000
--- a/org.eclipse.debug.core/ngibmcpy2003.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.core/plugin.properties b/org.eclipse.debug.core/plugin.properties
deleted file mode 100644
index 732d0f7..0000000
--- a/org.eclipse.debug.core/plugin.properties
+++ /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
-###############################################################################
-
-pluginName=Debug Core
-providerName=Eclipse.org
-launcherExtensionPointName=Launcher
-breakpointExtensionPointName=Breakpoint
-launchConfigurationTypeNameExtensionPointName=Launch Configuration Type
-launchConfigurationComparatorsExtensionPointName=Launch Configuration Comparators
-statusHandlerExtensionPointName=Status Handler
-sourceLocatorsExtensionPointName=Source Locator
-launchModesExtensionPointName=Launch Modes
-launchDelegatesExtensionPointName=Launch Delegates
-watchExpressionDelegatesName= Watch Expression Delegates
-processFactoriesExtensionPointName=Process Factories
-logicalStructureTypesExtensionPointName=Logical Structure Types
-logicalStructureProvidersExtensionPointName=Logical Structure Providers
-sourceContainerTypesName = Source Container Types
-sourcePathComputersName = Source Path Computers
-
-run=&Run
-debug=&Debug
-profile=&Profile
-runAs.label=&Run As
-debugAs.label=&Debug As
-profileAs.label=&Profile As
-
-env_var.description=Returns the value of an environment variable. An environment variable name must be specified as an argument.
-system_var.description=Returns the value of an Eclipse system variable. A variable name must be specified as an argument - one of ARCH, ECLIPSE_HOME, NL, OS, or WS.
-system_property.description=Returns the value of a system property from the Eclipse runtime. A system property name must be specified as an argument.
-
-containerName.archive = Archive
-containerDescription.archive = A jar or zip in the workspace containing source files
-containerName.externalArchive = External Archive
-containerDescription.externalArchive = A jar or zip in the local file system containing source files
-containerName.project = Project
-containerDescription.project = A project in the workspace
-containerName.folder = Workspace Folder
-containerDescription.folder = A folder in the workspace
-containerName.directory = File System Directory
-containerDescription.directory = A directory in the local file system
-containerName.workspace = Workspace
-containerDescription.workspace = All projects in the workspace
-containerName.default = Default
-containerDescription.default = Default source lookup path
diff --git a/org.eclipse.debug.core/plugin.xml b/org.eclipse.debug.core/plugin.xml
deleted file mode 100644
index 75fc4a9..0000000
--- a/org.eclipse.debug.core/plugin.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-<!-- Extension points -->
-   <extension-point id="breakpoints" name="%breakpointExtensionPointName" schema="schema/breakpoints.exsd"/>
-   <extension-point id="launchConfigurationComparators" name="%launchConfigurationComparatorsExtensionPointName" schema="schema/launchConfigurationComparators.exsd"/>
-   <extension-point id="launchConfigurationTypes" name="%launchConfigurationTypeNameExtensionPointName" schema="schema/launchConfigurationTypes.exsd"/>
-   <extension-point id="launchModes" name="%launchModesExtensionPointName" schema="schema/launchModes.exsd"/>
-   <extension-point id="launchDelegates" name="%launchDelegatesExtensionPointName" schema="schema/launchDelegates.exsd"/>
-   <extension-point id="launchers" name="%launcherExtensionPointName" schema="schema/launchers.exsd"/>
-   <extension-point id="sourceLocators" name="%sourceLocatorsExtensionPointName" schema="schema/sourceLocators.exsd"/>
-   <extension-point id="statusHandlers" name="%statusHandlerExtensionPointName" schema="schema/statusHandlers.exsd"/>
-   <extension-point id="watchExpressionDelegates" name="%watchExpressionDelegatesName" schema="schema/watchExpressionDelegates.exsd"/>
-   <extension-point id="processFactories" name="%processFactoriesExtensionPointName" schema="schema/processFactories.exsd"/>
-   <extension-point id="logicalStructureTypes" name="%logicalStructureTypesExtensionPointName" schema="schema/logicalStructureTypes.exsd"/>
-   <extension-point id="sourceContainerTypes" name="%sourceContainerTypesName" schema="schema/sourceContainerTypes.exsd"/>
-   <extension-point id="sourcePathComputers" name="%sourcePathComputersName" schema="schema/sourcePathComputers.exsd"/>
-   <extension-point id="logicalStructureProviders" name="%logicalStructureProvidersExtensionPointName" schema="schema/logicalStructureProviders.exsd"/>
-
-<!-- Extensions -->
-   <extension
-         id="breakpointMarker"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.marker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-      <attribute
-            name="org.eclipse.debug.core.modelIdentifier">
-      </attribute>
-      <attribute
-            name="org.eclipse.debug.core.enabled">
-      </attribute>
-      <attribute
-            name="org.eclipse.debug.core.registered">
-      </attribute>
-      <attribute
-            name="org.eclipse.debug.core.persisted">
-      </attribute>
-   </extension>
-   <extension
-         id="lineBreakpointMarker"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.debug.core.breakpointMarker">
-      </super>
-      <super
-            type="org.eclipse.core.resources.textmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         point="org.eclipse.team.core.fileTypes">
-      <fileTypes
-            type="text"
-            extension="launch">
-      </fileTypes>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchModes">
-      <launchMode
-            label="%run"
-            launchAsLabel="%runAs.label"
-            mode="run">
-      </launchMode>
-      <launchMode
-            label="%debug"
-            launchAsLabel="%debugAs.label"
-            mode="debug">
-      </launchMode>
-      <launchMode
-            label="%profile"
-            launchAsLabel="%profileAs.label"
-            mode="profile">
-      </launchMode>
-   </extension>
-<!-- Dynamic (String Substitution) Variables -->	
-   <extension
-         point="org.eclipse.core.variables.dynamicVariables">
-      <variable
-            name="env_var"
-            resolver="org.eclipse.debug.internal.core.EnvironmentVariableResolver"
-            description="%env_var.description">
-      </variable>
-      <variable
-            name="system"
-            resolver="org.eclipse.debug.internal.core.SystemVariableResolver"
-            description="%system_var.description">
-      </variable>
-      <variable
-            name="system_property"
-            resolver="org.eclipse.debug.internal.core.SystemPropertyResolver"
-            description="%system_property.description">
-      </variable>      
-   </extension>
-   
-<!-- ====================== -->
-<!--  source containers     -->                        					 
-<!-- ====================== -->
-   <extension
-         point="org.eclipse.debug.core.sourceContainerTypes">
-      <sourceContainerType
-            name="%containerName.project"
-            class="org.eclipse.debug.internal.core.sourcelookup.containers.ProjectSourceContainerType"
-            id="org.eclipse.debug.core.containerType.project"
-            description="%containerDescription.project">
-      </sourceContainerType>
-      <sourceContainerType
-            name="%containerName.folder"
-            class="org.eclipse.debug.internal.core.sourcelookup.containers.FolderSourceContainerType"
-            id="org.eclipse.debug.core.containerType.folder"
-            description="%containerDescription.folder">
-      </sourceContainerType>
-      <sourceContainerType
-            name="%containerName.directory"
-            class="org.eclipse.debug.internal.core.sourcelookup.containers.DirectorySourceContainerType"
-            id="org.eclipse.debug.core.containerType.directory"
-            description="%containerDescription.directory">
-      </sourceContainerType>
-      <sourceContainerType
-            name="%containerName.workspace"
-            class="org.eclipse.debug.internal.core.sourcelookup.containers.WorkspaceSourceContainerType"
-            id="org.eclipse.debug.core.containerType.workspace"
-            description="%containerDescription.workspace">
-      </sourceContainerType>      
-      <sourceContainerType
-            name="%containerName.default"
-			class="org.eclipse.debug.internal.core.sourcelookup.containers.DefaultSourceContainerType"
-            id="org.eclipse.debug.core.containerType.default"
-            description="%containerDescription.default">
-      </sourceContainerType>    
-      <sourceContainerType
-            name="%containerName.archive"
-			class="org.eclipse.debug.internal.core.sourcelookup.containers.ArchiveSourceContainerType"
-            id="org.eclipse.debug.core.containerType.archive"
-            description="%containerDescription.archive">
-      </sourceContainerType>      
-      <sourceContainerType
-            name="%containerName.externalArchive"
-			class="org.eclipse.debug.internal.core.sourcelookup.containers.ExternalArchiveSourceContainerType"
-            id="org.eclipse.debug.core.containerType.externalArchive"
-            description="%containerDescription.externalArchive">
-      </sourceContainerType>      
-   </extension>
-   
-<!-- ===================================== -->
-<!--  launch configuration comparators     -->                        					 
-<!-- ===================================== -->
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationComparators">
-      <launchConfigurationComparator
-            attribute="org.eclipse.debug.core.source_locator_memento"
-            class="org.eclipse.debug.internal.core.sourcelookup.SourceLocatorMementoComparator"
-            id="org.eclipse.debug.core.sourceLocatorMementoComparator">
-      </launchConfigurationComparator>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.debug.internal.core.DebugPreferenceInitializer">
-      </initializer>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.debug.core/r2_0_buildnotes_platform-debug.html b/org.eclipse.debug.core/r2_0_buildnotes_platform-debug.html
deleted file mode 100644
index 90f26fd..0000000
--- a/org.eclipse.debug.core/r2_0_buildnotes_platform-debug.html
+++ /dev/null
@@ -1,1102 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes for the 2.0 release</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 20, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20365">20365</a>: Bidi - NPE when closing Eclipse<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 19, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20492">20492</a>: Extra separator in run/debug history menus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19878">19878</a>: Collapse/expand symbol (+/-) dissappears in inspect window<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19998">19998</a>: NullPointerException when launching rsource that has no extension<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20066">20066</a>: TVT2: Hardcoded "None" in debug preferences<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20594">20594</a>: Preference listeners should use equals, not ==<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 12, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19928">19928</a>: Run/Debug menu ordering<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 11, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17462">17462</a>: IllegalArgumentException when printing long stack to console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19375">19375</a>: Duplicate launch config naming problem<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19170">19170</a>: LaunchConfigurationDialog etc leakage when last launched is Runtime<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19740">19740</a>: Content assist is now retargetable<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 10, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19613">19613</a>: LaunchConfig marked PRIVATE shows in Console View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19338">19338</a>: Missing copyrights<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 7, 2002
-<h3>
-What's new in this drop</h3>
-<li>API change - a spelling mistake was fixed in the name of a method in IPersistableSourceLocator</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18789">18789</a>: Source editor not given focus on suspend<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19170">19170</a>: LaunchConfigurationDialog etc leakage when last launched is<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18772">18772</a>: Launch Configurations: Table is cut off on motif<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19379">19379</a>: Debug remembers selected state of toolbar entry even if it is no longer enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19443">19443</a>: IPersistableSourceLocator has misspelled method<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19489">19489</a>: References to IDebugViewAdapter (DOC)<br>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 1, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18209">18209</a>: Unable to run a program on first attempt<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 31, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15671">15671</a>: Strange behavior of the console view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17017">17017</a>: Not always prompted to find source location<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18334">18334</a>: Launch view holding onto Objects longer than necessary<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18153">18153</a>: launch last and run/debug buttons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18385">18385</a>: NPE during launching after removing the launch info<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16946">16946</a>: several Eclipse buttons are too short<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18474">18474</a>: Empty group in history menus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16764">16764</a>: Debug Perspective leaks actions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10383">10383</a>: Help pass for 2.0<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16152">16152</a>: NLS pass<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16379">16379</a>: Launch configs tree is missing label and is not wide enough<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 30, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17087">17087</a>: Launch view, source lookup and closed projects<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17029">17029</a>: DCR: Please let me specify a launch history size of 20<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16378">16378</a>: Missing icons in launch config creation tabs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18156">18156</a>: Debug/Run As cascade menu should be sorted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16462">16462</a>: Not all tabs visible in Run-time Workbench config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18154">18154</a>: Launch shortcuts menu labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16685">16685</a>: Internal error changing launch history preference<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16963">16963</a>: Mneumonic missing on table label for Select Launch Configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16975">16975</a>: Up/down button on launch history page not working correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17512">17512</a>: Missing mneumonics in Console Preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18222">18222</a>: All XML written using platform line delimiters/UTF8<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16955">16955</a>: NPE opening java perspective.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17633">17633</a>: ActionDelegateHelper should nullify fTextEditor when it does not need it<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17380">17380</a>: Launch history maintains duplicate entries<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14406">14406</a>: Debug menu items becoming disabled inappropriately<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17794">17794</a>: Disabled actions in the context menu of the Launch config dialog viewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17358">17358</a>: Revert button not enabled after changes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17116">17116</a>: Launch related walkbacks in .log<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 29, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18099">18099</a>: Change provider name<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17490">17490</a>: F1 help for launch config tabs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18121">18121</a>: Static menus items should be at the top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17649">17649</a>: ObjectCollectedException written to console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16838">16838</a>: Over zealous error logging when config has been deleted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17105">17105</a>: Attempt to save shared launch configs in closed projects<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18122">18122</a>: Scrapbook configs show up in list for Launch history pref page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16970">16970</a>: ClassCastException out of Launch history preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16492">16492</a>: CommonTab Switch to String<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16956">16956</a>: NPE opening java perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17100">17100</a>: Launch Config name with underscore is truncated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16638">16638</a>: Missing menmonic on Debug Action Groups page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17072">17072</a>: "Show Supported Breakpoints" has just one calorie, not meaningful enough<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17946">17946</a>: Generalize launch shortcuts/convenience actions<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 28, 2002
-<h3>
-What's new in this drop</h3>
-<li>New/replaced extension point. The extension point "org.eclipse.debug.ui.launchConfigurationShortcuts" has
- been replaced with "org.eclipse.debug.ui.launchShortcuts". Please see extension point documentation
- for details.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 27, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16757">16757</a>: Launch.removeDebugTarget does not work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17534">17534</a>: Two huge bugs in Launch class<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17676">17676</a>: Run menu history menus not updated after organize favorites<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17069">17069</a>: NPE deleting project with shared config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16655">16655</a>: Streams are not closed when a java program is finished<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 21, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16185">16185</a>: Show/hide package names button in doesn't work in debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15964">15964</a>: Updates to preference pages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16476">16476</a>: TextViewerGotoLineAction$NumberValidator<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 19, 2002
-<h3>
-What's new in this drop</h3>
-<li>API change - deprecated method was removed - ILaunchConfigurationTab.isValid()</li>
-<li>New extension point - org.eclipse.debug.core.launchConfigurationComparator. This 
- extension point is for launch configuration attributes that require a custom
- equality implementation. See documentation for extension point.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15704">15704</a>: Default "Maximum launch history size" should be at least 10<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15560">15560</a>: Cancel button on edit Configurations is much smaller than others<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15952">15952</a>: Remove deprecated method<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15953">15953</a>: No longer expanding debug target to show threads<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15988">15988</a>: ArrayIndexOutOfBoundsException in config reselection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16107">16107</a>: NPE opening editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16063">16063</a>: Preference pages now re-size<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16060">16060</a>: Re-sizable launch config dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15850">15850</a>: LaunchView changes required from platform ui changes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16143">16143</a>: Multiple *.launch filters<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12032">12032</a>: Debug Constants should include value in javadoc<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6485">6485</a>: Extension & Package documentation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16217">16217</a>: launch config "revert" causes flicker<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16325">16325</a>: Content assist action icon<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16356">16356</a>: NPE out of ConsoleDocumentManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16148">16148</a>: IProcess should support an exit value<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14927">14927</a>: Cancel button in progress monitor of launch configuration dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15775">15775</a>: Deleting launch config should select the next config<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16113">16113</a>: Execution arguments gets lost if starting a class file of a jar library<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 14, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13766">13766</a>: Error recovery on failed launch - need to bring up dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11540">11540</a>: Misc Debugger source lookup dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15506">15506</a>: Switching launch configs should show busy cursor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15618">15618</a>: DebugDropDownAction missing resource string<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15375">15375</a>: ClassCastException trying to resume<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15720">15720</a>: Debug perspective should define place holders for standard views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12316">12316</a>: Message (stack trace) silently written to console when trying to run small java example<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=4130">4130</a>: Eclipse Debugger: Setting Breakpoints via keyboard not possilbe (1GITILH)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15449">15449</a>: 'show detail pane' toolbar button behaves differently than other buttons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12904">12904</a>: Creating shard Launch Configuration fails<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15748">15748</a>: Duplicate action in launch config dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16848">15848</a>: Change Debug Menu id<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15533">15533</a>: DebugAction contains redundant cascade menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14922">14922</a>: Config created by double clicking on launch type; delete not enabled<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 08, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9034">9034</a>: Variables view should scroll to display new variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12001">12001</a>: Plug-in startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14412">14412</a>: Launch configuration XML should be written to file immediately<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15246">15246</a>: Allow private launch configs to perspective switch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15325">15325</a>: Remove 'Configuration' from debug action labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1636">1636</a>: Copy/paste across console docs (1GF61GB)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13457">13457</a>: Should expose launch history length as user preference<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15024">15024</a>: Launch configuration dialog doesn't display "favorite" option<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15180">15180</a>: DND.ERROR_CANNOT_SET_CLIPBOARD must be handled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14657">14657</a>: LaunchDropDownAction and coolbar support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14897">14897</a>: many missing '...' on buttons in launch configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15362">15362</a>: Standard out not always hooked to console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15446">15446</a>: first click in the debug/launch history preference page results in exception<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11894">11894</a>: Mneumonic collision in the debug menu<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 30, 2002
-<h3>
-What's new in this drop</h3>
-<li>Changes in the launch configuration dialog:
-	<ul>
-	<li>To free up screen real estate for editing launch configurations, the tree of launch
-		configurations has been made more narrow by removing the "copy" button from the
-		dialog. The "new" button copies a configuration when a configuration is selected, and
-		creates a new configuration (based on the workbench selection) when a configuration
-		type is selected.</li>
-	<li>The "Cancel" button has been replaced with a "Close" button (closing the dialog
-		does not cancel changes). You will be prompted to save unsaved changes.</li>
-	<li>A "Revert" button has been added to the edit area to revert changes on the 
-		currently selected launch configuration (under edit).</li>
-	</ul>
-</li>
-<li>Changes to launch behavior
-	<ul>
-	<li>Pressing the run or debug toolbar buttons launches the configuration that was last launched
-		(in the workspace), in the appropriate mode (run or debug).</li>
-	<li>To create a new launch configuration, use the cascading menu items on the run or debug
-		menu. For example "New Configuration -> Local Java Application" - this will create a new 
-		configuration based on the selection in the workbench (or active editor).</li>
-	<li>"Single-click launching" preference has been removed. It was determined that a preference
-		which changes the behavior of a toolbar button is disorienting to the user.</li>
-	</ul>
-</li>
-<li>Changes to ILaunchManager
-	<ul>
-	<li>API for setting default launch configuration types has been removed.</li>
-	</ul>
-</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13537">13537</a>: DebugActionGroups: Clearer wording in preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13909">13909</a>: Inconsistent margins on preference pages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11889">11889</a>: Buttons too small in the Console and Launch Configuration Preference pages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13513">13513</a>: Running a debug view in a Java perspective has several problems<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13536">13536</a>: DebugActionGroups: Collision on ID wipes out both action groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13317">13317</a>: New Configuration menu empty<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14560">14560</a>: Deleting breakpoint selects another breakpoint in the wrong direction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14143">14143</a>: Breakpoints View appears with "Go to file" button enabled regardless of breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9834">9834</a>: Views do not remember package visibility filter settings<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11904">11904</a>: Debug menu mneumonics<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14797">14797</a>: NumberFormatException if cancel Go to line in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13440">13440</a>: menu reorganization<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14550">14550</a>: Need to be able to make launch configuration type invisible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6388">6388</a>: Variables view's static and field buttons are backwards<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14495">14495</a>: clipboards must be disposed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13665">13665</a>: Debug preference page looks cluttered<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14485">14485</a>: Cannot delete a launch config using the Delete key<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14486">14486</a>: Default perspective for Run should not be Debug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11697">11697</a>: Debug Preference Page needs group box<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14540">14540</a>: Relaunch action not enabled correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14556">14556</a>: Enable breakpoint action using old selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14520">14520</a>: Debug plugins should provide consistent unique identifier access<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12577">12577</a>: Launch configurations wizard - usability<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13555">13555</a>: Edit configuration dialog UI confusing<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12292">12292</a>: Unable to suspend a running thread to see stack frames<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 23, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13836">13836</a>: Missing and duplicated extensions in debug plugin.xml<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12125">12125</a>: NLS debug projects<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14111">14111</a>: Console terminate button not enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13041">13041</a>: Remove all terminated action incorrectly enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13372">13372</a>: Strange UI feedback when breakpoint hit during evaluation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13430">13430</a>: Open on Type in console can work better; less beep<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12184">12184</a>: IncompatibleThreadStateException on launchAdded<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14190">14190</a>: Stack dumps noticed in log<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14125">14125</a>: Debug view "Resume" always jumps to source - menu item does not<br>
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12132">12132</a>: Can't launch debugger if proxy set.<br>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 18, 2002
-<h3>
-What's new in this drop</h3>
-<ul>
-<li>Support for old launchers has been removed (ILauncher, ILauncherDelegate, ILaunchWizard).
-	Launch configruations now rule the launching world.</li>
-<li>The extension point "org.eclipse.debug.ui.launchTabs" has been removed and replaced with
- a new extension point "org.eclipse.debug.ui.launchTabGroups".</li>
-<li>The constants IDebugUIConstants.PREF_AUTO_SHOW_DEBUG_VIEW & IDebugUIConstants.PREF_AUTO_SHOW_PROCESS_VIEW
- have been removed.  Users can now set a default perspective for each of Run & Debug which may be
- overridden in a launch configuration.</li>
-</ul>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13385">13385</a>: Showing detail should be disabled when multi-select in var view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12788">12788</a>: Cut, copy, paste actions don't work in details pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8590">8590</a>: Allow position of "step debug" in step tools<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12982">12982</a>: Need ability to set initial state of debug view based on AbstractDebugView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13554">13554</a>: Incorrect dependencies: result is NPE in DebugActionGroupsManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13714">13714</a>: Pressing Apply makes tabs disappear<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13307">13307</a>: NPE in launch configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12382">12382</a>: Action set part association for the launch view?<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13285">13285</a>: Debug/Run With use old launchers when in config mode<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13425">13425</a>: Double click to expand/contract tree in variable and expression views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13864">13864</a>: npe on lanuning (latest after 0412)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12281">12281</a>: Launch configuration tab widgets are private<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13501">13501</a>: hostname cut off when show qualified names is off<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12257">12257</a>: remove single event handling support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12722">12722</a>: Actions for configuration dialogs should appear on Debug menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13324">13324</a>: Change of selection lost in Launch configuration dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11942">11942</a>: Single click launching preference text<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13088">13088</a>: NPE in the log after exiting workspace<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13565">13565</a>: Properties page for process should not contain defaults/apply buttons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13853">13853</a>: native code error<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13613">13613</a>: Delegating presentation and #setAttribute()...<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12962">12962</a>: Same target shows up twice in drop-downs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13375">13375</a>: Show Detail Pane in popup menu missing mneumonic<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12785">12785</a>: Select all in the details pane selects all variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13383">13383</a>: Copy variables action not enabled correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13993">13993</a>: Debug and Run buttons have been accidentally swapped<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12953">12953</a>: Action "type" constants should be moved from AbstractDebugView to IDebugView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14124">14124</a>: Launch configuration classes not in launch configuration package<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 11, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12677">12677</a>: Single click launching and F11, Ctrl-F11<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13214">13214</a>: ArrayOutOfBoundException in launch history pref page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13480">13480</a>: NPE creating Java Project when running Runtime Workbench<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13345">13345</a>: exception in log - after opening/closing projects<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13085">13085</a>: DebugActionGroups cannot handle two actions with same ID in views<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 09, 2002
-<h3>
-What's new in this drop</h3>
-<li>A new extension point exists in the debug ui to control the types of launch configurations that can
- be created from the cascading "New run/debug configuration" menu (off the run/debug dropdown menus).
- A type of configuration can be contributed to mulitple perspectives.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1696">1696</a>: DCR: Perspective specific launcher filtering (1GIYJXH)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11733">11733</a>: duplicate shared config after close & restart<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11899">11899</a>: Launch config name collission<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12658">12658</a>: Single click launching doesn't work if the active editor isn't selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12488">12488</a>: Launch config dialog should allow double-click on config type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11710">11710</a>: Deleting a launch configuration leaves no selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12598">12598</a>: Launch config - tab group API inconvenience<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11190">11190</a>: cannot set working directory if it includes a japanese character<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12160">12160</a>: Launch creation/lifecycle<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8772">8772</a>: Infinitely looping stack trace in target pgm locks UI<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12619">12619</a>: Exception during startup.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10282">10282</a>: Rendering of changed variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12310">12310</a>: Need ability to determine if a breakpoint applies to a target<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12981">12981</a>: Launcher - listed name does not match given name<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9825">9825</a>: Action icon inconsistencies<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12891">12891</a>: Several IOExceptions from .log in StreamsProxy.write(StreamsProxy.java:92)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11906">11906</a>: Useless single click launch for classes with no main<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12276">12276</a>: Index out of bounds exception from launch configuration dialog<br>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 2, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12289">12289</a>: Breakpoint should extend platform object<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12548">12548</a>: Debug event filters should use event sets<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12613">12613</a>: Exception when on target workspace when starting eclipse<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 28, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11756">11756</a>: Launch config dialog: button sizes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11923">11923</a>: Console preference page needs reworking<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11880">11880</a>: Launch ConfigurationType property page missing accelerator<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11925">11925</a>: Up/down buttons for launch history restricted to single select<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11457">11457</a>: Launch Configuration Dialog issues<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11702">11702</a>: Launch configuration defaults are set after widgets are initialized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11330">11330</a>: JavaEnvironmentTab depends on JavaMainTab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11053">11053</a>: Launch view too optimistic on source lookup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11982">11982</a>: Logging exceptions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12339">12339</a>: NPE when i switch to debug perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7609">7609</a>: Attempting to go to a marker that no longer exists<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11326">11326</a>: Restore instead of rebuild launch config index<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11720">11720</a>: Need replacement for #hasChildren<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 26, 2002
-<h3>
-What's new in this drop</h3>
-<li>Breaking API change: IDebugViewAdapter had been renamed to IDebugView</li>
-<li>Launch configurations are the default launch mechanism.</li>
-<li>Debug events are reported in sets. @see IDebugEventSetListener and IDebugEventListener</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11610">11610</a>: Doc: identifier for launch extension points are incorrect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11401">11401</a>: API on ILaunch.getDebugTarget() <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11303">11303</a>: Deadlock on startup processing breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11919">11919</a>: 2 NPEs using Preferences->Debug->Launch Configuration Types<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6212">6212</a>: Debug view toolbar/menu pollution<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11849">11849</a>: Duplicate history items showing up<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10448">10448</a>: IExpressionManager#hasExpression, IBreakpointManager#hasBreakpoints,etc.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10817">10817</a>: configs in java packages get copied to output folder<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11207">11207</a>: IDebugViewAdapter should be named IDebugView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11612">11612</a>: Agressive clearing of instruction pointer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12025">12025</a>: Invalid thread access out of Launch configurations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12229">12229</a>: Set default launching style to configuration based<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9650">9650</a>: Variable change notification bug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12157">12157</a>: Debug event sets<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 18, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11197">11197</a>: Feature request: Delete in breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11212">11212</a>: Debug UI plugin.xml references jdt<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11308">11308</a>: Launch configurations make workspace non-transportable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11346">11346</a>: Registering a launch multiple times is not handled well<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10586">10586</a>: Use new workbench selection service<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11425">11425</a>: ILaunchConfiguration JavaDoc is incorrect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11189">11189</a>: Flicker in the Launch Configurations dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11253">11253</a>: Launch config tab flicker<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11370">11370</a>: Launch view update bug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11462">11462</a>: Launch config metadata change generates parse exception<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10637">10637</a>: "currently active project" should be the "current working directory"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10162">10162</a>: Console View to front on error output only<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8937">8937</a>: Feature Request: Select all in the breakpoints view<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 12, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10775">10775</a>: New, delete copy of Launch configurations remain disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10780">10780</a>: Delete and Copy enabled for Launch configuration type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10778">10778</a>: Launch configuration names should be trimmed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6376">6376</a>: Should be possible to remove entries from the "Run list"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10855">10855</a>: Use new workbench API for show perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10610">10610</a>: Null exception when lauchviewer processing events on remove tree items<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8420">8420</a>: Cannot edit ExpressionView detail area until after inspect.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11076">11076</a>: Delete configs reamin in favorite list<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9922">9922</a>: Null pointer in launch configuration type property page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7605">7605</a>: Feature: Doubleclicking in launch config dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11072">11072</a>: History menu update<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8294">8294</a>: "Debug History" and "Run History" have empty submenus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11133">11133</a>: NPE in LaunchView.initializeSelection()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11110">11110</a>: NPE in AbstractListenerActionDelegate.pageActivated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10847">10847</a>: API - AbstractLaunchConfiguration tab<br>
-<h3>
-
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 05, 2002
-<h3>
-What's new in this drop</h3>
-<li>Launch Configuration API has changed. The launch configuration tab lifecycle is now similar
- to that of preference and wizard pages.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9680">9680</a>: Launch config: pressing save returns to first tab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9660">9660</a>: Launch Config Flicker<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10524">10524</a>: Provide default label provider API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10506">10506</a>: NPE in launch view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10582">10582</a>: SWT Exception closing a Debug Perspective in JUnit test<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7207">7207</a>: Launch configuration bugs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7430">7430</a>: Debug perspective not reused<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10652">10652</a>: Remove action enabled when nothing to be removed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7430">7430</a>: Debug perspective not reused<br>
-<h3>
-Problem Reports Closed</h3>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-February 28, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10243">10243</a>: ClassCastException when removing a breakpoint<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-February 26, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7767">7767</a>: Changing from "Debug View"<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-February 14, 2002
-<h3>
-What's new in this drop</h3>
-<li>As part of the transition to configuration-based launching, early adopters may
-continue to access the launch configuration dialog by Shift-clicking the run and debug
-buttons, but configuration-based launches will NOT appear in the history, and
-CANNOT be relaunched.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9166">9166</a>: NPE in preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9167">9167</a>: LaunchConfigurationLabelDecorator should not be on by default<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9483">9483</a>: NPE in LaunchConfigurationTypePropertyPage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9652">9652</a>: IllegalArgumentException out of Console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9704">9704</a>: NPE on shutdown in BreakpointsView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9167">9167</a>: LaunchConfigurationLabelDecorator should not be on by default<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-February 12, 2002
-<h3>
-What's new in this drop</h3>
-<li>Removed deprecated constant IDebugUIConstants.ID_PROCESS_VIEW</li>
-<li>Basic icons and their support has been removed</li>
-<li>Breakpoint property sheet has been replaced with breakpoint properties dialog.
- Choose "Properties..." from the pop-up menu in the breakpoints view.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8230">8230</a>: Console does not show process as <terminated>; better tracking of changes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9194">9194</a>: Attempting to modify locked resource tree in BreakpointManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9200">9200</a>: Editor not opening for suspended stack frame with modified prefs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9218">9218</a>: NPE in LaunchConfigurationLabelDecorator.isLaunchConfigFile<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9280">9280</a>: Debug event handlers performing runnables after dispose<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9057">9057</a>: API - CHANGE event should be better specified<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9111">9111</a>: Invalid thread access running test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6370">6370</a>: Breakpoint Properties Dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9327">9327</a>: JavaDebugOptionsManager startup loading breakpoints during resource changed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9200">9200</a>: Editor not opening for suspended stack frame with modified prefs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9178">9178</a>: Remove All Terminated always disabled?<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9065">9065</a>: WID opening editor for breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8296">8296</a>: Debug With menu items have interesting numbering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9421">9421</a>: NPE out of the LaunchView on shutdown with running target<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7301">7301</a>: no way to switch to custom debug perspective on debug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5311">5311</a>: Missing debug information should be conveyed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1683">1683</a>: Extra Action delegates (1GIGUK0)<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9299">9299</a>: NPE in LaunchView.showMarkerForCurrentSelection<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-February 05, 2002
-<h3>
-What's new in this drop</h3>
-<li>Launch configuration infrastructure and UI is available for early adopters.
-Developers that have contributed launchers should migrate to launch configurations. To
-access launch configurations from the workbench, press the run/debug buttons while holding
-the SHIFT key down.</li>
-<li>The debugger indicates variables that have changed since the last suspend. See <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1533">1533</a>.</i>
-<li>The debug action set has been renamed from Debug/Run to Debug. See <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8729">8729</a>.</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8729">8729</a>: Rename Debug action set from "Debug/Run" to "Debug"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8945">8945</a>: Non-Persisted breakpoint can be incorrectly deleted at startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7965">7965</a>: Debug view refresh flicker<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1533">1533</a>: Feature: notification of changing variables (1G5NRPC)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1721">1721</a>: Small Feature: separate disable/enable breakpoints (1GKKEI5)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8245">8245</a>: Launch preferences page problems<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1621">1621</a>: Debugger doesn't come to front when breakpoint is hit (1GEUZEX)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9102">9102</a>: Remove & Terminate walkback<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6807">6807</a>: launch configurations not crash proof<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-January 29, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7837">7837</a>: Launch configuration page verifier error<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8235">8235</a>: Ctrl-space does not work for code assist in details pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7763">7763</a>: (usability) selecting in variables view with details pane causes un-maximize<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7814">7814</a>: API for char range within a line<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8501">8501</a>: "Disable all" breakpoints action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7864">7864</a>: Need API for selection changes in debug view<br>
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-January 24, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8059">8059</a>: NPE out of ControlActionDelegate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8005">8005</a>: Terminate & Remove disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8063">8063</a>: NPE in BreakpointsView when closing workbench<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=8318">8318</a>: internal error occured, if open the menu "Debug -> Debug History"<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-January 22, 2002
-<h3>
-What's new in this drop</h3>
-<li>Breakpoint API has been updated to allow selective persistence of breakpoint
-of the same type</li>
-<li>Breakpoint API now allows for "hidden" breakpoints. @see IBreakpoint.isRegistered()</li>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7578">7578</a>: .metadata launch files not in correct location<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7626">7626</a>: Widget is disposed error relaunching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1710">1710</a>: DCR - Launcher should have control over perspective switching (1GJUT9J)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6480">6480</a>: Launch configurations - store with workspace<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7961">7961</a>: updating source twice per suspend event<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7507">7507</a>: debugger keyboard shortcuts do not work in 20020109<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=2990">2990</a>: Internal errors when fast clicking in debug stack (1GLDZVH)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7974">7974</a>: Stack overflow pression "remove all" from Expression View<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1563">1563</a>: Fully qualified rendering of launch element name (1GD7U0Z)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7418">7418</a>: Need the Process view back<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7627">7627</a>: Tooltips not working in debug views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7755">7755</a>: The Breakpoints pane should highlight the breakpoint where the debugger stops<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5141">5141</a>: Breakpoint manager can use new marker API<br>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-January 15, 2002
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6088">6088</a>: Move "qualified name" rendering to java debug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7420">7420</a>: "Debug UI.xml" references JDT<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7580">7580</a>: NPE out of AbstractDebugEventHandler on shutdown<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7513">7513</a>: Terminate and remove fails to remove when timeouts occur<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7316">7316</a>: Inconsistent casing for Show detail pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7370">7370</a>: TimeoutException occurs during stepping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1714">1714</a>: Confusion of launches from different projects in history (1GJYNLK)<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-January 9, 2002
-<h3>
-What's new in this drop</h3>
-<li>The debugger now uses the workbench editor re-use policy.</li>
-<li>There is no longer a Process view. The Debug view shows all debug
-sessions and processes launched. When a workspace is re-started that
-had a Process view open, an error message will appear explaining that
-the Process view could not be created.</li>
-<li>The debug action set has been split into two groups - debug and launch.
-Existing debug and Java perspectives need to be closed and re-opened to obtain
-run and debug buttons in the toolbar. @see bug 1724.</li>
-<li>There is no longer an Inspector view - it has been replaced with an
-Expressions view. When a workspace is re-started that had an Inspector
-view open, an error message will appear explaining the Inspector view
-could not be created.</li>
-<li>A launch can be annotated with client specific data. @see bug 6481.</li>
-<li>A launch can now contain more than one debug target. API has changed
- in ILaunch, ILaunchListener, and ILaunchManager to suppport this.</li>
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7120">7120</a>: NPE during shutdown of DebugUIPlugin<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6954">6954</a>: Use new workbench API for openning perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6206">6206</a>: Make AbstractDebugView API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7151">7151</a>: Toggling ShowDetailPaneAction sets focus to the launch view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7164">7164</a>: NPE during shutdown to do with DebugSelectionManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1724">1724</a>: Feature: split debug action set in to debug & launch (1GKCQVZ)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7167">7167</a>: NPE shutting down in abstract debug view 'save state'<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6771">6771</a>: DebugEvent constructors changed to take IDebugElement<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1574">1574</a>: Settings in debug views not persisted (1GDTUNW)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6105">6105</a>: Step accelerators should not take focus from editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1671">1671</a>: Option to autoclear terminated processes (1GHSO3L)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6357">6357</a>: Combine Process/Debug Views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6200">6200</a>: Extensible set of debug elements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7204">7204</a>: Copy variables action needs icon<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7031">7031</a>: Inspector is missing a toString area<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6213">6213</a>: Breakpoints view improvements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6213">6481</a>: Feature: Annotate launch with transaction id<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1617">1617</a>: type names not always shown in inspector (1GEULC4)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6484">6484</a>: Ability for "super adaptor"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6783">6783</a>: Console should not steal focus while writing output<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7277">7277</a>: Step detail events for into/over/return<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6214">6214</a>: More that one debug target per lanuch<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6482">6482</a>: Ability to group debug targets in one launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6215">6215</a>: Exception handling in variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1688">1688</a>: Object display options (1GIKMIG)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1606">1606</a>: Feature: Source Lookup (1GEPJEN)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1553">1553</a>: Handling of no source is confusing (1GC2TVU)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7166">7166</a>: Remove terminated launches preference does not applied correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7169">7169</a>: Debug "F" keys not enabled properly on new editor<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-December 18, 2001
-<h3>
-What's new in this drop</h3>
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5260">5260</a>: TVT: Properties view for debug process is missing substitution variable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6321">6321</a>: Console IOException<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7003">7003</a>: Debug With menu launches incorrect program (not finding selection)<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1548">1548</a>: Extensible launch modes (1GBEQYO)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1592">1592</a>: DebugPlugin must allow for null elements in updateHistory() (1GEI3C1)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6886">6886</a>: Request: Keep perspective when running application<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1627">1627</a>: Previous editor's unsaved contents are still visible (1GEX5LS)<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-December 11, 2001
-<h3>
-What's new in this drop</h3>
-	<ul>
-	<li>The "relaunch last" action has been remapped to use F9 instead of F10.
-	Please see "<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6387">6387</a>: Can't use F10" for details.
-	</li></ul>
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6387">6387</a>: Can't use F10 <br>
-<h3>
-Problem Reports Closed</h3>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-December 6, 2001
-<h3>
-What's new in this drop</h3>
-<ul>
-</ul>
-
-<h3>
-Problem Reports Fixed</h3>
-
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6521">6521</a>: Variables view stays empty with stack frame selected (1GLE8PW) <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6577">6577</a>: NPE in DebugContentProvider<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6598">6598</a>: Problem using old workspace with new build <br>
-<h3>
-Problem Reports Closed</h3>
-
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-December 4, 2001
-<h3>
-What's new in this drop</h3>
-<ul>
-</ul>
-
-<h3>
-Problem Reports Fixed</h3>
-
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6321">6321</a>: Console IOException <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6216">6216</a>: Help for debug views in 1.0 <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6521">6521</a>: Newly added resources cannot be checked out <br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1715">1715</a>: Consider removing state change actions from BreakpointsView (1GKKT90)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1559">1559</a>: Debugger doesn't pop to front when breakpoint hit (1GD7P7D) <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1564">1564</a>: README: printf's in native code only show up in console at the end of execution (1GD80QZ) <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1588">1588</a>: README: System.exit(0) from Scrapbook (1GE8JU3) <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5485">5485</a>: NPE if missing launcher when using launch history <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1770">1770</a>: Last launch not updated upon deletion (1GLEANH) <br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 27, 2001
-<h3>
-What's new in this drop</h3>
-<ul>
-<li>Procedural Debug API - new debug element interfaces have been defined to support the notion of registers,
-register groups, memory blocks, and memory block retrieval:
-	<ul>
-	<li>IRegister - a register in a register group</li>
-	<li>IRegisterGroup - register groups are available from each stack frame (that supports registers)</li>
-	<li>IMemoryBlock - a contiguos block of bytes from memory allocated by a running program</li>
-	<li>IMemoryBlockRetrieval - support to retrieve arbitrary blocks of memory from a running program</li>
-	</ul>
-</li>
-</ul>
-
-<h3>
-Problem Reports Fixed</h3>
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1720">1720</A>: Issue: breakpoint manager breaks lazy plug-in load rule (1GK<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6097">6097</A>: The inspector is not refresh<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 20, 2001
-<h3>
-What's new in this drop</h3>
-<ul>
-<li>API Change - method addition - @see ILaunch.getLaunchConfiguration(). This does
-not break any clients, as the only implementation of ILaunch is org.eclipse.debug.core.Launch,
-which has been updated.</li>
-<li>API Change - method return value - @see ILaunch.getLauncher(). A launch
-is now allowed to return null for #getLauncher() when it was created by a launch
-configuration rather than a launcher. This does not break any clients, as launch configurations
-are not in use yet. The main client that will have to be updated is the Debug UI.</li>
-<li>New debug preference - "Build (if required) before launch"</li>
-</ul>
-
-<h3>
-Problem Reports Fixed</h3>
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=4023">4023</A>: Prompt user for save and build before run  (1GGCBO0)<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5818">5818</A>: Debugger Source Lookup page claims project is closed<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5895">5895</A>: NPE out of the Console view on shutdown<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5896">5896</A>: NPE out of LaunchManagerVisitor on shutdown<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1623">1623</A>: StackFrame selected but toolbar actions disable (1GEV0L7)<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5681">5681</A>: Show debug perspective doesn't reuse my perspective<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5909">5909</A>: Should have terminate on Debug menu<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5582">5582</A>: Keyboard shortcut for run/debug<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5789">5789</A>: Console Empty on Hello World Examples<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5951">5951</A>: Console buffer not flushed?<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5946">5946</A>: NPE  in LaunchManagerVisitor<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5808">5808</A>: Console output being lost<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5925">5925</A>: DebugView does not survive platform crash<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 13, 2001
-<h3>
-What's new in this drop</h3>
-
-<h3>
-Problem Reports Fixed</h3>
-
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5360">5360</A>: ListenerList#removeAll<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5613">5613</A>: Debugger hangs when it hits breakpoints during self hosting<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=4269">4269</A>: Simplifying debugger perspective (1GKRAWI)<br>
-
-
-<h3>
-Problem Reports Closed</h3>
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5588">5588</A>: General Protection Fault double clicking on breakpoint in th<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5795">5795</A>: Reached Breakpoint, but no stacktrace<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 12, 2001
-<h3>
-What's new in this drop</h3>
-<ul>
-<li>Draft definition and infrastructure for launch configurations.</li>
-<li>API Change: Presentation of variable value details allows for long running
-computation. @see IDebugModelPresentation.computeDetail(IValue, IValueDetailListener). @see IValueDetailListener.
-</ul>
-
-<h3>
-Problem Reports Fixed</h3>
-
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5686">5686</A>: Launch/Run actions should be available on menubar<br>
-<A HREF="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5579">5579</A>: Would like option to switch to Debug perspective on breakpoi<br>
-
-<h3>
-Problem Reports Closed</h3>
-
-
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r2_1_buildnotes_platform-debug.html b/org.eclipse.debug.core/r2_1_buildnotes_platform-debug.html
deleted file mode 100644
index 3e0da8c..0000000
--- a/org.eclipse.debug.core/r2_1_buildnotes_platform-debug.html
+++ /dev/null
@@ -1,410 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 25, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35459">35459</a>: "Run As ..." menu disabled<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 24, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35410">35410</a>: VariableView#fExpandedVariables is not always cleaned<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-March 17, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32335">32335</a>: Eclipse M5, launcher, arguments tab truncated<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-March 13, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=34901">34901</a>: Typos(?)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=34899">34899</a>: Typos<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=34554">34554</a>: console: locking during 6 second clear request on big contents<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-March 6, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33767">33767</a>: Step with filters label<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32335">32335</a>: Eclipse M5, launcher, arguments tab truncated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33993">33993</a>: NPE in launch config getMemento<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33996">33996</a>: Making a shared favorite config does not appear in fav's<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-March 4, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32631">32631</a>: Problem with text input from console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32668">32668</a>: Invalid thread access disposing process drop down menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32706">32706</a>: Can re-enable LCD when disabled for run in foreground<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32621">32621</a>: Console Pref page: punctuation and capitalization<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33289">33289</a>: Console: ShowProcess tooltip should use book capitilization<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29752">29752</a>: Removal of the "launchers" extension point<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31519">31519</a>: action set part associations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33579">33579</a>: NPE in launch view event handler on shutdown<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33613">33613</a>: NPE in console line notifier<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32722">32722</a>: Attempting two background builds at same time: lose console document<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33620">33620</a>: NPE attempting to launch from a LCD with no selection area (Run Ant...)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33153">33153</a>: Debug As and Run As actions are ignored if there is no selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33185">33185</a>: Activate workbench when breakpoint hit should be on by default<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32775">32775</a>: BadLocationException on file hyperlink from ant build<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Feb 20, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18665">18665</a>: Launch progress message bar is too short<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32191">32191</a>: LaunchManager added too late as resource changed listener<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31431">31431</a>: Show In...from the Console to the Debug View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32247">32247</a>: Missing hashCode in org.eclipse.debug.internal.core.LaunchConfigurationInfo<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32176">32176</a>: Hyperlink on wrapped line draws line badly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32275">32275</a>: Debug console selection shows the wrong information<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30513">30513</a>: Step actions should be disabled when debug view closed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31161">31161</a>: Dialogs don't use standard platform spacing for buttons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31216">31216</a>: Offer Show In...<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31734">31734</a>: Console line trackers not notified of last line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=11991">11991</a>: Renamed config not updated in history<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31745">31745</a>: No feedback for navigating links in console using keyboard<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30586">30586</a>: NPE opening editor in LaunchView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=32433">32433</a>: ShowProcessAction reference to its process keeps hyperlinks in memory<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Feb 18, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31565">31565</a>: Selecting part of stack trace in console loses focus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29326">29326</a>: Launch configuration with errors can be launched<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29045">29045</a>: StringIndexOutOfBoundsException from Console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31394">31394</a>: New console UI does not provide a "Clear History" option<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31898">31898</a>: Error in the status bar without any text selected in the console<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Feb 13, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30901">30901</a>: Dialog flicker when launching a program<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31500">31500</a>: Double click for create a new launch configuration<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Feb 11, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31321">31321</a>: disable/enable breakpoints does not scale<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31502">31502</a>: Refactor LaunchHistoryPreferenceTab<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Feb 5, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30411">30411</a>: Exceptions deleting Launch Configurations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28148">28148</a>: Debug and Run toolbar actions missing mneumonics<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30493">30493</a>: No need for the verify key listener in the VariablesView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22815">22815</a>: Support delete key in viewers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30125">30125</a>: Provide inforpops for launch configuration types<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30332">30332</a>: Not enough IDisconnect support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28827">28827</a>: Run Screen Sizing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30167">30167</a>: Would like a way to navigate back from debugger to corresponding launch config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30333">30333</a>: Problem when multiple debug events occur at the same time<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30831">30831</a>: Console View: Terminate and Clear are too close<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29503">29503</a>: Debug preference page error messaging<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Jan 28, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29877">29877</a>: Chkpii errors in debug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28295">28295</a>: ConcurrentModificationException during "Run Ant..." build<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18306">18306</a>: Use safe runnables for listeners and "untrusted" code<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30037">30037</a>: Use platform support for breakpoint persistence<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29843">29843</a>: tooltip of the debug and run buttons displays "Debu&g" and "Ru&n"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30307">30307</a>: Apparent mispelled catalog reference in Expressions pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30222">30222</a>: External tool builder build command path is fully qualified<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30324">30324</a>: NPE restoring shared launch config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29112">29112</a>: Add key binding to "open link" action in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30180">30180</a>: Stale launch if runtime-workbench launch is canceled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29028">29028</a>: Stack trace hyperlink does not work after clear<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Jan 21, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24154">24154</a>: Add interfaces to debug core for enhanced debug function...<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27782">27782</a>: Improve Debug UI plug-in startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29660">29660</a>: Only top stack frame icon correct after long step<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29676">29676</a>: Better error reporting when a launch config goes missing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29720">29720</a>: launch dialog for edit/run of a single config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26157">26157</a>: launch config working sets applied globally<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27989">27989</a>: Provide 'final verification' launch configuration API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29450">29450</a>: LaunchManager.searchForFiles optimization<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24821">24821</a>: [Key Bindings] Provide debug action definitions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29153">29153</a>: Migrate extension point schema ownership<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Java Debug</h1>
-Jan 14, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28969">28969</a>: convenience action to open LCD<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27342">27342</a>: No busy cursor when creating new config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25569">25569</a>: Checkbox in launch config doesn't keep its value<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27164">27164</a>: shared launch configs and "validate edit"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29064">29064</a>: Attached source not recognized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27830">27830</a>: Use IActionDelegate2<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28033">28033</a>: external tools dialog title shows as "&External Tools"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27403">27403</a>: Should consider using the new font propogation support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27444">27444</a>: [Dialogs] Dialog font should be used by debug components<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22927">22927</a>: Add word-wrap option to Variables display area<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28127">28127</a>: NPE if AbstractDebugView handling exception early<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22230">22230</a>: #setButtonLayoutData addition<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24754">24754</a>: Preferences - should offer font choice for variable details pane<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Jan 07, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28386">28386</a>: Source selection disappears<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28571">28571</a>: Text selection updates on evaluation end<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10016">10016</a>: Flicker of System.err output in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28060">28060</a>: Launch#canTerminate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24884">24884</a>: Launching progress monitor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28562">28562</a>: details area does not update when BP hit while stepping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=7715">7715</a>: Console does not show output of selected process<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28867">28867</a>: [Console] Navigation between output of hosted/debugged apps<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27172">27172</a>: Hang copying variables with cycle<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29052">29052</a>: ConsolePreferencePage problem<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Dec 17, 2002
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28383">28383</a>: Debug view flashes during stepping<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Dec 16, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28245">28245</a>: No launchAdded notification on first relaunch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28282">28282</a>: Launch view doesn't select stack frame when it is made visible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27011">27011</a>: NPE from LaunchConfigurationTabGroupViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28317">28317</a>: NPE exiting workbench<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Dec 13, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28050">28050</a>: Extra separator if no history, only favorites.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27881">27881</a>: Remote Debug Connection Configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28088">28088</a>: Console view caused NPE when "becomesVisible"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27092">27092</a>: Only update variables/expressions when visible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28227">28227</a>: NPE painting console document<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28100">28100</a>: Re-factor "isVisible" debug view function<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25437">25437</a>: Console Performance when output alternates between streams<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Dec 10, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27139">27139</a>: Common tab has duplicate accelerator<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23216">23216</a>: Shared launches marked as favorites do not show up after importing existing project<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23951">23951</a>: Flicker when closing launch config dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26333">26333</a>: Improve launch manager startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24715">24715</a>: Launch dialog open return codes are internal<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14758">14758</a>: ILaunchConfigurationTab#performApply called twice on hitting the Apply button<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26335">26335</a>: Improve debug plug-in startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27834">27834</a>: LaunchHistory registers unnecessary listener<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27607">27607</a>: Better Ant project names<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26503">26503</a>: launch groups/dropdown should support shortcuts<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27877">27877</a>: Don't use a marker for stack frame line highlighting<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27816">27816</a>: Re-work launch actions to use launch group framework<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27952">27952</a>: hyperlink region should not be stored in hyperlink<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Dec 03, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27353">27353</a>: ConsoleContentProvider -> ConsoleColorProvider<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27347">27347</a>: Process types<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27200">27200</a>: "Show console when program writes ..." doesn't work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19674">19674</a>: LaunchConfigurationDialog is over 3,000 lines (whew!)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27248">27248</a>: Launch config dialog is grotesquely large<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Nov 26, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18814">18814</a>: Cannot 'save changes' and duplicate a Launch configuration at the same time<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25745">25745</a>: NPE if no tab group specified for a configuration type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26996">26996</a>: get/setAttributes on ILaunchConfiguration/WorkingCopy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26702">26702</a>: Allow single launch config to be edited<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Nov 12, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25701">25701</a>: Instruction pointer disappears<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23477">23477</a>: Most recent launch config lost after each restart<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Nov 05, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1524">1524</a>: Feature: Displaying Instruction pointer (1G3A7CG)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14758">14758</a>: ILaunchConfigurationTab#performApply called twice on hitting the Apply button<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Oct 22, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24738">24738</a>: Launch Config Dialog: Pressing cancel permanently diables 'Apply'<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16817">16817</a>: DebugException: The resource tree is locked for modifications.<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Oct 15, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24364">24364</a>: Investigate opening launch config dialog from inside a delegate's launch() method<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Oct 8, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24270">24270</a>: UI hangs when try to debug with 'bad' VM arguments<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Oct 1, 2002
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24100">24100</a>: LaunchConfigurationWorkingSetPage.setSelection should work without container being set<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Sept 17, 2002
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23124">23124</a>: Presentation of "no source"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23266">23266</a>: NPE exception in VariablesViewContentProvider<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22595">22595</a>: No code assist in details pane<br>
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Aug 27, 2002
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22283">22283</a>: ArrayIndexOutOfBoundsException in launch view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19856">19856</a>: Create a new launch configuration should always be an option in launch configuration wizard<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18877">18877</a>: Flicker in VariablesView when rapid stepping<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-August 06, 2002
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21585">21585</a>: Evaluating expression switches editors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=9687">9687</a>: Should have busy cursor opening editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21640">21640</a>: Show types action in Variables view is confused<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18787">18787</a>: Slightly off message in details pane of Expressions view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15847">15847</a>: Disable Run / Debug buttons in toolbar if no contribution is associated with that mode<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 30, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21504">21504</a>: Both "enable" and "disable" breakpoints actions are enabled when multiple breakpoints are selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20431">20431</a>: Run/debug include in favorites setting ineffective<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 16, 2002
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19099">19099</a>: Console in different window keeps name of terminated and removed debug target<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20504">20504</a>: Launch view accelerator update workaround no longer needed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20602">20602</a>: Potential NPE in AbstractDebugView when subclass does not persist state in memento<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20610">20610</a>: [Console] Terminate button disabled on Clear Console, even when app still running<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20713">20713</a>: 2 requests to change value of variable when enter pressed on invalid value.<br>
-
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r3_0_buildnotes_platform-debug.html b/org.eclipse.debug.core/r3_0_buildnotes_platform-debug.html
deleted file mode 100644
index fb29aed..0000000
--- a/org.eclipse.debug.core/r3_0_buildnotes_platform-debug.html
+++ /dev/null
@@ -1,994 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>3.0 - RC4</p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=68181">68181</a>: [doc] Error in IDebugUIConstants javadoc (launchActionSet)<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>3.0 - RC3</p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61992">61992</a>: Slow selection change in debug view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66586">66586</a>: Debug-related views no longer "come to front" in non-debug perspective<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66990">66990</a>: PopupInformationControl does not specify shell for handler<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66330">66330</a>: Remote Debug Connection not disconnected when JDIDebugModel.newDebugTarget(...) fails<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66443">66443</a>: Review LaunchView call to IEditorReference#getEditor(true)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67522">67522</a>: Views don't open when auto-manage initially activated<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67463">67463</a>: Launch Shortcuts schema is incorrect<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67507">67507</a>: Ampersand ('&') in label when adding directory to source lookup path<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67620">67620</a>: Breakpoints should not be shown in the overview ruler<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65051">65051</a>: string_prompt variable prevents other variables from executing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67781">67781</a>: color tuning<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>3.0 - RC2</p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64638">64638</a>: Don't use new "Run" icon on Debug objects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=45980">45980</a>: Check calls to IWorkspace.run(...)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65067">65067</a>: switch perspective when breakpoint hit not honored<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57293">57293</a>: [doc] Beef up contextViewBinding schema<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66033">66033</a>: Move isAutoManageViews() to LaunchViewContextListener<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63340">63340</a>: Remove DebugContextManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65814">65814</a>: o.e.debug.core.memoryRenderings extension point<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65581">65581</a>: broken doc link for stringVariablePresentations<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65351">65351</a>: Breakpoint migration from 2.1 to 3.0<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64940">64940</a>: Delay on breakpoint rendering when enable/disable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66187">66187</a>: Polish patch: support view activation via a keyboard shortcut<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65356">65356</a>: source lookup tab migration from 2.1 to 3.0<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65072">65072</a>: workbench not activated when breakpoint hit<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64984">64984</a>: Inspect doesn't work in Display View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65039">65039</a>: Launch view should use IPerspectiveListener2<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64666">64666</a>: Run/Debug prompts to continue before compiling [JUnit]<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=52336">52336</a>: [Viewers] Internal error at start of debug session<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62677">62677</a>: Adding working set to Source Lookup Tabs causes problems in the tab.<br>
- 
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>June 1, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56012">56012</a>: Consistency in space at top of launch configuration tabs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64188">64188</a>: Classcast exception when trying to resolve non-stackframe object<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63468">63468</a>: ConsoleView should set it's title using setContentDescription()<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64019">64019</a>: IllegalArgumentException when editing ant builder<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63449">63449</a>: Wrong menu path for profile action set.<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61117">61117</a>: enable checkbox state after "Show Breakpoints Supported by Selected Target"<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62322">62322</a>: Green triangle for Run is confused with the Resume button<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63951">63951</a>: Wrong window activated when new window is opened<br> 
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>May 25, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63323">63328</a>: Move "show debug action set" to LaunchView<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63493">63493</a>: LaunchView keeps lots of state from last debug session in memory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63016">63016</a>: Display view always brought to the top<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64337">64337</a>: unqualified source lookup fails in external archive<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62803">62803</a>: ExternalArchiveSourceContainer needs to handle multiple root paths<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>May 21, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63348">63348</a>: NPE from popup<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63374">63374</a>: NPE in LaunchView.partClosed<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63575">63575</a>: Invalid button states in EnvironmentTab of Launch Configuration<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>May 20, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62798">62798</a>: Ok to launch Yes/No should also honor cancel<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62960">62960</a>: NullPointerException when restoring default in Source Lookup Tab<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62677">62677</a>: Adding working set to Source Lookup Tabs causes problems in the tab.<br>  
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63009">63009</a>: Source Lookup Tab does not properly show icons for Jar files<br>  
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63182">63182</a>: Warning about error in pre-requisite wrong<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63090">63090</a>: Console scroll button has its logic reversed.<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63053">63053</a>: View Management view menu drop down has no mnemonic<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63249">63249</a>: uneccessary error logging<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63029">63029</a>: Show As for logical structure has no mnemonic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62564">62564</a>: A runnable may not be run, if the previous one throws an exception<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=54407">54407</a>: Make a pass on all the properties files<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62643">62643</a>: [External Tools] Quoted args send quote to process<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63027">63027</a>: View Management "Reset Now" button does not layed out correctly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56042">56042</a>: [Coolbar] [Workbench] Toolbar flash selecting stack frames<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62592">62592</a>: Debug view can fail to close generic debugging views<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63050">63050</a>: NPE in VariablesViewContentProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62574">62574</a>: Expose Debug view's "view tracking" behavior<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63293">63293</a>: Pressing "Reset Now/Cancel" does not cancel<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63256">63256</a>: NPE when adding a breakpoint in an external Java file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62391">62391</a>: View management: Views opened in wrong perspective<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>May 18, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57519">57519</a>: Console should bold title when new output is available<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=53508">53508</a>: Activate debug action set with debug view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61801">61801</a>: A null String object reference becomes the value "null"<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62069">62069</a>: NullPointerException in LaunchViewContextListener#initViewCollection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61940">61940</a>: Customized perspective opens closed views<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61064">61064</a>: improve string variable descriptions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61116">61116</a>: Common watch expressions don't work for wrapper adapters<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60024">60024</a>: Memory view code could make use of Debug plugin logging support<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61385">61385</a>: Remove debug action group doc<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=47295">47295</a>: Hard to pin down a console<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62236">62236</a>: Debug color settings should NOT be shown in Workbench>Colors and Fonts<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61938">61938</a>: Add source location dialog always selects Java Classpath Variable<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62193">62193</a>: No RunToLine action in context menu<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62488">62488</a>: Default pref settings<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62490">62490</a>: out-of-box experience<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61412">61412</a>: Source lookup tab causes config to need saving<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=44632">44632</a>: Debug view need to be error-proof<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61958">61958</a>: dangerous practice of catching Throwable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60327">60327</a>: Review LaunchViewContextListener multi-window behavior<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56412">56412</a>: Duplicate favorites after rename<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61630">61630</a>: schema for external tools configurationDuplicationMaps ext point<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55400">55400</a>: context menu&gt;watch from the variables view doesn't open/activate the expressions view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62258">62258</a>: No vertical scroll bar on inspect results<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61826">61826</a>: Add file extension filtering for run/debug context menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=51435">51435</a>: CommonSourceNotFoundEditor#resetEditor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60016">60016</a>: Accessibility: Run config, Arguments tab: Working directory not read<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61868">61868</a>: Double tree viewer in debug view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61917">61917</a>: use .exsd for extension pt schemas<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62202">62202</a>: Run context menu does not filter actions based on enabled activities<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62269">62269</a>: Uneccessary label computation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=61928">61928</a>: Launch Views leaking<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>May 11, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=54598">54598</a>: Launch configuration; wizard buttons New/Delete margins<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57637">57637</a>: turn Remove All Terminated Launches on by default<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60305">60305</a>: Layout problems on the Environment tab<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58384">58384</a>: Profile toolbar launch menu should use "Profile As &gt;"<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=51916">51916</a>: Add ability to change source lookup of a running launch<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58725">58725</a>: [Debug] "Switch to assciated perspective when launching" should set to "Prompt" by default<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60286">60286</a>: API Request: Ability to open launch configuration properties dialog on a specific tab<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60838">60838</a>: Support matchesContentType property test<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=45656">45656</a>: New Annotation Features<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59319">59319</a>: make scroll lock global to all process consoles<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60927">60927</a>: notifyResult(...) in OpenLaunchDialogAction<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60952">60952</a>: Chkpii errors in I20040504<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60364">60364</a>: debug used deprecated runtime code<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61321">61321</a>: ui.console should not depend on core.resources<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60918">60918</a>: [KeyBindings] Some key bindings not working<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60974">60974</a>: make org.eclipse.debug.internal.ui.views.console.ProcessConsolePage.getConsoleViewer() method public<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61105">61105</a>: Configure view management per perspective<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60010">60010</a>: Auto manage view action move to view menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61221">61221</a>: No progress dialog when prompted to wait for build<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57763">57763</a>: NPE running from scrapbook<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61166">61166</a>: source not found<br> 
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61120">61120</a>: Should closed projects be skipped?<br>  
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55423">55423</a>: don't schedule build if already building<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=41376">41376</a>: Incorrect english: doesn't account for case where launch config type starts with vowel<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=53722">53722</a>: Run As... menu disabled if selection is empty<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61634">61634</a>: Compile errors in workspace message should be more general<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61336">61336</a>: Compile errors prompt should use a warning dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61291">61291</a>: Breakpoint view is displayed when a breakpoint is hit<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57052">57052</a>: [KeyBindings] F11 (Debug Last Launched) Conflict on MacOS X<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=46168">46168</a>: fork() methods should use jobs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61427">61427</a>: LaunchConfigurationDialog leaked for each use<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=54946">54946</a>: Contextual launch contribution should not set adaptable=true<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60051">60051</a>: Launching with Ant buildfile errors <br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61308">61308</a>: Display var/expression shows in unreadable popup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57333">57333</a>: Provide API to specify whether a substitution variable supports arguments<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57164">57164</a>: Context view activation should maintain view "stack"<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57588">57588</a>: Removing process from launch doesn't remove associated console<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61810">61810</a>: NPE in the log<br>
- 
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>May 4, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60064">60064</a>: Memory preference page is missing mnemonic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60254">60254</a>: Change required in AbstractMemoryRenderer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56146">56146</a>: Memory View Contribution to Eclipse<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56827">56827</a>: NPE - ExpressionManager expects a delegate for all debug models<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57862">57862</a>: Ability to configure variables from variable selection dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=54726">54726</a>: Fix schema reference in launch shortcut extension<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=51503">51503</a>: Add filter button to Expressions view to show expressions by debug target<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59776">59776</a>: Migrate memory view pref page to view setting<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60203">60203</a>: Launch job waiting forever<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60655">60655</a>: Memory Block is not enabled / disabled by the Memory View properly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59986">59986</a>: Move from ProgressMonitorDialog to IProgressService.busyCursorWhile()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57272">57272</a>: AlwaysNeverDialog should have "Eclipse standard" look<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60708">60708</a>: Edit String Substitution Variable dialog does not use the dialog font<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58933">58933</a>: Remove activity filtering in Breakpoints view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59330">59330</a>: migrate to new search API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59183">59183</a>: Cancelling foreground launch waits for build to complete<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59535">59535</a>: Opening launch configuration dialog with "profile" mode.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59356">59356</a>: LaunchConfigurationDelegate needs a way to tell it per instance to not put up status prompts.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=60409">60409</a>: Use of deprecated fontDefinition extension point<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59854">59854</a>: Debug keybindings wrong on Mac<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59990">59990</a>: function keys not working<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58528">58528</a>: User prompted to switch to debug when debug perspective is active<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>April 27, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58957">58957</a>: breakpoints : Remove BreakpointManagerListener on dispose<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57305">57305</a>: flashing breakpoints view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57173">57173</a>: Activity filtering not working for debug<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58684">58684</a>: Installed JRE can't be named "."<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=42138">42138</a>: Provide a way to dynamically change the process label shown in the console title and debug view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=47164">47164</a>: Need to be able to disable go to file action for breakpoints.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57517">57517</a>: eval popup are initially too small<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57735">57735</a>: When including assert tags in private method, breakpoint can't be set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59483">59483</a>: Predefine some launch conifiguration variables<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59042">59042</a>: Invalid Launch configurations are never cleaned up<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58725">58725</a>: [Debug] "Switch to assciated perspective when launching" should set to "Prompt" by default<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=39024">39024</a>: Need better icon for object browsers action<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57999">57999</a>: Breakpoints added to view while breakpoint manager disabled are not greyed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58516">58516</a>: HandlerSubmission constructor marked as deprecated<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58766">58766</a>: doc/enhance stratum breakpoint<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59002">59002</a>: Do we need marker definitions for instruction pointers<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57642">57642</a>: [ViewMgmt] debug tests failures due to missing selection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57836">57836</a>: Support to put paths in variable values<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59729">59729</a>: Run-> context menu only enabled for a single selection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56246">56246</a>: InstructionPointerAnnotation and IDebugEditorPresentation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58209">58209</a>: Support multi-select for Resume action<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58377">58377</a>: 'Esc' out of change variable dialog doesn't cancel action<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58650">58650</a>: replace debugModelActivityBinding with pattern binding<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59828">59828</a>: Various issues with SelectedResourceManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=7552">7552</a>: Keep breakpoints when renaming a resource<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>April 20, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58290">58290</a>: Launch error message spelling<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56850">56850</a>: DebugViewDecoratingLabelProvider.computedText never cleared<br>  
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=29890">29890</a>: Debug Platform Source Lookup Facilites<br>  
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=45877">45887</a>: When selecting "Build before launching", the build is not specific to the project launched, but the whole workspace<br>  
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58754">58754</a>: Wait for build never and prompt preferences reversed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55419">55419</a>: Generalize compilation error detection for other launchers<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56191">56191</a>: Skip breakpoints in run-to-line<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57306">57306</a>: Improve progress feedback when user wants to wait on build before a launch<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>April 13, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=57790">57790</a>: Support multiple debug-model-to-context extensions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53222">53222</a>: Trigger activities when debug elements selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53640">53640</a>: Registers view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=57929">57929</a>: Scope step actions with debuging context<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=58052">58052</a>: Launch view can open views in the wrong window<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=57788">57788</a>: API changes to IHandler causing compile errors<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>April 6, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56235">56235</a>: Organize Favorites dialog could remember size<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56266">56266</a>: Reorder preference choices for Save dirty editors<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56966">56966</a>: Skip All Breakpoints should have a keyboard shortcut<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=30639">30639</a>: Debug preference pages cut of in High Contrast<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57328">57328</a>: NPE from ResourceResolver<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55685">55685</a>: Get rid of MoveResultToViewerAction<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55808">55808</a>: SelectedResourceManager holds onto selections too long<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56192">56192</a>: Remove unused command for close popup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55612">55612</a>: Rename "Run" keybinding category to "Run/Debug"<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56035">56035</a>: Console text font should be moved to Workbench Appearance<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=51901">51901</a>: Breakpoint image specification is on jdt.ui instead of debug.ui<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56214">56214</a>: ProjectSourceContainer#getSourceContainers() and referenced projects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=51084">51084</a>: Launch view should not track view open/close during perspective reset<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=52524">52524</a>: Blocked launch dialog should offer cancel as an option<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56013">56013</a>: Remove the use of the deprecated shared icons<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56070">56070</a>: New and Delete buttons remained disabled after cancelling search<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=53548">53548</a>: Automatically close views that were opened automatically<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>March 30, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56677">56677</a>: AssertionFailed from LaunchConfigurationView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56082">56082</a>: no junit test for LaunchConfigurationDelegate.preLaunchCheck()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55309">55309</a>: Leak: RetargetWatchpointAction hangs onto last activated part<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56672">56672</a>: 'Marker id not found' error in breakpoint view during fast create/delete breakpoint actions<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>March 25, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55704">55704</a>: Step into selection leads to too many breakpoints being skipped<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56238">56238</a>: Continue Launch when compile errors preference: Never<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>March 23, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53677">53677</a>: Remove "debug popup" scope when dialogs support key bindings<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52613">52613</a>: [New Look] Duplicate debugger perspective opened while stopping at brk pt<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55124">55124</a>: Warning reported in the builds<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36495">36495</a>: Debugger support for roles and activities<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55040">55040</a>: Don't provide ILaunchListener2 API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54925">54925</a>: want option to not run programs with errors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54631">54631</a>: debug view opens while prompting for perspective change<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6400">6400</a>: DCR - suggestion to improve running vs. debugging<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55183">55183</a>: Preference to switch perspective on suspend is too eager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55442">55442</a>: ClassCastException in LaunchViewEventHandler<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55194">55194</a>: "String" problems with the DebugPreferencePage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=55430">55430</a>: "[KeyBindings] Migrate Popup keybinding support to new EnabledSubmission API<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>March 16, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50156">50156</a>: Disable "Use Step Filters" toggle for targets that do not support step filters<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54189">54189</a>: Disable "Use ToggleAutoManageViewsActionDelegate is missing required id<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37485">37485</a>: Icons for launch short-cuts should be optional<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44234">44234</a>: Type names always qualified in expressions view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53223">53223</a>: Expression popup should also show toString()/details<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54073">54073</a>: Chkpii warnings in plugin.xml files<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10302">10302</a>: 'Run to Line' stops at breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52809">52809</a>: Evaluating in debugger should not stop on breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38950">38950</a>: Display offset of cursor in variables detail pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10078">10078</a>: Feature: Global enable/disable of breakpoints (and leave breakpoints list untouched)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54182">54182</a>: Two prompts when starting a debug session<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44632">44632</a>: Debug view need to be error-proof<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12746">12746</a>: refactoring support for launch configurations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52017">52017</a>: Add createCheckButton API to AbstractLaunchConfigurationTab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=34345">34345</a>: Disabled watch expression label includes "obsolete"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53001">53001</a>: Need a separator between 'Include type inheriting ...' and 'stop in main' in the main Java launch configuration tab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54859">54859</a>: Breakpoint are not set as non-registered when deleted from the breakpoint view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54117">54117</a>: Contextual Launch should use XML Expression Language<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52952">52952</a>: show all env vars when replacing environment<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48933">48933</a>: Move to use the Platform UI color support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50384">50384</a>: Debugger perspective: default layout improvements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37514">37514</a>: global retargettable breakpoint action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52450">52450</a>: Don't open Expression View by default<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51402">51402</a>: [Generic console] need showConsoleView() method<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51935">51935</a>: Add UI support for variables when specifying environment variable values<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54065">54065</a>: Tooltip text for profile button in toolbar is wrong<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54901">54901</a>: Better error logging when launch configuration blows up<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51568">51568</a>: Numerated accelerators for launch shorts in context menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54924">54924</a>: Variable selection dialog needs mneumonic for Variable Desc<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54619">54619</a>: Doc for breakpoint manager enablement<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>March 9, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14414">14414</a>: Use detail pane for variable value setting<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53636">53636</a>: Label changes after display/inspect popup is visible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53665">53665</a>: NPE with "double click"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48313">48313</a>: Message console does not support tab size<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52964">52964</a>: Persist size of debug pop-ups (or size better)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53470">53470</a>: launch waiting for build shows up in context menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53693">53693</a>: Variables view doesn't show variables.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51787">51787</a>: Stepping in Java Perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53554">53554</a>: Default perspective switching preferences are backwards<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53954">53954</a>: "Change variable value" action.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50886">50886</a>: Update debug markerAnnotationSpecification<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44135">44135</a>: ability to prompt for arguments in run/debug profiles<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>March 2, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52607">52607</a>: console: no action when drop down is pressed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51387">51387</a>: API for retreiving console associated with a process<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52867">52867</a>: New look - console no longer has a view title<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53225">53225</a>: Display keybinding for default close action in debug popup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51386">51386</a>:	Variables view does not persist size of details area<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13933">13933</a>:	Terminating launch does not send launchChanged event<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53313">53313</a>:	StringIndexOutOfBoundsException from LaunchConfiguration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52330">52330</a>:	Logical Structure should have a single value<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52974">52974</a>: NPE in launch dialog when creating a new config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53409">53409</a>: Launch view doesn't persist "views to not close"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49877">49887</a>: Expose the exit value of IProcess<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Feb 24, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29953">29953</a>: Launch configuration not found, many stacktraces in the .log<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=13449">13449</a>: Better description when launch configuration type is selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52397">52397</a>: NPE from AddFavoritesAction and others when rename launch config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52763">52763</a>:	Edit String Substitution Variable dialog clears value on name change<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52170">52170</a>:	Improve debug context inheritance<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Feb 17, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51998">51998</a>: Bad label for a menu item<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51465">51465</a>: Variable subranges<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51635">51635</a>: Debug view is not brought to the front when a breakpoint is hit<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37942">37942</a>: Launch config dialog should have some way to determine the full location of JARs that are listed on the classpath<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Feb 12, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51803">51803</a>: ClassCastException importing preferences<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Feb 10, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18338">18338</a>: Run/Debug in the context menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51388">51388</a>: Show "Selection Not Applicable"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51422">51422</a>: NPE on hitting breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49934">49934</a>: Promote views with debugging contexts<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Feb 3, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50155">50155</a>: New Job#schedule() behavior<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50203">50203</a>: Exception in error log + blank rendered in sessions view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50543">50543</a>: Cannot override PATH environment variable<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Jan 27, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49972">49972</a>: Nothing happens when launching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50232">50232</a>: Missing localizations for extension point names<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49891">49891</a>: Problems launching a program, when using linked resources in CLASSPATH, which are not set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50407">50407</a>: NPE in selected text resolver<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50223">50223</a>: Missing localizations for extension point names<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Jan 20, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46781">46781</a>: Console buffer size limit<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46869">46869</a>: Message console does not buffer output<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49288">49288</a>: Set Variable dialog not sized properly or resizable.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47601">47601</a>: external tools: add ${selection} as a variable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48320">48320</a>: Adapt to annotation deprecations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49977">49977</a>: Less invasive background labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41510">41510</a>: Step with Filters: unify function across languages by allowing filters to be enabled/disabled on the 3 basic step functions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50232">50232</a>: Missing localizations for extension point names<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Jan 13, 2004 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45603">45603</a>: Cycles in string substitutions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46363">46363</a>: Lazy label provider for variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49884">49884</a>: ProcessConsolePage does not deregister hyperlink action<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Dec 15, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48608">48608</a>: Handle null for IProcess#getStreamsProxy()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46868">46868</a>: Changing text color via a MessageStream doesn't update colors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46797">46797</a>: Possible NPE when writing launch configurations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48226">48226</a>: Tooltip text for "External Tools" toolbar button not updated.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47668">47668</a>: Exclude exception location<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37506">37506</a>: RefreshTab makes use of WorkbenchPlugin<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45991">45991</a>: need package.html in "variables" plug-in<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47848">47848</a>: IDebugEditorPresentation methods called in different order<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47855">47855</a>: Review VariableViewToggleAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48224">48224</a>: Target execution order hidden<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47268">47268</a>: Selected launch configuration incorrect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48190">48190</a>: Variables context menu actions need eclipses [...]<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40541">40541</a>: NPE in launch configuration dialog<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Dec 9, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37918">37918</a>: Console uses Date format that is not appropriate for Japanese<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47949">47949</a>: Nothing added to launch history<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47924">47924</a>: Thread label flicker<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47834">47834</a>: No feedback that launch got queued/postponed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47377">47377</a>: Console: order of local toolbar items should remain stable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42272">42272</a>: Resize problem in Launch Config dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41609">41609</a>: invalid tab size (rendering) in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48315">48315</a>: LaunchView thread timer runs too long<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47389">47389</a>: Use of deprecated API from IActivityManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38419">38419</a>: Variable "filters" is a misnomer<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Dec 2, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47478">47478</a>: Switching to use JRE Library container<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47107">47107</a>: Open Resource not available in Debug perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45981">45981</a>: Move debug projects to use PDE dynamic classpath support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46811">46811</a>: Deadlock saving working copied<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 25, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47248">47248</a>: NPE starting run-time workspace<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38979">38979</a>: Should not be able to remove contributed variables<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 21, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47100">47100</a>: TitleAreaDialog image has been disposed<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 20, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47071">47071</a>: Set instruction point layer to 6 in code<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 19, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46858">46858</a>: FileLink needs to resolve an editorId<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 18, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45524">45524</a>: Artwork for array partitions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46728">46728</a>: org.eclipse.ui.console should be tagged as 3.0 plug-in<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44479">44479</a>: Exception when trying to start RuntimeWorkbench while workspace is building<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 11, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43388">43388</a>: Possible problem with DebugPlugin$AsynchJob<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36942">36942</a>: [plan item] Present logical view of Java objects in debugger<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45903">45903</a>: Breakpoint incorrectly enabled after activity filtering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43387">43387</a>: Refresh tab and specific resources<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44566">44566</a>: Refresh tab does not enable "Apply" when changing selection<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Nov 4, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45849">45849</a>: ConcurrentModificationException in Expression manager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43332">43332</a>: String Substitution Support - org.eclipse.core.variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43952">43952</a>: Improve launch tab interface/notification<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44100">44100</a>: UI blocked removing breakpoints from breakpoints view with other jobs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46152">46152</a>: Revise usage of IWorkspace.run<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46035">46035</a>: NPE in Run... pages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45858">45858</a>: User gets prompted multiple times to save the same resources<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Oct 28, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43388">43388</a>: Possible problem with DebugPlugin$AsynchJob<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45195">45195</a>: Debug View: Copy Stack only copies <pending...><br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44856">44856</a>: errors in label update<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44723">44723</a>: Redundant launching job message<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36735">36735</a>: Would like automatic partitioning of large arrays<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44099">44099</a>: organize favorites...<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44577">44577</a>: Suspended debug target not given "suspended" overlay<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Oct 21, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44934">44934</a>: Remove dependancies on Xerces plugin<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Oct 15, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44660">44660</a>: MessageConsole.appendToDocument(...)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44040">44040</a>: IConsoleLineTrackerExtension and after consoleClosed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44012">44012</a>: missing closed notification for console line tracker<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Oct 07, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40609">40609</a>: Launch configuration dialog re-initializes all of the tabs on close<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43226">43226</a>: Deadlock using 0916<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44048">44048</a>: Cannot create New String Substitutions<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Sep 30, 2003 </p>
-<h3>API Changes</h3>
-<ul>
-  <li>Support for variables that support string substitution has been changed. 
-    The previously experimental extension points for simpleLaunchVariables, contextLaunchVariables, 
-    and refreshLaunchVariables have been replaced with new (and yet experimental) 
-    extension points valueVariables and contextVariables. The new support is purely 
-    string based and is currently implemented in internal packages. It is percieved 
-    that the new support could be moved to a new plug-in such that more clients 
-    could leverage the support, as the current implementation is not tied to the 
-    debug plug-in. </li>
-  <li>A console line tracker (IConsoleLineTracker) can be notified when its associated 
-    console is closed (i.e. all of its streams are closed), by implementing the 
-    new interface IConsoleLineTrackerExtension. The notification indicates that 
-    no more output will be appended to the console.</li>
-</ul>
-
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31734">31734</a>: Console line trackers not notified of last line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43608">43608</a>: NPE removing an existing program in the external tools launching configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43477">43477</a>: Console plug-in needs package.html<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43704">43704</a>: LaunchConfiguration.getFile does not handle linked resources: NPE<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41579">41579</a>: Move selection to next suspended thread after resuming<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43197">43197</a>: Race condition between console line tracker and debug terminate event<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Sep 23, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43225">43225</a>: No prompt to save dirty editors <br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43353">43353</a>: Environment variable names all lowercased when appending to native environment<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43331">43331</a>: Rework Refresh Tab to avoid use of "refresh variables"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=43334">43334</a>: Refresh Tab always needs "apply" when working set specified<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33866">33866</a>: Move to using the PDE generated build.xml for exporting plugins<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37263">37263</a>: Support for generic console<br>
- 
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Sep 16, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42570">42570</a>: Promote RuntimeProcess to API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42779">42779</a>: Duplicate entry in expression view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42814">42814</a>: Ability of "override" environment<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42877">42877</a>: Clean up Launch in Background / Run in Background<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19292">19292</a>: Icons for enable/disable breakpoints very confusing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37091">37091</a>: Need icon for environment tab and variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=10668">10668</a>: Variable view - should reselect selected variable name<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42177">42177</a>: Installed JRE's preference page is huge<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40863">40863</a>: Env var usability<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37784">37784</a>: Rename "Debug" preference page to "Run/Debug"<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Sep 09, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42020">42020</a>: Move "Run in background" to builders only<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41866">41866</a>: Reference to IConsoleDocumentContentProvider in error message<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42179">42179</a>: Reevaluate watch expression enabled with no active targets<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41633">41633</a>: ILaunchManager#getLaunchConfigurations returns private configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41352">41352</a>: Incorrect lineAppended notification from ConsoleLineNotifier<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1562">1562</a>: Suspending on a breakpoint...select that breakpoint (1GD5P0D)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42184">42184</a>: Edit->Find action for the console is only enabled after some text is selected<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Sep 2, 2003 </p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41758">41758</a>: "Profile Last Launched" menu item is at the bottom, should be at the top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42218">42218</a>: LAUNCH_CONFIGURATION_DIALOG_LAUNCH_LAST no longer used<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41947">41947</a>: LaunchConfigurationDialog and cancellation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42064">42064</a>: "New Launch Variable" and "Edit Launch Variable" dialogs do not use dialog font<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42189">42189</a>: NPE during shutdown<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-<p>Aug 27, 2003 </p>
-<h3>New Features in Milestone 3 (release 3.0)</h3>
-<h4>Extensible Watch Expressions</h4>
-<p>In release 3.0, the debug platform provides an implementation of watch expressions. 
-  Debug models can contribute watch expression delegates if they support watch 
-  expressions. When a stack frame is selected, the associated delegate is queried 
-  to provide a value for a watch expression in the given (stack frame) context. 
-  The debug platform provides persistence, enabling, disabling, entering, and 
-  editing of watch expressions. See the new extension point <code>org.eclipse.debug.core.watchExpressionDelegates</code> 
-  for more details.</p>
-<h3>API Changes</h3>
-<h4>Launch Tabs &amp; Tab Groups</h4>
-<p>Launch tab groups and launch tabs are no longer notified when a launch completes. 
-  The method <code>launched(ILaunch)</code> in the interfaces <code>ILaunchConfigurationTab</code> 
-  and <code>ILaunchConfigurationTabGroup</code> has been deprecated and is no 
-  longer called. Relying on this method for launch function was always problematic, 
-  since tabs only exist when launching is performed from the launch dialog. Also, 
-  with the introduction of background launching, this method can no longer be 
-  called, as the launch dialog is be closed before the resulting launch object 
-  exists.</p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41675">41675</a>: breakpoints no longer visible in overview ruler<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38842">38842</a>: Make enabling and disabling expressions part of the debug framework.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27493">27493</a>: Re-use "watch list" actions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41940">41940</a>: watch item not updated when enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41941">41941</a>: API method should be internal<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41550">41550</a>: launch in the background<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41977">41977</a>: watch items will not disappear<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42013">42013</a>: Launching should not be UIJob<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42037">42037</a>: Breakpoint not shown as checked when enabled.<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Aug 19, 2003
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41499">41499</a>: Update doc for watchExpressionDelegates extension point<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41448">41448</a>: launch shortcuts should be sorted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41506">41506</a>: NPE attempting to create watch expression<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27281">27281</a>: The watch expressions don't persist across workbench invocations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41575">41575</a>: Can't open breakpoint view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41585">41585</a>: shared launch configurations are not being encoded with UTF-8<br>
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Aug 12, 2003
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41290">41290</a>: Typo: "persepctive" in launch configurations window<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41276">41276</a>: Clarify ILaunchConfiguration#getLocation()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41384">41384</a>: Chkpii errors in debug<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Aug 5, 2003
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40964">40964</a>: Got DebugException when stepping and removing a breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38365">38365</a>: current instruction pointer annotation only added for ITextEditor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40961">40961</a>: Refresh tab indicates working set error when no refresh<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40962">40962</a>: Refresh tab revert enabled incorrectly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19581">19581</a>: Single launch config error logged many time<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 29, 2003
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40576">40576</a>: NPE with pinned console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40844">40844</a>: NPE using debug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35453">35453</a>: Process output causes switch to wrong console view.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35573">35573</a>: Console output on new run or debug<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 22, 2003
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40235">40235</a>: preference page 'launch variables' uses borderless table, which looks suboptimal<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40275">40275</a>: Superfluous semicolons in the generated jdt eval tests<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 15, 2003 
-<h3>New Features in Milestone 2 (release 3.0)</h3>
-<h4>Extensible Debug Events</h4>
-<p>The debug platform supports an extensible set of debug events. A debug event 
-  kind of <code>MODEL_SPECIFIC</code> has been added in the 3.0 release to indicate 
-  an application specific debug event. When a debug event of kind <code>MODEL_SPECIFIC</code> 
-  is created, the detail code in the event is client defined. The source of the 
-  event (debug element that generated the event) identifies the debug model from 
-  which the event was generated. The debug platform and user interface ignores 
-  model specific debug events.</p>
-<p>A data field has been added to debug events to allow clients to store application 
-  specific data in debug events.</p>
-<h4>Extensible Instruction Pointer Images</h4>
-<p>When a stack frame is selected in the debug view, the debugger opens a corresponding 
-  editor and displays an image in the editor ruler on the line that corresponds 
-  to the selected stack frame. In releases prior to 3.0, the images were provided 
-  by the debug plug-in and could not be overridden by a debug model. In release 
-  3.0, a debug model presentation (<code>IDebugModelPresentation</code>) can provide 
-  specialized images by implementing the debug editor presentation interface (<code>IDebugEditorPresentation</code>).</p>
-<h4>Editor Positioning and Custom Decorations</h4>
-<p>In release 3.0, debug model presentations can control the positioning of editors 
-  opened by the debugger for a stack frame, and may add extra decorations to the 
-  editor for a stack frame (for example, custom background coloring, etc.). This 
-  can be acheived by having a debug model presentation implement the new interface 
-  <code>IDebugEditorPresentation</code>, and implementing the appropriate methods 
-  - <code>selectAndReveal</code>,<code> decorateEditor</code>, and <code>removeDecorations</code>.</p>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=33598">33598</a>: Need to dynamically set icon for current line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38976">38976</a>: Cancelling on launch var pref page does not work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38980">38980</a>: var descriptions not persisted.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37793">37793</a>: When moving folders and/or files in the navigator window UI hangs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36147">36147</a>: Launch framework doesn't handle out of sync launch files<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37092">37092</a>: Environment tab variables should be sorted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38534">38534</a>: Duplicate environment variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39979">39979</a>: Edit button should be disabled for multiselect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36597">36597</a>: Would like to say what text attributes to use when selecting the executing statement<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35208">35208</a>: IAE in JavaMainTab when entering project name with path seperator<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39980">39980</a>: Selection of launch variables in the Launch Variable pref page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38324">38324</a>: Double dialog for launch variable is unnecessary<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=40122">40122</a>: NPE in TextEditorSelection.remove<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 9, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39058">39058</a>: Would like "collapse all" action in variable view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38577">38577</a>: Setting detail pane to be visible can hide selected variable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39482">39482</a>: NPE adding Java Watch expressions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39709">39709</a>: Duplicated entries in the debugger<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 1, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38584">38584</a>: Book Capitilization for the tooltip for Toggle Variable Filters<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38508">38508</a>: [Dialog] [Font] Remote Java Application/Connect Page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38302">38302</a>: An IProcess that returns null for getStreamsProxy generates 2 null pointer exceptions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39397">39397</a>: Consolidate variables & general debug preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39208">39208</a>: Context menu "Copy" should show Icon from ISharedImages [Console]<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39344">39344</a>: Convert ProcessMonitor to be a Job<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39258">39258</a>: Launch Configuration dialog: Screen cheese when switching between nodes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=39394">39394</a>: Extensible debug events<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23432">23432</a>: Some exceptions should not be logged.<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 17, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38676">38676</a>: can't debug into class if file/class name identifier has _$$_<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38722">38722</a>: Need restoration of preference store for those actions that are enabled only<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38532">38532</a>: Variables view orientation actions should more closely mimic the type hierarchy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22941">22941</a>: Details area orientation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37241">37241</a>: Support for core variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38837">38837</a>: CHKPII errors with launch variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38972">38972</a>: variable values only persisted when added/removed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38967">38967</a>: simple launch variables & lazy init of plug-in<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38725">38725</a>: Debug context variables missing descriptions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38727">38727</a>: IVariableComponent#setEnabled(boolean)<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 10, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38671">38671</a>: NPE from LaunchVariableManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38649">38649</a>: Plugin.xml and schema validation<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 5, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38423">38423</a>: NPE during creation of varibles view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38529">38529</a>: UI locks up toggline on the variable filters<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38420">38420</a>: Details pane does not populate when first opened<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-June 3, 2003
-
-<h3> Extensible Launch Modes</h3>
-<p>The debug platform supports an extensible set of launch modes. Releases prior 
-  to 3.0 only supported two launch modes - run and debug. The debug platform now 
-  provides an extension point for contributing new launch modes - <code>org.eclipse.debug.core.launchModes</code>. 
-  The debug platform now defines (contributes) three basic launch modes - run, 
-  debug, and profile. Other clients may contribute new launch modes. The launch 
-  manager (<code>ILaunchManager</code>) has additional API to retrieve all launch 
-  modes, and a human readable label for each launch mode.</p>
-<p>The debug platform has a new extension point to support the contribution of 
-  a launch delegate for a specific launch configuration type and launch mode - 
-  <code>org.eclipse.debug.core.launchDelegates</code>. This allows launch configurations 
-  to be extended by third parties, to support new launch modes. For example, a 
-  client could contribute a launch delegate that launches a Java Application in 
-  profile mode (currently, the SDK does not provide a profiler).</p>
-<p>The debug platform has added an optional element (<code>launchMode</code>), 
-  to the definition of a launch tab group extension - <code>(org.eclipse.debug.ui.launchConfigurationTabGroup</code>), 
-  to support the contribution of a set of tabs for a specific launch configuration 
-  type and launch mode. This allows third parties to extend an existing lauch 
-  configuration user interface. For example, a client contributing a launch delegate 
-  to profile a Java Application would also contribute a set of tabs to configure 
-  the profiler. The launchMode element defines a perpsective attribute to specify 
-  the default perspective associated with the launch configuration type and mode. 
-  This controls the perspective that is switched to/opened, by default, when a 
-  configuration is launched in the associated mode. For example, a client contributing 
-  a profiler may also contribute a profiling perspective that should be displayed 
-  when an application is profiled.</p>
-
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38083">38083</a>: [Viewers] Debug exception when double-clicking on hashtable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38249">38249</a>: NPE trying to create project builder<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37141">37141</a>: Common tab icon should not be a bug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38283">38283</a>: Remove the setting of the target perspective on working copies<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38102">38102</a>: [Debug] [Preferences] Launch Variables Page; Table Columns truncated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38330">38330</a>: No double click to edit for launch variable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38325">38325</a>: Launch variable not removed from table on remove<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38336">38336</a>: Support delete key in launch variable table<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38328">38328</a>: Launch variable table needs to be sorted alphabetically<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 27, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38070">38070</a>: AbstractLaunchConfigurationTabGroup#launched() javadoc typo<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 06, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=37090">37090</a>: Apply/Revert incorrectly enabled for Environment tab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36930">36930</a>: Support variables in launch configurations<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 29, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27243">27243</a>: Environment for external tools<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 22, 2003
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35740">35740</a>: Disable edit launch config popup action for private launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36390">36390</a>: Doc error in schema for consoleColorProviders and consoleLineTrackers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36152">36152</a>: Workbench Help set on wrong Composite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36035">36035</a>: Request a variant on DebugPlugin.exec that takes an environment pointer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=36409">36409</a>: TODO marker for help context for OpenLaunchDialogAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27444">27444</a>: [Dialogs] Dialog font should be used by debug components<br>
-
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r3_0_changes.html b/org.eclipse.debug.core/r3_0_changes.html
deleted file mode 100644
index 1e584cb..0000000
--- a/org.eclipse.debug.core/r3_0_changes.html
+++ /dev/null
@@ -1,260 +0,0 @@
-<html>
-<head>
-<title>3.0 Debug Platform Change Notes</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000">
-<h1>3.0 Debug Platform Change Notes</h1>
-<p>This document describes important changes in the 3.0 debug platform, relative 
-  to the 2.1 release.</p>
-  
-<h2>New Features</h2>
-
-<h3> Extensible Launch Modes</h3>
-<p>The debug platform supports an extensible set of launch modes. Releases prior 
-  to 3.0 only supported two launch modes - run and debug. The debug platform now 
-  provides an extension point for contributing new launch modes - <code>org.eclipse.debug.core.launchModes</code>. 
-  The debug platform now defines (contributes) three basic launch modes - run, 
-  debug, and profile. Other clients may contribute new launch modes. The launch 
-  manager (<code>ILaunchManager</code>) has additional API to retrieve all launch 
-  modes, and a human readable label for each launch mode.</p>
-<p>The debug platform has a new extension point to support the contribution of 
-  a launch delegate for a specific launch configuration type and launch mode - 
-  <code>org.eclipse.debug.core.launchDelegates</code>. This allows launch configurations 
-  to be extended by third parties, to support new launch modes. For example, a 
-  client could contribute a launch delegate that launches a Java Application in 
-  profile mode (currently, the SDK does not provide a profiler).</p>
-<p>For backwards compatibility, the launch delegate supplied by a launch configuration 
-  type extension is used for the launch modes specified by the launch configuration 
-  type. A launch delegate supplied for a specific mode, is used only for that 
-  mode. </p>
-<p>The debug platform has added an optional element (<code>launchMode</code>), 
-  to the definition of a launch tab group extension - <code>(org.eclipse.debug.ui.launchConfigurationTabGroup</code>), 
-  to support the contribution of a set of tabs for a specific launch configuration 
-  type and launch mode. This allows third parties to extend an existing launch 
-  configuration user interface. For example, a client contributing a launch delegate 
-  to profile a Java Application would also contribute a set of tabs to configure 
-  the profiler. The <code>launchMode</code> element defines a <code>perspective</code> 
-  attribute to specify the default perspective associated with the launch configuration 
-  type and mode. This controls the perspective that is switched to/opened, by 
-  default, when a configuration is launched in the associated mode. For example, 
-  a client contributing a profiler may also contribute a profiling perspective 
-  that should be displayed when an application is profiled.</p>
-<p>For backwards compatibility, the tab group contributed for a launch configuration 
-  type (specifying no launch mode), is used for all launch modes for which a specific 
-  launch tab group is not contributed. Thus, when a mode is not specified by a 
-  tab group, the tab group effectively becomes the default tab group.</p>
-  
-<h3>Extensible Debug Events</h3>
-<p>The debug platform supports an extensible set of debug events. A debug event 
-  kind of <code>MODEL_SPECIFIC</code> has been added in the 3.0 release to indicate 
-  an application specific debug event. When a debug event of kind <code>MODEL_SPECIFIC</code> 
-  is created, the detail code in the event is client defined. The source of the 
-  event (debug element that generated the event) identifies the debug model from 
-  which the event was generated. The debug platform and user interface ignores 
-  model specific debug events.</p>
-<p>A data field has been added to debug events to allow clients to store application 
-  specific data in debug events.</p>
-  
-<h3>Editor Positioning and Custom Annotations</h3>
-<p>In release 3.0, a debug model presentation can position and annotate editors 
-  opened by the debugger for stack frames. This is done by implementing the new 
-  interface <code>IDebugEditorPresentation</code> on the applicable debug model 
-  presentation. When implemented, the model presentation is used as a delegate 
-  to position editors, add annotations, and remove annotations for stack frames.</p>
-
-<h3>Extensible Watch Expressions</h3>
-<p>In release 3.0, the debug platform provides an implementation of watch expressions. 
-  Debug models can contribute watch expression delegates if they support watch 
-  expressions. When a stack frame is selected, the associated delegate is queried 
-  to provide a value for a watch expression in the given (stack frame) context. 
-  The debug platform provides persistence, enabling, disabling, entering, and 
-  editing of watch expressions.</p>
-
-<h3>Process Factories</h3>
-<p>The debug platform provides an extension point (<code>org.eclipse.debug.core.processFactories</code>) 
-  for contributing process factories. A process factory can be used to override 
-  default process creation for a launch configuration when the debug plug-in (i.e.<code> 
-  org.eclipse.debug.core.DebugPlugin</code>) is consulted to create a new process. 
-  A launch configuration can reference a process factory to use when creating 
-  a process, via the launch configuration attribute <code>DebugPlugin.ATTR_PROCESS_FACTORY_ID</code>.</p>
-
-<h3>Automatic Array Partitioning</h3>
-<p>The debug plug-in now supports automatic array partitioning in the variables, 
-  which partitions large arrays into sub-ranges in the variables view. This is 
-  supported with the introduction of a new interface in the debug model representing 
-  an indexed value - <code>org.eclipse.core.debug.model.IIndexedValue</code>. 
-  If a value implements this interface, the variables view will automatically 
-  partition its elements as required, into sub-ranges</p>
-
-<h3>Logical Structure Types</h3>
-<p>Often, it is convenient to navigate complex data structures in terms of a logical 
-  structure, rather than an implementation structure. For example, no matter how 
-  a list is implemented (i.e. linked list, collection of arrays, etc.), it is 
-  often convenient to be able to view the list as an ordered collection. To facilitate 
-  the display of logical structures in the variables view, an extension point 
-  has been added (<code>org.eclipse.debug.core.logicalStructureTypes</code>) allowing 
-  debug models to contribute logical structures of its values, where applicable. 
-  Debug models may contribute delegates to translate raw implementation values 
-  into logical values. The variables view will display the logical values, when 
-  the option to display logical structures is turned on. More than one logical 
-  structure can be provided for a single value - the user can choose which structure 
-  to display.</p>
-
-<h3>Step Filters</h3>
-<p>To support step filters on all stepping functions (into, over, return), a new 
-  interface has been added to the debug platform - <code>IStepFilters</code> - 
-  which can be implemented by debug targets. This interface replaces <code>IFilteredStep</code>, 
-  which is now deprecated. The debugger provides a global toggle that turns step 
-  filters on/off for all stepping functions. Toggle actions are provided in the 
-  Run menu, Debug View context menu, and Debug View toolbar, which replaces the 
-  'Step with Filters' action in previous releases. As well, an API is provided 
-  on <code>DebugUITools</code> to modify step filter enablement. It is up to debug 
-  targets to implement this new interface and to honor the step filter enablement 
-  setting when stepping. See javadoc for <code>IStepFilters</code> for more details.</p>
-<p>This change maintains binary compatibility with previous releases. However, 
-  targets wishing to leverage the new function must implement the new interface.</p>
-
-<h3>Launch Termination Notification</h3>
-<p>A new interface has been introduced to provide a mechanism for launch listeners 
-  to be notified when a launch terminates. A launch is simply a container of processes 
-  and debug targets. When all of the contained targets and processes terminate, 
-  a terminate notification is now sent to those listeners that implement
-  <code>ILaunchesListener2</code>.</p>
-  
-
-<h3>Launch Delegate Enhancements</h3>
-<p>Lanuch delegates can optionally implement the new interface <code>ILaunchConfigurationDelegate2</code>. 
-  This allows launch delegates to provide a launch object to be used for a launch. 
-  For example, when debugging on a server a delegate could create a new launch 
-  object or may reuse an existing launch object if the server is already running 
-  in debug mode.</p>
-
-<h3>Retargettable Actions</h3>
-<p>The debug platform now provides retargettable actions for the following actions.</p>
-<ul>
-  <li>Run to Line</li>
-  <li>Toggle Line Breakpoint</li>
-  <li>Toggle Method Breakpoint</li>
-  <li>Toggle Watchpoint</li>
-</ul>
-<p>Debug implementations can plug into the retargettable actions by providing 
-  appropriate adapters for relevant editors and model objects that perform the 
-  actual operations (<code>IRunToLineTarget</code> and <code>IToggleBreakpointsTarget</code>, 
-  defined in the <code>org.eclipse.debug.ui.actions</code> package). A retargettable 
-  action works on the active part. First the part is asked for a target adapter. 
-  If the part does not provide an adapter, the selected objects within the part 
-  are consulted for adapters.</p>
-<p>As well, action delegates actions are provided by the debug platform such that 
-  debug implementations can contribute appropriate actions to context menus. An 
-  editor actions delegate is provided for the run to line action, and an object 
-  action delegate is provided for toggling method breakpoints and watchpoints. 
-  See the following classes: <code>RunToLineActionDelegate</code>, <code>ToggleMethodBreakpointActionDelegate</code>, 
-  and <code>ToggleWatchpointActionDelegate</code> in the <code>org.eclipse.debug.ui.actions</code> 
-  package.</p>
-  
-<h2>API Changes</h2>
-
-<h3>Debug Action Groups removed</h3>
-<p>The Debug Action Groups extension point (org.eclipse.debug.ui.debugActionGroups) has been
-  removed. In Eclipse 3.0, the workbench introduced support for Activities via the
-  org.eclipse.platform.ui.activities extension point. This support provides everything
-  that Debug Action Groups provided and is also easier to use (it supports patterns instead of
-  specifying all actions exhaustively) and has a programmatic API to support it.</p>
-<p>Failing to remove references to the old extension point won't cause any failures.
-  References to the extension point will simply be ignored. Product vendors are encouraged to
-  use the workbench Activities support to associate language-specific debugger actions with
-  language-specific activities (for example, C++ debugging actions might be associated with
-  an activity called "Developing C++").</p>
-
-<h3>Extensible Launch Modes</h3>
-<p>With the introduction of extensible launch modes, more than one launch delegate 
-  can exist for a launch configuration type. Releases prior to 3.0 only supported 
-  one launch delegate per launch configuration type. The method <code>ILaunchConfigurationType.getDelegate()</code> 
-  is now deprecated. The method <code>getDelegate(String mode)</code> should be 
-  used in its place to retrieve the launch delegate for a specific launch mode. 
-  The deprecated method has been changed to return the launch delegate for the 
-  <code>run</code> mode.</p>
-
-<h3>Launch Tabs &amp; Tab Groups</h3>
-<p>Launch tab groups and launch tabs are no longer notified when a launch completes. 
-  The method <code>launched(ILaunch)</code> in the interfaces <code>ILaunchConfigurationTab</code> 
-  and <code>ILaunchConfigurationTabGroup</code> has been deprecated and is no 
-  longer called. Relying on this method for launch function was always problematic, 
-  since tabs only exist when launching is performed from the launch dialog. Also, 
-  with the introduction of background launching, this method can no longer be 
-  called, as the launch dialog is be closed before the resulting launch object 
-  exists.</p>
-
-<h3>Perspective Switching</h3>
-<p>In prior releases, perspective switching was specified on a launch configuration, 
-  via the launch configuration attributes <code>ATTR_TARGET_DEBUG_PERSPECTIVE</code> 
-  and <code>ATTR_TARGET_RUN_PERSPECTIVE</code>. With the addition of extensible 
-  launch modes in 3.0, this approach no longer scales. Perspective switching is 
-  now specified on launch configuration type basis, per launch mode that a launch 
-  configuration type supports. API has been added to <code>DebugUITools</code> 
-  to set and get the perspective associated with a launch configuration type for 
-  a specific launch mode.</p>
-<p>An additional, optional, <code>launchMode</code> element has been added to 
-  the <code>launchConfigurationTabGroup</code> extension point, allowing a contributed 
-  tab group to specify a default perspective for a launch configuration type and 
-  mode.</p>
-<p>From the Eclipse user interface, users can edit the perspective associated 
-  with a launch configuration type by opening the launch configuration dialog, 
-  and selecting a launch configuration type node in the tree (rather than an individual 
-  configuration). A tab is displayed allowing the user to set a perspective with 
-  each supported launch mode.</p>
-
-<h3>Generic Console</h3>
-<p>With the work for the generic console support <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=37263"> 
-  (Bug 37263)</a>, the view id for the Eclipse (formerly debug) console has changed. 
-  This results in problems at startup such as "Could not restore workbench layout" 
-  with details that "Could not create view: org.eclipse.debug.ui.ConsoleView" 
-  for the particular perspective that contained reference to the old view id. 
-  The equivalent view id is now: "org.eclipse.ui.console.ConsoleView".<br>
-  The generic console is available via the Window>Show View>Basic>Console and 
-  is used by the Eclipse debug and Ant integration. </p>
-
-<h3>Console Line Tracker Extension</h3>
-<p>A console line tracker (<code>IConsoleLineTracker</code>) can be notified when 
-  its associated console is closed (i.e. all of its streams are closed), by implementing 
-  the new interface <code>IConsoleLineTrackerExtension</code>. The notification 
-  indicates that no more output will be appended to the console.</p>
-
-<h3>Launch Configuration Tab Enhancements</h3>
-<p>Two methods have been added to the <code>ILaunchConfigurationTab</code> interface 
-  - activated and deactivated. These new life cycle methods are called when a 
-  tab is entered and exited respectively. Existing implementations of <code>ILaunchConfigurationTab</code> 
-  that subclass the abstract class provided by the debug plug-in (<code>AbstractLaunchConfigurationTab</code>) 
-  will maintain binary compatibility, as the methods have been added in the abstract 
-  class.</p>
-<p>In prior releases, a tab was sent the message <code>initializeFrom</code> when 
-  it was activated, and <code>performApply</code> when it was deactivated. In 
-  this way, the launch configuration tab framework provided inter-tab communication 
-  via a launch configuration (by updating the configuration with current attribute 
-  values when a tab is exited, and updating the newly entered tab). However, since 
-  many tabs do not perform inter-tab communication, this can be inefficient. As 
-  well, there was no way to distinguish between a tab being activated, and a tab 
-  displaying a selected launch configuration for the first time. The newly added 
-  methods allow tabs to distinguish between activation and initialization, and 
-  deactivation and saving current values. </p>
-<p>To avoid breaking the behavior of current tab implementations, the default 
-  implementation of <code>activated</code>, provided by the abstract tab, calls 
-  <code>initializeFrom</code>. And, the default implementation of <code>deactivated</code> 
-  calls <code>performApply</code>. Tabs wishing to take advantage of the new API 
-  should override these methods as required. Generally, for tabs that do not perform 
-  inter-tab communication, a correct implementation of these methods is to do 
-  nothing.</p>
-  
-<h3>BreakpointManager Can Be Disabled</h3>
-<p>IBreakpointManager now defines the methods setEnabled(boolean) and isEnabled().
-  When the breakpoint manager is disabled, debuggers should ignore all registered breakpoints.
-  The debug platform also provides a new listener mechanism, IBreakpointManagerListener
-  which allows clients to register with the breakpoint manager to be notified when its
-  enablement changes.</p>
-<p>The Breakpoints view calls this API from a new toggle action that allows the user to
-  "Skip All Breakpoints." Debuggers which do not honor the breakpoint manager's enablement
-  will thus appear somewhat broken if the user tries to use this feature.</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r3_1_buildnotes_platform-debug.html b/org.eclipse.debug.core/r3_1_buildnotes_platform-debug.html
deleted file mode 100644
index 3562b6e..0000000
--- a/org.eclipse.debug.core/r3_1_buildnotes_platform-debug.html
+++ /dev/null
@@ -1,975 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-3.1 RC4
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100807">100807</a>: Source not found<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-3.1 RC3
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99407">99407</a>: Handle BLE from toggle breakpoint action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99796">99796</a>: Refactoring changed launch config name to &quot;null&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99693">99693</a>: Invalid stack frames during display<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84458">84458</a>: [Doc] package.html needs to be updated for org.eclipse.ui.console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99752">99752</a>: Console Terminate Hangs Eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99996">99996</a>: NPE when bringing the Memory View to the top from a view stack<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100105">100105</a>: Help context id fixes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100489">100489</a>: &quot;color&quot; as a preference keyword<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100283">100283</a>: [Memory View]: SWTException when launch a session with Memory view open<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-3.1 RC2 - June 10, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94441">94441</a>: deallocated Inspect Expression incorrectly displayed in details pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97654">97654</a>: Pref Page General/Colors and Fonts - problems<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97564">97564</a>: breakpoint group shows as disabled when enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98655">98655</a>: [Preferences] Error message too long in Preferences dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96972">96972</a>: NullPointerException when trying to set breakpoint (in ToggleBreakpointAction)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97304">97304</a>: DebugRequestJob should be system job<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97327">97327</a>: renaming main type does not update launch history<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97628">97628</a>: Edit source path dialog not re-sizeable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97742">97742</a>: Console uses wrong link color<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97847">97847</a>: An internal error occurred during: &quot;Fetching children from debug target&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97869">97869</a>: Pref Page Run/Debug - problems<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98272">98272</a>: Key binding for terminate - works 3.0, not 3.1 (debug view issue)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98389">98389</a>: Stack overflow when launching from within project with circular plugin dependancy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71794">71794</a>: Mnemonic in error message<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98090">98090</a>: source lookup with relative path names<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95490">95490</a>: String substitution variables are lost during import<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98048">98048</a>: &quot;Terminate and Remove&quot; doesn't assure termination of launch object<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98090">98090</a>: source lookup with relative path names<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99174">99174</a>: launch view should use async instead of sync<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98249">98249</a>: cvs console missing icon<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99063">99063</a>: DebugModePromptStatusHandler should check preference before getting the active shell<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91305">91305</a>: program spewing large amounts to console causes eclipse to OOM<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92135">92135</a>: Investigate console performance test failures<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97348">97348</a>: Run button enabled without selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98162">98162</a>: Missing properties string in AddMemoryRenderingAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98003">98003</a>: 3.1 RC1 javadoc warnings<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96657">96657</a>: Clipped message for missing source.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97726">97726</a>: Carat location should be updated when user types in Console.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98900">98900</a>: Console hyperlinks inaccurately detected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98995">98995</a>: Monitor Memory Dialog needs to accept empty expression<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99067">99067</a>: Add Memory Monitor dialog should stay up if there is an error adding a memory monitor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99247">99247</a>: Potential NegativeArraySizeException in Table Rendering<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-3.1 RC1 - May 27, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94446">94446</a>: CodePagesPrefDialog using internal help access<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84324">84324</a>: Changes to Watch Expressions not updated in view when not debugging<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84959">84959</a>: action background job hangs onto elements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89961">89961</a>: NPE running test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93686">93686</a>: Provide select all / deselect all buttons for BreakpointWorkingSetPage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95190">95190</a>: Display view context menu item is missing label<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95199">95199</a>: consoleFactories extension point doesn't specify implementation reqs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94749">94749</a>: terminate all does not work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95256">95256</a>: Marker doesn't exist error from breakpoint sorter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94357">94357</a>: breakpoints view not auto-opened on second launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87586">87586</a>: View closure doesn't pay attention to perspectives<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71486">71486</a>: no error message when CTRL-S used to change var value<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85612">85612</a>: NPE trying to create new launch config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93545">93545</a>: No feedback when re-enabling breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95662">95662</a>: Activity enablement not working in debug platform<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93474">93474</a>: &quot;Step filters&quot; incorrectly enabled when launch selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94281">94281</a>: [Preferences] Some Parts not using Dialog Fonts<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90206">90206</a>: Stack trace console should use console font<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95204">95204</a>: FolderSourceContainerDialog and internal ref<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95767">95767</a>: (polish) Use &quot;open&quot; instead of &quot;switch&quot; terminology for perspectives<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95956">95956</a>: typo in NLS keys<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92547">92547</a>: Job not shut down correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92949">92949</a>: potential NPE in RenderingViewPane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95477">95477</a>: Infinite &quot;restore viewer state&quot; in Registers view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91543">91543</a>: Exception when placing a breakpoint (double click on ruler)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91786">91786</a>: top frame annotated as &quot;secondary&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77252">77252</a>: Consistency in SDK consoles<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96546">96546</a>: Debug plugins should restrict access to their packages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95470">95470</a>: Debug jobs should be system jobs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87587">87587</a>: Debugging views automatically opened before perspective switch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96470">96470</a>: Breakpoint type group shows up not &quot;enabled&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96199">96199</a>: NPE in RemoteTreeViewer.deferExpansion running Ant test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96724">96724</a>: FindVariableDelegate leaks as remains as DebugEventListener<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96557">96557</a>: Missing adapter type: BreakpointTypeCategory<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94406">94406</a>: Context Enabled not opened in Java Perspective in multi-langauage scenario<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94535">94535</a>: TimedOut VM remains in Debug View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96451">96451</a>: Memory View throws exception in multi-window scenario<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95745">95745</a>: console/editor:  allow editor selection/load of source files for none stack traces<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96766">96766</a>: Console hyperlinks broken by 3.1M7<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96432">96432</a>: Debug/Run As "Ant build" shows up for Java files<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85770">85770</a>: Hyperlink over multiple lines: text colored only on first line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96731">96731</a>: Leak: RemoteTreeViewer jobs holding on to debug elements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=96728">96728</a>: Leak: MemoryViewSynchronizationService remains as listener of IMemoryBlockManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94454">94454</a>: Find Variable action from Variable view missing mnemonic<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 13, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94208">94208</a>: Debug UI depends on IDE to declare &quot;Goto Breakpoint&quot; image.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94216">94216</a>: Open type does not work for generic types<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94447">94447</a>: WorkingSetSourceContainerBrowser and internal WorkbenchPlugin<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 9, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92939">92939</a>: Render links in the console as hyperlinks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93712">93712</a>: missing messages in DebugUIMessages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93198">93198</a>: ClassCastException  when monitoring large array in Expression View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93578">93578</a>: java.lang.ArrayIndexOutOfBoundsException in ConsoleDocumentAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93800">93800</a>: Serialize requests per target<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93805">93805</a>: Run/Debug as menu should never be empty<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93909">93909</a>: No longer able to launch java application from navigator view folder<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93927">93927</a>: Add keywords to preference pages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93949">93949</a>: Tests opening external browsers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93976">93976</a>: Add Source Container dialog should add the new container to the top of the source container list by default.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=94133">94133</a>: [Console] console does not automatically appear on write to stdout<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 3, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=93711">93711</a>: Eraser icon is difficult to see and analogy is often missed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89548">89548</a>: no message for native methods in var view<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-May 3, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85033">85033</a>: Memory View:  Screen reader does not read content properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92704">92704</a>: Classcast exception from Registers View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76032">76032</a>: inconsistent &quot;Run&quot; rightclick menu on French OS vs. English OS<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92817">92817</a>: [api] fields deleted from MessageConsole<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92838">92838</a>: [api] add missing &#64;since 3.1 tags on API added in 3.1 cycles<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92902">92902</a>: Can't launch with errors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92836">92836</a>: [api] missing &#64;since 3.1 tag on AbstractDebugView.setViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92930">92930</a>: 4 methods added to CommonTab intended to be private<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90289">90289</a>: &gt;1 debug worker thread calling IStackFrame.getVariables()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92938">92938</a>: Unused Keys in ConsoleMessages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92840">92840</a>: [api] deleted field IDebugUIConstants.IMG_ACT_SYNCED<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 26, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88685">88685</a>: stepxxx and resume calls made even if &quot;canStepxxx()&quot; and &quot;canResume()&quot; return false<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91605">91605</a>: ShowTypesAction runs twice when it is invoked.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89604">89604</a>: [polish] Prompted to delete all selected breakpoints for empty group<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91889">91889</a>: top frame not selected when monitor added to stack<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78166">78166</a>: [performance test] console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79426">79426</a>: Exception in log file<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92135">92135</a>: Output out of sync with process when debugging<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90351">90351</a>: [performance test] Tests completing too quickly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91552">91552</a>: Console view shows &quot;Console&quot; as content description when no consoles open<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91625">91625</a>: IndexedValuePartition's #getVariables is inefficient<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91984">91984</a>: RemoteTreeViewer.StateRestorationJob should be pushed down stack<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92132">92132</a>: Memory rendering's dispose() method gets called twice when closing the rendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89743">89743</a>: [polish] [Console] Process Console not opened if output is not captured anywhere<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87420">87420</a>: Provide feedback during source lookup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89230">89230</a>: Run as mnemonic has been changed from S to U<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89693">89693</a>: Exception occurred when looking at monitors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92244">92244</a>: SelectedResourceManager copies entire text selection upon every selection change<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=81330">81330</a>: Missing mnemonics in Context menu of Console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85588">85588</a>: No error/warning when console encoding not set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74885">74885</a>: Review all Threads created to see if they should be set as daemon<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 19, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91208">91208</a>: firing PropertyChangeEvent in TextConsole.addHyperlink can be expensive<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78318">78318</a>: Backport performance tests<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91471">91471</a>: Avoid asyncs in action updating<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89865">89865</a>: Poor debug performance in I20050330-0500<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89184">89184</a>: Eclipse hangs during shutdown after error disposing display<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90975">90975</a>: Consoles removed when using multiple windows<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91569">91569</a>: TextConsoleViewer should not change selection when auto-scrolling<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91067">91067</a>: Performance problem in Console View if more than one Console View is opened<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=91597">91597</a>: OutputStreamMonitor #read method is inefficient<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82530">82530</a>: DebugPluginImages and ImageRegistry<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 12, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89748">89748</a>: [polish] &quot;Search for duplicate source files&quot; option doesn't work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82627">82627</a>: Source containers should be case-insensitive on platforms that are case insensitive.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89883">89883</a>: Exception triggered by Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90154">90154</a>: [Memory View] Short Input Rejected by Hex Rendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88261">88261</a>: create component XML for debug plugins<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90892">90892</a>: Typos in javadoc of IConsoleFactory<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90318">90318</a>: Change string externalization to use new format<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88677">88677</a>: AbstractDebugEventHandler$EventProcessingJob can hog UI thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90387">90387</a>: Debug with break point cause error in 3.1M6<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90518">90518</a>: JAR debug plug-ins<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90838">90838</a>: Folder and Directory source containers should have slightly more descriptive names.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90470">90470</a>: StatusDialog now available in JFace<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76794">76794</a>: Error Disabling Breakpoint: "Unable to create class prepare request."<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 5, 2005 - M6
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89741">89741</a>: [polish] Debug config: Suggestion: When user clicks new, put focus in name text field<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89590">89590</a>: Scroll Lock is broken<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89711">89711</a>: Display View unexpectedly brought to top when debug session is suspended<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-April 1, 2005 - M6
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89772">89772</a>: [Memory View] NPE in AbstractTableRendering when throwing Debug Exception during rendering creation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89308">89308</a>: Pass combined preference store to TextSourceViewerConfiguration(IPreferenceStore)<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Mar 29, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88945">88945</a>: [Memory View] Add code page preference for Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84378">84378</a>: Open several tabs in memory view at once<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89293">89293</a>: [Memory View] Selection problems in Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82245">82245</a>: Multiple memory views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88828">88828</a>: [Memory View] Allow clients to provider custom decorations in AbstractTableRendering<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Mar 24, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88833">88833</a>: TableRenderingLabelProviderEx should cache font/color providers<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Mar 22, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86510">86510</a>: Filtering all threads from the debug view causes infinite expand attempts<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88585">88585</a>: Find action in variables and expressions view context menu has no text<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80857">80857</a>: ProjectSourceContainer fails to search for files specified by relative paths<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86572">86572</a>: banner image for launch config tab groups ignored<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88465">88465</a>: VariableValueEditorManager does not need to be API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86743">86743</a>: Register view shows the same as Variables view in CVS HEAD<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88027">88027</a>: ConsoleManager does not recognize Workbench shutdown.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88264">88264</a>: [Memory View] Support for non-scrollable IMemoryBlockExtension<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88404">88404</a>: [Memory View] Support for mixed-endianess in a memory block<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88232">88232</a>: AbstractSourceLookupDirector disposes existing containers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86725">86725</a>: Environment vars on windows: lowercase/uppercase<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85216">85216</a>: [API] platform could provide double-click breakpoint action<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Mar 15, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86793">86793</a>: Support for dynamic help in LaunchConfigurationView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87421">87421</a>: IMemoryBlockExtension: Rename getAddressibleSize<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52939">52939</a>: Launch from the context menu in an editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74343">74343</a>: Some contextual views not opening after a perspective switch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87569">87569</a>: Infinte loop obtaining image when switching to Debug Perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87955">87955</a>: Exception on startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86617">86617</a>: Memory view scrolling problem under GTK<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83246">83246</a>: Javadoc warnings in latest builds<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87692">87692</a>: setConsoleWidth() causes Invalid thread access<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86859">86859</a>: NPE running Ant debugger test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86895">86895</a>: NPE from source lookup from Ant debug tests<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Mar 8, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87108">87108</a>: ProcessConsole.ConsoleLogFilePatternMatcher should remove itself once a match has been found<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78288">78288</a>: [API] Drop to Frame not enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86850">86850</a>: Console should scroll to last line, not end of document<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86956">86956</a>: Adapt to the key binding changes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87225">87225</a>: NPE during compile using clover 1.2.2<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Mar 1, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85623">85623</a>: NPE opening View Management preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77566">77566</a>: [API] Implementations of AbstractJavaLaunchConfigurationDelegate.launch are too monolithic<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85322">85322</a>: remote viewers should cancel jobs when disposed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85964">85964</a>: RemoteVariablesContentProvider.hasChildren() communicating with Target in UI Thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86030">86030</a>: VariablesView communicates with target in UI thread while populated Details pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86199">86199</a>: [M5a] Memory view is not updated when padded string is changed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=81211">81211</a>: [KeyBindings] preference page: key bindings don't show relevant platform<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51887">51887</a>: Feature request: Allow more control over Debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86573">86573</a>: Console prcoess type property tester poorly named<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76526">76526</a>: [API] ILaunchManager/Launch not extensible.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87081">87081</a>: Invalid thread access during &quot;Populate Detail Pane&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85600">85600</a>: NPE from format in Java Stack trace console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77255">77255</a>: RemoveAllTerminatedAction and ConsoleRemoveAllTerminatedAction differences/bugs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85626">85626</a>: View tracking state still honored after toggling "track views" preference<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84362">84362</a>: Relaunch does not terminate current launch<br>
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Feb 22, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85740">85740</a>: &quot;Display in favorites&quot; selection table is too small<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85734">85734</a>: Debug view flickers excessively<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Feb 17, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85582">85582</a>: index out of bounds<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85653">85653</a>: Reuse of source lookup result<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84111">84111</a>: Exception while running test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85603">85603</a>: Attempting to capture output to invalid file<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85330">85330</a>: Illegal Argument Exception in VariablesView details panel<br>	  	
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85579">85579</a>: launch view event handler performs insert rather than refresh<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85701">85701</a>: source selection only cleared on thread termination<br>
-	  	
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Feb 15, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84588">84588</a>: Dummy launch should be rendered with italics<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84587">84587</a>: dummy launch not cleaned up when job terminated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84257">84257</a>: Expanding tree in the variable view collapses the tree<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78553">78553</a>: Console hyperlink painting needs improvement<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84795">84795</a>: Missing NLS string<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84586">84586</a>: Launch doesn't wait for build if launching while &quot;cleaning&quot; before build<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82318">82318</a>: Breakpoint enablement blocks UI<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80325">80325</a>: Deferred content adapater will override workbench adapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84075">84075</a>: deferred workbench adapters for expressions and registers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84825">84825</a>: new variables no longer revealed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84672">84672</a>: breakpoint does not have marker errors in test log<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84907">84907</a>: Invalid thread access while removing launches<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84958">84958</a>: class cast exceptions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85048">85048</a>: RemoveAllTerminatedAction causes debug view to refresh<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84932">84932</a>: Deleting a breakpoint leaves no selection in the breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83793">83793</a>: Find Variable could be mapped to Ctrl-F<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84959">84959</a>: action background job hangs onto elements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84951">84951</a>: Launch leak<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73397">73397</a>: Setting ErrorHandlers for XML parsing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84960">84960</a>: Launch view source lookup result hangs onto launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83245">83245</a>: [Breakpoint Groups] Improve icons for breakpoint type groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84884">84884</a>: test failure: memory rendering types<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84925">84925</a>: refactoring of doUpdateItem(...)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85291">85291</a>: NPE in find variale action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84933">84933</a>: Adding a lock to Debug View deselects stack frame<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=85007">85007</a>: Invalid stack frames displayed in Debug View, Owned monitors not displayed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84641">84641</a>: StringIndexOutOfBoundsException in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84870">84870</a>: Hang in PasteBreakpointsAction.updateSelection<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Feb 8, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84072">84072</a>: Text field doesn't have border<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83237">83237</a>: [Breakpoint Groups] Breakpoint working set actions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84258">84258</a>: Find variable enabled when view is empty<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83453">83453</a>: Infinite &quot;restore viewer state&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73417">73417</a>: Wrong thread selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84078">84078</a>: RemoteTreeContentManager should override default job name<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84493">84493</a>: Flashing job notification on stepping: "Restore Viewer state<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84189">84189</a>: Remove &quot;final&quot; limitation from Launch implementation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77781">77781</a>: No feedback when launch is waiting for build<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84454">84454</a>: Allow termination of launch when in &quot;waiting for build...&quot; state<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83607">83607</a>: ClassCastException during saving VariablesView state<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84605">84605</a>: update javadoc for IDebugModelPresentation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=84385">84385</a>: disabling breakpoint with ruler action does update check box in breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83794">83794</a>: API issue with logical structures<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72838">72838</a>: Say which project in &quot;Errors exist in a required project. Continue to launch?&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=64424">64424</a>: Enhancement required in the Launch Configuration extension point<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Feb 1, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83779">83779</a>: NPE attempting to edit string<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75849">75849</a>: Support for search in variables view.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83054">83054</a>: Changing toString() setting at debug time has no immediate effect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83570">83570</a>: Mnemonic collisions on CommonTab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83956">83956</a>: Hang while debugging<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Jan 25, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82866">82866</a>: [Breakpoint Groups] The default groups should be emphasized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82993">82993</a>: &quot;show qualified names&quot; broken in breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83035">83035</a>: breakpoints not visible when view brought to top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83103">83103</a>: newly created breakpoint not visible in breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82886">82886</a>: Breakpoints view "expands all" too often<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83244">83244</a>: [Breakpoint Groups] wording in advanced ordering dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44724">44724</a>: background content in debug views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82840">82840</a>: Concurrent modification exception<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82729">82729</a>: Run to line should work in the background<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82931">82931</a>: NPE in RenderingViewPane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82869">82869</a>: [Breakpoint Groups] show only breakpoint working sets<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74125">74125</a>: [Console] provide API for images<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75227">75227</a>: Allow DND of breakpoints to breakpoint groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83235">83235</a>: [Breakpoint Groups] show empty breakpoint sets<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83238">83238</a>: [Breakpoint Groups] Breakpoint actions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83260">83260</a>: dnd with nested breakpoint groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83277">83277</a>: Run/Debug: reuse editor does not affect current workbench session<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82492">82492</a>: Groups do not indicate that the breakpoint manager is disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83365">83365</a>: Cutting a breakpoint doesn't remove the breakpoint from editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82912">82912</a>: breakpoint groups "Others" category could be more descriptive<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75891">75891</a>: Stratum line breakpoints should be grouped by stratum.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=83202">83202</a>: No mnemonics on Breakpoint working set page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82868">82868</a>: [Breakpoint Groups] Custom working set dialog<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Jan 18, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80991">80991</a>: Promote StringVariableSelectionDialog to API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82553">82553</a>: NPE from TerminateAllAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80924">80924</a>: errors in log running test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75194">75194</a>: CommonSourceNotFoundEditor is closed unexpectedly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76272">76272</a>: Use working sets to store custom breakpoint groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71149">71149</a>: [artwork] When breakpoints are disabled (skipped), the bullet should be different<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=81236">81236</a>: Consider console output to a workspace file<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82708">82708</a>: Cannot delete console output file w/o removing console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82908">82908</a>: console ckpii error<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80321">80321</a>: Support "Group By > Working Set" in Breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82865">82865</a>: [Breakpoint Groups] "Show" actions for breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82871">82871</a>: [Breakpoint Groups] Deselect working should disable when none<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82882">82882</a>: Need to provide an icon for "working set organizer"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82883">82883</a>: IBreakpointOrganizer not needed in public API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82885">82885</a>: "Breakpoint organizers" don't show icons in cascade menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82895">82895</a>: Broken strings in new "breakpoint working set" dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82900">82900</a>: should be able to create empty breakpoint working set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80207">80207</a>: launch variables should insert at cursor<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Jan 11, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82003">82003</a>: The IDisconnect implementation by Launch module is too restrictive<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82001">82001</a>: When shutting down the IDE, the debugger should first attempt to disconnect debug targets before terminating them<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80551">80551</a>: Provide AbstractRunToLineAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82402">82402</a>: [Memory View] Bad error message format<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74559">74559</a>: Memory View does not scroll properly on Linux<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82403">82403</a>: [Memory View] Unable to remove more than one memory monitor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82280">82280</a>: remove TextConsole.setAutoScroll()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82479">82479</a>: run to line test failures<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Jan 4, 2005
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72909">72909</a>: Add &quot;Remove All Breakpoints&quot; action to &quot;Run&quot; menu<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-Dec 21, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=81540">81540</a>: no need to create annotation for editors without annotation model<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71149">71149</a>: [artwork] When breakpoints are disabled (skipped), the bullet should be different<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-M4, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70938">70938</a>: Need to be able to turn off &quot;Watch&quot; action for IVariable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80522">80522</a>: VariablesView and problems with hyperlink support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=81234">81234</a>: Console Pinning causes no console to be displayed.<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-December 14, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80227">80227</a>: Fixed width console of 80 chars double spaces 80 char lines<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80546">80546</a>: Incorrect package ref for IRunToLineTarget<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80617">80617</a>: Memory View does not synchronize properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80331">80331</a>: NPE from AbstractDebugActionDelegate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80409">80409</a>: Breakpoints Group By > menu should number submenu starting with 1<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76297">76297</a>: Enhancements to memory block API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78335">78335</a>: Support for word-addressable memory in memory view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78423">78423</a>: Enhancements to Memory Rendering Extension Point<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79255">79255</a>: Enhancements to Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80284">80284</a>: Enhancements to Memory View - replace MemoryViewPane with Tree Viewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80229">80229</a>: AIOB exception with fixed width console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80679">80679</a>: Encoding dropdown enabled on common tab of launch config when default selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80653">80653</a>: IllegalArgumentException from OpenBreakpointMarkerAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1654">1654</a>: USABILITY - Can't look at client server output in one perspective (1GFX2ZU)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80726">80726</a>: new launch doesn't open console view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80728">80728</a>: ShowConsoleAction not working when console pinned<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80720">80720</a>: Pinned console does not remain on top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80373">80373</a>: Pinning of consoles is lost after relaunch of debug process<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80729">80729</a>: NPE in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80873">80873</a>: Fill out schema for logical structure providers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80721">80721</a>: Conflicting key binding for 'org.eclipse.debug.ui.commands.eof' and 'org.eclipse.ui.edit.text.delete.line'<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-December 7, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79153">79153</a>: [Common Tab] redirect to file should do variable expansion<br>	
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79043">79043</a>: Translatable attributes not translated in memoryRenderingTypes extensions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79757">79757</a>: NoClassDefFoundError when opening type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79897">79897</a>: Debug view flashes after terminating target<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79903">79903</a>: Source not found automatically for higher level plugins<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79949">79949</a>: Console View is missing Ctrl-C in context menu item.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79841">79841</a>: Memory view leaks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79606">79606</a>: Common tab is too tall<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79735">79735</a>: Allow to append / overwrite when output to file from console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79304">79304</a>: Incorrect stack frame selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79952">79952</a>: broken hyperlink in console redirecting process output to console.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79306">79306</a>: Custom breakpoint group action enablement<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=30779">30779</a>: Queue/Fire debug events in separate thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79951">79951</a>: Output lost / colored incorrect with echoProperties<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=80073">80073</a>: Shortcut for show debug perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79510">79510</a>: background source lookup<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 30, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78881">78881</a>: NullPointerException in memory view when selecting watch expressions<br>	
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78079">78079</a>: Error loading classes to to Apple's VM packaging.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79097">79097</a>: Mnemonic collision on the Commons tab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79466">79466</a>: Capture Output file widgets enabled initially<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=35400">35400</a>: new Debugger view can't get to associated text editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79043">79043</a>: Translatable attributes not translated in memoryRenderingTypes extensions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23064">23064</a>: RFE: Add option to redirect console output (stderr & stdout) to file<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 23, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76316">76316</a>: Addition of memory block manager to API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76310">76310</a>: Memory block enhancements: MemoryByte<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78864">78864</a>: Using new registry API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=61801">61801</a>: A null String object reference becomes the value &quot;null&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77060">77060</a>: Toggling show qualified names in the Debug view collapses thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78010">78010</a>: NPE closing eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79008">79008</a>: Dialog units should not be used for calculating button heights<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77380">77380</a>: hyperlinks in stack trace console draw &quot;higher&quot; than original text<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78739">78739</a>: stack trace console unexpectedly restored<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78751">78751</a>: Extension Point Schema Changes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78996">78996</a>: ContextualLaunchAction assumes launch group category supports mode<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78759">78759</a>: NPE in WatchExpression.getLaunch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78338">78338</a>: Selection is lost in debug view while stepping with monitor info on<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79304">79304</a>: Incorrect stack frame selected<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 16, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77202">77202</a>: font setting for process console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73882">73882</a>: ConsoleDocumentManager caused a deadlock<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77779">77779</a>: Advanced Breakpoints grouping dialog improvements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76119">76119</a>: source containers not disposed when launch removed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78338">78338</a>: Selection is lost in debug view while stepping with monitor info on<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78191">78191</a>: [console] context menu contributions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77995">77995</a>: NPE out of LaunchViewer running test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74590">74590</a>: Console colors not changed for terminated processes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52336">52336</a>: [Viewers] Internal error at start of debug session<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68621">68621</a>: Invalid thread access in launcher from Checkout thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78193">78193</a>: IOConsolePartitioner.TrimJob quits too early if lastPartition is null<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78351">78351</a>: Please add shortcut keys to switch to Variables and Breakpoints views<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77416">77416</a>: Filter console factories by capabilities<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78386">78386</a>: NPE in ProcessConsoleManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73460">73460</a>: Console flicker when launching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78456">78456</a>: Breakpoint group setting lost on close of breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78494">78494</a>: State of child BreakpointContainers are not updated when parent is enabled/disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75851">75851</a>: Custom variable edit widget<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78513">78513</a>: Memory View: Length and change state incorrect for IMemoryBlock<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=29581">29581</a>: Launch shortcut hotkeys<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 9, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74584">74584</a>: [Console] IOConsole does not bold title when contents change<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75571">75571</a>: restore defaults does not enable console buffer size text field<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77667">77667</a>: Invalid error message in Run/Debug|Console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77783">77783</a>: No mnemonic for &quot;Group By&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77670">77670</a>: breakpoint group rendered as &quot;enabled&quot; when manager disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77721">77721</a>: groups not expanded when switching between none and other<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77991">77991</a>: Leak: IOConsolePage needs to dispose ScrollLockAction<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 5, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77703">77703</a>: Deselecting Map$Entry/Show As&gt;/Key And Value Deselects Map/Show As&gt;/Map Entries<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77754">77754</a>: Inefficient loop rendering styled text<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77472">77472</a>: NPE in TextConsolePage runnable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77994">77994</a>: TextConsoleViewer leaks ConsoleDocumentAdapter<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77998">77998</a>: IOConsoleViewer leaks a document listener<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76605">76605</a>: Set our compiler settings for each project so they are shared<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77748">77748</a>: NPE terminating a target<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-November 2, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76771">76771</a>: Inconsistency between schema description and implementation in logicalStructureTypes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77049">77049</a>: SelectBreakpointGroupDialog doesn't allow selection of existing groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76675">76675</a>: Pattern Matching independent of IOConsole and IOConsolePartitioner<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77028">77028</a>: Element 'breakpointContainerFactory' is not legal as a child of element 'extension'.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77046">77046</a>: Console causing Ant test failures<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77072">77072</a>: Composite breakpoint group expansion problem<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77065">77065</a>: scroll lock not required in stack trace console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77066">77066</a>: Pressing &lt;Enter&gt; in strack trace console appends to EOD<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76907">76907</a>: Clarify run menu (run, run..., run &gt; run...?  RUN!)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=54916">54916</a>: Environment tab should show icons for env vars<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74206">74206</a>: Delete breakpoint needs to "preserve selection"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74031">74031</a>: No mnemonics on Open Console drop down items<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74123">74123</a>: Console font problem<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75370">75370</a>: Hyperlinks to source in console don't work sometimes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77029">77029</a>: &quot;Browse&quot; button on the Common tab does not resize properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77033">77033</a>: Console encoding on Common tab: mnemonics and NLS<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77189">77189</a>: exception during test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77202">77202</a>: font setting for process console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77068">77068</a>: Typing in stack trace console moves line to top of view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77116">77116</a>: API cannot reference internal classes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77306">77306</a>: Provide a rendering view pane in the Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69815">69815</a>: DBCS -- System console cannot display Unicode characters properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76427">76427</a>: Run configuration dialog layout<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69083">69083</a>: Switch to associated perspective on suspension<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77063">77063</a>: JavaStackTraceConsole should use Hyperlink Color<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77295">77295</a>: Argument parsing for command line launching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77238">77238</a>: Enable/Disable not on context menu for breakpoint groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77048">77048</a>: ArrayIndexOutOfBounds removing breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77397">77397</a>: Book capitalization in Color and Font extensions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77253">77253</a>: Sort the consoles in the Open console dropdown<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77073">77073</a>: Expand to show breakpoint containers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77421">77421</a>: [Themes] default text editor font changes by itself<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77462">77462</a>: CVS Plug-in fails to start<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74596">74596</a>: Always group by breakpoint type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75119">75119</a>: Default breakpoint group setting not used when breakpoints view not there<br>
- 
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-October 26, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76539">76539</a>: ILaunchConfiguration.getAttributes doc/clone usage pbm<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76677">76677</a>: Console Input incorrect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76110">76110</a>: Breakpoints not showing as installed in the BreakpointsView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76532">76532</a>: Deleting multipe groups prompts for each group<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75183">75183</a>: DebugEvent.CHANGE does not cause run control action states to be updated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76797">76797</a>: Two output stream reader threads and 100% CPU usages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76743">76743</a>: Console pipes should be closed when program terminated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51884">51884</a>: Feature request: More flexible debug hierarchy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76514">76514</a>: Allow debug presentations to provide colors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76517">76517</a>: NPE in LaunchViewContextListener<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76529">76529</a>: Renaming a custom group collapses all of the groups<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-October 19, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75967">75967</a>: NullPointerException in IOConsolePartitioner.getRegion<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75769">75769</a>: Console doesn't restore displayed tab width 8 on restart<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74909">74909</a>: Automated test for console input<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75174">75174</a>: Can not clear console with unlimited output<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75546">75546</a>: hang during debug session<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72500">72500</a>: Migrate StringMatcher to RegEx 1.4 support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75198">75198</a>: breakpoint groups don't support double click expand<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76428">76428</a>: Run configuration dialog; source tab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76270">76270</a>: Scroll in Console is always lock.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74909">74909</a>: Automated test for console input<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76208">76208</a>: Incorrect code for converting String-> boolean<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75282">75282</a>: Composite breakpoint groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76518">76518</a>: Buttons in the Group Breakpoints "Advanced" dialog incorrectly sized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76521">76521</a>: Incorrect icon names for the breakpoint group actions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76519">76519</a>: Expand all in the Breakpoints view with no groups causes infinite recursion<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74673">74673</a>: Add Expand/Collapse All to Breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74560">74560</a>: Group all should expand groups on creation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76495">76495</a>: Delete action is enabled for a group<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76498">76498</a>: "set custom group" should have "..."<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76497">76497</a>: illegal argument exception<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76326">76326</a>: Shared launch configurations not removed when containing project is deleted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76527">76527</a>: Flaw in AbstractBreakpointGroupAction->rename and dissolve broken<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-October 12, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75454">75454</a>: RuntimeProcess.isTerminated() replies "false" if process segfaults<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75402">75402</a>: NPE on LaunchShortcutsAction.createContext<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75588">75588</a>: generalize watchpoint to debug platform<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-October 5, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75111">75111</a>: ArrayIndexOutOfBoundsException in ContentWidthCache.textChanged<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75177">75177</a>: Error setting Console Preference<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75204">75204</a>: NPE using build 200409240800<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75226">75226</a>: IllegalArgumentException setting console size from 200k to 400k<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75506">75506</a>: Adjust for the many deprecations in the command extension point<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75405">75405</a>: Allow a logical structure type to provide more than one logical structure<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75123">75123</a>: Use PerspectiveLabelProvider in ViewManagementPreferencePage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75372">75372</a>: NPE in org.eclipse.ui.console.IOConsole.getHyperlink<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72209">72209</a>: Inspect and Display popup does not allow copying of values<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-September 28, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74947">74947</a>: Remove warnings from 200409240800 build<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74741">74741</a>: console hyperlink search is slow<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=34052">34052</a>: CTRL-Z Not Recognized as EOF<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-September 21-23, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56253">56253</a>: [Generic Console] no support for extending the toolbar<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73942">73942</a>: IllegalMonitorStateException pasting into the Java Stack Trace Console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73908">73908</a>: [Console] Incorrect colorization when multi streams write to same line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56252">56252</a>: [Generic Console] no support for enabled/disabled lifecycles<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73957">73957</a>: API break introduced with IConsoleHyperlink change<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73924">73924</a>: Console can be removed before it's page is created<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73893">73893</a>: Should disallow close in LCD when running an operation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73842">73842</a>: Remove from Group enabled when breakpoint not in a group<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73576">73576</a>: Pattern matching in IOConsole is too expensive<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73996">73996</a>: Add to Group / Remove from Group incorrectly disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74005">74005</a>: Persist last breakpoint group across invocations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73460">73460</a>: Console flicker when launching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73950">73950</a>: MemoryView leaks AddMemoryBlockAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73951">73951</a>: CopyViewTabToClipboardAction leaks Clipboard<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74033">74033</a>: ClassCastException on selection change in Breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73840">73840</a>: Group by>File seems to only match on name<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74000">74000</a>: ClassCastException filtering for "show support breakpoints"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73870">73870</a>: [misc] NPE when terminating large output<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73917">73917</a>: [Console] Missing hyperlinks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74080">74080</a>: Process console did not flush stream monitors<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74124">74124</a>: Console type should be promoted to IConsole<br>  
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74308">74308</a>: Wrong number of lines in output<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74331">74331</a>: CPU at 99% after a debug session<br>  
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74340">74340</a>: NPE in IOConsoleViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74370">74370</a>: NPE from ProcessConsolePageParticipant<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74039">74039</a>: NPE in ProcessConsole.connect<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68077">68077</a>: Manually closed views do not open when view management is reset<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73841">73841</a>: Icon for grouped breakpoints not disabled with set to skip breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74229">74229</a>: Debug test failure for program arguments<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74283">74283</a>: Empty output in debug tests<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74703">74703</a>: Console view activated even if nothing is written to standart out<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74431">74431</a>: [Mac] runtime discovers JDI interfaces in classes.jar before jdi.jar<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48286">48286</a>: Add support for input on consoles<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74024">74024</a>: Console buffer implementation is line based rather than char based<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74428">74428</a>: Clearing console during output breaks hyperlinks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74363">74363</a>: &quot;Terminate and Remove&quot; action doesn't close a view tied to a Context<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74563">74563</a>: renaming breakpoint group collapses group<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74560">74560</a>: Group all should expand groups on creation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74381">74381</a>: Launch view manages views in other perspectives<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74384">74384</a>: Numerous action delegates leaked on debug perspective closed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74465">74465</a>: Pasting multiple lines in console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74558">74558</a>: "Dissolve Group" should be "Ungroup"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21597">21597</a>: Difficult to enter text in debug console<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-September 14, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72317">72317</a>: Copying from IOConsole inserts extra line breaks.<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73823">73823</a>: Reorganize BreakpointsView menus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72167">72167</a>: ProcessConsole should extend IOConsole<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=44986">44986</a>: Support for Breakpoint groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73704">73704</a>: Provide action to group breakpoints by Type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70066">70066</a>: Bind &quot;Alt+Shift+Q C&quot; to active console view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73493">73493</a>: Default VM Args field should parse quotes intuitively<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73577">73577</a>: Find (Ctrl-F) not enabled in ConsoleView<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73779">73779</a>: Allow browse in &quot;Add To Group&quot; dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70471">70471</a>: ExpressionManager#handleDebugEvents() doesn't work as intended<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73844">73844</a>: Mnemonics missing from breakpoint groups<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-September 7, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72986">72986</a>: ExpressionInformationControl leaks<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72000">72000</a>: Run as Application: duplicate menmonics<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72449">72449</a>: NPE in VariablesView.saveState<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73068">73068</a>: Support for ordering launch shortcuts<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73069">73069</a>: bogus extension point id in org.eclipse.debug.ui.launchShortcuts<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73110">73110</a>: IConsoleColorProvider is not disconnected<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72472">72472</a>: Remove unused dependancies<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72551">72551</a>: add System property to test suite to turn off workbench and console activation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51562">51562</a>: console doesn't wrap input<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72317">72317</a>: IOConsole inserts extra line breaks when pasting<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72517">72517</a>: Replace &quot;Run As &gt;&quot; with context launch<br>  
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73272">73272</a>: NPE in ProcessConsoleManager when no process type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70664">70664</a>: TVT3.0:   Improper characters combination &quot;Run As&quot;<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-August 31, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72300">72300</a>: Confirmation on RemoveAll actions<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72350">72350</a>: NPE in BreakpointsView.dispose<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72881">72881</a>: LineTracker Test Failure<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72483">72483</a>: NPE attempt to Inspect if never shown Variable view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27895">27895</a>: Add new command to Run-menu; Resume All Threads<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=67383">67383</a>: breakpoint manage fires add notificaiton on initialization<br>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-August 24, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72169">72169</a>: provided debug context for non-UI thread<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26830">26830</a>: Allow external programs to create tasks and markers through regex matches on the output<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=27591">27591</a>: [Console] Hyperlink color not used<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72165">72165</a>: MessageConsole should extend IOConsole<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70864">70864</a>: API method to show the console view has a bug<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=28193">28193</a>: Watch expressions updating when expression view not visible<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31899">31899</a>: Consolidate "Java" hyperlinks<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71292">71292</a>: Launch name is truncated in MRU list<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71429">71429</a>: Choosing 'Cancel' in the ${string_prompt} dialog does not cancel the Run command<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=61447">61447</a>: keybinding clean up.<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71561">71561</a>: Inspect popup doesn't handle tabs in inspected expression<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72370">72370</a>: [Console] ArrayIndexOutOfBounds<br> 
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-August 17, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70354">70354</a>: JSP editor does not scroll to/highlight the current execution line when debug with JDT<br>
- 
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-August 3, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69470">69470</a>: TVT3.0: NL Truncation occurs in Run -> External Tools -> External Tools<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69723">69723</a>: TVT3.0: Truncated text in memory view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69952">69952</a>: ILaunchConfigurationListener's launchConfigurationRemoved gets a configuration that doesn't exist<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=71185">71185</a>: TVT3.0: Extra mnemonics for Debug, Run, and External tools<br>  
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=61566">61566</a>: Launch configs dialog: Arrow_Up/Down in configurations tree extremely slow<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=64370">64370</a>: Fix setTitle deprecations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68808">68808</a>: all debug actions (step, terminate, etc), should be done async<br>
- 
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Platform Debug</h1>
-July 27, 2004
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69536">69536</a>: Infinite loop on rendering variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69978">69978</a>: TVT3.0: Two shortcuts for one menuitem<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69057">69057</a>: Incorrect icon in Breakpoints view when breakpoint manager disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69190">69190</a>: NullPointerException @ org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer.isFindDuplicates<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70472">70472</a>: MemoryBlockManager has redundant null check<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70492">70492</a>: Possible NPE in AddSourceContainerDialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70493">70493</a>: Possible NPE in ViewTabCursorManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70495">70495</a>: Redundant null check in RefreshTab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70499">70499</a>: Unnecessary null check in ContextualLaunchAction#selectionChanged(...)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69452">69452</a>: NPE initializing source lookup<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70571">70571</a>: launch config save location on Common tab<br>  
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68523">68523</a>: missing `return' in org.eclipse.ui.internal.console.MessageConsolePartition<br>  
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24829">24829</a>: Multiple toString results shown if hold down arrow key<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68413">68413</a>: NPE from InstructionPointerManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70051">70051</a>: MemoryViewTab does not calculate delta and selected address correctly after error<br>
-
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r3_1_changes.html b/org.eclipse.debug.core/r3_1_changes.html
deleted file mode 100644
index fb2cba6..0000000
--- a/org.eclipse.debug.core/r3_1_changes.html
+++ /dev/null
@@ -1,183 +0,0 @@
-<html>
-<head>
-<title>3.1 Debug Platform Change Notes</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000">
-<h1>3.1 Debug Platform Change Notes</h1>
-<p>This document describes new features and important changes in the 3.1 debug 
-  platform, relative to the 3.0 release.</p>
-  
-<h2>New Features</h2>
-
-<h3> Breakpoint Organizers</h3>
-<p>The breakpoints view allows breakpoints to be displayed in groups. The platform 
-  supports breakpoint groupings by breakpoint type, file, project, and breakpoint 
-  working sets and resource based working sets (as well, it supports nested groupings). 
-  The <code>breakpointOrganizers</code> extension point allows for other grouping 
-  strategies to be contributed to the debug platform.</p>
-<p>A new, optional, <code>name</code> attribute has been added to the breakpoints 
-  extension point to provide a type name for breakpoints. This name appears as 
-  the group label, when the user chooses to group breakpoints by type. If this 
-  attribute is not specified on a breakpoint extension, the breakpoints are considered 
-  to not have a type, and will be displayed in the &quot;Others&quot; group.</p>
-<h3>Logical Structure Providers</h3>
-<p>Logical structures have been enhanced to allow clients to more easily contribute 
-  more than one logical structure for a given value. The new extension point <code>logicalStructureProviders</code> 
-  allows clients to contribute an implementation of an <code>ILogicalStrugureProvider</code>. 
-  A logical structure provider provides a simple way to contribute a single factory 
-  of logical structures for a debug model.</p>
-<p>In addition the optional interface <code>ILogicalStructureTypeDelegate2</code> 
-  has been added to allow a logical structure delegate to provide a dynamic label 
-  for a value's logical structure type.</p>
-<h3>Process Console Enhancements</h3>
-<p>The debug console has been enhanced to allow output to be multiplexed between 
-  the console and/or a file. As well, the encoding used to translate output to 
-  characters can now be specified. All of these options are available to the user 
-  on the &quot;Common&quot; launch configuration tab. As well, the options are 
-  available programmatically as launch configuration attributes. The following 
-  attributes have been added to <code>org.eclipse.debug.ui.IDebugUIConstants</code>.</p>
-<ul>
-  <li><code>ATTR_CONSOLE_ENCODING</code></li>
-  <li><code>ATTR_CAPTURE_IN_CONSOLE</code></li>
-  <li><code>ATTR_CAPTURE_IN_FILE</code></li>
-  <li><code>ATTR_APPEND_TO_FILE</code></li>
-</ul>
-<h3>Memory View</h3>
-<p>The Memory view, which was first released in 3.0 as internal API, has become 
-  public API in 3.1. See the new extension point <code>memoryRenderings</code>, 
-  and the new API package <code>org.eclipse.debug.ui.memory</code> for more information.</p>
-<h3>Parse Arguments</h3>
-<p>A convenience API method has been added to <code>DebugPlugin</code> to separate 
-  arguments in a single string into an array of arguments that can be passed to 
-  the command line for execution. See <code>DebugPlugin.parseArguments(String)</code>.</p>
-<h3>Run To Line Handler</h3>
-<p>Many debuggers implement &quot;run to line&quot; functionality by creating 
-  a breakpoint at the line a user has chosen to &quot;run to&quot;, and then resuming 
-  execution until that breakpoint is hit. A new API class, <code>RunToLineHandler</code>, 
-  has been created to simplify the task. The handler manages the &quot;skip breakpoints 
-  while performing run to line&quot; user preference as well canceling the operation 
-  if another breakpoint is hit before the &quot;run to line&quot; operation completes.</p>
-<h3>Run To Line Action Delegate</h3>
-<p>The <code>RunToLineActionDelegate</code> introduced in 3.0 can now also be 
-  contributed to a view (in 3.0 it could only be contributed to an editor). The 
-  action additionally implements <code>IViewActionDelegate</code>.</p>
-<h3>Variable Value Editors</h3>
-<p>A new extension point, <code>variableValueEditors</code>, allows debuggers 
-  to contribute custom editors for modifying a variable's value selected in the 
-  Variables view.</p>
-<h3>Launch Shortcut Keybindings</h3>
-<p>To register a key-binding for a launch shortcut, define a command with an <font face="Courier New, Courier, mono">id 
-  </font>the same as the launch shortcut <font face="Courier New, Courier, mono">id</font>, 
-  suffixed with the launch mode. For example, the id of the &quot;Java Application&quot; 
-  launch short cut is <font face="Courier New, Courier, mono">org.eclipse.jdt.debug.ui.localJavaShortcut</font>, 
-  so the command id for launching in debug mode is <font face="Courier New, Courier, mono">org.eclipse.jdt.debug.ui.localJavaShortcut.debug</font>. 
-  Then define a key-binding for your command.</p>
-<p>When the command is invoked via the key-binding, the selection or active editor 
-  will be used as the target for the launch shortcut's launch method. The shortcut 
-  is only invoked if the shortcut is enabled for the selection or editor.</p>
-<h3>Source Lookup/Display Facility</h3>
-<p>API methods have been added to <code>DebugUITools</code> to facilitate source 
-  lookup and display. See the methods <code>lookupSource(Object, ISourceLocator)</code> 
-  and <code>displaySource(ISourceLookupResult, IWorkbenchPage)</code>. When a 
-  source lookup result for a stack frame is displayed, the open editor is also 
-  annotated with an appropriate instruction pointer.</p>
-<h3>Watchpoints (IWatchpoint) and Images</h3>
-<p>As watchpoints are common to many debug architectures, the notion of an IWatchpoint 
-  has been added to the debug model. A watch point is a breakpoint that suspends 
-  execution when an associated variable is read and/or written. As well, default 
-  images for rendering watchpoints have been added to the debug platform.</p>
-<h3>Colors and Fonts for Debug Elements</h3>
-<p>In 3.1, debug model presentations (<code>IDebugModelPresentation</code>) may 
-  optionally implement <code>IColorProvider </code>and <code>IFontProvider </code>to 
-  override default fonts and colors for debug elements.</p>
-<h3>Inserting Elements into Debug View</h3>
-<p>The Debug view allows for debug models to insert arbitrary elements into the 
-  debug model element hierarchy. For example, the Java debugger now displays lock 
-  information directly in the view. To override the default presentation in the 
-  view, a debugger must provide an <code>IWorkbenchAdapter</code> or <code>IDeferredWorkbenchAdapter 
-  </code>for the relevant element(s). The debug platform provides default adapters 
-  for the standard debug elements.</p>
-<p>Debug elements were always required to implement <code>IAdaptable</code>, and 
-  now must be subclasses of <code>PlatformObject</code> in order for workbench 
-  adapters to be properly registered and retrieved for debug elements.</p>
-<h3>Abstract Debug Element</h3>
-<p>An abstract implementation of a debug element is provided in 3.1 - <code>DebugElement</code>. 
-  Clients implementing debug models may choose to subclass this class when implementing 
-  debug models. The class provides convenience methods for firing debug events, 
-  reporting exceptions, and retrieving adapters.</p>
-<h3>Drop to Frame Platform Action/Interface</h3>
-<p>The debug platform provides a &quot;drop to frame&quot; action and corresponding 
-  capability interface (<code>IDropToFrame</code>). Debug elements supporting 
-  the capability should implement this new interface to share the global action.</p>
-<h3>Context Menu Launching in Editors</h3>
-<p>Launching from the context menu (for example, &quot;Run As &gt; Java Application&quot;), 
-  is now available in editors (In 3.1, this was only available in the package 
-  explorer and resource navigator). To leverage this feature, the editor input 
-  associated with a executable file must have an <code>ILaunchable</code> adapter 
-  registered for it.</p>
-<h3>Support for Unregistered Launch</h3>
-<p>The launch framework allows for a launch to be performed without registering 
-  a launch object with the launch manager. An unregistered launch does not appear 
-  in the Debug view. A new launch method has been added to <code>ILaunchConfiguration</code>, 
-  accepting a boolean argument determining whether the launch should be registered 
-  (<code>launch(String mode, IProgressMonitor monitor, boolean build, boolean 
-  register)</code>), and a new method has been added to <code>ILaunchManager</code> 
-  to determine if a launch is registered (<code>isRegistered(ILaunch launch)</code>).</p>
-<h3>Reusable Breakpoint Ruler Toggle Actions</h3>
-<p>Providing double-click breakpoint creation in an editor's vertical ruler is 
-  a common feature for debuggers. The debug platform provides two actions to facilitate 
-  this: <code>RulerToggleBreakpointActionDelegate </code>and <code>ToggleBreakpointAction</code>. 
-  A debugger must contribute the <code>RulerToggleBreakpointActionDelegate</code> 
-  to the appropriate editor (see javadoc for more details), and also register 
-  an <code>IToggleBreakpointsTarget </code>adapter with the editor.</p>
-<h3>Environment Variables Case Preservation</h3>
-<p>Support has been added to <code>ILaunchManager</code> to retrieve the environment 
-  variables defined in the OS preserving case. This is important on the WIN32 
-  operating system. Although WIN32 is case insensitive, depending on what you 
-  intend to do with the environment, the lack of normalization may or may not 
-  cause problems. This method <code>getNativeEnvironmentCasePreserved()</code> returns 
-  mixed-case keys using the variable names recorded by the OS. Use <code>getNativeEnvironment()</code> 
-  instead to get a WIN32 system environment where all keys have been normalized 
-  to uppercase.</p>
-<h3>Closing an Input Stream</h3>
-<p>An optional extension, <code>IStreamsProxy2</code>, can be implemented by implementations 
-  of <code>IStreamsProxy</code>. When implemented, it allows the input stream 
-  associated with a process to be closed. This is used to allow the user to signal 
-  EOF when typing in the console.</p>
-<h3>Launch in Debug Mode when Workspace Contains Breakpoints</h3>
-<p>Since 3.0, The user preference &quot;Launch in debug mode when workspace contains 
-  breakpoints&quot; is used to control whether a launch should use debug mode 
-  even when &quot;run&quot; is pressed by the user, based on the presence of breakpoints 
-  in the workspace. A new method, <code>getBreakpoints(ILaunchConfiguration configuration)</code>, 
-  has been added to the abstract implementation of <code>LaunchConfigurationDelegate</code>, 
-  to determine which breakpoints should be considered as relevant for a particular 
-  launch. By default, all breakpoints in the workspace are considered, but subclasses 
-  may override. For example, the Java Application launcher only considers Java 
-  breakpoints.</p>
-<h3>Case Insensitive Source Lookup and Relative Paths</h3>
-<p>The debug platform's source lookup facilities now lookup source in folders 
-  and directories in a case insensitive manner on platforms that are case insensitive. 
-  As well, relative path names are supported in folders and directories.</p>
-<h2>Changes</h2>
-<h3>Debug Event Dispatch</h3>
-<p>In releases 3.0 and prior, calling <code>DebugPlugin.fireDebugEventSet(DebugEvent[])</code> 
-  resulted in debug events being fired synchronously in the calling thread. In 
-  3.1, debug event set listeners are notified of debug events asynchronously in 
-  a different thread than the event is reported in.</p>
-<h3>Debug Actions and Content in Background Jobs</h3>
-<p>In 3.1, many actions that call debug element APIs (like &quot;stepOver&quot;), 
-  now create jobs to communicate with debug elements in background threads. This 
-  avoids blocking the UI in the case that a debug element method requires communication 
-  with a debug target that can block, hang, or timeout. Similarly, many of the 
-  debug views populate their content using background jobs to avoid blocking the 
-  UI thread. The net difference is that in 3.1, more than one thread might be 
-  accessing a debug model's APIs where previously only the UI thread was.</p>
-<h3>Contextual Launch from Top Level Run/Debug Menus</h3>
-<p>The top level menus no longer support the perspective element, and launch shortcuts 
-  must specify a &quot;<code>contextualLaunch</code>&quot; element to appear in 
-  the Run/Debug cascade menus.</p>
-<p>&nbsp;</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r3_2_ buildnotes_platform-debug.html b/org.eclipse.debug.core/r3_2_ buildnotes_platform-debug.html
deleted file mode 100644
index fad1106..0000000
--- a/org.eclipse.debug.core/r3_2_ buildnotes_platform-debug.html
+++ /dev/null
@@ -1,601 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes</title>
-</head>
-<body>
-<h1> Eclipse 3.2 Debug Platform Build Notes&nbsp;</h1>
-
-<h2>RC7 - June 2, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144551">144551</a>: Collapse All tooltip in the Breakpoint View says &quot;Collapse Al&quot;<br>
-
-<h2>RC6 - May 26, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=143297">143297</a>: Terminate and Relaunch only works asynchronously<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=143096">143096</a>: TVT3.2:TCT644: TR: Migrate button truncated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=143812">143812</a>: [Memory View] Memory View's tree viewer handles any terminate event<br>
-
-<h2>RC5 - May 19, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139839">139839</a>: [source lookup] disconnect from PDE source locator<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141908">141908</a>: Memory Leak in debugger<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141895">141895</a>: Step keybindings not working in Ant debugger.<br>
-
-<h2>RC4 - May 12, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138389">138389</a>: Large memory leak in launch configuration dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141324">141324</a>: NPE in JDIDebugTarget.getRootThreadGroups()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141189">141189</a>: No version range specified when requiring bundles<br>
-
-<h2>RC3 - May 05, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136223">136223</a>: Suspended thread does not show stackframe/missing thread labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138527">138527</a>: Actions under the &quot;Run&quot; menu are incorrectly enabled at startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139530">139530</a>: SWTException when workbench is shut down<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139718">139718</a>: Got internal error for &quot;Retrieving labels&quot; when displaying my JSP variable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139853">139853</a>: NPE in asynch tree viewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139859">139859</a>: selection lost while traversing tree<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136416">136416</a>: Terminated threads appearing in debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139562">139562</a>: Regression...Launch Dialogs lose default button handling<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139576">139576</a>: unable to get the 'value' column back in variables view<br>
-
-<h2>RC2 - April 28, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131930">131930</a>: New Variables view is hard to use<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136478">136478</a>: IllegalArgumentException in ProcessPropertyPage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138468">138468</a>: special characters should be escaped in var view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138220">138220</a>: Using 0424-0010, I got org.eclipse.core.commands.common.NotDefinedException<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123842">123842</a>: IndexedVariablePartition has no children in InspectPopup.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126725">126725</a>: &quot;Find&quot; in virtual trees<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126724">126724</a>: Copy Stack/Variables in virtual tree<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137782">137782</a>: Index out of bounds exception in clear()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136671">136671</a>: Mnemonic conflict on "Common" Launch Configuration tab<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136917">136917</a>: Console view doesn't get opened in the current window<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137212">137212</a>: Launch Dialogs won't save data<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137511">137511</a>: Launch Dialogs won't close<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130201">130201</a>: Debug view doesn't select the last stopped thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=109611">109611</a>: System environment variables are not propagated into External tools<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136623">136623</a>: prompt to delete shared configs not needed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137379">137379</a>: Assert error from actions when wrappering JDT debug elements.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135093">135093</a>: 'Errors in Project' dialog should have 'Yes' as default button<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134612">134612</a>: shared location dialog does not persist size/location<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134287">134287</a>: Junit View autosave class(es) used in test<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130208">130208</a>: Widget disposed in AsynchronousTreeModelViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137836">137836</a>: Step Filters action do not use StepFiltersAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138186">138186</a>: Deadlock after inspecting a value (Ctrl+Shift+I)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137569">137569</a>: Remove ICU4J dependency for org.eclipse.core.variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108039">108039</a>: Detail pane setting not remembered if debug views are controlled by context<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120620">120620</a>: Static variables show up twice in Find Variables Dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133750">133750</a>: Copy variables action should include columns to copy values of variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137923">137923</a>: Delete Launch Configurations dialog problems<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138002">138002</a>: ModelDelta using ArrayList that only contains 1 element<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128452">128452</a>: Race Condition on Auto-Removal of terminated Launches<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128289">128289</a>: [memory view] added mem block  not selected in mem view tree<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130572">130572</a>: [Memory View] Do not show Previous and Next Page actions for IMemoryBlock<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139051">139051</a>: Remove unused 'background' function in old debug action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120200">120200</a>: Stepping performance deteriorates for testcase with many variables<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126725">126725</a>: Find" in virtual trees<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134833">134833</a>: Thread Change events not handled properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136439">136439</a>: Terminate All should be disabled on startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133422">133422</a>: [Memory View] SwitchMemoryBlock does not list all available memory blocks if the node is collapsed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135275">135275</a>: [Memory View] Formatting sometimes not synchronized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136646">136646</a>: [Memory View] Memory View takes focus whenever a rendering is added<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133755">133755</a>: Columns settings not remembered for Registers View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137308">137308</a>: [Memory View] Need changes in table rendering resulted from changes with underlying table viewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138011">138011</a>: [Memory View] Format causes boundary alignment to be incorrect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139024">139024</a>: Ant JRE tab has clipped widgets on the bottom<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138660">138660</a>: [Memory View] Firing state change event for memory block does not update labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138729">138729</a>: [Memory View] Need to  be able to turn off address boundary alignment<br>
-
-<h2>RC1 - April 13, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=101754">101754</a>: [EditorMgmt] Debug view opens wrong editor if more than one editor is registered for given file type.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135629">135629</a>: undo/redo in variable view details pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134871">134871</a>: StackOverflowError using AsynchronousViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133632">133632</a>: Please add &quot;do not ask again&quot; to &quot;errors in project&quot; dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134177">134177</a>: Step Actions still check for IStep interface<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134324">134324</a>: infinite &quot;do you wish to save?&quot; dialogs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17360">17360</a>: Should specify default shared config location<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134186">134186</a>: [Memory View] Workbench gets really slow after formatting to 1 byte per row<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134408">134408</a>: DBCS3.2: errors on the Variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110215">110215</a>: Apply button has no effect after having modified launch configuration arguments<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135514">135514</a>: BreakpointConditionEditor disposes global action handler<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133563">133563</a>: Edit Source Lookup action available on non-existant config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127894">127894</a>: Debug Exception when selecting the launch after refactor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=114727">114727</a>: DebugException after renaming a type and switching to debug perspective<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135877">135877</a>: Warning in latest nightly build<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135770">135770</a>: need to adopt ICU4J APIs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133379">133379</a>: Bad console pattern listener breaks launching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127157">127157</a>: Deleting &gt; 1 project results in &gt; 1 prompt to delete configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134746">134746</a>: Pressing ENTER key while editing program or VM arguments runs the app and doesn't insert a new line.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131368">131368</a>: [Memory View] AddMemoryBlockAction and GoToAddressAction  should get debug context from service<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131830">131830</a>: [Memory View] AbstractAsyncTableRendering shows pending forever<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133864">133864</a>: [Memory View] Columns not sized properly first memory rendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134886">134886</a>: [Memory View] Copy and Print actions only copy/print what's visible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135031">135031</a>: [Memory View] Lose last line of buffer for IMemoryBlock after format<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135119">135119</a>: [Memory View] Reset does not position the base address to the top of the view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135274">135274</a>: [Memory View] Text rendering should render memory byte-by-byte for invalid data<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134092">134092</a>: NPE in LaunchConfigurationsDialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135897">135897</a>: [Memory View] All tab labels show address if creating more than one rendering at the same time<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135914">135914</a>: [Memory View] TableRenderingModel only considers values when marking a byte as changed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133857">133857</a>: Expansion not maintained in Registers View when switching between stackframes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129247">129247</a>: [Memory View] Format Dialog is too small<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134603">134603</a>: [Memory View]MonitorMemoryBlockDialog is too small<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134348">134348</a>: Footprint fattening from StackFrameSourceDisplayAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131920">131920</a>: Variables view unusably small<br>
-
-<h2>3.2 Milestone 6 - March 31, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132896">132896</a>: Improve perspective description and display on launch dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133752">133752</a>: Unexpected filtering in the launch configuration dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132929">132929</a>: LCD Filtering is whacked<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132860">132860</a>: launch config resource filter assumes resource mapping is project<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133553">133553</a>: prompt for delete breakpoints and working sets enabled when nothing selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133705">133705</a>: Error out of date in Launch dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133712">133712</a>: Typing in filter text in launch dialog does not work as expected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132936">132936</a>: Resizeable launch configuration migration dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130852">130852</a>: NPE from async tree viewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132342">132342</a>: [Memory View] Need more enhancements in offset mode for GoToAddressAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133371">133371</a>: [Memory View] SwitchMemoryBlockAction calls model on UI thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=133877">133877</a>: [Memory View] Viewer contribution of AddMemoryRenderingActionDelegate does not work properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106790">106790</a>: Resume button is incorrectly enabled when the IProcess is selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131179">131179</a>: Show Column action has no effect in Registers View and Expressions View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132044">132044</a>: ArrayIndexOutOfBound exception in Variables View if show column is off<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132150">132150</a>: Suspend action is always disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127147">127147</a>: [Memory View] Allow user to enter &quot;go to address&quot; in an address bar from a rendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=105733">105733</a>: TVT 3.1 - TCT 531 - Poor grammar in &quot;Run Eclipse Application&quot; and &quot;Profile Eclipse Application&quot;<br>
-
-<h2>March 21, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132953">132953</a>: DBCS3.2: unstable Breakpoint export<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131818">131818</a>: [Column Adapters] Widget disposed error closing down workbench<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131765">131765</a>: Columns disappear when resumig to breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131842">131842</a>: Remove workaround for bug 95832<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131922">131922</a>: index out of bounds handling cell selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131587">131587</a>: launch config dialog has different appearance than the rest of eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131173">131173</a>: &quot;show columns&quot; setting not persisted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130534">130534</a>: Need collapse option for launch config management<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132054">132054</a>: NPE in JavaBreakpointPropertiesAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=118072">118072</a>: [flex-hierarchy] Setting color to null in label adapter does nothing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127066">127066</a>: debug capability interfaces should be async<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106205">106205</a>: [plan item] Enhance the debug platform<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131816">131816</a>: [Memory View] Sync properties id need to be defined in AbstractAsyncTableRendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132027">132027</a>: [Memory View] Rendering View Pane is blank if the tree viewer is hidden<br>
-
-<h2>March 14, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131032">131032</a>: org.eclipse.debug.ui.BreakpointOrganizers shutdown problem<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131174">131174</a>: background color for changed value should be user pref<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=131212">131212</a>: Need factory adapter for IModelSelectionPolicyAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=103811">103811</a>: cannot delete a breakpoint working set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79713">79713</a>: Persist/restore expansion state in the LCD<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125292">125292</a>: red X = delete   black X = clear<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129757">129757</a>: view menu polishing: use 'Layout' submenu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130750">130750</a>: cheese in LCD<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130663">130663</a>: Warn when console pattern matcher missing enablement expression<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=102943">102943</a>: [Memory View] F1 help for Memory View does not work correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108590">108590</a>: [Memory View] Add mnemonic to pull down menu items<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99866">99866</a>: [Memory View] Labels on the Memory Monitors Pane is truncated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120758">120758</a>: [Memory View] Non-auto load mode does not load memory properly if row size is not boundary aligned<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127327">127327</a>: [Memory View] Rendering shows blank lines when re-synchronizing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130370">130370</a>: [Memory View] Add Layout submenu in Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129761">129761</a>: [Memory View] memory view UI issues<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125374">125374</a>: support trees with columns<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130775">130775</a>: [Memory View] TableCursor magically appears again<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130941">130941</a>: [Memory View] swt exception  when debug session is terminated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130953">130953</a>: [Memory View] Create provisional APIs<br>
-
-<h2>March 7, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130431">130431</a>: A lot of characters in a line of output crashes Eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129762">129762</a>: initial focus in launch dialog should be on tree, not filter coolbar<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124257">124257</a>: LCD insists on saving<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128991">128991</a>: NPE in DebugPlugin<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127873">127873</a>: Actions incorrectly enabled in Debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128685">128685</a>: Resume action enabled after all processes terminated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129577">129577</a>: separate viewer model and widgets<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79912">79912</a>: Bad sizing in LaunchConfigurationsDialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130373">130373</a>: Bad sizing on the LaunchConfigurationPropertiesDialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129381">129381</a>: LaunchView will never return a ShowInContext<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130767">130767</a>: In 3.1/3.2, ExecutionArguments class unexpectedly returns surrounding double-quotes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130828">130828</a>: Breakpoints View go to file icon is gone.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130397">130397</a>: [Memory View] widget disposed exception when debug session terminates<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=130555">130555</a>: [Memory View] Cursor unexpectedly disappears<br>
-
-<h2>February 28, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124799">124799</a>: Discouraged references on legitimate API methods<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127926">127926</a>: Discouraged access to &quot;getContainer()&quot; from &quot;FolderSourceContainer&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106406">106406</a>: Preference not saved when launching with compile error<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128383">128383</a>: BreakpointOrganzierLabelProvider extends internal UI class but does not use it<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128610">128610</a>: DBCS32: exported breakpoints file isn't UTF-8 encoded<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128978">128978</a>: Add an &quot;Are You Sure?&quot; check to &quot;Remove All&quot; action in Expressions View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128553">128553</a>: NPE when launching Ant launch config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128534">128534</a>: Use FilteredTree in launch configuration dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129351">129351</a>: Mismatched selection in Launch Configuration Dialog after rename<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=121747">121747</a>: [flex-hierarchy] investigate jface TreeSelection and TreePath<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=129379">129379</a>: Incorrect logic in BreakpointTypeOrganizer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128494">128494</a>: Organize manifests<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127331">127331</a>: [Memory View] Changing color setting has no effect until refresh<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127460">127460</a>: [Memory View] Create empty groups in context menu for AbstractAsyncTableRendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127371">127371</a>: [Memory View] #supportsValueModification calls on UI thread<br>
-
-<h2>3.2 M5 - February 17, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123653">123653</a>: Ctrl-Shift-D does not work  in dialogs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127914">127914</a>: Export Breakpoints Table does not use Dialog Font<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127581">127581</a>: NPE attempting selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124274">124274</a>: debug keybindings not active on first launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127067">127067</a>: Instruction pointer images should be API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126630">126630</a>: Deadlock while building<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=121454">121454</a>: Console synchronization problem<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=105235">105235</a>: TVT 3.1: TCT479 - mnemonic char in middle of DBCS menu label<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117103">117103</a>: Suspending the target manually does not expand it.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126667">126667</a>: Copy stack behavior differs when showing thread groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68394">68394</a>: [view management] debug view stays when debug session finishes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=87612">87612</a>: Automated tests for debug view management<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=119512">119512</a>: [flex-hierarchy] AsynchronousTreeViewer.add(..) requires UI Thread.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124203">124203</a>: View management with respect to debug context manager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126790">126790</a>: Variables view update problems<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117491">117491</a>: Debug event handlers no more<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=119512">119512</a>: [flex-hierarchy] AsynchronousTreeViewer.add(..) requires UI Thread.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126666">126666</a>: NPE in target on latest code<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126726">126726</a>: Show Monitors not working<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125236">125236</a>: Missing context help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=95791">95791</a>: [view management] Context enablement efficiency<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127106">127106</a>: suspend trigger not created for subsequent launches<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127130">127130</a>: ConsoleDocumentAdapter.repairLines needs review<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=66576">66576</a>: perspectives pref page tab does not take activities into accoutn<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126963">126963</a>: Terminate action in console context menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126964">126964</a>: &quot;Remove Launch&quot; action in console context menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126884">126884</a>: Terminology: 'Perspectives' vs. 'Perspective Switching'<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125375">125375</a>: Cancel does not cancel launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126439">126439</a>: SelectAllExpressionsAction leakage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127334">127334</a>: Turning off filter checked launch configuration types fails<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127305">127305</a>: apply revert buttons appear always<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127246">127246</a>: NPE in ViewContextService.perspectiveChanged<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126733">126733</a>: Debug view toolbar actions initially enabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127307">127307</a>: empty logical structure dance<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127937">127937</a>: Leak: LaunchSuspendTrigger is not disposed properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127903">127903</a>: Terminate all has no effect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125536">125536</a>: selection not revealed when item not populated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127458">127458</a>: NPE attempting selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127918">127918</a>: Refresh Tab displaying incorrect error message<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127932">127932</a>: Widget is disposed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127473">127473</a>: NPE in  Launch View context provider<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127190">127190</a>: Duplication of stack in Debug View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127757">127757</a>: missing thread in debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127946">127946</a>: Leak: ConsoleView never deregistered from the ConsoleManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127886">127886</a>: NPE on importing Ant breakpoints<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90164">90164</a>: [Memory View] Highlight/Colourize Changed Values<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106424">106424</a>: [Memory View] Move memory view update to background thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120031">120031</a>: [Memory View] Need to allow clients to customize labels in SwitchMemoryBlockAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120126">120126</a>: [Memory View] RenderingViewPane does not set selection to new memory block<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128096">128096</a>: [Memory View] Selection in tree view pane not maintained properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120443">120443</a>: [Memory View] Reset Monitor action does not run<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=127368">127368</a>: [Memory View] NPE in synchronization service when Memory View is closed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128292">128292</a>: launch config type viewer is showing private config types<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128144">128144</a>: Launch view should support legacy &quot;workbench adapters&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128210">128210</a>: Cannot expand items in the Variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=128314">128314</a>: NPE after clicking in stack<br>
-
-<h2>February 7, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126024">126024</a>: Launch config filter for external tools<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126114">126114</a>: Launch Configuraiton dialog filter count does not update<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123163">123163</a>: AsynchronousTreeViewer should use SWT.VIRTUAL.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120863">120863</a>: Support Ctrl modifier on console hyperlinks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=121106">121106</a>: no need for IModelDelta.CHANGE flag<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=122743">122743</a>: ToggleBreakpointAction must implement IUpdate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124040">124040</a>: debug/inspect popups require ITextViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125490">125490</a>: Debug view not populated when a breakpoint is reached<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125771">125771</a>: unable to create method breakpoints in external source<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126106">126106</a>: popup dialog API changes<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126165">126165</a>: Snipptet editor's 'documentSetup' extension violates spec<br>
-
-<h2>January 31, 2006</h2>
-<h3>Enhancements</h3>
-<ul>
-  <li>Added API to consolePatternMatchListeners extension to support the use of
-    string variable substitution in pattern matchers. See extension point documentation.</li>
-  <li>Added API to delegate watch expression creation to debug model via IWatchExpressionFactoryAdapter.
-    Allows a debugger to override default watch expression creation based on a
-    variable's name.</li>
-</ul>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=119488">119488</a>: java stack trace hyperlinks not .java agnostic<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124257">124257</a>: LCD insists on saving<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125244">125244</a>: ResourceException while running Debug test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=12134">12134</a>: Closing a project should disable run and debug.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125005">125005</a>: renaming a project prompts for deleting launch configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=115044">115044</a>: Filter launch configurations to current working set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125361">125361</a>: spelling error in Configure Details Area dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=125054">125054</a>: FIlter menu mnuemonic should be letters not numbers<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124160">124160</a>: step actions become disabled<br>
-
-<h2>January 24, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124171">124171</a>: Launch configuration filters prefs page: glitches in labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123861">123861</a>: Selection remains on filtered config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124170">124170</a>: Launch configuration filters: pulldown menu on filter button<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124181">124181</a>: Invalid Thread Access in LaunchConfigurationsDialog<br>
-
-<h2>January 17, 2006</h2>
-<h3>Enhancements</h3>
-<ul>
-  <li>New API to export and import breakpoints. The new API classes ExportBreakpointsOperation
-    and ImportBreakpointsOperation can be found in org.eclipse.debug.ui.actions.</li>
-</ul>
-
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19521">19521</a>: Launching classes from closed projects<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=122882">122882</a>: Mnemonic change on debug launch page: &quot;De&amp;bug&quot; conflicts with &quot;&amp;Browse&quot; buttons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=114521">114521</a>: Still too hard to customize the coloring of the executing line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123820">123820</a>: typo in AbstractSourceLookupDirector javadoc<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=113772">113772</a>: removing a project should remove launcher-entry as well<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123627">123627</a>: Filter count on LCD not accurate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123630">123630</a>: CCE pressing Aply in Launch config pref page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123635">123635</a>: run/debug latest fails when filtered<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123680">123680</a>: FIlter count not updated with action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123858">123858</a>: LCD main page needs updating<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123663">123663</a>: Launch history should support Capabilities<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123862">123862</a>: keywords for Launch Configurations pref page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123889">123889</a>: LCD not setting dialog font for preferences dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123956">123956</a>: Font not propegated to child widgets<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123440">123440</a>: DebugPopup and InspectPopup need javadoc/since 3.2<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=124017">124017</a>: NPE after deleting config from LCD<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111530">111530</a>: update dialog size/position persistance<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123847">123847</a>: Remote Java App - Debug Run Configuration - throws IndexOutOfBoundsException<br>
-
-<h2>January 10, 2006</h2>
-<h3>Enhancements</h3>
-<ul>
-  <li>Insturction pointer annotataions can be overriden in part or whole by having a debug
-     model presentation implement <code>IInstructionPointerPresentation</code>. This allows
-     specification of the entire annotation object, and annotation type + text, or an
-     image + text.</li>
-</ul>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=122908">122908</a>: pref pages missing context help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=121681">121681</a>: CCE in breakpoints export wizard.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=116316">116316</a>: &quot;Source lookup error&quot; logged<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=122646">122646</a>: Use IStructuredSelection instead of StructuredSelection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111017">111017</a>: default tab width for MessageConsole changed from 8 to 0 in 3.1<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=116060">116060</a>: MessageConsoleStream.println synchronization hazard<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117946">117946</a>: InstantiationException from ConsoleRemoveLaunchAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=119306">119306</a>: [flex-hierarchy] LaunchView autoExpand() creates TreePath with hard coded hierarchy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=122166">122166</a>: Watch does Inspect in 3.2M4<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=123327">123327</a>: Need API to import / export breakpoints programatically<br>
-
-<h2>3.2 M4</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120677">120677</a>: Terminating a debug launch does not deactivate the debugging context<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108568">108568</a>: Debug console test failure<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120028">120028</a>: ConcurrentModificationException in DecorationManager when stepping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=121092">121092</a>: DefaultUpdate policy ignores EXPAND and SELECT deltas for unchanged items<br>
-
-<h2>December 12, 2005</h2>
-<h3>Enhancements</h3>
-<ul>
-  <li>The &quot;source not found&quot; editor and editor input have become API.
-    See <code>CommonSourceNotFoundEditor</code> and <code>CommonSourceNotFoundEditorInput</code>.</li>
-  <li>The &quot;changed value color&quot; has become API. See <code>IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR</code>
-    and <code>DebugUITools.getPreferenceColor(id)</code>.</li>
-</ul>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120683">120683</a>: Please stop using ListenerList from org.eclipse.core.commands<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=119447">119447</a>: SaveScopeResourcesHandler needs check for Private configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117098">117098</a>: Thread not selected on class loading breakpoint hit<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=92901">92901</a>: Popup control should be installed once on each control<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106419">106419</a>: [Memory View] Improve user experience for adding new memory blocks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100081">100081</a>: [Memory View] Support for address space in Memory View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106422">106422</a>: [Memory View] Improvement to Memory Monitor View Pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=118075">118075</a>: CommonSourceNotFoundEditor needs to be public<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106421">106421</a>: [Memory View] Initial column size preference should be stored by debug target<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112412">112412</a>: Make access to change variable colour preference public<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117093">117093</a>: [flex-hierarchy] Drop to frame doesn't clear old current line annotations.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117082">117082</a>: [flex-hierarchy] expressions don't show errors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=119391">119391</a>: Many NPEs in DebugTargetProxy.containsEvent<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120010">120010</a>: combine IModelDelat and IModelDeltaNode<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108828">108828</a>: Drag and Drop in Breakpoints view shows misleading drop affordance<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120447">120447</a>: prompted to save scrapbook editor before exeucting expression<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117072">117072</a>: [flex-hierarchy] suspend event may occurr before proxy installed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=113410">113410</a>: null fTabFolderForMemoryBlock in RenderingViewPane.memoryBlocksAdded<br>
-
-<h2>December 6, 2005</h2>
-<h3>Enhancements</h3>
-<ul>
-  <li>New API action for enabling/disabling breakpoints in editor ruler - RulerEnableDisableBreakpointActionDelegate.</li>
-  <li>New abstract API action for action working on breakpoints in editor ruler
-    - RulerBreakpointAction.</li>
-  <li>API to retrieve images and browsers for source containers added to DebugUITools.</li>
-  <li>API for overriding default instruction pointer annotations - see IInstructionPointerPresentation.</li>
-</ul>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=63058">63058</a>: Adding lots of favorites needs busy cursor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=97706">97706</a>: [Memory View] Need to make some more Memory View  related contants/methods public<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=88914">88914</a>: [Memory View] Provide UI and API to configure the addressable size.<br>
-
-<h2>November 29, 2005</h2>
-<h3>Enhancements</h3>
-<ul>
-  <li>API has been added to retrieve images and browsers for source container
-    types. See DebugUITools.</li>
-</ul>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117945">117945</a>: [flexible hierarchy] ClassCastException when trying to get active context<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117386">117386</a>: [flex-hierarchy] expand over rides previous expands<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112792">112792</a>: NPE in TextConsoleViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89429">89429</a>: Make the SourceLookupUIUtils class public<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117720">117720</a>: SelectAll and Copy actions not available in Registers View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=118082">118082</a>: Deadlock between VariablesViewer and DefaultVariableViewModelProxy<br>
-
-<h2>November 22, 2005</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=114845">114845</a>: 'Terminate and relaunch' action is enabled for non-relaunchable configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=115874">115874</a>: Import and Export icons for Breakpoints are backwards.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117057">117057</a>: [flex-hierarchy] NPE in RemoveAllTerminatedAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117090">117090</a>: [flex-hierarchy] terminated threads appear in debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=82850">82850</a>: Variable is not updated in the variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106150">106150</a>: Variables view is constantly updating which results in 100% CPU usage<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=109943">109943</a>: Expressions view calls expensive IValue.getVariables() instead of cheap IValue.hasVariables()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110206">110206</a>: Variables view won't collapse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117101">117101</a>: [flex-hierarchy] select/expand states not cleared from cache<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117155">117155</a>: [flex-hierarchy] Threads not updated when target resumed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=114617">114617</a>: [Memory View] Tooltip not updated propertly at column 0 in AbstractTableRendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100273">100273</a>: [Memory View]: Preference Table Renderings UI bug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117095">117095</a>: [flex-hierarchy] resuming one thread does not select next suspended thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=117106">117106</a>: [flex-hierarchy] null tree path with manually expanding thread<br>
-
-<h2>November 8, 2005</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=115195">115195</a>: Debug manifests reference a deprecated header<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=115155">115155</a>: Link to perspective preferences<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=90031">90031</a>: [Memory View] Adjust the Number of Columns in the Memory View<br>
-
-<h2>October 31, 2005</h2>
-<h3>Enhancements</h3>
-<ol>
-  <li>Consoles can provide context specfic F1 help. Console implementations should
-    override <code>AbstractConsole.getHelpContextId()</code> to hook appropriate
-    help. If not provided, the generic help for the console view is displayed.</li>
-</ol>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112625">112625</a>: Launcher : Bad default value with the variable ${string_prompt}<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112670">112670</a>: Can't toggle selection of treeitem in variables view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=113837">113837</a>: breakpoints import and export wizards should be categorized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112503">112503</a>: Cannot change the background color of the 'Display' view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112553">112553</a>: ConcurrentModificationException in BreakpointManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112771">112771</a>: Add API to allow specific context help in Text Consoles<br>
-
-<h2>October 25, 2005</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112648">112648</a>: Breakpoint import/export references java constant<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=113378">113378</a>: incorrect neumonic on Launching preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111633">111633</a>: API clarification needed for getWorkingCopy()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111739">111739</a>: [Contributions] matchesContentType check does not take base-type into account<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106567">106567</a>: [Memory View] Provide hover support in table renderings<br>
-
-<h2>October 18, 2005</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110080">110080</a>: breakpoint import updates breakpoint view for each breakpoint<br>
-
-<h2>October 11, 2005</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111485">111485</a>: perspective page fails when new launch types are added<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=103462">103462</a>: Stacktrace-Hyperlink works only for one link per line<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111437">111437</a>: hyperlinks not updated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=109491">109491</a>: Exception in log<br>
-
-<h2>October 4, 2005</h2>
-<h3>Enhancements</h3>
-<ol>
-  <li>The perspective settings associated with launch configurations have been
-    centralized on the &quot;Run/Debug &gt; Perspectives&quot; preference page.
-    Previously the perspective settings were controlled via the launch configuration
-    dialog. The &quot;Perspectives&quot; tab has been replaced with a &quot;Getting
-    Started&quot; tab that explains how to create a new configuration.</li>
-</ol>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110928">110928</a>: mneumonic conflict on preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=79709">79709</a>: Centralize launching preferences<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110075">110075</a>: Embedded breakpoints view with nested groups does not update check marks properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=111079">111079</a>: debug/run button active with multiple selection<br>
-
-<h2>September 21, 2005</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110078">110078</a>: acclerator conflict in breakpoint import<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=110074">110074</a>: Breakpoints are not added to default breakpoint working set<br>
-
-<h2>September 19, 2005</h2>
-<h3>Enhancements</h3>
-<ol>
-  <li><strong>Remove a single console</strong>: An action has been added to the console
-  toolbar to remove the associated launch/console.</li>
-</ol>
-
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=109008">109008</a>: breakpoint import/export polish items<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=103731">103731</a>: breakpoint working set settings lost on project close/open<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=102270">102270</a>: Console: Close just one window?<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=109009">109009</a>: Tests for breakpoint import/export<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=109777">109777</a>: import/export breakpoints test failure<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=102526">102526</a>: Find/Replace in Console window does not go to proper place of matches when window  has fixed width<br>
-
-<h2>September 13, 2005</h2>
-<h3>Enhancements</h3>
-<ol>
-  <li><strong>Breakpoint import and export</strong>: Breakpoints can be exported
-    and imported from the local file system. Actions are available in the context
-    menu of the Breakpoints view to export/import, as well as in the general import/export
-    wizard. </li>
-</ol>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=41057">41057</a>: Option to export and import break points at the Breakpoints view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=86114">86114</a>: Breakpoint working set wizard should show breakpoints in hierarchical fashion<br>
-
-<h2>September 6, 2005</h2>
-<h3>Enhancements</h3>
-<ol>
-  <li><strong>System properties as launch variables</strong>: A new string variable
-    &quot;${system_property:name}&quot; was added to the debug platform that resolves
-    to the value of a system property in the Eclipse SDK runtime. The variable
-    accepts a system property name as an argument and a selection dialog allows
-    the user to select from known system properties.</li>
-</ol>
-
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108323">108323</a>: expose system properties as variables in the launching framework<br>
-
-
-<h2>Aug 30, 2005 </h2>
-
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=107488">107488</a>: [Memory View] Table rendering stop updating when new memory blocks are added<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108307">108307</a>: remove coupling between breakpoints view and content provider<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=105356">105356</a>: TVT 3.1 - TCT 428 - Mnemonic Error<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=107383">107383</a>: testCaseSensitiveQualifiedSourceLookup failure<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=108126">108126</a>: NPE when bringing Registers View to the top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=107739">107739</a>: [Memory View] Rendering View Pane does not pin display on first new memory block.<br>
-
-<h2>Aug 8, 2005 </h2>
-<h3>Enhancements</h3>
-<ol>
-  <li><strong>API addition:</strong><code> IDebugUIConstants.PREF_MAX_DETAIL_LENGTH</code>.
-    The user preference controlling the maximum length of strings displayed in
-    the Variables view detail area has been made public API. In previous builds
-    the preference was internal.</li>
-</ol>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=106178">106178</a>: Remove uneccessary NLS tags<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89471">89471</a>: [polish] Installed JRE pref page: Source attach &amp; jdoc loc should be configurable in default<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=104852">104852</a>: Debug View  changes focus on removal of terminated launch forcing editor popup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=104675">104675</a>: large byte[] variabls expand into too much memory<br>
-
-
-<h2>Aug 2, 2005 </h2>
-<h3>Enhancements</h3>
-<ol>
-  <li>Added NL support for images.</li>
-</ol>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=103381">103381</a>: Infinite viewer expand/restore when recursive data structure expanded<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=105071">105071</a>: Incorrect handling for debugger's continue-launch-despite-compile-errors dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=105264">105264</a>: [BIDI] need to add $nl$/ to icon paths for reversed icons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=104573">104573</a>: Resource Tree Locked error while saving shared Eclipse Application launch config<br>
-
-<h2>July 26, 2005 </h2>
-<h3>
-Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=98147">98147</a>: Variables View does not show all children if same instance is expanded twice<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99416">99416</a>: Evaluation in context of superclass fails to resolve instvar in subclass<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100543">100543</a>: TextConsoleViewer should not subclass TextViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100480">100480</a>: Duplicate launch configuration leads to bogus launch configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=102537">102537</a>: org.eclipse.ui.console.consolePageParticipants API information<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99753">99753</a>: Debug use of new Boolean(boolean)<br>
-</body>
-</html>
diff --git a/org.eclipse.debug.core/r3_3_buildnotes_platform-debug.html b/org.eclipse.debug.core/r3_3_buildnotes_platform-debug.html
deleted file mode 100644
index 5c79a75..0000000
--- a/org.eclipse.debug.core/r3_3_buildnotes_platform-debug.html
+++ /dev/null
@@ -1,747 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]">
-   <title>Platform Debug Release Notes</title>
-</head>
-<body>
-<h1> Eclipse 3.3 Debug Platform Build Notes&nbsp;</h1>
-
-<h2>Summary of API changes in 3.3</h2>
-<h3>Launching</h3>
-The launch framework has been enhanced to support the following: 
-<ul>
-  <li> Mixed mode launching - for example, allows an application to debugged and 
-    profiled at the same time</li>
-  <li> Multiple launch delegates for the same configuration type and mode combination 
-    - for example, allows multiple Java profilers to exist in the workbench side 
-    by side</li>
-  <li>Contribution of extra tabs to existing tab groups - for example, allows 
-    a profiler to contribute a profile options tab to an existing tab group in 
-    the launch dialog</li>
-  <li>Read-only launch configurations - for example, if a launch configuration 
-    is stored in the file system in a read-only state, the launch configuration 
-    cannot be edited in the launch dialog</li>
-  <li>Nested launch configuration working copies - allows a working copy to be 
-    created from a working copy that saves back to the parent working copy instead 
-    of file system</li>
-</ul>
-<p>The following extension points have been added: </p>
-<ul>
-  <li><code>org.eclipse.debug.ui.launchConfigurationTabs</code> - allows a tab 
-    to be contributed to an existing tab group in the launch configuration dialog 
-    <ul>
-      <li>added extension point identifier constant <code>IDebugUIConstants.EXTENSION_POINT_LAUNCH_TABS</code> 
-      </li>
-    </ul>
-  </li>
-</ul>
-<p>The following extension points have been enhanced: </p>
-<ul>
-  <li><code>org.eclipse.debug.core.launchDelegates </code> 
-    <ul>
-      <li>addition of optional <code>name</code> attribute to allow users to select 
-        a launcher when more than one is available</li>
-      <li>addition of optional <code>modeCombination</code> element to specify 
-        supported mixed launch modes</li>
-    </ul>
-  </li>
-  <li><code>org.eclipse.debug.core.launchConfigurationTypes </code> 
-    <ul>
-      <li>addition of optional <code>icon</code> attribute to allow an icon to 
-        be contributed in the same extension as its type. This can only be used 
-        if the icon is in the same plug-in as the launch configuration type.</li>
-      <li>addition of optional <code>delegateName </code>attribute to allow users 
-        to select a launcher when more than one is available</li>
-    </ul>
-  </li>
-</ul>
-<p>The following types have been added:</p>
-<ul>
-  <li>added interface <code>org.eclipse.debug.core.ILaunchDelegate</code> - provides 
-    access to a launch delegate extensions and attributes</li>
-  <li>added class org.eclipse.debug.ui.AbstractLaunchModeConfigurationTab - abstract 
-    implementation of a launch tab that modifies a configuration's launch mode</li>
-</ul>
-<p>The following types have been modified in support of launching enhancements:</p>
-<ul>
-  <li>org.eclipse.debug.core.ILaunchConfiguration 
-    <ul>
-      <li>added method getAttribute(String key, Set defaultValue)</li>
-      <li>added method getModes()</li>
-      <li>added method isReadOnly()</li>
-    </ul>
-  </li>
-  <li>org.eclipse.debug.core.ILaunchConfigurationType 
-    <ul>
-      <li>deprecated method getDelegate(String mode)</li>
-      <li>added method getDelegates(Set modes)</li>
-      <li>added method getPreferredDelegate(Set modes)</li>
-      <li>added method setPreferredDelegate(Set modes)</li>
-      <li>added method supportsModes(Set modes)</li>
-      <li>deprecated method getSupportedModes()</li>
-      <li>added method getSupportedModeCombinations()</li>
-      <li>added method getContributorName()</li>
-      <li>added method getImageDescriptorPath()</li>
-    </ul>
-  </li>
-  <li>org.eclipse.debug.core.ILaunchConfigurationWorkingCopy 
-    <ul>
-      <li>added method addModes(Set modes)</li>
-      <li>added method setModes(Set modes)</li>
-      <li>added method removeModes(Set modes)</li>
-      <li>added method getNestedWorkingCopy()</li>
-      <li>added method getParent()</li>
-    </ul>
-  </li>
-  <li>org.eclipse.debug.ui.DebugUITools 
-    <ul>
-      <li>added method getLastLaunch(String id)</li>
-      <li>added method openLaunchConfigurationEditDialog(Shell shell, ILaunchConfiguration 
-        configuration, String groupIdentifier, IStatus status, boolean showCancel)</li>
-    </ul>
-  </li>
-  <li>org.eclipse.debug.ui.AbstractLaunchConfigurationTab 
-    <ul>
-      <li>added method getId()</li>
-    </ul>
-  </li>
-  <li>org.eclipse.debug.ui.actions.AbstractLaunchHistoryAction 
-    <ul>
-      <li>getHistory()</li>
-      <li>getFavorites()</li>
-    </ul>
-  </li>
-</ul>
-<h3>Debug Context Service</h3>
-<p>A debug context represents the active state of a program being debugged. The 
-  active debug context drives the enabled state of debug actions (step, terminate, 
-  etc.), source lookup, visible variables, watch expression values, etc. A set 
-  of classes and interfaces have been added allowing clients to respond to and 
-  provide the active debug context.</p>
-<p>The package <code>org.eclipse.debug.ui.contexts</code> has been added with 
-  the following types:</p>
-<ul>
-  <li><code>AbstractDebugContextProvider</code></li>
-  <li><code>DebugContextEvent</code></li>
-  <li><code>IDebugContextListener</code></li>
-  <li><code>IDebugContextManager</code></li>
-  <li><code>IDebugContextProvider</code></li>
-  <li><code>IDebugContextService</code></li>
-  <li><code>ISuspendTrigger</code></li>
-  <li><code>ISuspendTriggerListener</code></li>
-</ul>
-<p>The following types have been modified</p>
-<ul>
-  <li><code>org.eclipse.debug.ui.DebugUITools </code> 
-    <ul>
-      <li>added method <code>getDebugContextManager()</code></li>
-    </ul>
-  </li>
-</ul>
-<h3>Debug Commands</h3>
-<p>Debug commands represent common debug operations implemented by debuggers - 
-  for example, step over, suspend, resume, and terminate. The debug platform allows 
-  debuggers to provide custom implementations of the operations by implementing 
-  debug command handler interfaces. The platform provides a user interface and 
-  actions that delegate to the command handlers. As well, the platform provides 
-  an implementation of the commands for debuggers that are implementations of 
-  the standard debug model. Debuggers may override the standard implementation 
-  by directly implementing the command handler interfaces in debug model elements 
-  or by registering adapters for the command handler interfaces on debug model 
-  elements. The command handler interfaces are to be implemented in a non-blocking 
-  fashion, and are designed with an asynchronous API, allowing clients to cancel 
-  a command or report failure via the asynchronous request.</p>
-<p>The package<code> org.eclipse.debug.core.commands</code> has been added with 
-  the following types:</p>
-<ul>
-  <li><code>IDebugCommandHandler</code></li>
-  <li><code>IDebugCommandRequest</code></li>
-  <li><code>IDisconnectHandler</code></li>
-  <li><code>IDropToFrameHandler</code></li>
-  <li><code>IEnabledStateRequest</code></li>
-  <li><code>IResumeHandler</code></li>
-  <li><code>IStepFiltersHandler</code></li>
-  <li><code>IStepIntoHandler</code></li>
-  <li><code>IStepOverHandler</code></li>
-  <li><code>IStepReturnHandler</code></li>
-  <li><code> ISuspendHandler</code></li>
-  <li><code> ITerminateHandler</code></li>
-</ul>
-<p>Note that the &quot;use step filters&quot; setting has been moved to the <code>org.eclipse.debug.core</code> 
-  plug-in from <code>org.eclipse.debug.ui</code>. This is to allow the toggle 
-  step filters command to work properly in absence of the UI plug-in. The following 
-  API methods have been added to <code>DebugPlugin</code>:</p>
-<ul>
-  <li><code>setUseStepFilters(boolean useStepFilters)</code></li>
-  <li><code>isUseStepFilters()</code></li>
-</ul>
-<p>The same methods that existed in <code>DebugUITools</code> now delegate to 
-  these new methods.</p>
-<h3>Pluggable Detail Panes</h3>
-<p>The variables, registers, and expressions views in Eclipse 3.3 support pluggable 
-  detail panes. A new extension point - <code>org.eclipse.debug.ui.detailPaneFactories</code> 
-  - is used to contribute factories that create detail panes for specific selections. 
-  The platform provides a default text details area that displays textual details 
-  based on a debug model presentation's <code>computeDetails(...)</code> method. 
-  Clients can contribute detail pane factories with enablement expressions that 
-  can create one or more detail panes for specific objects/selections. The user 
-  is allowed to choose between available detail panes using a context menu. See 
-  <code>IDetailPaneFactory</code> and <code>IDetailPane</code>.</p>
-<h3>Source Lookup</h3>
-<p>Source lookup is driven by the active debug context. When a context is activated 
-  the debug platform displays source for that context. Clients may provide a custom 
-  implementation of source lookup by implementing the source display interface 
-  directly on their debug model elements, or by providing an adapter for the source 
-  display interface. The debug platform provides a standard implementation of 
-  source display for debuggers that are an implementation of the standard debug 
-  model - i.e. implementations of <code>IStackFrame</code> that have an associated 
-  <code>ISourceLocator</code>.</p>
-<p>The following interface has been added:</p>
-<ul>
-  <li><code>org.eclipse.debug.ui.sourcelookup.ISourceDisplay</code></li>
-</ul>
-<h3>Console</h3>
-<ul>
-  <li>Added <code>DebugPlugin.ATTR_CONSOLE_ENCODING</code> - this launch attribute 
-    specifies the encoding used by the console. When unspecified the default system 
-    encoding is used. This constant replaces the now deprecated <code>IDebugUIConstants.ATTR_CONSOLE_ENCODING</code>.</li>
-  <li>Deprecated <code>IDebugUIConstants.ATTR_CONSOLE_ENCODING</code>.</li>
-  <li>Added support to set the background color to text consoles - see new methods 
-    <code>TextConsole.setBackground(Color)</code> and <code>getBackground()</code></li>
-  <li>Added property constant to indicate background color of a console has changed 
-    - <code>IConsoleConstants.P_BACKGROUND_COLOR</code>.</li>
-   <li>Added preference constant <code>IDebugUIConstants.PREF_CONSOLE_FONT</code>, which is used to specify
-   what font should be used in the console.</li>
-</ul>
-<h3>Expressions</h3>
-<ul>
-  <li>added <code>org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapterExtension</code> 
-    - this is an interface that can be optionally implemented by <code>IWatchExpressionFactoryAdapter</code>'s. 
-    Allows the <b>Create Watch Expression</b> action to be dynamically enabled 
-    based on the selected variables.</li>
-</ul>
-<h3>Breakpoints</h3>
-<ul>
-  <li>Added new optional interface for breakpoint organizer extensions. Breakpoint 
-    organizer delegates may optionally implement the <code>IBreakpointOrganizerDelegateExtension</code> 
-    interface. The new interfaces supports add and remove operations on collections 
-    of breakpoints to allow for more efficient drag and drop operations in the 
-    breakpoints view.</li>
-</ul>
-<h3>Memory Renderings</h3>
-<ul>
-  <li>Memory renderings can optionally implement the new interface <code>IRepositionableMemoryRendering</code> 
-    to support repositioning. The API allows a memory rendering to be positioned 
-    to a user specified address.</li>
-</ul>
-<h3>Debug Popup Anchor</h3>
-<ul>
-<li>The specifications on the constructor for <code>DebugPopup</code> have been updated to reflect the change allowing 
-<code>null</code> to be passed as the default anchor point. This change allows consumers of the popup to force a default location 
-for the popup to appear when an otherwise valid anchor point is not available.</li>
-</ul>
-
-<h2>3.3 RC4 - June 8, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=188404">188404</a>: [doc] Help for default launchers is meaningless<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=190264">190264</a>: [doc] Add links to command contexts to reference help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=190269">190269</a>: [doc] JDT Developer Guide Topics need organizing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=190528">190528</a>: [doc] New screenshots needed for debug help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=190259">190259</a>: [doc] Check html links in doc plugin<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=190532">190532</a>: [doc] Variables and Expressions aren't helpful enough<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=190535">190535</a>: [doc] Run/Debug help doesn't make sense with contextual launching<br>
-
-<h2>3.3 RC3 - June 1, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189708">189708</a>: fill contextual launch perf test is yellow<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=188689">188689</a>: [Memory View] Command Handler conflict when switching to java editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189665">189665</a>: IProcess label not displayed in debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189182">189182</a>: Help contents cannot be fully indexed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189509">189509</a>: Contextual launching glitches<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189982">189982</a>: Layout shows &quot;Variables View Only&quot; in Registers View drop-down<br>
-
-<h2>3.3 RC2 - May 25, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187746">187746</a>: Conflicting mnemonics on Environment tab of OSGi Framework launcher<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=188444">188444</a>: Restore Defaults does not work in Launch Preference Page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187905">187905</a>: [doc] console actions are missing help context ids<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187684">187684</a>: Slow to show debug drop-down<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=188315">188315</a>: [doc] Reference help uses incorrect style<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=188747">188747</a>: [doc] &quot;Realizes&quot; should be replaced with &quot;Opens&quot; in help doc<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=188919">188919</a>: [doc] Breakpoints view doc needs improvements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189019">189019</a>: [doc] import/export breakpoints topics do not follow style<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189024">189024</a>: [doc] import/export breakpoints F1 help needs more topics<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=189012">189012</a>: Change Value dialogs do not have F1 help<br>
-
-<h2>3.3 RC1 - May 18, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=186527">186527</a>: F11 (Debug Last Launched) behaves wrong in 3.3m7<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=186920">186920</a>: TextConsole setBackground method incorrectly spelled as setBackgrond<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187171">187171</a>: [Memory View] Reset Monitors action is enabled when there is no monitor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187043">187043</a>: TVT33:TCT179: ja: mnemonic displayed in the hover text (linux only)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183509">183509</a>: [launching] Optimize launcher story for test driven development<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187049">187049</a>: Update org.eclipse.jdt.doc.user Memory view user assistance<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=186595">186595</a>: Non-nls string in StackFrameSourceDisplayAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=186622">186622</a>: Deadlock trying to launch two configs at the same time<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184934">184934</a>: [breakpoints] double click bp in external source should fail more gracefully<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=169718">169718</a>: Received ConcurrentModificationException when debugging in RAD6<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185553">185553</a>: Strange icon in the launch configuration context menu<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=169438">169438</a>: [Debug Framework] DefaultVariableCellModifier doesn't call verifyValue<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184959">184959</a>: instruction pointer remains when added &gt; 1 editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185311">185311</a>: typo in detailPaneFactories.exsd<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144019">144019</a>: [KeyBindings] Constructed context shows in Keys pref page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185171">185171</a>: LaunchConfigurationTypesViewer is no longer used and should be deleted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184867">184867</a>: Ok is the new Cancel<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184898">184898</a>: [breakpoints] AIOOB exception setting default working set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184893">184893</a>: [launching] Restore defaults in Run/Debug settings does nothing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184972">184972</a>: [launching] the Search... button is the new dirty button<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184631">184631</a>: no way to remove <unknown> launches<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184864">184864</a>: [help] Help topic for Run/Debug properties pages is wrong<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184999">184999</a>: Add/Edit File System Directory Dialog has incorrect F1 help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184873">184873</a>: No F1 help for Registers view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185832">185832</a>: [launching] [favorites] filtered launch configurations show up where they shouldn't<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185621">185621</a>: Launching history imposes size limit without message<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185688">185688</a>: [KeyBindings] conflict between Run and Debug last launched on Mac<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184970">184970</a>: [Memory View] NPE in SwitchMemoryBlockAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184880">184880</a>: [launching] cannot apply changes editing launch configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184901">184901</a>: [breakpoints] Breakpoints get removed for same named resources<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184865">184865</a>: [help] help topic for Select Configuration Type dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184945">184945</a>: [breakpoints] [refactoring] Moving breakpoints of an anonymous inner type has bad label<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=185829">185829</a>: [help] The add favorites dialog help is not helpful<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184902">184902</a>: Timing problem in variables views' expansion state save/restore logic.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184958">184958</a>: Text from bottom of launch dialog gets cut off<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187033">187033</a>: Concurrent modification exception in LaunchManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=173120">173120</a>: [variables] logical structures re-computed for each visible range<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187319">187319</a>: TVT33:TCT189: ar: 13.002210 Parenthesis incorrectly displayed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=187134">187134</a>: NLS33:default Run application name RTL reading order problem<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=186921">186921</a>: TVT33:TCT170: zh_TW:the mnemonic should be either removed or placed in the end<br>
-
-<h2>3.3 Milestone 7 - May 4, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184896">184896</a>: Concurrent Modification on startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134863">134863</a>: [Memory View] Cell editors in the table rendering needs to be extensible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176857">176857</a>: [Memory View] View id check in DefaultModelProxyFactory makes rendering not portable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176858">176858</a>: [Memory View] CreateRendering can potentially get left behind<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=181648">181648</a>: [Memory View] NPE in AbstractAsyncTableRendering when activated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183078">183078</a>: [Memory View] NPE in sync service<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183019">183019</a>: [Memory View] Reset does not position the base address to the top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184315">184315</a>: Remove all breakpoint dialog does not honor escape<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184320">184320</a>: Color labels for changed values are variables specific<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=167426">167426</a>: InstructionPointerContext keeps reference to closed editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183887">183887</a>: NPE in DefaultVariableViewModelProxy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183504">183504</a>: Frames collapse when holding down step over key<br>
-
-<h2>April 24, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=184108">184108</a>: [Memory View] Address passed to the cell modifier is incorrect for muti-byte addressable size<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183621">183621</a>: Ensure plug-in dependencies are correct (versions)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183059">183059</a>: SWTException: Failed to execute runnable (ArrayIndexOutOfBoundsException)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=180441">180441</a>: RetargetAction should not update upon text selection change<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132385">132385</a>: [Memory View] &quot;Remove Rendering&quot; action  not disabled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144467">144467</a>: [jdi] SocketLaunchingConnectorImpl.launch should call Runtime.getRuntime().exec(String [])<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=173306">173306</a>: When editing source lookup, new source containers should be added at the top of the list.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182657">182657</a>: AssertionFailedException running Ant UI test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182324">182324</a>: [launching] When launching a project with errors the warning dialog title says &quot;Errors in Project{0}&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136943">136943</a>: [console] README: Console Deadlock when too much information written<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183163">183163</a>: Accessing constants causes DebugUI to be started<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182318">182318</a>: context launching should be default launch pref setting<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183097">183097</a>: [launching] prompted for which Eclipse Application to launch after workbench restart<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177539">177539</a>: [launching] Press on Run/Debug button launches an unexpected configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182774">182774</a>: [launching] launch shortcuts have deprecated elements<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=112081">112081</a>: [launching] Widget is disposed error from launch config window<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183275">183275</a>: NPE in TreeModelContentProvider.getPresentationContext<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183460">183460</a>: catch up with JFace fixes from bug 172640<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183463">183463</a>: Expanded nodes in tree viewer flash on refresh<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182901">182901</a>: Better labels for references tracking<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=183360">183360</a>: [launching] Launching tooltip re-computed for same selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176471">176471</a>: [launching] debug fails if the default jre is a jdk<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=181220">181220</a>: Variable text font does not update correctly when columns turned on/off<br>
-
-<h2>April 17, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182230">182230</a>: org.eclipse.core.variables version number update<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182554">182554</a>: illegal argument exception updating labels<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182170">182170</a>: Index out of bounds running test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177909">177909</a>: [Variables View/Registers View] Refresh/Scroll issues - Test Case to reproduce<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=31969">31969</a>: [breakpoints] Method breakpoint icon too wide for editor ruler<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177910">177910</a>: [Debug] No stack frame selected when thread has been suspended<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178868">178868</a>: run/debug buttons do nothing if exception in shortcut enablement expr<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=181044">181044</a>: LabelUpdate does not store previous font data<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=181769">181769</a>: [api] broken api contract in ContextualLaunchAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=181809">181809</a>: [launching] ContextualLaunchAction shuold not hold handle to current selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=182572">182572</a>: [tests] TestAlternateModeTab invalid thread access<br>
-
-<h2>April 10, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178106">178106</a>: [detail pane] Find action doesn't scroll to reveal selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176478">176478</a>: [Registers View] Add font preference for registers view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=180618">180618</a>: AbstractLaunchConfigurationTabGroup#setDefaults() no longer gets called<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178753">178753</a>: Cannot do anything in Run/Debug&gt;Launching&gt;Default Launcher preference page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74480">74480</a>: [launching] Simplify the launch experience for less technical users of Eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=154107">154107</a>: [launching] Enhance launching support<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166219">166219</a>: [launching] Run Last Launched fails due to Launch Config Tree filter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=180756">180756</a>: Launch config attriubutes should be persisted in consistent order<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=143711">143711</a>: [views] async update of variables view too granular<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177303">177303</a>: [launching] ContextLaunchingResourceManager slows down structured selection changes and part activations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42879">42879</a>: [launching] Common tab does not allow revert when in error state<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=180971">180971</a>: [breakpoints] export breakpoints dialog scrolled to right<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138780">138780</a>: [variables] [vitrual] Detail pane doesn't show value of selected element if it is invisible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=181034">181034</a>: Closing the workbench results in Widget is disposed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178526">178526</a>: New menu item &quot;Open Debug Dialog...&quot; is counter intuitive and has bad kbd access key<br>
-
-<h2>April 3, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177640">177640</a>: icon attribute from consoleFactory element should be a resource type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164218">164218</a>: [console] IOConsoleInputStream.read() doesn't reduce the amount of data available<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=179558">179558</a>: [console] Preferences... action should use the new SWTFactory<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178356">178356</a>: [launching] launch tabs do not match new presentation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176638">176638</a>: [launching] launch config tree initially scrolled to the right<br>
-
-<h2>Milestone 6 - Mar 23, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177788">177788</a>: When hitting a breakpoint from the java perspective, the variable view is not populated<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178463">178463</a>: NPE in Launch Configuration Mgr<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177988">177988</a>: Launch configurations marked dirty for no reason<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175805">175805</a>: Debug wants to migrate scrapbook pages but can't<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177165">177165</a>: Context launch chooses Eclipse Application over Test Suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177349">177349</a>: [launching] ContextLaunchingResourceManager should deregister when not using context launching<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176266">176266</a>: a possible null-deference in &quot;org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java&quot;<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177036">177036</a>: move 'delete configs' preference to debug.core<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177074">177074</a>: Logged errors for out of sync launch configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176000">176000</a>: NPE when looking at 'All Instances'<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177143">177143</a>: remove unused private constant<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175723">175723</a>: Errors related to old launch configs on startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177388">177388</a>: NLS33:translation questions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176902">176902</a>: run/debug hover/behavior incorrect on workspace re-start<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177012">177012</a>: separator in menu when not needed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177004">177004</a>: NPE in LaunchConfigurationManager.getHistoryAsXML<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176440">176440</a>: Add optional description attribute to launch shortcuts<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177298">177298</a>: AFE in context launching for binary type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=154135">154135</a>: APIs for custom debugger integration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=177913">177913</a>: Wrong javadoc for org.eclipse.debug.ui.AbsractLaunchConfigurationTab.setDirty(...)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178057">178057</a>: details for indexed partition do not update detail pane<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178126">178126</a>: Incomplete context-sensitive help text.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=178118">178118</a>: [launch view] [actions] the launch view should use new factory<br>
-
-<h2>Mar 13, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176957">176957</a>: NPEs from Debug<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176890">176890</a>: NLS33:new debug.ui message &quot;LaunchConfigurationAction_0&quot; not enabled for translation properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176487">176487</a>: org.eclipse.debug.core crashes in headless mode<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176430">176430</a>: remove API for set/get default launch config for a resource<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174190">174190</a>: Transient test failures not allowed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176841">176841</a>: [launching] preference for launch last vs. launch selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175862">175862</a>: Selecting text in editor broken<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=150625">150625</a>: [build path] Cancel project creation ask to delete launch configurations<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175332">175332</a>: Run/Debug last actions should conform to contextual launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165515">165515</a>: [Memory View] Built-in table renderings only write value if it differs from original<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166234">166234</a>: [Memory View] More flexible buffer size in table renderings<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166691">166691</a>: [Memory View] Need gotoAddress() API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=167788">167788</a>: [Memory View] Add shortcut keys for Next Page and Previous Page actions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=171753">171753</a>: [Memory View] Reload is incorrect when receiving selected address change event<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=176962">176962</a>: Inconsistency in labels for browse buttons<br>
-
-<h2>Mar 6, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=173181">173181</a>: [variables][views] change background colour is hard to work with....<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170857">170857</a>: Index out of bound at the SWT level in the debug view<br>
-
-<h2>Feb 27, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175541">175541</a>: concurrent modification exception in launch history<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=175292">175292</a>: new config should be initialized with defaults<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=56642">56642</a>: [launching] Launching progress<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174797">174797</a>: [launching] no longer prompted to delete associated launch configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174782">174782</a>: firing model delta should notify root delta<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166231">166231</a>: [launching] history not updated properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174527">174527</a>: NLS:questions about LaunchConfigurationsMessages.properties<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=159981">159981</a>: Add &quot;COLLAPSE&quot; flag to IModelDelta<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174819">174819</a>: [history] [launching] launch history/favorites not persisted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174935">174935</a>: &quot;&lt;project&gt; does not exist&quot; in log when selecting launch configuration<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=172728">172728</a>: [detail pane] detail panes should be available in inspect popup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=100478">100478</a>: [Memory View]: Adding 0 memory blocks<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174722">174722</a>: [Memory View] a possible out-of-bound array access in &quot;org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTableRendering.java&quot;<br>
-
-<h2>Feb 20, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=159054">159054</a>: IModelDelta reference ModelDelta<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174210">174210</a>: batched updates don't run if last update canceled<br>
-
-<h2>Feb 13, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=173087">173087</a>: Debug should make use of IWorkingSetElementAdapter API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=174233">174233</a>: Allow null anchor point in DebugPopup window<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153013">153013</a>: [console] Java console will not open<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=173896">173896</a>: NPE while debugging<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=145396">145396</a>: ShowIn LaunchView does not work anymore<br>
-
-<h2>Milestone 5 - Feb 9, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166794">166794</a>: [variables] Copy variables shortcut key doesn't work after detail pane gets focus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=172556">172556</a>: Skip all Breakpoints option not persisted<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170857">170857</a>: Index out of bound at the SWT level in the debug view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132055">132055</a>: [launching] Promote LaunchHistory methods to AbstractLaunchToolbarAction API?<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=173093">173093</a>: [detail panes] detail pane test failure on linux<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=114377">114377</a>: [Memory View] Endian in hex view and ASCII view doesn't work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=150003">150003</a>: expansion state not maintained when suspending target with thread groups<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=158537">158537</a>: Variables view: copy variables copies formerly expanded children<br>
-
-<h2>Jan 30, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=172248">172248</a>: TextConsoleViewer should be checking for disposed text widget<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=159944">159944</a>: Asynchronous viewer should allow model to set selection after selected object is removed.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=172026">172026</a>: [launching] alt+enter shortcut dies when resource adapter cannot be resolved<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168733">168733</a>: Manifest and properties file could get some clean up<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=171700">171700</a>: [launching] changing LCD filtering with last items elected throws exception<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=171790">171790</a>: Chkpii error in build N20070126-0010<br>
-
-<h2>Jan 23, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170766">170766</a>: NPE MultiLaunchGroupFilter.equalModes()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=150970">150970</a>: Progress Monitor not handled correctly during launch<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166102">166102</a>: RetargetBreakpointAction should use the &quot;resource-&gt;launch configuration&quot; association to find the IToggleBreakpointsTarget adapter.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=171056">171056</a>: Detail job should stop wait()'ing when canceled<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=171091">171091</a>: [detail pane] Removing default detail pane results in NPE<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170673">170673</a>: [Console] Select all keyboard shortcut marked incorrectly in context menu<br>
-
-<h2>Jan 16, 2007</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170669">170669</a>: [Launching] Main Tab missing search options under main type<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170485">170485</a>: [launching] no useful help in save and launch dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170502">170502</a>: [source lookup] [launching] string variables added to the bootpath via the launch dialog do not stay there<br>
-
-<h2>Jan 9, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=169701">169701</a>: IllegalArgumentException in LaunchConfigurationViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=169992">169992</a>: Non-externalized string in debug ui plugin.xml<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=169689">169689</a>: [launching] revert button does not revert config name text<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168434">168434</a>: move debug commands to core plug-in<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168618">168618</a>: step actions enabled when multiple frames selected<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=169549">169549</a>: no description for java tab group anymore<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165986">165986</a>: [Memory View] Migrate MemoryBlocksTreeViewPane to use new tree viewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=126883">126883</a>: [launching] Allow multi-selection of application types in Perspective Switching preferences<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=167667">167667</a>: [launching] No visual clue configurations are filtered from dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153938">153938</a>: [Memory View] Base address of memory block is not displayed on first rendering's tab label<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=167292">167292</a>: [Memory View] Icons and labels for Memory view layout menu are mismatched<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168768">168768</a>: [Memory View] NPE when shutting down workbench with table rendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=167031">167031</a>: Switching perspectives based on launch delegates<br>
-
-<h2>Dec 19, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168525">168525</a>: Loading Debug Core plug-in causes ClassNotFoundException<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168428">168428</a>: &quot;Asynchronous viewer update&quot; appears when stepping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=170784">170784</a>: org.eclipse.debug.ui plugin.xml uses enablesFor=&quot;1+&quot; incorrectly<br>
-
-<h2>3.3 M4 - Dec 15, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166659">166659</a>: [launching] Launcher selection dialog layout<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=167119">167119</a>: [launching] tab icons not decorated consistently<br>
-
-<h2>Dec 11, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=156441">156441</a>: Scalability enhancement to the flexible hierarchy's IAsynchronousContentAdapter<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=75852">75852</a>: [variables] Support for custom details view widgets.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166408">166408</a>: VM Capabilities property page shows up unexpectedly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=160745">160745</a>: Dangerous use of getActiveShell in Debug<br>
-
-<h2>Dec 5, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166683">166683</a>: [plugins] DebugUIPlugin should be a save participant<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166525">166525</a>: [launching] Should display error message in LCD when launcher choice required<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45061">45061</a>: [launching] LaunchHistory is serialized 9 times on preference change<br>
-
-<h2>Nov 28, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166065">166065</a>: Deadlock in DebugCommandAction/DebugCommandActionDelegate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165829">165829</a>: [launching] the source lookup tab is the new apply button<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165175">165175</a>: [source lookup] ContainerSourceContainer assumes resource is in local file system<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=156516">156516</a>: Incorrect popup text in debug icon<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165855">165855</a>: Launch Shortcuts shows deprecated example.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165348">165348</a>: [source lookup] source lookup panel is not saving changes to source lookup path<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164682">164682</a>: NPE SourceLookupPanel  add external archive<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=166125">166125</a>: [launching] run last no longer runs last<br>
-
-<h2>Nov 21, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165174">165174</a>: [viewers] selection is lost in launch view after stepping into sync block<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=165046">165046</a>: [viewers] launch view loses selection with monitors showing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164953">164953</a>: Watch expression keeps reference to old IDebugTarget object after debug session terminates<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164671">164671</a>: NPE updating children in view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164651">164651</a>: [viewers] launch view has duplicate entries<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164379">164379</a>: ClassCastException from StackFrameContentProvider<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=156761">156761</a>: [console] Allow possibility of changing console background color<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=104369">104369</a>: [breakpoints] drag & drop of many breakpoints is slow<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164620">164620</a>: Tree in Debug view should not have border<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=99709">99709</a>: [breakpoints] Breakpoints dropped to incorrect working set when moved using drag and drop<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=158280">158280</a>: CCE in JDIObjectValue.getEnclosingObject<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163082">163082</a>: Add Memory Rendering Dialog should listen for Memory Rendering Bindings changed event<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=159359">159359</a>: expressions serialized each time they change state<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163130">163130</a>: [breakpoints] select default breakpoint working set dialog throws NPE<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=164940">164940</a>: Disabled state of Run/Profile/Debug button is not handled properly sometimes<br>
-
-<h2>Nov 14, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162802">162802</a>: [launching] launch manager causes exception persisting preferred delegates<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163128">163128</a>: org.eclipse.debug.ui plugin needs organizing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=160749">160749</a>: Can't set a breakpoint on the first line of an editor<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163684">163684</a>: [variables view] Max details pane text length dialog does nothing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162996">162996</a>: NPE in EnvironmentVariableResolver.resolveValue<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163988">163988</a>: org.eclipse.debug.ui.console.FileLink missing adaptation, protection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153461">153461</a>: DnD slow in breakpoints view.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163684">163684</a>: [variables view] Max details pane text length dialog does nothing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163400">163400</a>: fileExtension is deprecated but doesn't offer alternatives in schema description<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=163961">163961</a>: Schema description for launchConfigurationTypes outdated<br>
-
-<h2>3.3 Milestone 3 - Nov 3, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=159200">159200</a>: Step action should not automatically disable after the action is invoked.<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162802">162802</a>: [launching] launch manager causes exception persisting preferred delegates<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162667">162667</a>: Javadoc warnings in N20061028-0010<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162816">162816</a>: [commands] StepFilterCommand can lead to NPE<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162320">162320</a>: Toggle step filters action does not initialize state properly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=160932">160932</a>: API for debug context and debug commands<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162426">162426</a>: Javadoc warnings in N20061026-0010<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162666">162666</a>: Chkpii error in nightly build 20061028-0010<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162106">162106</a>: Missing org.eclipse.debug.core.launchOptions extension point<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=162547">162547</a>: ConcurrentModificationEx in DebugCommandService.postUpdate<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=160130">160130</a>: Multi-line environment variables are truncated<br>
-
-<h2>Oct 24, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=161896">161896</a>: Warnings in N20061022-0010<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=151848">151848</a>: [launching] Write protected launch configurations fails in Launch Configuration Dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153789">153789</a>: [launching] Launch configuration dialog: switching filters should not remove multi-selection<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=154400">154400</a>: [WorkingSets] Select Default Breakpoint Working Set dialog is confusing and can clear default setting accidentally<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=157915">157915</a>: Delete launch configurations confirmation dialog too small<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=158232">158232</a>: 'Terminate and relaunch' action is enabled for non-relaunchable configs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=161077">161077</a>: [schema] build N20061016-0010 schema errors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=161080">161080</a>: [schema] build &gt; N20061016-0010 schema errors<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=157090">157090</a>: should adopt ICU Collator and use new APIs on StructuredViewer<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=155552">155552</a>: Debug View has no selection after long step<br>
-
-<h2>Oct 3, 2006</h2> 
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=158760">158760</a>: Warning in latest nightly build and integration build<br>
-
-<h2>Sep 22, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=158202">158202</a>: LaunchConfigurationWorkingCopy setAttributes(Map) does not set dirty?<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=140722">140722</a>: Surface Run/Debug Terminate key mapping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76341">76341</a>: [evaluation] Yellow popup box cannot be moved easily<br>
-
-<h2>Sep 12, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=155791">155791</a>: Patch to fix jface.text.Assert deprecation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=156134">156134</a>: debug.core should re-export dependencies whose API is exposed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=155690">155690</a>: Launch shortcuts: Allow 'forcePluginActivation' for expressions<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148255">148255</a>: [tests] &quot;should be access&quot; test failure<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=155055">155055</a>: [views] [actions] Terminate All changed since 3.1.2<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=156087">156087</a>: NPE in CreateLaunchConfigurationAction#performAction<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=105574">105574</a>: TVT 3.1 - TCT 466 - Truncated string on Memory monitor<br>
-
-<h2>Aug 22, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153929">153929</a>: [Memory View] Shift+F10 does not bring up context menu in table rendering<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153964">153964</a>: Need public access to LaunchConfigurationManager.getLastLaunch()<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=153428">153428</a>: Share a launch configuration: NPE<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=154025">154025</a>: Unable to create view: Argument not valid---:---Variables view doesn't show variable values in debug mode<br>
-
-<h2>3.3 Milestone 1 - August 10, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138976">138976</a>: [console] IOException when closing the application<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=152794">152794</a>: ConcurrentModificationException disposing consoles from Ant UI test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=152583">152583</a>: Use proceed label and button id for compile error prompt<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=152664">152664</a>: Separate workbench part from presentation context id<br>
-
-<h2>July 29, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=151066">151066</a>: details sash same background color as tree<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149728">149728</a>: Detaching from process with many threads takes a long time<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=142198">142198</a>: [breakpoints] Initial state of breakpoint's 'Enable/Disable Breakpoint' ruler menu is always 'Enable Breakpoint'<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138252">138252</a>: [console] Stream closed while debugging<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=151433">151433</a>: Firing content event on a debug target does not causing the target to be refreshed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148900">148900</a>: IWatchExpressionDelegate needs to be context sensitive<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=142602">142602</a>: [breakpoints] Default Breakpoint Working Set's setting lost when working set name is changed<br>
-
-<h2>July 18, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149205">151006</a>: Expression View menu inconsistent when referring to Detail(s) Pane/Area<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149205">149205</a>: AssignValueAction ignores target messages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=135170">135170</a>: Terminate All menu option does not do anything<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=150193">150193</a>: second frame selected instead of top frame after step return<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148995">148995</a>: Deadlock while stepping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148897">148897</a>: [Memory View] memory renderings leak menu listener<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148923">148923</a>: [Memory View] selection is incorrect after stepping<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=140102">140102</a>: [breakpoints] Focus cannot be set to &quot;Type&quot;, &quot;Line Number&quot; and &quot;Member&quot; fields in the properties dialog of the breakpoint<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=150569">150569</a>: [help] Add exception dialog show workbench help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149638">149638</a>: [breakpoints] 'Don't ask again' option for 'Remove All Breakpoints'<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149176">149176</a>: [Working Sets] UI is blocked when clearing all items in a breakpoint working set<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148863">148863</a>: [Memory View] Memory View should clean up command handler for NextMemoryBlock action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148865">148865</a>: [Memory View]Sync service is holding onto rendering after a memory block is removed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149891">149891</a>: SourceLookupFacility should use IEditorMatchingStrategy<br>
-
-<h2>July 11, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149069">149069</a>: [preferences] Move USE_STEP_FILTERING pref constant to public API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148776">148776</a>: !MESSAGE NLS unused messages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149076">149076</a>: [preferences] Use step filtering pref is not persisted over workbench restart<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148526">148526</a>: Editing a string variable discards last entered character<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=149021">149021</a>: [tests] testInstructionPointerLeaks failing<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=139089">139089</a>: [breakpoints] NPE in JavaBreakpoint.fireRemoved () shutting down eclipse with Java Debug session running<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144258">144258</a>: The image registry is created twice<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144560">144560</a>: [console] NPE in ProcessConsole$InputReadJob<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=145545">145545</a>: [console] Console can only be associated with IDebugElement instances<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148940">148940</a>: [Preferences] Step filter settings broken post-RC7<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=140561">140561</a>: debug view scrolls to top, loses thread focus<br>
-
-<h2>June 27, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=142972">142972</a>: [launching] Add &quot;Run&quot; to context menu of shared launch config<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148006">148006</a>: [console] deadlock in ConsoleDocument during ant execution in autobuild<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=148646">148646</a>: [console] current console combo uses CHECK instead of RADIO style buttons<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138719">138719</a>: [source lookup] memory  leak in DecorationManager<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132616">132616</a>: [console] Console corrupts UTF-8<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38387">38387</a>: NLS'ing of internal error messages<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=138473">138473</a>: [breakpoints] BreakpointManager sometimes fails to send a breakpoint-changed notification<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=142476">142476</a>: TVT3.2:TCT535: Text boxes overlap with borders<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=89594">89594</a>: [console] typing in the JSTConsole is screwy<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=137694">137694</a>: [console] scrollbar in empty console<br>
-
-<h2>June 20, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=67370">67370</a>: [console] F1 help missing - Console view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=140487">140487</a>: [launching] The Debug/Run Configurations dialog uses wrong color<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=140823">140823</a>: [launching] Code clean up<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141782">141782</a>: [help] Debug dialogs not offering help<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141785">141785</a>: [help] No context help for Debug Dialogs<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=145634">145634</a>: [view management] Context-Based Debug View Activation only uses last contributed binding per view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=147335">147335</a>: [help] Source Tab has no context help topic<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=147502">147502</a>: [view management] most relevant view should be brought to top<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=42876">42876</a>: [help] F1 help in the Launch Configuration Dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=145766">145766</a>: [launching] Launch configuration change dialog appears twice<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=147464">147464</a>: [view management] debug view does not activate in non-debug perspective<br>
-
-<h2>June 13, 2006</h2>
-<h3>Problem Reports Fixed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=132554">132554</a>: keybinding doesn't enable 'Use Step Filters/Step Debug' action<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144900">144900</a>: TVT3.2:TCT824: FR : Base - Missing apostrophes in Perspective preferences<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=120606">120606</a>: [variables] Static variables disappeared after clicking a variable<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=136085">136085</a>: [variables] view doesn't remember column positions or even which column<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=140487">140487</a>: [launching] The Debug/Run Configurations dialog uses wrong color<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=141769">141769</a>: [preferences] Perspectives tab is broken<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=143569">143569</a>: Debug actions should check status after an action is completed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=143805">143805</a>: [viewers] array does not grow when parent not visible<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144221">144221</a>: [Memory View] Table rendering fails to show changes after resume<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144258">144258</a>: The image registry is created twice<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144400">144400</a>: [launching] LaunchManager keeps references on last resource delta<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144560">144560</a>: [console] NPE in ProcessConsole$InputReadJob<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=144900">144900</a>: TVT3.2:TCT824: FR : Base - Missing apostrophes in Perspective preferences<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=145545">145545</a>: [console] Console can only be associated with IDebugElement instances<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=145553">145553</a>: [variables] Cannot modify String variable with empty string value with Change Value dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=134304">134304</a>: Fix broken NLS strings<br>
-
-<p>&nbsp;</p></body>
-</html>
diff --git a/org.eclipse.debug.core/schema/breakpoints.exsd b/org.eclipse.debug.core/schema/breakpoints.exsd
deleted file mode 100644
index 0c076e8..0000000
--- a/org.eclipse.debug.core/schema/breakpoints.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="breakpoints" name="Breakpoints"/>
-      </appInfo>
-      <documentation>
-         This extension point defines a mechanism for defining new types of breakpoints.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="breakpoint" 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="breakpoint">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this breakpoint type.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="markerType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified identifier (id) of the corresponding marker definition for breakpoints of this type.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;IBreakpoint&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.Breakpoint"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  specifies a user-presentable name for this breakpoint type. For example, &quot;Java Line Breakpoint&quot;. This attribute was added in 3.1 to support automatic grouping of breakpoints by breakpoint type. When this attribute is unspecified, breakpoints of this type cannot be automatically grouped by type.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a launch configuration type extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.breakpoints&quot;&gt;
-  &lt;breakpoint
-   id=&quot;com.example.ExampleBreakpoint&quot;
-   markerType=&quot;com.example.ExampleBreakpointMarker&quot;
-   class=&quot;com.example.ExampleBreakpointImpl&quot;&gt;
-  &lt;/breakpoint&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified type of breakpoint is implemented by the class &quot;com.example.BreakpointImpl&quot;.
-There is an associated marker definition for &quot;com.example.ExampleBreakpointMarker&quot;, defining the attributes of this breakpoint.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.model.IBreakpoint&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/launchConfigurationComparators.exsd b/org.eclipse.debug.core/schema/launchConfigurationComparators.exsd
deleted file mode 100644
index d0fe6b0..0000000
--- a/org.eclipse.debug.core/schema/launchConfigurationComparators.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="launchConfigurationComparators" name="Launch Configuration Comparators"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a configurable mechanism for comparing specific attributes of a launch configuration.
-In general, launch configuration attributes can be compared for equality via the default implementation of &lt;samp&gt;java.lang.Object.equals(Object)&lt;/samp&gt;.
-However, attributes that require special handling should implement this extension point.
-For example, when an attribute is stored as XML, it is possible that two strings representing an equivalent attribute have different whitespace formatting.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchConfigurationComparator" 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="launchConfigurationComparator">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this extension.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="attribute" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the launch configuration attribute name that this comparator compares.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully-qualified name of a class that implements &lt;code&gt;java.util.Comparator&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="java.util.Comparator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a launch configuration comparator extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.launchConfigurationComparators&quot;&gt;
-  &lt;launchConfigurationComparator
-   id=&quot;com.example.ExampleIdentifier&quot;
-   attribute=&quot;com.example.ExampleAttributeName&quot;
-   class=&quot;com.example.ComparatorImplementation&quot;&gt;
-  &lt;/launchConfigurationComparator&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified type of launch configuration comparator will be consulted when comparing the equality of attributes keyed with name &lt;samp&gt;com.example.ExampleAttributeName&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully-qualified name of a Java class that implements the interface &lt;b&gt;java.util.Comparator&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/launchConfigurationTypes.exsd b/org.eclipse.debug.core/schema/launchConfigurationTypes.exsd
deleted file mode 100644
index c0ebf4c..0000000
--- a/org.eclipse.debug.core/schema/launchConfigurationTypes.exsd
+++ /dev/null
@@ -1,244 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="launchConfigurationTypes" name="Launch Configuration Types"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a configurable mechanism for launching applications.
-Each launch configuration type has a name, supports one or more modes (run and/or debug), and specifies a delegate
-responsible for the implementation of launching an application.
-
-As of 3.2 the types can also define a migration delegate that can be used to set resource mappings between projects and the launch configurations that launch them.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchConfigurationType" 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>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="launchConfigurationType">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="1">
-            <element ref="fileExtension" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch configuration type.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="delegate" type="string">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;ILaunchConfigurationDelegate&lt;/code&gt;.
-Launch configuration instances of this type will delegate to instances of this class to perform launching. Launch delegates can also be contributed for a launch configuration type via the &lt;code&gt;launchDelegates&lt;/code&gt; extension. The launch delegate specified by a &lt;code&gt;launchConfigurationType&lt;/code&gt; extension is responsible for launching in all modes specified by the same extension. To extend the launching capabilities of an existing configuration type, or when different delegates are required for different launch mode combinations, the &lt;code&gt;launchDelegates&lt;/code&gt; extension should be used to contribute a launch delegate.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.ILaunchConfigurationDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="modes" type="string">
-            <annotation>
-               <documentation>
-                  specifies a comma-separated list of the modes this type of lauch configuration supports - &quot;run&quot; and/or &quot;debug&quot;. Launch modes can also be contributed for a launch configuration type via the &lt;code&gt;launchDelegates&lt;/code&gt; extension.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a human-readable name for this type of launch configuration.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="public" type="boolean">
-            <annotation>
-               <documentation>
-                  specifies whether this launch configuration type is accessible by users.  Defaults to &lt;code&gt;true&lt;/code&gt; if not specified.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute that specifies this launch configuration type&apos;s category. The default value is unspecified (&lt;code&gt;null&lt;/code&gt;). Categories are client defined. This attribute was added in the 2.1 release.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="sourcePathComputerId" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of a sourcePathComputer extension that is used to compute a default source lookup path for launch configurations of this type. This atttribute was added in the 3.0 release.
-
-Since 3.3, the &lt;code&gt;sourcePathComputerId&lt;/code&gt; can also be specified via the &lt;code&gt;launchDelegates&lt;/code&gt; extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="sourceLocatorId" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of a sourceLocator extension that is used to create the source locator for sessions launched using launch configurations of this type. This atttribute was added in the 3.0 release.
-
-Since 3.3, the &lt;code&gt;sourceLocatorId&lt;/code&gt; can also be specified via the &lt;code&gt;launchDelegates&lt;/code&gt; extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="migrationDelegate" type="string">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of a Java class that implements &lt;code&gt;org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate&lt;/code&gt;. Optional delegate used to migrate launch configurations of this type to be compatible with current tooling, since 3.2
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="delegateName" type="string">
-            <annotation>
-               <documentation>
-                  A human readable name for the associated launch delegate - for example, &quot;Eclipse JDT Launcher&quot;. This name is presented to the user when more than one launcher is available for a launch configuration and the user must choose a preferred launcher. This attribute was added in the 3.3 release.
-
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="delegateDescription" type="string">
-            <annotation>
-               <documentation>
-                  A description of this type&apos;s launch delegate - for example &quot;The Eclipse JDT Java Application Launcher supports running and debugging local Java applications&quot;.  This description is presented to the user when more than one launcher is available for a launch configuration and the user must choose a preferred launcher. This attribute was added in the 3.3 release.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="fileExtension">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-         <documentation>
-            This element is no longer used. Instead, use the &lt;code&gt;org.eclipse.debug.ui.launchShortcuts&lt;/code&gt; extension point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="extension" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a file extension that this launch configuration type can be used for.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="boolean">
-            <annotation>
-               <documentation>
-                  specifies whether this launch configuration type should be the default launch configuration type for the specified file extension.  Defaults to &lt;code&gt;false&lt;/code&gt; if not specified.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-The following is an example of a launch configuration type extension point:
-&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.launchConfigurationTypes&quot;&gt;
-  &lt;launchConfigurationType
-   id=&quot;com.example.ExampleIdentifier&quot;
-   delegate=&quot;com.example.ExampleLaunchConfigurationDelegate&quot;
-   modes=&quot;run,debug&quot;
-   name=&quot;Example Application&quot;
-   migrationDelegate=&quot;com.example.migrationDelegate&quot;
-   sourceLocatorId=&quot;com.example.sourceLookupDirector&quot;
-   sourcePathComputerId=&quot;com.example.sourcePathComputer&quot;
-   delegateName=&quot;Example Application Launch Tooling&quot;
-   delegateDescription=&quot;This example tooling will run or debug example code.&quot;&gt;
-  &lt;/launchConfigurationType&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;
-In the example above, the specified type of launch configuration supports both run and debug modes. 
-The specified type also has an associated migration delegate, a source locator id, a source path computer, and launch delegate name and description.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-Value of the attribute &lt;b&gt;delegate&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.model.ILaunchConfigurationDelegate&lt;/b&gt;. 
-
-The value of the attribute &lt;b&gt;migrationDelegate&lt;/b&gt; must be a fully qualified name of a Java class that implements &lt;b&gt;org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate&lt;/b&gt;.
-&lt;/p&gt;
-      </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/org.eclipse.debug.core/schema/launchDelegates.exsd b/org.eclipse.debug.core/schema/launchDelegates.exsd
deleted file mode 100644
index e95ff8c..0000000
--- a/org.eclipse.debug.core/schema/launchDelegates.exsd
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="launchDelegates" name="Launch Delegates"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing a launch delegate to an existing launch configuration type for one or more launch modes. Since launch modes are extensible, it may be neccessary to contribute additional launch delegates to an existing launch configuration type. Each launch delegate is contributed for a specific launch configuration type. A launch delegate supports one or more launch modes, and specifies a delegate responsible for the implementation of launching.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchDelegate" 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>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="launchDelegate">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="1">
-            <element ref="modeCombination" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch delegate.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  A human readable name for this delegate - for example, &quot;Eclipse JDT Launcher&quot;. This name is presented to the user when more than one launcher is available for a launch configuration and the user must choose a preferred launcher. This attribute was added in the 3.3. release.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="delegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;ILaunchConfigurationDelegate&lt;/code&gt;.
-Launch configuration instances of this delegate&apos;s type will delegate to instances of this class to perform launching in the modes this launch delegate supports - see the &lt;code&gt;modes&lt;/code&gt; attribute and the &lt;code&gt;modeCombination&lt;/code&gt; element.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.debug.core.model.ILaunchConfigurationDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="modes" type="string">
-            <annotation>
-               <documentation>
-                  A comma-separated list of the &lt;b&gt;individual&lt;/b&gt; launch modes this delegate supports.
-&lt;p&gt;
-This attribute should be used when a launch delegate supports single launch modes - for example launching in run mode or debug mode. When a launch delegate supports launching in mixed mode (for example, debug and profile), the &lt;code&gt;modeCombination&lt;/code&gt; element should be used to specify supported launch mode combinations.
-&lt;/p&gt;
-&lt;p&gt;
-This attribute can be used in conjunction with &lt;code&gt;modeCombination&lt;/code&gt; elements. It is suggested practice to provide one or the other (either a comma seperated listing in the &lt;code&gt;modes&lt;/code&gt; attribute, or &lt;code&gt;modeCombinations&lt;/code&gt;). Specifying &apos;run,debug&apos; in the modes attribute is analogous to specifying two &lt;code&gt;modeCombination&lt;/code&gt; contributions, one for &apos;run&apos; and another for &apos;debug&apos;.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string">
-            <annotation>
-               <documentation>
-                  identifier of an existing launch configuration type that this launch delegate is capable of launching.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="sourcePathComputerId" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of a sourcePathComputer extension that is used to compute a default source lookup path for launch configurations of this type. Since 3.1, this attribute cab be specified in a launchDelegate extension when unspecified in the assocaited launchConfigurationType extension. Only one source path computer can be specified per launch configuration type.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="sourceLocatorId" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of a sourceLocator extension that is used to create the source locator for sessions launched using launch configurations of this type. Since 3.1, this attribute can be specified in a launchDelegate extension when unspecified in the assocaited launchConfigurationType extension. Only one source locater can be specified per launch configuration type.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="delegateDescription" type="string">
-            <annotation>
-               <documentation>
-                  A description of this launch delegate - for example &quot;The Eclipse JDT Java Application Launcher supports running and debugging local Java applications&quot;. This description is presented to the user when more than one launcher is available for a launch configuration and the user must choose a preferred launcher. This attribute was added in the 3.3 release.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="modeCombination">
-      <annotation>
-         <documentation>
-            This element specifies a launch mode combination this delegate supports. Each &lt;code&gt;modeCombination&lt;/code&gt; element specifies a comma seperated list of modes specifying a supported mixed launch mode. For example, a delegate that supports debugging, profiling and code coverage at the same time would specify a &lt;code&gt;modes&lt;/code&gt; element of consisting of &apos;debug, profile, coverage&apos;. This element can also be used to specify single launch modes that are supported - for example a &lt;code&gt;modes&lt;/code&gt; attribute of &apos;debug&apos;. This element was added in the 3.3 release.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="modes" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a comma seperated list specifying a combination of modes the associated delegate supportes.
-
-&lt;p&gt;
-Unlike the modes attribute of the &lt;code&gt;launchDeleaget&lt;/code&gt; element definition, this comma seperated list represents a mixed launch mode rather than the single supported launch modes. For example: a &lt;code&gt;modeCombination&lt;/code&gt; element specifying &lt;code&gt;modes&lt;/code&gt; of &apos;profile,debug&apos; indicates the delegate can debug and profile at the same time. In contrast, if &apos;profile,debug&apos; was specified by the &lt;code&gt;modes&lt;/code&gt; attribute of the &lt;code&gt;launchDelegate&lt;/code&gt; element, it would indicate the delegate could debug or profile, but not at the same time.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="perspective" type="string">
-            <annotation>
-               <documentation>
-                  a string representing the id of a persepctive to switch to when launching.
-               </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 a launch delegate extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.launchDelegates&quot;&gt;
-  &lt;launchDelegate
-    id=&quot;com.example.ExampleProfileDelegate&quot;
-    delegate=&quot;com.example.ExampleProfileDelegate&quot;
-    type=&quot;org.eclipse.jdt.launching.localJavaApplication&quot;
-    name=&quot;Eclipse JDT Java Profile Tooling&quot;&gt;
-   &lt;modeCombination 
-    modes=&quot;run, profile&quot;&gt;
-    perspective=&quot;com.example.Perspective&quot;&gt;
-   &lt;/modeCombination&gt;
-   &lt;modeCombination modes=&quot;debug, profile, coverage&quot;&gt;&lt;/modeCombination&gt;
-  &lt;/launchDelegate&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified launch delegate is contributed to launch Java applications in profile mode. The delegate supports mixed mode launching. The delegate supports profiling when launching in run or debug mode, with code coverage in debug mode only. When the mode combination or run and profile is used, in this example, the perspective com.example.Perspective can also be opened.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;delegate&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.model.ILaunchConfigurationDelegate&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/launchModes.exsd b/org.eclipse.debug.core/schema/launchModes.exsd
deleted file mode 100644
index b7adefa..0000000
--- a/org.eclipse.debug.core/schema/launchModes.exsd
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="launchModes" name="Launch Modes"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing launch modes to the debug platform. The debug platform defines modes for &quot;run&quot;, &quot;debug&quot;, and &quot;profile&quot;.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchMode" 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>
-      </complexType>
-   </element>
-
-   <element name="launchMode">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="mode" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch mode. The launch modes contributed by the debug plaform are &quot;run&quot;, &quot;debug&quot;, and &quot;profile&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A human-readable label that describes the launch mode
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="launchAsLabel" type="string">
-            <annotation>
-               <documentation>
-                  A human-readable label to be used in a launch cascade menu. For example &quot;Run As&quot;. This attribute was added in 3.2 to allow the label to be properly externalized. When unspecified, a default label is created via concatenation.
-               </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 launch delegate extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.launchModes&quot;&gt;
-  &lt;launchMode
-   mode=&quot;profile&quot;
-   label=&quot;Profile&quot;&gt;
-  &lt;/launchMode&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the profile launch mode is contributed.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </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/org.eclipse.debug.core/schema/launchers.exsd b/org.eclipse.debug.core/schema/launchers.exsd
deleted file mode 100644
index 2a90cdf..0000000
--- a/org.eclipse.debug.core/schema/launchers.exsd
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="launchers" name="Launcher (Obsolete)"/>
-      </appInfo>
-      <documentation>
-         This extension point has been replaced by the launchConfigurationTypes extension point. Extensions of this type are obsolete as of release 2.0 and are ignored. This extension point was used to contribute launchers. 
-A launcher was responsible for initiating a debug session 
-or running a program and registering the result with the 
-launch manager.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="launcher" 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="launcher">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="label" icon="icon"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier that can be used to reference 
-this launcher.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified name of the Java class that implements 
-&lt;code&gt;org.eclipse.debug.core.model.ILauncherDelegate&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.ILauncherDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="modes" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A comma separated list of modes this launcher supports. 
-The two supported modes are &quot;run&quot; and &quot;debug&quot; - 
-as defined in &lt;code&gt;org.eclipse.debug.core.ILaunchManager&lt;/code&gt;. 
-A launcher may be capable of launching in one or both modes.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a label to use for the launcher. This attribute is used by the debug UI.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="wizard" type="string">
-            <annotation>
-               <documentation>
-                  fully qualified name of the class that implements 
-&lt;code&gt;org.eclipse.debug.ui.ILaunchWizard&lt;/code&gt;. 
-This attribute is used by the debug UI. A launcher 
-may contribute a wizard that allows users to configure 
-and launch specific attributes.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.wizard.Wizard:org.eclipse.debug.ui.ILaunchWizard"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="public" type="boolean">
-            <annotation>
-               <documentation>
-                  whether a launcher is publically visible in the debug UI.
-If &lt;code&gt;true&lt;/code&gt;,  the launcher will be available from the 
-debug UI - the launcher will appear as a choice 
-for a default launcher, launches created by this 
-launcher will appear in the launch history, and the 
-launcher will be available from the drop-down run/debug 
-toolbar actions.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a description of the launcher.  Currently only used 
-if the wizard attribute is specified.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="perspective" type="string">
-            <annotation>
-               <documentation>
-                  the identifier of the perspective that will be switched 
-to on a successful launch.  Default value is the 
-identifier for the debug perspective. This attribute 
-is used by the debug UI.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon that will represent the launcher 
-in the UI if specified.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a launcher extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-      point = &quot;org.eclipse.debug.core.launchers&quot;&gt; 
-         &lt;launcher 
-             id = &quot;com.example.ExampleLauncher&quot;
-             class = &quot;com.example.launchers.ExampleLauncher&quot; 
-             modes = &quot;run, debug&quot;
-        label = &quot;Example Launcher&quot;
-      wizard = &quot;com.example.launchers.ui.ExampleLaunchWizard&quot;     
-      public = &quot;true&quot;
-      description = &quot;Launches example programs&quot;
-      perspective= &quot;com.example.JavaPerspective&quot;&gt;  
-         &lt;/launcher&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-In the example above, the specified launcher supports 
-both run and debug modes. Following a successful launch, 
-the debug UI will change to the Java perspective. When 
-the debug UI presents the user with a list of launchers 
-to choose from, &quot;Example Launcher&quot; will appear as one of 
-the choices with the &quot;Launches example programs&quot; as the 
-description, and the wizard specified by 
-&lt;samp&gt;com.example.launchers.ui.ExampleLaunchWizard&lt;/samp&gt;
-will be used to configure any launch specific details.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;samp&gt;class&lt;/samp&gt; must be a fully 
-qualified class name of a Java class that implements 
-the interface 
-&lt;samp&gt;org.eclipse.debug.core.ILauncherDelegate&lt;/samp&gt;. 
-Value of the attribute &lt;samp&gt;wizard&lt;/samp&gt; must be a 
-fully qualified class name of a Java class that 
-implements &lt;samp&gt;org.eclipse.debug.ui.ILaunchWizard&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) 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/org.eclipse.debug.core/schema/logicalStructureProviders.exsd b/org.eclipse.debug.core/schema/logicalStructureProviders.exsd
deleted file mode 100644
index d3a2fff..0000000
--- a/org.eclipse.debug.core/schema/logicalStructureProviders.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="logicalStructureProviders" name="Logical Structure Providers"/>
-      </appInfo>
-      <documentation>
-         This extension point allows contributors to provide multiple logical structure types for a value.
-This is an extension of the logical structure support provided by the extension point &lt;code&gt;org.eclipse.debug.core.logicalStructureTypes&lt;/code&gt;, which allows one logical structure type per value.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="logicalStructureProvider" 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="logicalStructureProvider">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified name of a Java class that implements &lt;code&gt;ILogicalStructureProvider&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.internal.core.ILogicalStructureProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="modelIdentifier" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier of the debug model this logical structure provider is associated with
-               </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 logical structure type extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.logicalStructureProviders&quot;&gt;
-  &lt;logicalStructureProvider
-   class=&quot;com.example.ExampleLogicalStructureProvider&quot;
-   modelIdentifier=&quot;com.example.debug.model&quot;&gt;
-  &lt;/logicalStructureProvider&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified logical structure provider will be consulted for alternative logical structures for values from the &lt;code&gt;com.example.debug.model&lt;/code&gt; debug model as they are displayed in the variables view.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.ILogicalStructureProvider&lt;/b&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/org.eclipse.debug.core/schema/logicalStructureTypes.exsd b/org.eclipse.debug.core/schema/logicalStructureTypes.exsd
deleted file mode 100644
index 242bd7e..0000000
--- a/org.eclipse.debug.core/schema/logicalStructureTypes.exsd
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="logicalStructureTypes" name="Logical Structure Types"/>
-      </appInfo>
-      <documentation>
-         This extension point allows debuggers to present alternative logical structures of values. Often, complex data structures are more convenient to navigate in terms of their logical structure, rather than in terms of their implementation. For example, no matter how a list is implemented (linked, array, etc.), a user may simply want to see the elements in the list in terms of an ordered collection. This extension point allows the contribution of logical structure types, to provide translations from a raw implementation value to a logical value.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="logicalStructureType" 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="logicalStructureType">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier for this logical structure type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a description of this logical structure. Since 3.1, this attribute is optional. When unspecified, a logical structure type delegate must also implement &lt;code&gt;ILogicalStructureTypeDelegate2&lt;/code&gt; to provide descriptions for values that logical structures are provided for.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified name of a Java class that implements &lt;code&gt;ILogicalStructureTypeDelegate&lt;/code&gt;. The class may optionally implement &lt;code&gt;ILogicalStructureTypeDelegate2&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.ILogicalStructureTypeDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="modelIdentifier" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier of the debug model this logical structure type is associated with
-               </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 a logical structure type extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.logicalStructureTypes&quot;&gt;
-  &lt;logicalStructureType
-   id=&quot;com.example.ExampleLogicalStructure&quot;
-   class=&quot;com.example.ExampleLogicalStructureDelegate&quot;
-   modelIdentifier=&quot;com.example.debug.model&quot;
-   description=&quot;Ordered Collection&quot;&gt;
-  &lt;/logicalStructureType&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified logical structure type will be consulted for alternative logical values for values from the &lt;code&gt;com.example.debug.model&lt;/code&gt; debug model as they are displayed in the variables view.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.model.ILogicalStructureTypeDelegate&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/processFactories.exsd b/org.eclipse.debug.core/schema/processFactories.exsd
deleted file mode 100644
index 8f5106f..0000000
--- a/org.eclipse.debug.core/schema/processFactories.exsd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="processFactories" name="Process Factories"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for specifying a process factory to be used with a launch configuration to create the appropriate instance of &lt;b&gt;IProcess&lt;/b&gt;.
-      The launch configuration will require the &lt;b&gt;DebugPlugin.ATTR_PROCESS_FACTORY_ID&lt;/b&gt; attribute set to the appropriate process factory ID that will be
-      used to create the &lt;b&gt;IProcess&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="processFactory" 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="processFactory">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this process factory.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;IProcessFactory&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.IProcessFactory"/>
-               </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 process factory extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.processFactories&quot;&gt;
-  &lt;processFactory
-       id=&quot;com.example.ExampleIdentifier&quot;
-       class=&quot;com.example.ExampleProcessFactory&quot;&gt;
-  &lt;/processFactory&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.IProcessFactory&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/sourceContainerTypes.exsd b/org.eclipse.debug.core/schema/sourceContainerTypes.exsd
deleted file mode 100644
index 5965579..0000000
--- a/org.eclipse.debug.core/schema/sourceContainerTypes.exsd
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="sourceContainerTypes" name="Source Container Types"/>
-      </appInfo>
-      <documentation>
-         This extension point allows for an extensible set of source container types to be contributed by the debug platform
-         source lookup facilities.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="sourceContainerType" 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="sourceContainerType">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id used to refer to this type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of this source container type used for presentation purposes.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A class that implements &lt;code&gt;ISourceContainerTypeDelegate&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A short description of this source container for presentation purposes.
-               </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="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a source container type definition:
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.core.sourceContainerTypes&quot;&gt;
- &lt;sourceContainerType
-  name=&quot;Project&quot;
-  class=&quot;org.eclipse.debug.internal.core.sourcelookup.containers.ProjectSourceContainerType&quot;
-  id=&quot;org.eclipse.debug.core.containerType.project&quot;
-  description=&quot;A project in the workspace&quot;&gt;
- &lt;/sourceContainerType&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;ISourceContainerType&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2003, 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/org.eclipse.debug.core/schema/sourceLocators.exsd b/org.eclipse.debug.core/schema/sourceLocators.exsd
deleted file mode 100644
index f06ee77..0000000
--- a/org.eclipse.debug.core/schema/sourceLocators.exsd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="sourceLocators" name="Source Locators"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism specifying a source locator to be used with a launch configuration.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="sourceLocator" 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="sourceLocator">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this source locator.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;IPersistableSourceLocator&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.IPersistableSourceLocator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a human-readable name, describing the type of this source locator.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a source locator extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.sourceLocators&quot;&gt;
-  &lt;sourceLocator
-   id=&quot;com.example.ExampleIdentifier&quot;
-   class=&quot;com.example.ExampleSourceLocator&quot;
-   name=&quot;Example Source Locator&quot;&gt;
-  &lt;/sourceLocator&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.model.IPersistableSourceLocator&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/sourcePathComputers.exsd b/org.eclipse.debug.core/schema/sourcePathComputers.exsd
deleted file mode 100644
index 48f8289..0000000
--- a/org.eclipse.debug.core/schema/sourcePathComputers.exsd
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="sourcePathComputers" name="Source Path Computers"/>
-      </appInfo>
-      <documentation>
-         Defines an extension point to register a computer that can describe a default source lookup path for
-         a launch configuration. Source path computers are associated with launch configuration types via the
-         launchConfigurationTypes extension point. As well, a source path computer can be associated with a
-         specific launch configuration via the launch configuration attribute ATTR_SOURCE_PATH_COMPUTER_ID.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="sourcePathComputer" 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="sourcePathComputer">
-      <annotation>
-         <documentation>
-            Defines an extension point to register a computer that can describe a default source lookup path
-            for a launch configuration.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id used to refer to this computer.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A class that implements &lt;code&gt;ISourcePathComputerDelegate&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.internal.core.sourcelookup.ISourcePathComputerDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example source path computer definition:
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.debug.core.sourcePathComputers&quot;&gt;
-     &lt;sourcePathComputer
-      id=&quot;org.eclipse.example.exampleSourcePathComputer&quot;
-      class=&quot;org.eclipse.example.SourcePathComputer&quot;&gt;
-     &lt;/sourcePathComputer&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;ISourcePathComputer&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2003, 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/org.eclipse.debug.core/schema/statusHandlers.exsd b/org.eclipse.debug.core/schema/statusHandlers.exsd
deleted file mode 100644
index a2feb31..0000000
--- a/org.eclipse.debug.core/schema/statusHandlers.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="statusHandlers" name="Status Handlers"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for separating the generation and resolution of an error.
-The interaction between the source of the error and the resolution is client-defined.
-It is a client responsibility to look up and delegate to status handlers when an error condition occurs.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="statusHandler" 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="statusHandler">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this status handler.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of the Java class that implements &lt;code&gt;IStatusHandler&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.IStatusHandler"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="plugin" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Plug-in identifier that corresponds to the plug-in of the status this handler is registered for.  (i.e. &lt;code&gt;IStatus.getPlugin()&lt;/code&gt;).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="code" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the status code this handler is registered for.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a status handler extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.core.statusHandlers&quot;&gt;
-  &lt;statusHandler
-   id=&quot;com.example.ExampleIdentifier&quot;
-   class=&quot;com.example.ExampleStatusHandler&quot;
-   plugin=&quot;com.example.ExamplePluginId&quot;
-   code=&quot;123&quot;&gt;
-  &lt;/statusHandler&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, the specified status handler will be registered for to handle status objects with a plug-in identifier of 
-&lt;samp&gt;com.example.ExamplePluginId&lt;/samp&gt; and a status code of &lt;samp&gt;123&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.IStatusHandler&lt;/b&gt;.
-      </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/org.eclipse.debug.core/schema/watchExpressionDelegates.exsd b/org.eclipse.debug.core/schema/watchExpressionDelegates.exsd
deleted file mode 100644
index 44e55d4..0000000
--- a/org.eclipse.debug.core/schema/watchExpressionDelegates.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.core" id="watchExpressionDelegates" name="Watch Expression Delegates"/>
-      </appInfo>
-      <documentation>
-         This extension provides a mechanism for providing delegates to evaluate watch expressions on a per debug model basis. Watch expression delegates perform evaluations for watch expressions and report the results asynchronously.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="watchExpressionDelegate" 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="watchExpressionDelegate">
-      <complexType>
-         <attribute name="debugModel" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the id of the debug model that this delegate provides evaluations for
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="delegateClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a Java class which implements &lt;code&gt;org.eclipse.debug.core.model.IWatchExpressionDelegate&lt;/code&gt;, which is used to evaluate the value of an expression.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.IWatchExpressionDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-The following is the definition of a watch expression delegate for the com.example.foo plug-in:
- &lt;extension point=&quot;org.eclipse.debug.core.watchExpressionDelegates&quot;&gt;
-   &lt;watchExpressionDelegate
-     debugModel=&quot;org.eclipse.jdt.debug&quot;
-     delegateClass=&quot;org.eclipse.jdt.internal.debug.ui.JavaWatchExpressionDelegate&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;delegateClass&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.core.model.IWatchExpressionDelegate&lt;/b&gt;.
-      </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/org.eclipse.debug.core/scripts/exportplugin.xml b/org.eclipse.debug.core/scripts/exportplugin.xml
deleted file mode 100644
index c29eada..0000000
--- a/org.eclipse.debug.core/scripts/exportplugin.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Export a jar of .class files for the org.eclipse.debug.core Eclipse plugin
-     along with other important plugin files to the "plugin-export" subdirectory
-     of the target Eclipse installation -->
-<project name="Export debug.core" default="export" basedir="..">
-
-	<!-- Set the timestamp and important properties -->
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="dest"  value="${destdir}/org.eclipse.debug.core_3.0.0" />
-	</target>
-
-	<!-- Create the jar of .class files, and copy other important files to export dir -->
-	<target name="export" depends="init">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<jar 
-			jarfile="${dest}/dtcore.jar"
-			basedir="bin"
-		/>
-		<!-- Create the source zip -->
-		<zip zipfile="${dest}/dtcoresrc.zip">
-			<fileset dir="core"/>
-		</zip>		
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy file=".classpath" todir="${dest}"/>
-		<copy file=".options" todir="${dest}"/>
-	</target>
-	
-</project>
diff --git a/org.eclipse.debug.ui/.classpath b/org.eclipse.debug.ui/.classpath
deleted file mode 100644
index 95b3cfa..0000000
--- a/org.eclipse.debug.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="ui"/>
-	<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/org.eclipse.debug.ui/.cvsignore b/org.eclipse.debug.ui/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/org.eclipse.debug.ui/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/.options b/org.eclipse.debug.ui/.options
deleted file mode 100644
index cba192b..0000000
--- a/org.eclipse.debug.ui/.options
+++ /dev/null
@@ -1,8 +0,0 @@
-org.eclipse.debug.ui/debug = false
-org.eclipse.debug.ui/debug/viewers/model = false
-org.eclipse.debug.ui/debug/viewers/viewer = false
-org.eclipse.debug.ui/debug/viewers/deltas = false
-org.eclipse.debug.ui/debug/viewers/contentProvider = false
-org.eclipse.debug.ui/debug/viewers/updateSequence = false
-org.eclipse.debug.ui/debug/contextlaunching = false
-org.eclipse.debug.ui/debug/launchhistory = false
diff --git a/org.eclipse.debug.ui/.project b/org.eclipse.debug.ui/.project
deleted file mode 100644
index bd63b2b..0000000
--- a/org.eclipse.debug.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.debug.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.debug.ui/.settings/org.eclipse.core.resources.prefs b/org.eclipse.debug.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 46dcee1..0000000
--- a/org.eclipse.debug.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Mar 09 10:33:21 CST 2006
-eclipse.preferences.version=1
-encoding//ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.properties=8859_1
-encoding//ui/org/eclipse/debug/internal/ui/importexport/breakpoints/BreakpointImportExport.properties=8859_1
diff --git a/org.eclipse.debug.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.debug.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3a32d2d..0000000
--- a/org.eclipse.debug.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,72 +0,0 @@
-#Tue Jan 16 11:18:43 CST 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=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.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-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=ignore
-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=ignore
-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=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-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=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-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=disabled
-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.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,HIGH,HIGH
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,EXPERIMENTAL,CONTEXTLAUNCHING
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/org.eclipse.debug.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.debug.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 7686374..0000000
--- a/org.eclipse.debug.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,17 +0,0 @@
-#Tue Jan 30 11:38:16 CST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.missing-packages=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/org.eclipse.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.debug.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index dbff10d..0000000
--- a/org.eclipse.debug.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,64 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.debug.ui; singleton:=true
-Bundle-Version: 3.3.100.qualifier
-Bundle-Activator: org.eclipse.debug.internal.ui.DebugUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.debug.internal.ui;x-internal:=true,
- org.eclipse.debug.internal.ui.actions;x-internal:=true,
- org.eclipse.debug.internal.ui.actions.breakpointGroups;x-internal:=true,
- org.eclipse.debug.internal.ui.actions.breakpoints;x-internal:=true,
- org.eclipse.debug.internal.ui.actions.expressions;x-internal:=true,
- org.eclipse.debug.internal.ui.actions.variables;x-internal:=true,
- org.eclipse.debug.internal.ui.actions.variables.details;x-internal:=true,
- org.eclipse.debug.internal.ui.commands.actions;x-internal:=true,
- org.eclipse.debug.internal.ui.contextlaunching;x-internal:=true,
- org.eclipse.debug.internal.ui.contexts;x-internal:=true,
- org.eclipse.debug.internal.ui.elements.adapters;x-internal:=true,
- org.eclipse.debug.internal.ui.importexport.breakpoints;x-internal:=true,
- org.eclipse.debug.internal.ui.launchConfigurations;x-internal:=true,
- org.eclipse.debug.internal.ui.memory;x-internal:=true,
- org.eclipse.debug.internal.ui.memory.provisional;x-internal:=true,
- org.eclipse.debug.internal.ui.model.elements;x-internal:=true,
- org.eclipse.debug.internal.ui.preferences;x-internal:=true,
- org.eclipse.debug.internal.ui.sourcelookup;x-internal:=true,
- org.eclipse.debug.internal.ui.sourcelookup.browsers;x-internal:=true,
- org.eclipse.debug.internal.ui.stringsubstitution;x-internal:=true,
- org.eclipse.debug.internal.ui.viewers;x-internal:=true,
- org.eclipse.debug.internal.ui.viewers.model;x-internal:=true,
- org.eclipse.debug.internal.ui.viewers.model.provisional;x-internal:=true,
- org.eclipse.debug.internal.ui.viewers.provisional;x-internal:=true,
- org.eclipse.debug.internal.ui.viewers.update;x-internal:=true,
- org.eclipse.debug.internal.ui.views;x-internal:=true,
- org.eclipse.debug.internal.ui.views.breakpoints;x-internal:=true,
- org.eclipse.debug.internal.ui.views.console;x-internal:=true,
- org.eclipse.debug.internal.ui.views.expression;x-internal:=true,
- org.eclipse.debug.internal.ui.views.launch;x-internal:=true,
- org.eclipse.debug.internal.ui.views.memory;x-internal:=true,
- org.eclipse.debug.internal.ui.views.memory.renderings;x-internal:=true,
- org.eclipse.debug.internal.ui.views.registers;x-internal:=true,
- org.eclipse.debug.internal.ui.views.variables;x-internal:=true,
- org.eclipse.debug.internal.ui.views.variables.details;x-internal:=true,
- org.eclipse.debug.ui,
- org.eclipse.debug.ui.actions,
- org.eclipse.debug.ui.console,
- org.eclipse.debug.ui.contexts,
- org.eclipse.debug.ui.memory,
- org.eclipse.debug.ui.sourcelookup
-Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.variables;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.ui.console;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.debug.core;bundle-version="[3.3.100,4.0.0)";visibility:=reexport,
- org.eclipse.jface.text;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.ui.editors;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.3.0,4.0.0)"
-Eclipse-LazyStart: true
-Bundle-ClassPath: .
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/org.eclipse.debug.ui/about.html b/org.eclipse.debug.ui/about.html
deleted file mode 100644
index 4602330..0000000
--- a/org.eclipse.debug.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/org.eclipse.debug.ui/build.properties b/org.eclipse.debug.ui/build.properties
deleted file mode 100644
index 6cf5232..0000000
--- a/org.eclipse.debug.ui/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
-###############################################################################
-bin.includes = icons/,\
-               plugin.xml,\
-               plugin.properties,\
-               .,\
-               about.html,\
-               META-INF/,\
-               .options
-
-source.. = ui/
-src.includes = about.html,\
-               schema/
diff --git a/org.eclipse.debug.ui/component.xml b/org.eclipse.debug.ui/component.xml
deleted file mode 100644
index 08cfc0a..0000000
--- a/org.eclipse.debug.ui/component.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/component"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://eclipse.org/component ../component.xsd "
-   name="Eclipse Platform Debug">
- <plugin id="org.eclipse.debug.ui" />
-
- <package name="org.eclipse.debug.ui">
- 	<type name="AbstractBreakpointOrganizerDelegate" />
- 	<type name="AbstractDebugView" />
- 	<type name="AbstractLaunchConfigurationTab" />
- 	<type name="AbstractLaunchConfigurationTabGroup" />
- 	<type name="AbstractLaunchModeConfigurationTab" />
- 	<type name="BreakpointTypeCategory" />
- 	<type name="CommonTab" subclass="false" />
- 	<type name="DebugElementWorkbenchAdapter" />
- 	<type name="DebugPopup" instantiate="false"/>
- 	<type name="DebugUITools" instantiate="false" subclass="false" />
- 	<type name="DeferredDebugElementWorkbenchAdapter" />
- 	<type name="EnvironmentTab" subclass="false" />
- 	<type name="IBreakpointOrganizerDelegate" />
- 	<type name="IBreakpointTypeCategory" />
- 	<type name="IDebugEditorPresentation" />
- 	<type name="IDebugModelPresentation" />
- 	<type name="IDetailPane" />
- 	<type name="IDetailPaneFactory" />
- 	<type name="IDebugUIConstants" implement="false" />
- 	<type name="IDebugView" />
-	<type name= "IInstructionPointerPresentation" />
- 	<type name="ILaunchConfigurationDialog" implement="false" />
- 	<type name="ILaunchConfigurationTab" />
- 	<type name="ILaunchConfigurationTabGroup" />
- 	<type name="ILaunchGroup" implement="false" />
- 	<type name="ILaunchShortcut" />
- 	<type name="InspectPopupDialog" subclass="false"/>
- 	<type name="ISourcePresentation" />
- 	<type name="IValueDetailListener" />
- 	<type name="RefreshTab" subclass="false" />
- 	<type name="StringVariableSelectionDialog" subclass="false" />
- </package>
- <package name="org.eclipse.debug.ui.actions">
-	<type name="AbstractLaunchHistoryAction" />
-	<type name="AbstractLaunchToolbarAction" />
-	<type name="AddMemoryRenderingActionDelegate" instantiate="false" subclass="false" />
-	<type name="ContextualLaunchAction" />
-	<type name="DebugAction" subclass="false" />
-	<type name="ExportBreakpointsOperation" subclass="false" />
-	<type name="IAddMemoryBlocksTarget" />
-	<type name="IAddMemoryRenderingsTarget" />
-	<type name="ILaunchable" implement="false" />
-	<type name="ImportBreakpointsOperation" subclass="false" />
-	<type name="IRunToLineTarget" />
-	<type name="IToggleBreakpointsTarget" />
-	<type name="IToggleBreakpointsTargetExtension" />
-	<type name="IVariableValueEditor" />
-	<type name="IWatchExpressionFactoryAdapter" />
-	<type name="IWatchExpressionFactoryAdapterExtension" />
-	<type name="LaunchAction" subclass="false" />
-	<type name="LaunchAsAction" subclass="false" />
-	<type name="LaunchShortcutsAction" />
-	<type name="OpenLaunchDialogAction" subclass="false" />
-	<type name="RulerBreakpointAction" instantiate="false" subclass="true" />
-	<type name="RulerEnableDisableBreakpointActionDelegate" instantiate="false" subclass="false" />
-	<type name="RulerToggleBreakpointActionDelegate" instantiate="false" subclass="false" />
-	<type name="RunAction" subclass="false" />
-	<type name="RunToLineActionDelegate" instantiate="false" subclass="false" />
-	<type name="RunToLineHandler" subclass="false" />
-	<type name="ToggleBreakpointAction" subclass="false" />
-	<type name="ToggleMethodBreakpointActionDelegate" instantiate="false" subclass="false" />
-	<type name="ToggleWatchpointActionDelegate" instantiate="false" subclass="false" />
- </package>
- <package name="org.eclipse.debug.ui.console">
-	<type name="ConsoleColorProvider" />
-	<type name="FileLink" subclass="false" />
-	<type name="IConsole" implement="false" />
-	<type name="IConsoleColorProvider" />
-	<type name="IConsoleHyperlink" />
-	<type name="IConsoleLineTracker" />
-	<type name="IConsoleLineTrackerExtension" />
- </package>
- <package name="org.eclipse.debug.ui.contexts">
-	<type name="AbstractDebugContextProvider" instantiate="false" subclass="true"/>
-	<type name="DebugContextEvent" instantiate="true" subclass="false"/>
-	<type name="IDebugContextListener"/>
-	<type name="IDebugContextManager" implement="false"/>
-	<type name="IDebugContextProvider" />
-	<type name="IDebugContextService" implement="false"/>
-	<type name="ISuspendTrigger" />
-	<type name="ISuspendTriggerListener" implement="false"/>
- </package>
- <package name="org.eclipse.debug.ui.memory">
-	<type name="AbstractMemoryRendering" />
-	<type name="AbstractMemoryRenderingBindingsProvider" />
-	<type name="AbstractTableRendering" />
-	<type name="AbstractTextRendering" />
-	<type name="IMemoryBlockTablePresentation" />
-	<type name="IMemoryRendering" />
-	<type name="IMemoryRenderingBindingsListener" />
-	<type name="IMemoryRenderingBindingsProvider" />
-	<type name="IMemoryRenderingContainer" />
-	<type name="IMemoryRenderingManager" implement="false" />
-	<type name="IMemoryRenderingSite" />
-	<type name="IMemoryRenderingSynchronizationService" />
-	<type name="IMemoryRenderingType" />
-	<type name="IMemoryRenderingTypeDelegate" />
-	<type name="IResettableMemoryRendering" />
-	<type name="MemoryRenderingElement" />
- </package>
- <package name="org.eclipse.debug.ui.sourcelookup">
-	<type name="AbstractSourceContainerBrowser" />
-	<type name="CommonSourceNotFoundEditor" />
-	<type name="CommonSourceNotFoundEditorInput" />
-	<type name="ISourceContainerBrowser" />
-	<type name="ISourceDisplay" />
-	<type name="ISourceLookupResult" implement="false" />
-	<type name="SourceLookupDialog" subclass="false" />
-	<type name="SourceLookupTab" subclass="false" />
-	<type name="WorkingSetSourceContainer" subclass="false" />
- </package>  
- 
- <component-depends unrestricted="true"/>
-
-</component>
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/doc/.cvsignore b/org.eclipse.debug.ui/doc/.cvsignore
deleted file mode 100644
index c3d27e2..0000000
--- a/org.eclipse.debug.ui/doc/.cvsignore
+++ /dev/null
@@ -1,11 +0,0 @@
-book.css
-org_eclipse_debug_ui_consoleColorProviders.html
-org_eclipse_debug_ui_consoleLineTrackers.html
-org_eclipse_debug_ui_debugModelPresentations.html
-org_eclipse_debug_ui_launchConfigurationTabGroups.html
-org_eclipse_debug_ui_launchConfigurationTypeImages.html
-org_eclipse_debug_ui_launchGroups.html
-org_eclipse_debug_ui_launchShortcuts.html
-org_eclipse_debug_ui_sourceContainerPresentations.html
-org_eclipse_debug_ui_stringVariablePresentations.html
-schema.css
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/changevariablevalue_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/changevariablevalue_co.gif
deleted file mode 100644
index d33c4d3..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/changevariablevalue_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gif
deleted file mode 100644
index 6775edf..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/collapseall.gif b/org.eclipse.debug.ui/icons/full/dlcl16/collapseall.gif
deleted file mode 100644
index bc3c2be..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/copy_edit_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/copy_edit_co.gif
deleted file mode 100644
index 98626a8..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/copy_edit_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/copyviewtoclipboard_tsk.gif b/org.eclipse.debug.ui/icons/full/dlcl16/copyviewtoclipboard_tsk.gif
deleted file mode 100644
index 3a4c6c3..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/copyviewtoclipboard_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/debuglast_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/debuglast_co.gif
deleted file mode 100644
index 83482f5..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/debuglast_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_hide.gif b/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_hide.gif
deleted file mode 100644
index 0c564ff..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_hide.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_right.gif b/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_right.gif
deleted file mode 100644
index ce1a29c..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_right.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_under.gif b/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_under.gif
deleted file mode 100644
index 5bffca2..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/det_pane_under.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/disabled_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/disabled_co.gif
deleted file mode 100644
index 803d910..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/disabled_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gif
deleted file mode 100644
index 587f8c9..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/display_selected_mb.gif b/org.eclipse.debug.ui/icons/full/dlcl16/display_selected_mb.gif
deleted file mode 100644
index db124cb..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/display_selected_mb.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/edtsrclkup_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/edtsrclkup_co.gif
deleted file mode 100644
index 2c6b58b..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/edtsrclkup_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/enabled_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/enabled_co.gif
deleted file mode 100644
index 0e83deb..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/enabled_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/export_brkpts.gif b/org.eclipse.debug.ui/icons/full/dlcl16/export_brkpts.gif
deleted file mode 100644
index 57e9ffd..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/export_brkpts.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/filter_ps.gif b/org.eclipse.debug.ui/icons/full/dlcl16/filter_ps.gif
deleted file mode 100644
index 6c54da9..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/import_brkpts.gif b/org.eclipse.debug.ui/icons/full/dlcl16/import_brkpts.gif
deleted file mode 100644
index e416bf0..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/import_brkpts.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/lock_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/lock_co.gif
deleted file mode 100644
index b776478..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/lock_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/memoryreset_tsk.gif b/org.eclipse.debug.ui/icons/full/dlcl16/memoryreset_tsk.gif
deleted file mode 100644
index bd3b45d..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/memoryreset_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/metharg_obj.gif b/org.eclipse.debug.ui/icons/full/dlcl16/metharg_obj.gif
deleted file mode 100644
index f538ca7..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/metharg_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/monitorexpression_tsk.gif b/org.eclipse.debug.ui/icons/full/dlcl16/monitorexpression_tsk.gif
deleted file mode 100644
index dfbf68f..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/monitorexpression_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/new_con.gif b/org.eclipse.debug.ui/icons/full/dlcl16/new_con.gif
deleted file mode 100644
index 8c682c0..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/new_con.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/printview_tsk.gif b/org.eclipse.debug.ui/icons/full/dlcl16/printview_tsk.gif
deleted file mode 100644
index 4d2722f..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/printview_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/prop_ps.gif b/org.eclipse.debug.ui/icons/full/dlcl16/prop_ps.gif
deleted file mode 100644
index 0fbf9d0..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/prop_ps.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gif
deleted file mode 100644
index ecd1be5..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gif
deleted file mode 100644
index 559e462..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/removememory_tsk.gif b/org.eclipse.debug.ui/icons/full/dlcl16/removememory_tsk.gif
deleted file mode 100644
index 559e462..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/removememory_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gif
deleted file mode 100644
index 8652797..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/runlast_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/runlast_co.gif
deleted file mode 100644
index 0c361fd..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/runlast_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/runtoline_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/runtoline_co.gif
deleted file mode 100644
index 50912b3..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/runtoline_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/skip_brkp.gif b/org.eclipse.debug.ui/icons/full/dlcl16/skip_brkp.gif
deleted file mode 100644
index 8b1e9b4..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/skip_brkp.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepbystep_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepbystep_co.gif
deleted file mode 100644
index fdbf370..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/stepbystep_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gif
deleted file mode 100644
index 61c5ad7..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gif
deleted file mode 100644
index c194def..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gif
deleted file mode 100644
index 67fa335..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gif
deleted file mode 100644
index e47777b..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/synced.gif b/org.eclipse.debug.ui/icons/full/dlcl16/synced.gif
deleted file mode 100644
index 4f6e43a..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_all_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/terminate_all_co.gif
deleted file mode 100644
index 1a33ac8..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_all_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gif
deleted file mode 100644
index 4f3dcba..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_rem_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/terminate_rem_co.gif
deleted file mode 100644
index 9b46637..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_rem_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gif
deleted file mode 100644
index 8341fba..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/toggledetailpane_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/toggledetailpane_co.gif
deleted file mode 100644
index edb400b..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/toggledetailpane_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/var_cntnt_prvdr.gif b/org.eclipse.debug.ui/icons/full/dlcl16/var_cntnt_prvdr.gif
deleted file mode 100644
index 50b6cec..0000000
--- a/org.eclipse.debug.ui/icons/full/dlcl16/var_cntnt_prvdr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gif b/org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gif
deleted file mode 100644
index 6434db2..0000000
--- a/org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/environment_co.gif b/org.eclipse.debug.ui/icons/full/dtool16/environment_co.gif
deleted file mode 100644
index 11640f1..0000000
--- a/org.eclipse.debug.ui/icons/full/dtool16/environment_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/profile_exc.gif b/org.eclipse.debug.ui/icons/full/dtool16/profile_exc.gif
deleted file mode 100644
index a5edd3a..0000000
--- a/org.eclipse.debug.ui/icons/full/dtool16/profile_exc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/run_exc.gif b/org.eclipse.debug.ui/icons/full/dtool16/run_exc.gif
deleted file mode 100644
index a252bf0..0000000
--- a/org.eclipse.debug.ui/icons/full/dtool16/run_exc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/term_restart.gif b/org.eclipse.debug.ui/icons/full/dtool16/term_restart.gif
deleted file mode 100644
index fa0df6f..0000000
--- a/org.eclipse.debug.ui/icons/full/dtool16/term_restart.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/watch_exp.gif b/org.eclipse.debug.ui/icons/full/dtool16/watch_exp.gif
deleted file mode 100644
index 38f60cd..0000000
--- a/org.eclipse.debug.ui/icons/full/dtool16/watch_exp.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/changevariablevalue_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/changevariablevalue_co.gif
deleted file mode 100644
index 87e57e3..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/changevariablevalue_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/collapseall.gif b/org.eclipse.debug.ui/icons/full/elcl16/collapseall.gif
deleted file mode 100644
index dc923f5..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/copy_edit_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/copy_edit_co.gif
deleted file mode 100644
index 7f5fe98..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/copy_edit_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/copyviewtoclipboard_tsk.gif b/org.eclipse.debug.ui/icons/full/elcl16/copyviewtoclipboard_tsk.gif
deleted file mode 100644
index 540860f..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/copyviewtoclipboard_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/debuglast_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/debuglast_co.gif
deleted file mode 100644
index cb68be1..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/debuglast_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/delete_config.gif b/org.eclipse.debug.ui/icons/full/elcl16/delete_config.gif
deleted file mode 100644
index b6922ac..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/delete_config.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/det_pane_hide.gif b/org.eclipse.debug.ui/icons/full/elcl16/det_pane_hide.gif
deleted file mode 100644
index 42fca3f..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/det_pane_hide.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/det_pane_right.gif b/org.eclipse.debug.ui/icons/full/elcl16/det_pane_right.gif
deleted file mode 100644
index d590470..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/det_pane_right.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/det_pane_under.gif b/org.eclipse.debug.ui/icons/full/elcl16/det_pane_under.gif
deleted file mode 100644
index dee0cbc..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/det_pane_under.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/disabled_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/disabled_co.gif
deleted file mode 100644
index f6b9f8a..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/disabled_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gif
deleted file mode 100644
index d8fdd8a..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/display_selected_mb.gif b/org.eclipse.debug.ui/icons/full/elcl16/display_selected_mb.gif
deleted file mode 100644
index 3637794..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/display_selected_mb.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/dissolve_group.gif b/org.eclipse.debug.ui/icons/full/elcl16/dissolve_group.gif
deleted file mode 100644
index d077125..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/dissolve_group.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/drop_to_frame.gif b/org.eclipse.debug.ui/icons/full/elcl16/drop_to_frame.gif
deleted file mode 100644
index 63a0f19..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/drop_to_frame.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/edtsrclkup_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/edtsrclkup_co.gif
deleted file mode 100644
index 94eedf6..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/edtsrclkup_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/enabled_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/enabled_co.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/enabled_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/expandall.gif b/org.eclipse.debug.ui/icons/full/elcl16/expandall.gif
deleted file mode 100644
index c4a67bb..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/expandall.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/export_brkpts.gif b/org.eclipse.debug.ui/icons/full/elcl16/export_brkpts.gif
deleted file mode 100644
index c1083f8..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/export_brkpts.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/filter_ps.gif b/org.eclipse.debug.ui/icons/full/elcl16/filter_ps.gif
deleted file mode 100644
index a4c9e60..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/hierarchicalLayout.gif b/org.eclipse.debug.ui/icons/full/elcl16/hierarchicalLayout.gif
deleted file mode 100644
index 2344861..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/hierarchicalLayout.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/import_brkpts.gif b/org.eclipse.debug.ui/icons/full/elcl16/import_brkpts.gif
deleted file mode 100644
index ffcd7b8..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/import_brkpts.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/lock_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/lock_co.gif
deleted file mode 100644
index 68fd6cf..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/lock_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/memoryreset_tsk.gif b/org.eclipse.debug.ui/icons/full/elcl16/memoryreset_tsk.gif
deleted file mode 100644
index 5f0e7c2..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/memoryreset_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/metharg_obj.gif b/org.eclipse.debug.ui/icons/full/elcl16/metharg_obj.gif
deleted file mode 100644
index 9e3a547..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/metharg_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/monitorexpression_tsk.gif b/org.eclipse.debug.ui/icons/full/elcl16/monitorexpression_tsk.gif
deleted file mode 100644
index 252d7eb..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/monitorexpression_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif b/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif
deleted file mode 100644
index 9d05088..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/pin.gif b/org.eclipse.debug.ui/icons/full/elcl16/pin.gif
deleted file mode 100644
index ec50b70..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/pin.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/printview_tsk.gif b/org.eclipse.debug.ui/icons/full/elcl16/printview_tsk.gif
deleted file mode 100644
index 045de75..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/printview_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/prop_ps.gif b/org.eclipse.debug.ui/icons/full/elcl16/prop_ps.gif
deleted file mode 100644
index 6223cfc..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/prop_ps.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gif
deleted file mode 100644
index 28a3785..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/rem_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/rem_co.gif
deleted file mode 100644
index 2cd9c54..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/rem_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/removememory_tsk.gif b/org.eclipse.debug.ui/icons/full/elcl16/removememory_tsk.gif
deleted file mode 100644
index 2cd9c54..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/removememory_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/resume_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/resume_co.gif
deleted file mode 100644
index 16f4e25..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/resume_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/runlast_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/runlast_co.gif
deleted file mode 100644
index afb6fa9..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/runlast_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/runtoline_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/runtoline_co.gif
deleted file mode 100644
index ec2c353..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/runtoline_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/skip_brkp.gif b/org.eclipse.debug.ui/icons/full/elcl16/skip_brkp.gif
deleted file mode 100644
index c1751c3..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/skip_brkp.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepbystep_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepbystep_co.gif
deleted file mode 100644
index 4635a71..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/stepbystep_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gif
deleted file mode 100644
index 75d165b..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gif
deleted file mode 100644
index 1ec36ae..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gif
deleted file mode 100644
index 4c2f219..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gif
deleted file mode 100644
index 161e3f5..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/synced.gif b/org.eclipse.debug.ui/icons/full/elcl16/synced.gif
deleted file mode 100644
index 870934b..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/terminate_all_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/terminate_all_co.gif
deleted file mode 100644
index 6d47276..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/terminate_all_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gif
deleted file mode 100644
index dc47edf..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/terminate_rem_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/terminate_rem_co.gif
deleted file mode 100644
index 8124628..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/terminate_rem_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gif
deleted file mode 100644
index 330fc38..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/toggledetailpane_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/toggledetailpane_co.gif
deleted file mode 100644
index ea13622..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/toggledetailpane_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/var_cntnt_prvdr.gif b/org.eclipse.debug.ui/icons/full/elcl16/var_cntnt_prvdr.gif
deleted file mode 100644
index 245c72e..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/var_cntnt_prvdr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/writeerr_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/writeerr_co.gif
deleted file mode 100644
index 27e7c9d..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/writeerr_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/writeout_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/writeout_co.gif
deleted file mode 100644
index 43d51bc..0000000
--- a/org.eclipse.debug.ui/icons/full/elcl16/writeout_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/debug_exc.gif b/org.eclipse.debug.ui/icons/full/etool16/debug_exc.gif
deleted file mode 100644
index afe775b..0000000
--- a/org.eclipse.debug.ui/icons/full/etool16/debug_exc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/environment_co.gif b/org.eclipse.debug.ui/icons/full/etool16/environment_co.gif
deleted file mode 100644
index 716df43..0000000
--- a/org.eclipse.debug.ui/icons/full/etool16/environment_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/profile_exc.gif b/org.eclipse.debug.ui/icons/full/etool16/profile_exc.gif
deleted file mode 100644
index b7f03d5..0000000
--- a/org.eclipse.debug.ui/icons/full/etool16/profile_exc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/run_exc.gif b/org.eclipse.debug.ui/icons/full/etool16/run_exc.gif
deleted file mode 100644
index 57f4102..0000000
--- a/org.eclipse.debug.ui/icons/full/etool16/run_exc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/term_restart.gif b/org.eclipse.debug.ui/icons/full/etool16/term_restart.gif
deleted file mode 100644
index 88276ce..0000000
--- a/org.eclipse.debug.ui/icons/full/etool16/term_restart.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/watch_exp.gif b/org.eclipse.debug.ui/icons/full/etool16/watch_exp.gif
deleted file mode 100644
index d37495a..0000000
--- a/org.eclipse.debug.ui/icons/full/etool16/watch_exp.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif b/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif
deleted file mode 100644
index f529c5a..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif
deleted file mode 100644
index ac5431f..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif
deleted file mode 100644
index ac5431f..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/details_view.gif b/org.eclipse.debug.ui/icons/full/eview16/details_view.gif
deleted file mode 100644
index c81630a..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/details_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif b/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif
deleted file mode 100644
index 7ce1112..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/register_view.gif b/org.eclipse.debug.ui/icons/full/eview16/register_view.gif
deleted file mode 100644
index 7134210..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/register_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif b/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif
deleted file mode 100644
index e35f594..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif b/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif
deleted file mode 100644
index c55cb58..0000000
--- a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/arraypartition_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/arraypartition_obj.gif
deleted file mode 100644
index 052915a..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/arraypartition_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkp_grp.gif b/org.eclipse.debug.ui/icons/full/obj16/brkp_grp.gif
deleted file mode 100644
index 173661c..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/brkp_grp.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkp_grp_disabled.gif b/org.eclipse.debug.ui/icons/full/obj16/brkp_grp_disabled.gif
deleted file mode 100644
index 5ea466b..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/brkp_grp_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gif
deleted file mode 100644
index a831fe7..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkp_type.gif b/org.eclipse.debug.ui/icons/full/obj16/brkp_type.gif
deleted file mode 100644
index 31c40ea..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/brkp_type.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gif
deleted file mode 100644
index 74b26c3..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/common_tab.gif b/org.eclipse.debug.ui/icons/full/obj16/common_tab.gif
deleted file mode 100644
index d11c996..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/common_tab.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gif
deleted file mode 100644
index c1e4ee3..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/debugts_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/debugts_obj.gif
deleted file mode 100644
index 0d71e42..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/debugts_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gif
deleted file mode 100644
index 81fb7b4..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/environment_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/environment_obj.gif
deleted file mode 100644
index 3150162..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/environment_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/envvar_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/envvar_obj.gif
deleted file mode 100644
index 0f07692..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/envvar_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/expression_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/expression_obj.gif
deleted file mode 100644
index 66fd649..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/expression_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/file_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/file_obj.gif
deleted file mode 100644
index 7ccc6a7..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/file_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/fldr_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/fldr_obj.gif
deleted file mode 100644
index 51e703b..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/fldr_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/genericreggroup_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/genericreggroup_obj.gif
deleted file mode 100644
index bb86ad3..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/genericreggroup_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/genericregister_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/genericregister_obj.gif
deleted file mode 100644
index 7134210..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/genericregister_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/genericvariable_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/genericvariable_obj.gif
deleted file mode 100644
index 1f4ec30..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/genericvariable_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/inst_ptr.gif b/org.eclipse.debug.ui/icons/full/obj16/inst_ptr.gif
deleted file mode 100644
index d58bf89..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/inst_ptr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/inst_ptr_top.gif b/org.eclipse.debug.ui/icons/full/obj16/inst_ptr_top.gif
deleted file mode 100644
index 34ac8ac..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/inst_ptr_top.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/jar_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/jar_obj.gif
deleted file mode 100644
index 2fa1d77..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/jar_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gif
deleted file mode 100644
index b0dfd3b..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gif
deleted file mode 100644
index 57f4102..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/memory_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/memory_obj.gif
deleted file mode 100644
index cdc52ef..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/memory_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/memorychanged_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/memorychanged_obj.gif
deleted file mode 100644
index 0733d3d..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/memorychanged_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gif
deleted file mode 100644
index aa15e0a..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gif
deleted file mode 100644
index 9f0d791..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/persp_tab.gif b/org.eclipse.debug.ui/icons/full/obj16/persp_tab.gif
deleted file mode 100644
index 9328079..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/persp_tab.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/prj_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/prj_obj.gif
deleted file mode 100644
index a4ea580..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/prj_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/read_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/read_obj.gif
deleted file mode 100644
index c876ebd..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/read_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/read_obj_disabled.gif b/org.eclipse.debug.ui/icons/full/obj16/read_obj_disabled.gif
deleted file mode 100644
index 0ee65cd..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/read_obj_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/readwrite_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/readwrite_obj.gif
deleted file mode 100644
index b11bfe2..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/readwrite_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/readwrite_obj_disabled.gif b/org.eclipse.debug.ui/icons/full/obj16/readwrite_obj_disabled.gif
deleted file mode 100644
index d58def4..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/readwrite_obj_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/refresh_tab.gif b/org.eclipse.debug.ui/icons/full/obj16/refresh_tab.gif
deleted file mode 100644
index 3ec515b..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/refresh_tab.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/rundebug.gif b/org.eclipse.debug.ui/icons/full/obj16/rundebug.gif
deleted file mode 100644
index 6b3911b..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/rundebug.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif
deleted file mode 100644
index f1e585b..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/stckframe_running_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/stckframe_running_obj.gif
deleted file mode 100644
index 0a44550..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/stckframe_running_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/terminatedlaunch_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/terminatedlaunch_obj.gif
deleted file mode 100644
index 76596dd..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/terminatedlaunch_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/thread_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/thread_obj.gif
deleted file mode 100644
index b8ca14a..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/thread_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/threads_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/threads_obj.gif
deleted file mode 100644
index 45c23a9..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/threads_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gif
deleted file mode 100644
index a7302ed..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/workset.gif b/org.eclipse.debug.ui/icons/full/obj16/workset.gif
deleted file mode 100644
index 2e4de3d..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/workset.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/write_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/write_obj.gif
deleted file mode 100644
index feb8e94..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/write_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/write_obj_disabled.gif b/org.eclipse.debug.ui/icons/full/obj16/write_obj_disabled.gif
deleted file mode 100644
index 2ddc3b8..0000000
--- a/org.eclipse.debug.ui/icons/full/obj16/write_obj_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ovr16/error.gif b/org.eclipse.debug.ui/icons/full/ovr16/error.gif
deleted file mode 100644
index 119dccc..0000000
--- a/org.eclipse.debug.ui/icons/full/ovr16/error.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ovr16/skip_breakpoint_ov.gif b/org.eclipse.debug.ui/icons/full/ovr16/skip_breakpoint_ov.gif
deleted file mode 100644
index 61c75c2..0000000
--- a/org.eclipse.debug.ui/icons/full/ovr16/skip_breakpoint_ov.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gif b/org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gif
deleted file mode 100644
index e1e4536..0000000
--- a/org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ovr16/transparent.gif b/org.eclipse.debug.ui/icons/full/ovr16/transparent.gif
deleted file mode 100644
index a9a3cdc..0000000
--- a/org.eclipse.debug.ui/icons/full/ovr16/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/adddir_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/adddir_wiz.png
deleted file mode 100644
index 684431c..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/adddir_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/addsrcloc_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/addsrcloc_wiz.png
deleted file mode 100644
index 6a8d691..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/addsrcloc_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/debug_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/debug_wiz.png
deleted file mode 100644
index d238c0b..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/debug_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/editdir_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/editdir_wiz.png
deleted file mode 100644
index 0b19626..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/editdir_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/edtsrclkup_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/edtsrclkup_wiz.png
deleted file mode 100644
index 8dca8ee..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/edtsrclkup_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/export_brkpts_wizban.png b/org.eclipse.debug.ui/icons/full/wizban/export_brkpts_wizban.png
deleted file mode 100644
index f4d9e6d..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/export_brkpts_wizban.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/import_brkpts_wizban.png b/org.eclipse.debug.ui/icons/full/wizban/import_brkpts_wizban.png
deleted file mode 100644
index 6434b3a..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/import_brkpts_wizban.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/profile_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/profile_wiz.png
deleted file mode 100644
index 7229ca0..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/profile_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/run_wiz.png b/org.eclipse.debug.ui/icons/full/wizban/run_wiz.png
deleted file mode 100644
index 16edc87..0000000
--- a/org.eclipse.debug.ui/icons/full/wizban/run_wiz.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties
deleted file mode 100644
index f49c2f5..0000000
--- a/org.eclipse.debug.ui/plugin.properties
+++ /dev/null
@@ -1,380 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
-###############################################################################
-
-pluginName=Debug UI
-
-accessAction.label=&Access
-BreakpointsView.name=Breakpoints
-ConsoleColorProvidersExtensionName= Console Color Providers
-ConsoleFont.description= The font used by the debug console.
-ConsoleFont.label= Console font
-ConsoleLineTrackersExtensionName= Console Line Trackers
-LaunchingPreferencePage.name=Launching
-LaunchDelegatesPreferencePage.name=Default Launchers
-ViewManagementPreferencePage.name=View Management
-ConsolePreferencePage.name=Console
-DebugModelContextBindingsName=Debug Model Context Bindings
-ContextViewBindingsName=Context View Bindings
-BreakpointOrganizersName=Breakpoint Organizers
-VariableValueEditorsName=Variable Value Editors
-
-ContextLaunchingRunMenu.name=&Run
-ContextLaunchingRunMenu.tooltip=Run the selected item
-
-ContextLaunchingDebugMenu.name=&Debug
-ContextLaunchingDebugMenu.tooltip=Debug the selected item
-
-ContextLaunchingProfileMenu.name=&Profile
-ContextLaunchingProfileMenu.tooltip=Profile the selected item
-
-ContextualLaunchingPrefPage.name=Contextual Launching
-
-DefaultLaunchConfigurationsPropPage.name=Run/Debug Settings
-
-BreakpointActionSet.label=Breakpoints
-CollapseAll.label=Collapse All
-CollapseAll.tooltip= Collapse All
-CopyToClipboardAction.label=&Copy Stack
-CopyVariablesToClipboardAction.label=Copy &Variables
-CopyExpressionsToClipboardAction.label=Copy &Expressions
-CopyRegistersToClipboardAction.label=Copy &Registers
-DebugActionSet.label=Debug
-debugCurrentInstructionPointer=Debug Current Instruction Pointer
-debugCallStack=Debug Call Stack
-DebugDropDownAction.label=Debug
-DebugHistoryMenuAction.label=Debug &History
-DebugLastAction.label=&Debug Last Launched
-DebugLaunchGroup.label=De&bug
-DebugLaunchGroup.title=Select or configure an application to debug
-DebugModelPresentationExtensionName=Debug Model Presentation
-
-LaunchConfigurationTabsExtension.name=Launch Configuration Tabs
-
-DebugPerspective.name=Debug
-DebugPerspective.description=This Debug perspective is designed to support application debugging.  It incorporates views for displaying the debug stack, variables and breakpoint management.
-
-command.openDebugPerspective.description = Open the debug perspective
-DebugPreferencePage.name=Run/Debug
-DebugView.name=Debug
-DebugViewsCategory.name=Debug
-DebugWithConfigurationAction.label=Debu&g As
-DetailPaneFontDefinition.label=Detail pane text font
-DetailPaneFontDefinition.description=The detail pane text font is used in the detail panes of debug views.
-DetailPaneFactoriesExtension.name=Detail Pane Factories
-DisableBreakpointsAction.label=&Disable
-EnableBreakpointsAction.label=&Enable
-ExpandAll.label=Expand All
-ExpandAll.tooltip=Expand All
-ExpressionView.name=Expressions
-GroupBy.label=&Group By
-GroupBy.tooltip=Show
-LinkWithDebugView.label=Link with Debug View
-LinkWithDebugView.tooltip=Link with Debug View
-LaunchActionSet.label=Launch
-LaunchConfigurationTabGroupExtensionName=Launch Configuration Tab Group
-LaunchShortcutsName=Launch Shortcut
-LaunchConfigurationTypeImageExtensionName=Launch Configuration Type Image 
-LaunchGroupsExtensionName=Launch Groups
-modificationAction.label=&Modification
-OpenDebugConfigurations.label=Open De&bug Dialog...
-OpenRunConfigurations.label=Open Ru&n Dialog...
-OpenProfileConfigurations.label=Open &Profile Dialog...
-processPropertyPageName=Process Information
-ProfileLaunchGroup.label=&Profile
-ProfileLaunchGroup.title=Select or configure an application to profile
-ProfileDropDownAction.label=Profile
-ProfileWithConfigurationAction.label=Pro&file As
-ProfileHistoryMenuAction.label=Profile Histor&y
-ProfileLastAction.label=Profi&le Last Launched
-ProfileActionSet.label=Profile
-RegistersView.name=Registers
-RelaunchAction.label=Re&launch
-RemoveAction.label=Rem&ove
-RemoveAllAction.label=Remove A&ll
-RemoveAllBreakpointsAction.label=Remo&ve All Breakpoints
-RemoveAllBreakpointsAction.tooltip=Remove All Breakpoints
-RemoveAllExpressionsAction.tooltip=Remove All Expressions
-RemoveAllTerminatedAction.label=Remove &All Terminated
-RemoveAllTerminatedAction.tooltip=Remove All Terminated Launches
-RemoveBreakpointAction.tooltip=Remove Selected Breakpoints
-RemoveExpressionAction.tooltip=Remove Selected Expressions
-ResumeAction.label=Resu&me
-RunDropDownAction.label=&Run
-RunMenu.label=&Run
-RunLastAction.label=&Run Last Launched
-RunLaunchGroup.label=Ru&n
-RunLaunchGroup.title=Select or configure an application to run
-RunHistoryMenuAction.label=Run His&tory
-RunWithConfigurationAction.label=Run A&s
-RunToLine.label=Run to &Line
-SelectAll.label=Select &All
-StepWithFiltersAction.label=Use Step &Filters
-StepWithFiltersAction.tooltip=Use Step Filters/Step Debug
-StepIntoAction.label=Step &Into
-StepOverAction.label=Step &Over
-StepReturnAction.label=Step Ret&urn
-StringVariablePresentationsName=String Variable Presentations
-SuspendAction.label=&Suspend
-TerminateAction.label=&Terminate
-ToggleBreakpointAction.label=Toggle Brea&kpoint
-ToggleLineBreakpointAction.label=Toggle &Line Breakpoint
-ToggleMethodBreakpointAction.label=Toggle &Method Breakpoint
-ToggleWatchpointAction.label=Toggle &Watchpoint
-VariablesView.name=Variables
-VariableTextFontDefinition.label=Variable text font
-VariableTextFontDefinition.description=Font to use for the label text of entries in the Variables, Registers and Expression views as well as the Inspect Popup Dialog.
-StringVariablePreferencePage.name=String Substitution
-ToggleMemoryMonitorsPaneAction.name = &Toggle Memory Monitors Pane
-ToggleMemoryMonitorsPaneAction.tooltip = Toggle Memory Monitors Pane
-ToggleSplitPaneAction.name = Toggle &Split Pane
-ToggleSplitPaneAction.tooltip = Toggle Split Pane
-LinkRenderingPanesAction.name = &Link Memory Rendering Panes
-LinkRenderingPanesAction.tooltip = Link Memory Rendering Panes
-AddRemoveRenderingMenu.name = Add/Remove Rendering
-AddRenderingAction.name = Add Rendering
-RemoveRenderingAction.name = Remove Rendering
-PerspectivePreferencePage.name = Perspectives
-LaunchConfigurationsPage.name = Launch Configurations
-
-#string substitution variables
-string_prompt.description=Returns the text value entered into a prompt dialog. When one argument is provided, it is used as a prompt hint on the input dialog. When a second argument is provided, it is used as an initial value in the input dialog. The first and second arguments must be separated with a ':'.
-file_prompt.description=Returns the absolute file system path of a file chosen in a file selection dialog. When one argument is provided, it is used a prompt hint on the dialog title. When a second argument is provided, it is used as an initial value for the file selection dialog. The first and second arguments must be separated with a ':'.
-folder_prompt.description=Returns the absolute file system path of a directory chosen in a directory selection dialog. When one argument is provided, it is used a prompt hint on the dialog title. When a second argument is provided, it is used as an initial value for the directory selection dialog. The first and second arguments must be separated with a ':'.
-container_loc.description=Returns the absolute file system path of a resource's container. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-container_path.description=Returns the workspace relative path of a resource's container. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-container_name.description=Returns the name of a resource's container. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-project_loc.description=Returns the absolute file system path of a resource's project. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-project_path.description=Returns the workspace relative path of a resource's project. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-project_name.description=Returns the name of a resource's project. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-resource_loc.description=Returns the absolute file system path of a resource. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-resource_path.description=Returns the workspace relative path of a resource. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-resource_name.description=Returns the name of a resource. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
-workspace_loc.description=Returns the absolute file system path of the workspace root. When an argument is specified, the absolute file system path of the resource identified by a workspace relative path is returned.
-selected_text.description=Returns the text currently selected in the active editor.
-
-providerName=Eclipse.org
-
-runCategory.name= Run/Debug
-runCategory.description= Run/Debug command category
-
-NoSourceFoundEditor.name= No Source Found
-
-Context.debugging.description= Debugging Programs
-Context.debugging.name= Debugging
-
-Context.console.description= In Console
-Context.console.name= In Console
-
-Context.memoryview.description = In Memory View
-Context.memoryview.name = In Memory View
-
-ActionDefinition.eof.name= EOF
-ActionDefinition.eof.description= Send end of file
-
-ActionDefinition.addMemoryBlock.name= Add Memory Block
-ActionDefinition.addMemoryBlock.description=Add Memory block
-
-ActionDefinition.toggleStepFilters.name= Use Step Filters
-ActionDefinition.toggleStepFilters.description= Toggles enablement of debug step filters
-
-ActionDefinition.stepInto.name= Step Into
-ActionDefinition.stepInto.description= Step into
-
-ActionDefinition.stepOver.name= Step Over
-ActionDefinition.stepOver.description= Step over
-
-ActionDefinition.stepReturn.name= Step Return
-ActionDefinition.stepReturn.description= Step return
-
-ActionDefinition.resume.name=Resume
-ActionDefinition.resume.description=Resume
-
-
-ActionDefinition.runToLine.name=Run to Line
-ActionDefinition.runToLine.description=Resume and break when execution reaches the current line
-
-ActionDefinition.terminate.name=Terminate
-ActionDefinition.terminate.description=Terminate
-
-ActionDefinition.terminateAndRelaunch.name=Terminate and Relaunch
-ActionDefinition.terminateAndRelaunch.description=Terminate and Relaunch
-
-ActionDefinition.toggleBreakpoint.name=Toggle Breakpoint
-ActionDefinition.toggleBreakpoint.description=Creates or removes a breakpoint
-
-ActionDefinition.suspend.name=Suspend
-ActionDefinition.suspend.description=Suspend
-
-ActionDefinition.openProfile.name=Profile...
-ActionDefinition.openProfile.description=Open profile launch configuration dialog
-
-ActionDefinition.profileLast.name=Profile Last Launched
-ActionDefinition.profileLast.description=Profile the last launch in profile mode
-
-ActionDefinition.openRun.name=Run...
-ActionDefinition.openRun.description=Open run launch configuration dialog
-
-ActionDefinition.debugLast.name=Debug Last Launched
-ActionDefinition.debugLast.description=Debug the last launch in debug mode
-
-ActionDefinition.runLast.name=Run Last Launched
-ActionDefinition.runLast.description=Relaunch the last launch in run mode
-
-ActionDefinition.openDebug.name=Debug...
-ActionDefinition.openDebug.description=Open debug launch configuration dialog
-
-
-ActionDefinition.toggleWatchpoint.name=Toggle Watchpoint
-ActionDefinition.toggleWatchpoint.description=Creates or removes a watchpoint
-
-ActionDefinition.toggleMethodBreakpoint.name=Toggle Method Breakpoint
-ActionDefinition.toggleMethodBreakpoint.description=Creates or removes a method breakpoint
-
-ActionDefinition.removeAllBreakpoints.name=Remove All Breakpoints
-ActionDefinition.removeAllBreakpoints.description=Removes all breakpoints
-
-ActionDefinition.skipAllBreakpoints.name=Skip All Breakpoints
-ActionDefinition.skipAllBreakpoints.description=Sets whether or not any breakpoint should suspend execution
-
-ViewCommand.debugView.name=Debug
-ViewCommand.debugView.description=Show the Debug view
-
-ViewCommand.breakpointView.name=Breakpoints
-ViewCommand.breakpointView.description=Show the Breakpoints view
-
-ViewCommand.variableView.name=Variables
-ViewCommand.variableView.description=Show the Variables view
-
-ViewCommand.expressionView.name=Expressions
-ViewCommand.expressionView.description=Show the Expressions view
-
-ViewCommand.registerView.name=Registers
-ViewCommand.registerView.description=Show the Registers view
-
-ViewCommand.memoryView.name=Memory
-ViewCommand.memoryView.description=Show the Memory view
-
-SkipAllBreakpointsAction.label=S&kip All Breakpoints
-editWatchExpressionAction.label=&Edit Watch Expression...
-editWatchExpressionAction.tooltip=Edit the selected watch expression
-reevaluateWatchExpressionAction.label=&Reevaluate Watch Expression
-reevaluateWatchExpressionAction.tooltip=Reevaluate the watch expression in the selected stack frame
-addWatchExpressionAction.label=&Add Watch Expression...
-addWatchExpressionAction.tooltip=Create a new watch expression
-convertToWatchExpressionAction.label=Convert to &Watch Expression
-convertToWatchExpressionAction.tooltip=Convert an inspect expression to a watch expression
-Watch.label=Create Wa&tch Expression
-
-enableWatchExpressionAction.label=Enable
-enableWatchExpressionAction.tooltip=Enable watch expression
-
-disableWatchExpressionAction.label=Disable
-disableWatchExpressionAction.tooltip=Disable watch expression
-
-BreakpointMarkerPreference.label= Breakpoints
-
-SourceContainerPresentationsName = Source Container Presentations
-
-DebugContextMenu.label=&Debug As
-RunContextMenu.label=&Run As
-ProfileContextMenu.label=&Profile As
-
-containerName.workingSet = Working set
-sourceNotFoundEditorName=Source Not Found Editor
-
-debugPresentation.label= Debug
-
-MemoryViewName = Memory
-
-MemoryViewTableFontDefinition.label=Memory view table font
-MemoryViewTableFontDefinition.description=The font used in the table of the memory view.
-
-RawHex = Hex
-ASCIIName = ASCII
-SignedIntegerName = Signed Integer
-UnsignedIntegerName = Unsigned Integer
-Endianess = Endianess
-BigEndianActionName = Big Endian
-LittleEndianActionName = Little Endian
-RestoreDefEndianessActionName = Restore Default
-HexIntegerName = Hex Integer
-
-ViewManagementAction.label=&View Management...
-
-setDefaultGroup.label=&Select Default Working Set...
-setDefaultGroup.tooltip=Select Default Working Set
-clearDefaultGroup.label=&Deselect Default Working Set
-clearDefaultGroup.tooltip=Deselect Default Working Set
-workingSets.label=&Working Sets...
-workingSets.tooltip=Manage Working Sets
-
-editGroup.label=&Edit Working Set...
-ToggleDefault.label=Defaul&t Working Set
-
-Project.label=Projects
-Project.others=Others (no project)
-File.label=Files
-File.others=Others (no file)
-BreakpointType.label=Breakpoint Types
-BreakpointType.others=Others (type unspecified)
-WorkingSet.label=Resource Working Sets
-WorkingSet.others=Others (no working set)
-BreakpointWorkingSet.label=Breakpoint Working Sets
-BreakpointWorkingSet.others=Others (no working set)
-BreakpointWorkingSet.name=Breakpoint
-
-memoryRenderingsExtensionPointName = Memory Renderings
-TableRenderingPrefActionName = &Table Renderings Preferences...
-
-
-NewMemoryViewAction.label=&New Memory View
-NewMemoryViewAction.tooltip=New Memory View
-PinMemoryBlockAction.label=&Pin Memory Monitor
-PinMemoryBlockAction.tooltip=Pin Memory Monitor
-TableRenderingInfo.label = Rendering Selection
-
-preferenceKeywords.general=run debug breakpoints variables color
-preferenceKeywords.console=console stdout stderr color
-preferenceKeywords.launching=launching build
-preferenceKeywords.stringSubstitution=variables
-preferenceKeywords.viewManagement=views
-preferenceKeywords.perspective=perspectives switching assign automatic run debug
-preferenceKeywords.launchConfigurations=filters launch migration configurations run debug
-preferenceKeywords.launchDelegates=launch delegate duplicate run debug profile mode configuration launchers launcher modes
-preferenceKeywords.contextLaunching=run debug profile launch contextual delegate configuration execute
-
-exportBreakpoints.label=E&xport Breakpoints...
-importBreakpoints.label=I&mport Breakpoints...
-exportBreakpoints.name=Breakpoints
-importBreakpoints.description=Import breakpoints from the local file system.
-exportBreakpoints.description=Export breakpoints to the local file system.
-
-switchMemoryBlock.label = Switch &Memory Monitor
-switchMemoryBlock.tooltip = Switch Memory Monitor
-toggleMemoryMonitorsPane.label = Toggle Memory Monitors Pane
-toggleMemoryMonitorsPane.description = Toggle visibility of the Memory Monitors Pane
-nextMemoryBlockCommand.label = Next Memory Monitor
-nextMemoryBlockCommand.description = Show renderings from next memory monitor.
-memoryViewPrefAction.label = &Preferences...
-resetMemoryMonitorAction.label = &Reset
-
-ConsolePreferencesAction.label = &Preferences...
-ConsolePreferencesAction.tooltip = Opens the console's Preferences Page
-
-command.description.0 = Go to Address
-command.name.0 = Go to Address
-context.description.0 = In Table Memory Rendering
-context.name.0 = In Table Memory Rendering
-command.description.1 = Load next page of memory
-command.name.1 = Next Page of Memory
-command.description.2 = Load previous page of memory
-command.name.2 = Previous Page of Memory
diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml
deleted file mode 100644
index 84e3746..0000000
--- a/org.eclipse.debug.ui/plugin.xml
+++ /dev/null
@@ -1,2527 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-<!-- Extension points -->
-   <extension-point id="consoleColorProviders" name="%ConsoleColorProvidersExtensionName" schema="schema/consoleColorProviders.exsd"/>
-   <extension-point id="consoleLineTrackers" name="%ConsoleLineTrackersExtensionName" schema="schema/consoleLineTrackers.exsd"/>
-   <extension-point id="debugModelPresentations" name="%DebugModelPresentationExtensionName" schema="schema/debugModelPresentations.exsd"/>
-   <extension-point id="launchConfigurationTabGroups" name="%LaunchConfigurationTabGroupExtensionName" schema="schema/launchConfigurationTabGroups.exsd"/>
-   <extension-point id="launchConfigurationTypeImages" name="%LaunchConfigurationTypeImageExtensionName" schema="schema/launchConfigurationTypeImages.exsd"/>
-   <extension-point id="launchGroups" name="%LaunchGroupsExtensionName" schema="schema/launchGroups.exsd"/>
-   <extension-point id="launchShortcuts" name="%LaunchShortcutsName" schema="schema/launchShortcuts.exsd"/>
-   <extension-point id="stringVariablePresentations" name="%StringVariablePresentationsName" schema="schema/stringVariablePresentations.exsd"/>
-   <extension-point id="sourceContainerPresentations" name="%SourceContainerPresentationsName" schema="schema/sourceContainerPresentations.exsd"/>
-   <extension-point id="debugModelContextBindings" name="%DebugModelContextBindingsName" schema="schema/debugModelContextBindings.exsd"/>
-   <extension-point id="contextViewBindings" name="%ContextViewBindingsName" schema="schema/contextViewBindings.exsd"/>
-   <extension-point id="memoryRenderings" name="%memoryRenderingsExtensionPointName" schema="schema/memoryRenderings.exsd"/>
-   <extension-point id="breakpointOrganizers" name="%BreakpointOrganizersName" schema="schema/breakpointOrganizers.exsd"/>
-   <extension-point id="variableValueEditors" name="%VariableValueEditorsName" schema="schema/variableValueEditors.exsd"/>
-   <extension-point id="launchConfigurationTabs" name="%LaunchConfigurationTabsExtension.name" schema="schema/launchConfigurationTabs.exsd"/>
-   <extension-point id="detailPaneFactories" name="%DetailPaneFactoriesExtension.name" schema="schema/detailPaneFactories.exsd"/>
-
-<!-- Extensions -->
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="%DebugPerspective.name"
-            icon="$nl$/icons/full/eview16/debug_persp.gif"
-            class="org.eclipse.debug.internal.ui.DebugPerspectiveFactory"
-            id="org.eclipse.debug.ui.DebugPerspective">
-         <description>
-            %DebugPerspective.description
-         </description>
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.debug.ui.DebugPerspective">
-         <actionSet
-               id="org.eclipse.ui.NavigateActionSet">
-         </actionSet>
-		 <actionSet
-               id="org.eclipse.debug.ui.breakpointActionSet">
-         </actionSet>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%DebugViewsCategory.name"
-            id="org.eclipse.debug.ui">
-      </category>
-      <view
-            name="%DebugView.name"
-            icon="$nl$/icons/full/eview16/debug_view.gif"
-            category="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.views.launch.LaunchView"
-            id="org.eclipse.debug.ui.DebugView">
-      </view>
-      <view
-            name="%BreakpointsView.name"
-            icon="$nl$/icons/full/eview16/breakpoint_view.gif"
-            category="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView"
-            id="org.eclipse.debug.ui.BreakpointView">
-      </view>
-      <view
-            name="%VariablesView.name"
-            icon="$nl$/icons/full/eview16/variable_view.gif"
-            category="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.views.variables.VariablesView"
-            id="org.eclipse.debug.ui.VariableView">
-      </view>
-      <view
-            name="%ExpressionView.name"
-            icon="$nl$/icons/full/eview16/watchlist_view.gif"
-            category="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.views.expression.ExpressionView"
-            id="org.eclipse.debug.ui.ExpressionView">
-      </view>
-      <view
-            name="%RegistersView.name"
-            icon="$nl$/icons/full/eview16/register_view.gif"
-            category="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.views.registers.RegistersView"
-            id="org.eclipse.debug.ui.RegisterView">
-      </view>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.views.memory.MemoryView"
-            icon="$nl$/icons/full/eview16/memory_view.gif"
-            id="org.eclipse.debug.ui.MemoryView"
-            name="%MemoryViewName">
-      </view>      
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%DebugPreferencePage.name"
-            class="org.eclipse.debug.internal.ui.preferences.DebugPreferencePage"
-            id="org.eclipse.debug.ui.DebugPreferencePage">
-         <keywordReference id="org.eclipse.debug.ui.general"/>
-      </page>
-      <page
-            name="%LaunchingPreferencePage.name"
-            category="org.eclipse.debug.ui.DebugPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.LaunchingPreferencePage"
-            id="org.eclipse.debug.ui.LaunchingPreferencePage">
-         <keywordReference id="org.eclipse.debug.ui.launching"/>
-         <keywordReference
-               id="org.eclipse.debug.ui.contextLaunching">
-         </keywordReference>
-      </page>
-      <page
-            name="%ViewManagementPreferencePage.name"
-            category="org.eclipse.debug.ui.DebugPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.ViewManagementPreferencePage"
-            id="org.eclipse.debug.ui.ViewManagementPreferencePage">
-         <keywordReference id="org.eclipse.debug.ui.viewManagement"/>
-      </page>
-      <page
-            name="%ConsolePreferencePage.name"
-            category="org.eclipse.debug.ui.DebugPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.ConsolePreferencePage"
-            id="org.eclipse.debug.ui.ConsolePreferencePage">
-         <keywordReference id="org.eclipse.debug.ui.console"/>
-      </page>
-      <page
-            name="%StringVariablePreferencePage.name"
-            category="org.eclipse.debug.ui.DebugPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.StringVariablePreferencePage"
-            id="org.eclipse.debug.ui.StringVariablePreferencePage">
-         <keywordReference id="org.eclipse.debug.ui.stringSubstitution"/>
-      </page>
-      <page
-            category="org.eclipse.debug.ui.DebugPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.LaunchPerspectivePreferencePage"
-            id="org.eclipse.debug.ui.PerspectivePreferencePage"
-            name="%PerspectivePreferencePage.name">
-         <keywordReference id="org.eclipse.debug.ui.perspectivesPref"/>
-      </page>
-      <page
-            category="org.eclipse.debug.ui.LaunchingPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.LaunchConfigurationsPreferencePage"
-            id="org.eclipse.debug.ui.LaunchConfigurations"
-            name="%LaunchConfigurationsPage.name">
-         <keywordReference id="org.eclipse.debug.ui.launchconfigurations"/>
-      </page>
-      <page
-            category="org.eclipse.debug.ui.LaunchingPreferencePage"
-            class="org.eclipse.debug.internal.ui.preferences.LaunchersPreferencePage"
-            id="org.eclipse.debug.ui.LaunchDelegatesPreferencePage"
-            name="%LaunchDelegatesPreferencePage.name">
-         <keywordReference
-               id="org.eclipse.debug.ui.launchDelegatesKeywords">
-         </keywordReference>
-      </page>
-   </extension>
-   <extension point="org.eclipse.ui.actionSets">
-   		<actionSet
-            label="%BreakpointActionSet.label"
-            visible="false"
-            id="org.eclipse.debug.ui.breakpointActionSet">
-         <menu
-               label="%RunMenu.label"
-               path="additions"
-               id="org.eclipse.ui.run">
-            <separator
-                  name="breakpointGroup">
-            </separator>
-            <groupMarker
-                  name="lineBreakpointGroup">
-            </groupMarker>
-            <groupMarker
-                  name="emptyBreakpointGroup">
-            </groupMarker>
-         </menu>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RemoveAllBreakpointsAction"
-               definitionId="org.eclipse.debug.ui.commands.RemoveAllBreakpoints"
-               disabledIcon="$nl$/icons/full/dlcl16/rem_all_co.gif"
-               helpContextId="remove_all_breakpoints_action_context"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               id="org.eclipse.debug.ui.actions.RemoveAllBreakpoints"
-               label="%RemoveAllBreakpointsAction.label"
-               menubarPath="org.eclipse.ui.run/breakpointGroup"
-               style="push"/>
-          <action
-               definitionId="org.eclipse.debug.ui.commands.SkipAllBreakpoints"
-               label="%SkipAllBreakpointsAction.label"
-               icon="$nl$/icons/full/elcl16/skip_brkp.gif"
-               helpContextId="skip_all_breakpoints_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.SkipAllBreakpointsAction"
-               menubarPath="org.eclipse.ui.run/breakpointGroup"
-               style="toggle"
-               id="org.eclipse.debug.ui.actions.SkipAllBreakpoints">
-         </action>
-         <action
-               definitionId="org.eclipse.debug.ui.commands.ToggleWatchpoint"
-               label="%ToggleWatchpointAction.label"
-               icon="$nl$/icons/full/obj16/readwrite_obj.gif"
-               disabledIcon="$nl$/icons/full/obj16/readwrite_obj_disabled.gif"
-               helpContextId="toggle_watchpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RetargetWatchpointAction"
-               menubarPath="org.eclipse.ui.run/breakpointGroup"
-               id="org.eclipse.debug.ui.actions.ToggleWatchpoint">
-         </action>
-         <action
-               definitionId="org.eclipse.debug.ui.commands.ToggleMethodBreakpoint"
-               label="%ToggleMethodBreakpointAction.label"
-               icon="$nl$/icons/full/obj16/brkp_obj.gif"
-               disabledIcon="$nl$/icons/full/obj16/brkpd_obj.gif"
-               helpContextId="toggle_method_breakpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RetargetMethodBreakpointAction"
-               menubarPath="org.eclipse.ui.run/breakpointGroup"
-               id="org.eclipse.debug.ui.actions.ToggleMethodBreakpoint">
-         </action>
-         <action
-               definitionId="org.eclipse.debug.ui.commands.ToggleLineBreakpoint"
-               label="%ToggleLineBreakpointAction.label"
-               icon="$nl$/icons/full/obj16/brkp_obj.gif"
-               disabledIcon="$nl$/icons/full/obj16/brkpd_obj.gif"
-               helpContextId="toggle_line_breakpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RetargetToggleLineBreakpointAction"
-               menubarPath="org.eclipse.ui.run/breakpointGroup"
-               id="org.eclipse.debug.ui.actions.ToggleLineBreakpoint">
-         </action>         
-         <action
-               definitionId="org.eclipse.debug.ui.commands.ToggleBreakpoint"
-               label="%ToggleBreakpointAction.label"
-               icon="$nl$/icons/full/obj16/brkp_obj.gif"
-               disabledIcon="$nl$/icons/full/obj16/brkpd_obj.gif"
-               helpContextId="toggle_breakpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RetargetToggleBreakpointAction"
-               menubarPath="org.eclipse.ui.run/breakpointGroup"
-               id="org.eclipse.debug.ui.actions.ToggleBreakpoint">
-         </action>         
-      </actionSet>
-      <actionSet
-            label="%DebugActionSet.label"
-            visible="false"
-            id="org.eclipse.debug.ui.debugActionSet">
-         <menu
-               label="%RunMenu.label"
-               path="additions"
-               id="org.eclipse.ui.run">
-            <separator
-                  name="stepGroup">
-            </separator>
-            <groupMarker
-                  name="stepIntoGroup">
-            </groupMarker>
-            <groupMarker
-                  name="stepOverGroup">
-            </groupMarker>
-            <groupMarker
-                  name="stepReturnGroup">
-            </groupMarker>
-            <groupMarker
-                  name="emptyStepGroup">
-            </groupMarker>
-         </menu>
-         <action
-               id="org.eclipse.debug.ui.actions.ToggleStepFilters"
-               hoverIcon="$nl$/icons/full/elcl16/stepbystep_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.ToggleStepFiltersCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.ToggleStepFilters"
-               disabledIcon="$nl$/icons/full/dlcl16/stepbystep_co.gif"
-               icon="$nl$/icons/full/elcl16/stepbystep_co.gif"
-               helpContextId="step_with_filters_action_context"
-               label="%StepWithFiltersAction.label"
-               menubarPath="org.eclipse.ui.run/emptyStepGroup"
-               style="toggle"
-               state="false">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.RunToLine"
-               class="org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction"
-               definitionId="org.eclipse.debug.ui.commands.RunToLine"
-               helpContextId="run_to_line_action_context"
-               disabledIcon="$nl$/icons/full/dlcl16/runtoline_co.gif"
-               icon="$nl$/icons/full/elcl16/runtoline_co.gif"
-               label="%RunToLine.label"
-               menubarPath="org.eclipse.ui.run/emptyStepGroup">
-         </action>                  
-         <action
-               id="org.eclipse.debug.ui.actions.StepReturn"
-               hoverIcon="$nl$/icons/full/elcl16/stepreturn_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.StepReturnCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.StepReturn"
-               disabledIcon="$nl$/icons/full/dlcl16/stepreturn_co.gif"
-               icon="$nl$/icons/full/elcl16/stepreturn_co.gif"
-               helpContextId="step_return_action_context"
-               label="%StepReturnAction.label"
-               menubarPath="org.eclipse.ui.run/stepReturnGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.StepOver"
-               hoverIcon="$nl$/icons/full/elcl16/stepover_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.StepOverCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.StepOver"
-               disabledIcon="$nl$/icons/full/dlcl16/stepover_co.gif"
-               icon="$nl$/icons/full/elcl16/stepover_co.gif"
-               helpContextId="step_over_action_context"
-               label="%StepOverAction.label"
-               menubarPath="org.eclipse.ui.run/stepOverGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.StepInto"
-               hoverIcon="$nl$/icons/full/elcl16/stepinto_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.StepIntoCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.StepInto"
-               disabledIcon="$nl$/icons/full/dlcl16/stepinto_co.gif"
-               icon="$nl$/icons/full/elcl16/stepinto_co.gif"
-               helpContextId="step_into_action_context"
-               label="%StepIntoAction.label"
-               menubarPath="org.eclipse.ui.run/stepIntoGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.Terminate"
-               hoverIcon="$nl$/icons/full/elcl16/terminate_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.TerminateCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.Terminate"
-               disabledIcon="$nl$/icons/full/dlcl16/terminate_co.gif"
-               icon="$nl$/icons/full/elcl16/terminate_co.gif"
-               helpContextId="terminate_action_context"
-               label="%TerminateAction.label"
-               menubarPath="org.eclipse.ui.run/stepGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.Suspend"
-               hoverIcon="$nl$/icons/full/elcl16/suspend_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.SuspendCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.Suspend"
-               disabledIcon="$nl$/icons/full/dlcl16/suspend_co.gif"
-               icon="$nl$/icons/full/elcl16/suspend_co.gif"
-               helpContextId="suspend_action_context"
-               label="%SuspendAction.label"
-               menubarPath="org.eclipse.ui.run/stepGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.Resume"
-               hoverIcon="$nl$/icons/full/elcl16/resume_co.gif"
-               class="org.eclipse.debug.internal.ui.commands.actions.ResumeCommandActionDelegate"
-               definitionId="org.eclipse.debug.ui.commands.Resume"
-               disabledIcon="$nl$/icons/full/dlcl16/resume_co.gif"
-               icon="$nl$/icons/full/elcl16/resume_co.gif"
-               helpContextId="resume_action_context"
-               label="%ResumeAction.label"
-               menubarPath="org.eclipse.ui.run/stepGroup">
-         </action>
-      </actionSet>
-      <actionSet
-            label="%LaunchActionSet.label"
-            visible="false"
-            id="org.eclipse.debug.ui.launchActionSet">
-         <menu
-               label="%RunMenu.label"
-               path="additions"
-               id="org.eclipse.ui.run">
-            <separator
-                  name="relaunchGroup">
-            </separator>
-            <separator
-                  name="runGroup">
-            </separator>
-            <separator
-                  name="debugGroup">
-            </separator>
-            <separator
-                  name="emptyLaunchGroup">
-            </separator>
-         </menu>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.OpenRunConfigurations"
-               definitionId="org.eclipse.debug.ui.commands.OpenRunConfigurations"
-               disabledIcon="$nl$/icons/full/dtool16/run_exc.gif"
-               helpContextId="open_run_configurations_action_context"
-               hoverIcon="$nl$/icons/full/etool16/run_exc.gif"
-               icon="$nl$/icons/full/etool16/run_exc.gif"
-               id="org.eclipse.debug.ui.actions.OpenRunConfigurations"
-               label="%OpenRunConfigurations.label"
-               menubarPath="org.eclipse.ui.run/runGroup">
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.RunAsAction"
-               helpContextId="run_with_configuration_action_context"
-               id="org.eclipse.debug.internal.ui.actions.RunWithConfigurationAction"
-               label="%RunWithConfigurationAction.label"
-               menubarPath="org.eclipse.ui.run/runGroup"
-               style="pulldown">
-         </action>
-         <action
-               label="%RunHistoryMenuAction.label"
-               style="pulldown"
-               helpContextId="run_history_menu_action_context"
-               class="org.eclipse.debug.internal.ui.actions.RunHistoryMenuAction"
-               menubarPath="org.eclipse.ui.run/runGroup"
-               id="org.eclipse.debug.internal.ui.actions.RunHistoryMenuAction">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.DebugLast"
-               hoverIcon="$nl$/icons/full/elcl16/debuglast_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.DebugLastAction"
-               definitionId="org.eclipse.debug.ui.commands.DebugLast"
-               disabledIcon="$nl$/icons/full/dlcl16/debuglast_co.gif"
-               icon="$nl$/icons/full/elcl16/debuglast_co.gif"
-               helpContextId="debug_last_action_context"
-               label="%DebugLastAction.label"
-               menubarPath="org.eclipse.ui.run/relaunchGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.RunLast"
-               hoverIcon="$nl$/icons/full/elcl16/runlast_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.RunLastAction"
-               definitionId="org.eclipse.debug.ui.commands.RunLast"
-               disabledIcon="$nl$/icons/full/dlcl16/runlast_co.gif"
-               icon="$nl$/icons/full/elcl16/runlast_co.gif"
-               helpContextId="run_last_action_context"
-               label="%RunLastAction.label"
-               menubarPath="org.eclipse.ui.run/relaunchGroup">
-         </action>
-         <action
-               id="org.eclipse.debug.internal.ui.actions.RunDropDownAction"
-               toolbarPath="debug"
-               hoverIcon="$nl$/icons/full/etool16/run_exc.gif"
-               class="org.eclipse.debug.internal.ui.actions.RunToolbarAction"
-               disabledIcon="$nl$/icons/full/dtool16/run_exc.gif"
-               icon="$nl$/icons/full/etool16/run_exc.gif"
-               helpContextId="run_action_context"
-               label="%RunDropDownAction.label"
-               style="pulldown">
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.OpenDebugConfigurations"
-               definitionId="org.eclipse.debug.ui.commands.OpenDebugConfigurations"
-               disabledIcon="$nl$/icons/full/dtool16/debug_exc.gif"
-               helpContextId="open_debug_configurations_action_context"
-               hoverIcon="$nl$/icons/full/etool16/debug_exc.gif"
-               icon="$nl$/icons/full/etool16/debug_exc.gif"
-               id="org.eclipse.debug.ui.actions.OpenDebugConfigurations"
-               label="%OpenDebugConfigurations.label"
-               menubarPath="org.eclipse.ui.run/debugGroup">
-         </action>
-         <action
-               label="%DebugWithConfigurationAction.label"
-               style="pulldown"
-               helpContextId="debug_with_configuration_action_context"
-               class="org.eclipse.debug.internal.ui.actions.DebugAsAction"
-               menubarPath="org.eclipse.ui.run/debugGroup"
-               id="org.eclipse.debug.internal.ui.actions.DebugWithConfigurationAction">
-         </action>
-         <action
-               label="%DebugHistoryMenuAction.label"
-               style="pulldown"
-               helpContextId="debug_history_menu_action_context"
-               class="org.eclipse.debug.internal.ui.actions.DebugHistoryMenuAction"
-               menubarPath="org.eclipse.ui.run/debugGroup"
-               id="org.eclipse.debug.internal.ui.actions.DebugHistoryMenuAction">
-         </action>
-         <action
-               id="org.eclipse.debug.internal.ui.actions.DebugDropDownAction"
-               toolbarPath="debug"
-               hoverIcon="$nl$/icons/full/etool16/debug_exc.gif"
-               class="org.eclipse.debug.internal.ui.actions.DebugToolbarAction"
-               disabledIcon="$nl$/icons/full/dtool16/debug_exc.gif"
-               icon="$nl$/icons/full/etool16/debug_exc.gif"
-               helpContextId="debug_action_context"
-               label="%DebugDropDownAction.label"
-               style="pulldown">
-         </action>
-      </actionSet>
-      <actionSet
-            label="%ProfileActionSet.label"
-            visible="false"
-            id="org.eclipse.debug.ui.profileActionSet">
-         <menu
-               label="%RunMenu.label"
-               path="additions"
-               id="org.eclipse.ui.run">
-            <separator
-                  name="relaunchGroup">
-            </separator>
-            <separator
-                  name="profileGroup">
-            </separator>
-         </menu>
-         <action
-               id="org.eclipse.debug.internal.ui.actions.ProfileDropDownAction"
-               toolbarPath="org.eclipse.debug.ui.launchActionSet/debug"
-               hoverIcon="$nl$/icons/full/etool16/profile_exc.gif"
-               class="org.eclipse.debug.internal.ui.actions.ProfileToolbarAction"
-               disabledIcon="$nl$/icons/full/dtool16/profile_exc.gif"
-               icon="$nl$/icons/full/etool16/profile_exc.gif"
-               helpContextId="profile_action_context"
-               label="%ProfileDropDownAction.label"
-               style="pulldown">
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.OpenProfileConfigurations"
-               definitionId="org.eclipse.debug.ui.commands.OpenProfileConfigurations"
-               disabledIcon="$nl$/icons/full/dtool16/profile_exc.gif"
-               helpContextId="open_profile_configurations_action_context"
-               hoverIcon="$nl$/icons/full/etool16/profile_exc.gif"
-               icon="$nl$/icons/full/etool16/profile_exc.gif"
-               id="org.eclipse.debug.ui.actions.OpenProfileConfigurations"
-               label="%OpenProfileConfigurations.label"
-               menubarPath="org.eclipse.ui.run/profileGroup">
-         </action>
-         <action
-               label="%ProfileWithConfigurationAction.label"
-               style="pulldown"
-               helpContextId="profile_with_configuration_action_context"
-               class="org.eclipse.debug.internal.ui.actions.ProfileAsAction"
-               menubarPath="org.eclipse.ui.run/profileGroup"
-               id="org.eclipse.debug.internal.ui.actions.ProfileWithConfigurationAction">
-         </action>
-         <action
-               label="%ProfileHistoryMenuAction.label"
-               style="pulldown"
-               helpContextId="profile_history_menu_action_context"
-               class="org.eclipse.debug.internal.ui.actions.ProfileHistoryMenuAction"
-               menubarPath="org.eclipse.ui.run/profileGroup"
-               id="org.eclipse.debug.internal.ui.actions.ProfileHistoryMenuAction">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.actions.ProfileLast"
-               hoverIcon="$nl$/icons/full/etool16/profile_exc.gif"
-               class="org.eclipse.debug.internal.ui.actions.ProfileLastAction"
-               definitionId="org.eclipse.debug.ui.commands.ProfileLast"
-               disabledIcon="$nl$/icons/full/dtool16/profile_exc.gif"
-               icon="$nl$/icons/full/etool16/profile_exc.gif"
-               helpContextId="profile_last_action_context"
-               label="%ProfileLastAction.label"
-               menubarPath="org.eclipse.ui.run/relaunchGroup">
-         </action>
-      </actionSet>
-   </extension>         
-   <extension
-         point="org.eclipse.ui.viewActions">
-      <viewContribution
-            targetID="org.eclipse.debug.ui.DebugView"
-            id="org.eclipse.debug.ui.PulldownActions">
-         <action
-               id="org.eclipse.debug.ui.debugview.pulldown.ViewManagementAction"
-               class="org.eclipse.debug.internal.ui.actions.ViewManagementAction"
-               helpContextId="view_management_action_context"
-               label="%ViewManagementAction.label"
-               menubarPath="additions">
-         </action>
-      </viewContribution>
-<!-- Contributions to Debug View Toolbar -->
-      <viewContribution
-            targetID="org.eclipse.debug.ui.DebugView"
-            id="org.eclipse.debug.ui.debugview.toolbar">
-         <action
-               id="org.eclipse.debug.ui.debugview.toolbar.removeAllTerminated"
-               toolbarPath="threadGroup"
-               hoverIcon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.RemoveAllTerminatedAction"
-               disabledIcon="$nl$/icons/full/dlcl16/rem_all_co.gif"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               helpContextId="remove_all_terminated_action_context"
-               label="%RemoveAllTerminatedAction.label"
-               tooltip="%RemoveAllTerminatedAction.tooltip">
-         </action>
-      </viewContribution>
-     
-<!-- Contributions to Breakpoints View Toolbar -->
-      <viewContribution
-            targetID="org.eclipse.debug.ui.BreakpointView"
-            id="org.eclipse.debug.ui.breakpointsview.toolbar">
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.removeAll"
-               toolbarPath="breakpointGroup"
-               hoverIcon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RemoveAllBreakpointsAction"
-               disabledIcon="$nl$/icons/full/dlcl16/rem_all_co.gif"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               helpContextId="remove_all_breakpoints_action_context"
-               label="%RemoveAllAction.label"
-               tooltip="%RemoveAllBreakpointsAction.tooltip">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.remove"
-               toolbarPath="breakpointGroup"
-               hoverIcon="$nl$/icons/full/elcl16/rem_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RemoveBreakpointAction"
-               disabledIcon="$nl$/icons/full/dlcl16/rem_co.gif"
-               icon="$nl$/icons/full/elcl16/rem_co.gif"
-               helpContextId="remove_breakpoint_action_context"
-               label="%RemoveAction.label"
-               tooltip="%RemoveBreakpointAction.tooltip">
-            <selection
-                  class="org.eclipse.debug.core.model.IBreakpoint">
-            </selection>
-         </action>
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.linkWithDebugView"
-               toolbarPath="navigationGroup"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.LinkBreakpointsWithDebugViewAction"
-               icon="$nl$/icons/full/elcl16/synced.gif"
-               helpContextId="link_breakpoints_with_debug_view_action_context"
-               label="%LinkWithDebugView.label"
-               tooltip="%LinkWithDebugView.tooltip">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.collapseAll"
-               toolbarPath="navigationGroup"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.BreakpointsCollapseAllAction"
-               icon="$nl$/icons/full/elcl16/collapseall.gif"
-               helpContextId="breakpoints_collapse_all_action_context"
-               label="%CollapseAll.label"
-               tooltip="%CollapseAll.tooltip">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.expandAll"
-               toolbarPath="navigationGroup"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.BreakpointsExpandAllAction"
-               icon="$nl$/icons/full/elcl16/expandall.gif"
-               helpContextId="breakpoints_expand_all_action_context"
-               label="%ExpandAll.label"
-               tooltip="%ExpandAll.tooltip">
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.WorkingSetsAction"
-               helpContextId="breakpoint_working_sets_action_context"
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.workingSets"
-               label="%workingSets.label"
-               menubarPath="defaultBreakpointGroup"
-               style="push"
-               tooltip="%workingSets.tooltip"/>
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.clearDefaultBreakpointGroup"
-               menubarPath="defaultBreakpointGroup"
-               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.ClearDefaultBreakpointGroupAction"
-               helpContextId="clear_default_breakpoint_group_action_context"
-               label="%clearDefaultGroup.label"
-               tooltip="%clearDefaultGroup.tooltip">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.setDefaultBreakpointGroup"
-               menubarPath="defaultBreakpointGroup"
-               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.SetDefaultBreakpointGroupAction"
-               icon="$nl$/icons/full/obj16/brkp_grp.gif"
-               helpContextId="set_default_breakpoint_group_action_context"
-               label="%setDefaultGroup.label"
-               tooltip="%setDefaultGroup.tooltip">
-         </action>         
-         <action
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.groupByAction"
-               menubarPath="defaultBreakpointGroup"
-               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.GroupBreakpointsByAction"
-               helpContextId="group_breakpoints_by_action_context"
-               label="%GroupBy.label"
-               tooltip="%GroupBy.tooltip">
-         </action>
-      </viewContribution>
-<!-- Contributions to Expression View Toolbar -->
-      <viewContribution
-            targetID="org.eclipse.debug.ui.ExpressionView"
-            id="org.eclipse.debug.ui.expressionsView.toolbar">
-         <action
-               id="org.eclipse.debug.ui.expresssionsView.toolbar.removeAll"
-               toolbarPath="expressionGroup"
-               hoverIcon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.expressions.RemoveAllExpressionsAction"
-               disabledIcon="$nl$/icons/full/dlcl16/rem_all_co.gif"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               helpContextId="remove_all_expressions_action_context"
-               label="%RemoveAllAction.label"
-               tooltip="%RemoveAllExpressionsAction.tooltip">
-         </action>
-         <action
-               id="org.eclipse.debug.ui.expresssionsView.toolbar.remove"
-               toolbarPath="expressionGroup"
-               hoverIcon="$nl$/icons/full/elcl16/rem_co.gif"
-               class="org.eclipse.debug.internal.ui.actions.expressions.RemoveExpressionAction"
-               disabledIcon="$nl$/icons/full/dlcl16/rem_co.gif"
-               icon="$nl$/icons/full/elcl16/rem_co.gif"
-               helpContextId="remove_expression_action_context"
-               label="%RemoveAction.label"
-               tooltip="%RemoveExpressionAction.tooltip">
-            <selection
-                  class="org.eclipse.debug.core.model.IExpression">
-            </selection>
-            <selection
-                  class="org.eclipse.debug.core.model.IVariable">
-            </selection>
-         </action>
-         <action
-               label="%addWatchExpressionAction.label"
-               toolbarPath="expressionGroup"
-               icon="$nl$/icons/full/etool16/watch_exp.gif"
-               hoverIcon="$nl$/icons/full/etool16/watch_exp.gif"
-               helpContextId="add_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.AddWatchExpressionAction"
-               tooltip="%addWatchExpressionAction.tooltip"
-               id="org.eclipse.debug.ui.expresssionsView.toolbar.AddWatchExpression">
-         </action>
-      </viewContribution>
-      <viewContribution
-            targetID="org.eclipse.debug.ui.MemoryView"
-            id="org.eclipse.debug.ui.memoryView.toolbar">
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.PinMemoryBlockAction"
-               helpContextId="PinMemoryBlockAction_context"
-               icon="$nl$/icons/full/elcl16/pin.gif"
-               id="org.eclipse.debug.ui.PinMemoryBlockAction"
-               label="%PinMemoryBlockAction.label"
-               state="false"
-               style="toggle"
-               toolbarPath="additions"
-               tooltip="%PinMemoryBlockAction.tooltip"/>
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.NewMemoryViewAction"
-               helpContextId="NewMemoryViewAction_context"
-               icon="$nl$/icons/full/elcl16/new_con.gif"
-               id="org.eclipse.debug.ui.NewMemoryViewAction"
-               label="%NewMemoryViewAction.label"
-               style="push"
-               toolbarPath="additions"
-               tooltip="%NewMemoryViewAction.tooltip"/>
-         <action
-               disabledIcon="$nl$/icons/full/dlcl16/var_cntnt_prvdr.gif"
-               hoverIcon="$nl$/icons/full/elcl16/var_cntnt_prvdr.gif"
-               toolbarPath="MemoryMonitorsGroup"
-               label="%ToggleMemoryMonitorsPaneAction.name"
-               tooltip="%ToggleMemoryMonitorsPaneAction.tooltip"
-               class="org.eclipse.debug.internal.ui.views.memory.ToggleMemoryMonitorsAction"
-               icon="$nl$/icons/full/elcl16/var_cntnt_prvdr.gif"
-               style="toggle"
-               id="org.eclipse.debug.ui.togglemonitors"/>
-         <action
-               disabledIcon="$nl$/icons/full/dlcl16/synced.gif"
-               hoverIcon="$nl$/icons/full/elcl16/synced.gif"
-               toolbarPath="RenderingPanesGroup"
-               label="%LinkRenderingPanesAction.name"
-               tooltip="%LinkRenderingPanesAction.tooltip"
-               icon="$nl$/icons/full/elcl16/synced.gif"
-               class="org.eclipse.debug.internal.ui.views.memory.LinkRenderingPanesAction"
-               style="toggle"
-               id="org.eclipse.debug.ui.linkrenderingpanes"/>
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingPrefAction"
-               helpContextId="TableRenderingPrefAction_context"
-               id="org.eclipse.debug.ui.tablerendering.preferencesaction"
-               label="%TableRenderingPrefActionName"
-               menubarPath="additions"
-               style="push"
-               tooltip="%TableRenderingPrefActionName"/>
-         <action
-               disabledIcon="$nl$/icons/full/dlcl16/det_pane_right.gif"
-               hoverIcon="$nl$/icons/full/elcl16/det_pane_right.gif"
-               toolbarPath="RenderingPanesGroup"
-               label="%ToggleSplitPaneAction.name"
-               tooltip="%ToggleSplitPaneAction.tooltip"
-               icon="$nl$/icons/full/elcl16/toggledetailpane_co.gif"
-               class="org.eclipse.debug.internal.ui.views.memory.ToggleSplitPaneAction"
-               style="toggle"
-               id="org.eclipse.debug.ui.togglesplitpane"/>
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.SwitchMemoryBlockAction"
-               disabledIcon="$nl$/icons/full/dlcl16/display_selected_mb.gif"
-               helpContextId="switchMemoryBlockAction_context"
-               hoverIcon="$nl$/icons/full/elcl16/display_selected_mb.gif"
-               icon="$nl$/icons/full/elcl16/display_selected_mb.gif"
-               id="org.eclipse.debug.ui.switchMemoryBlock"
-               label="%switchMemoryBlock.label"
-               toolbarPath="switchMonitorGroup"
-               tooltip="%switchMemoryBlock.tooltip"/>
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.MemoryViewPrefAction"
-               helpContextId="MemoryViewPreferences_context"
-               id="org.eclipse.debug.ui.memoryViewPreferencesAction"
-               label="%memoryViewPrefAction.label"
-               menubarPath="additions"
-               style="push"
-               tooltip="%memoryViewPrefAction.label"/>
-      </viewContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-         
-   <!-- memory view contributions -->
-   <objectContribution
-            objectClass="org.eclipse.debug.internal.ui.views.memory.renderings.AbstractIntegerRendering"
-            id="org.eclipse.debug.ui.memory">
-         <menu
-               label="%Endianess"
-               path="additions"
-               id="org.eclipse.debug.ui.memory.rendering.setendianess">
-            <separator name="setEndianessGroup"/>
-            <groupMarker name="defaultEndianessGroup"/>
-         </menu>
-          <action
-                helpContextId="LittleEndianAction_context"
-                enablesFor="1"
-                label="%LittleEndianActionName"
-                class="org.eclipse.debug.internal.ui.views.memory.renderings.LittleEndianAction"
-                menubarPath="org.eclipse.debug.ui.memory.rendering.setendianess/setEndianessGroup"
-                id="org.eclipse.debug.ui.memory.rendering.LittleEndianAction"> 
-         </action>            
-         <action
-               helpContextId="BigEndianAction_context"
-               enablesFor="1"
-               label="%BigEndianActionName"
-               class="org.eclipse.debug.internal.ui.views.memory.renderings.BigEndianAction"
-               menubarPath="org.eclipse.debug.ui.memory.rendering.setendianess/setEndianessGroup"
-               id="org.eclipse.debug.ui.memory.rendering.BigEndianAction"> 
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.renderings.DefaultEndianessAction"
-               enablesFor="1"
-               helpContextId="RestoreDefEndianessAction_context"
-               id="org.eclipse.debug.ui.memory.rendering.DefaultEndianAction"
-               label="%RestoreDefEndianessActionName"
-               menubarPath="org.eclipse.debug.ui.memory.rendering.setendianess/defaultEndianessGroup"/>
-      </objectContribution>
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.MemoryView.RenderingViewPane.1"
-            id="org.eclipse.debug.ui.memory.renderingviewpane.1">
-         <menu
-               label="%AddRemoveRenderingMenu.name"
-               path="popUpBegin"
-               id="org.eclipse.debug.ui.memory.renderingviewpane.1.addremove">
-         </menu>
-         <action
-               helpContextId="RemoveRenderingContextAction_context"
-               label="%RemoveRenderingAction.name"
-               class="org.eclipse.debug.internal.ui.views.memory.RemoveRenderingContextAction"
-               icon="$nl$/icons/full/elcl16/removememory_tsk.gif"
-               menubarPath="org.eclipse.debug.ui.memory.renderingviewpane.1.addremove"
-               id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.1.remove"/>
-         <action
-               helpContextId="AddRenderingContextAction_context"
-               label="%AddRenderingAction.name"
-               class="org.eclipse.debug.internal.ui.views.memory.AddMemoryRenderingContextAction"
-               icon="$nl$/icons/full/elcl16/monitorexpression_tsk.gif"
-               menubarPath="org.eclipse.debug.ui.memory.renderingviewpane.1.addremove"
-               id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.1.add"/>
-      </viewerContribution>
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.MemoryView.RenderingViewPane.2"
-            id="org.eclipse.debug.ui.memory.renderingviewpane.2">
-         <menu
-               label="%AddRemoveRenderingMenu.name"
-               path="popUpBegin"
-               id="org.eclipse.debug.ui.memory.renderingviewpane.2.addremove"/>
-         <action
-               helpContextId="RemoveRenderingContextAction_context"
-               label="%RemoveRenderingAction.name"
-               class="org.eclipse.debug.internal.ui.views.memory.RemoveRenderingContextAction"
-               icon="$nl$/icons/full/elcl16/removememory_tsk.gif"
-               menubarPath="org.eclipse.debug.ui.memory.renderingviewpane.2.addremove"
-               id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.2.remove"/>
-         <action
-               helpContextId="AddRenderingContextAction_context"
-               label="%AddRenderingAction.name"
-               class="org.eclipse.debug.internal.ui.views.memory.AddMemoryRenderingContextAction"
-               icon="$nl$/icons/full/elcl16/monitorexpression_tsk.gif"
-               menubarPath="org.eclipse.debug.ui.memory.renderingviewpane.2.addremove"
-               id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.2.add"/>
-      </viewerContribution>   
-      <viewerContribution
-            id="org.eclipse.debug.ui.memory.memoryBlockTreeViewPane"
-            targetID="org.eclipse.debug.ui.MemoryView.MemoryBlocksTreeViewPane">
-         <action
-               class="org.eclipse.debug.internal.ui.views.memory.ResetMemoryBlockAction"
-               helpContextId="resetMemoryMonitor_context"
-               icon="$nl$/icons/full/elcl16/memoryreset_tsk.gif"
-               id="org.eclipse.debug.ui.resetMemoryBlock"
-               label="%resetMemoryMonitorAction.label"
-               menubarPath="additions"/>
-      </viewerContribution>
-   <!-- contextual launch -->
-      <objectContribution
-            objectClass="java.lang.Object"
-            id="org.eclipse.debug.ui.contextualLaunch.profile">
-        <action
-               label="%ProfileContextMenu.label"
-               style="pulldown"
-               class="org.eclipse.debug.internal.ui.actions.ProfileContextualLaunchAction"
-               menubarPath="additions"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.contextualLaunch.profile.submenu">
-        </action>    
-        <enablement>
-          <test property="org.eclipse.debug.ui.launchable" value="profile"/>
-        </enablement>        
-      </objectContribution>
-      <objectContribution
-            objectClass="java.lang.Object"
-            id="org.eclipse.debug.ui.contextualLaunch.debug">
-        <action
-               label="%DebugContextMenu.label"
-               style="pulldown"
-               class="org.eclipse.debug.internal.ui.actions.DebugContextualLaunchAction"
-               menubarPath="additions"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.contextualLaunch.debug.submenu">
-         </action>
-         <enablement>
-         	<test property="org.eclipse.debug.ui.launchable" value="debug"/>
-         </enablement>     
-       </objectContribution>    
-       <objectContribution
-            objectClass="java.lang.Object"
-            id="org.eclipse.debug.ui.contextualLaunch.run">
-         <action
-               label="%RunContextMenu.label"
-               style="pulldown"
-               class="org.eclipse.debug.internal.ui.actions.RunContextualLaunchAction"
-               menubarPath="additions"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.contextualLaunch.run.submenu">
-         </action>                  
-         <enablement>
-          	<test property="org.eclipse.debug.ui.launchable" value="run"/>
-         </enablement>
-      </objectContribution>
-   <!-- console additions -->
-      <viewerContribution
-             targetID="org.eclipse.debug.ui.ProcessConsoleType.#ContextMenu"
-             id="org.eclipse.debug.ui.processConsoleContextMenu">
-          <action
-                label="%RemoveAllTerminatedAction.label"
-                tooltip="%RemoveAllTerminatedAction.tooltip"
-                icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-                class="org.eclipse.debug.internal.ui.actions.RemoveAllTerminatedAction"
-                menubarPath="additions"
-                id="org.eclipse.debug.ui.consoleRemoveAllTerminatedAction"
-				helpContextId="console_remove_all_terminated_context"/>
-          <action
-                label="%ConsolePreferencesAction.label"
-                tooltip="%ConsolePreferencesAction.tooltip"
-                class="org.eclipse.debug.internal.ui.views.console.ConsoleShowPreferencesAction"
-                menubarPath="preferences"
-                id="org.eclipse.debug.ui.consolePreferencesAction"
-                helpContextId="console_show_preferences_action_context"/>                
-       </viewerContribution>
-<!-- Watch expression actions -->
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IExpression"
-            id="org.eclipse.debug.ui.ExpressionActions">
-         <visibility>
-            <not>
-               <objectClass
-                     name="org.eclipse.debug.core.model.IWatchExpression">
-               </objectClass>
-            </not>
-         </visibility>
-         <action
-               label="%convertToWatchExpressionAction.label"
-               helpContextId="convert_to_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.ConvertToWatchExpressionAction"
-               tooltip="%convertToWatchExpressionAction.tooltip"
-               menubarPath="additions"
-               enablesFor="*"
-               id="org.eclipse.debug.ui.actions.ConvertToWatchExpression">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IVariable"
-            id="org.eclipse.debug.ui.WatchActions">
-         <action
-               label="%Watch.label"
-               icon="$nl$/icons/full/etool16/watch_exp.gif"
-               helpContextId="variable_watch_action_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.WatchAction"
-               menubarPath="openOnGroup"
-               enablesFor="+"
-               id="org.eclipse.jdt.debug.ui.actions.WatchAction">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IWatchExpression"
-            id="org.eclipse.debug.ui.WatchExpressionActions">
-         <action
-               label="%editWatchExpressionAction.label"
-               helpContextId="edit_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.EditWatchExpressionAction"
-               tooltip="%editWatchExpressionAction.tooltip"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.debug.ui.watchExpressionActions.EditWatchExpression">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IWatchExpression"
-            id="org.eclipse.debug.ui.WatchExpressionActions">
-         <action
-               label="%enableWatchExpressionAction.label"
-               helpContextId="enable_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.EnableWatchExpressionAction"
-               tooltip="%enableWatchExpressionAction.tooltip"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.debug.ui.watchExpressionActions.EnableWatchExpression">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IWatchExpression"
-            id="org.eclipse.debug.ui.WatchExpressionActions">
-         <action
-               label="%disableWatchExpressionAction.label"
-               helpContextId="disable_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.DisableWatchExpressionAction"
-               tooltip="%disableWatchExpressionAction.tooltip"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.debug.ui.watchExpressionActions.DisableWatchExpression">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IWatchExpression"
-            id="org.eclipse.debug.WatchExpressionActions">
-         <action
-               label="%reevaluateWatchExpressionAction.label"
-               helpContextId="reevaluate_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.ReevaluateWatchExpressionAction"
-               tooltip="%reevaluateWatchExpressionAction.tooltip"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.debug.ui.watchExpressionActions.ReevaluateWatchExpression">
-         </action>
-      </objectContribution>
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.ExpressionView"
-            id="org.eclipse.debug.ui.ExpressionViewPopupActions">
-         <action
-               label="%addWatchExpressionAction.label"
-               icon="$nl$/icons/full/etool16/watch_exp.gif"
-               helpContextId="add_watch_expression_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.AddWatchExpressionAction"
-               tooltip="%addWatchExpressionAction.tooltip"
-               menubarPath="additions"
-               id="org.eclipse.debug.ui.expressionViewActions.AddWatchExpression">
-         </action>
-      </viewerContribution>
-<!-- Watchpoint actions -->      
-      <objectContribution
-            objectClass="org.eclipse.debug.core.model.IWatchpoint"
-            id="org.eclipse.debug.ui.WatchpointToggleActions">
-         <action
-               label="%accessAction.label"
-               helpContextId="access_toggle_action_context"
-               state="false"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.AccessWatchpointToggleAction"
-               menubarPath="emptyBreakpointGroup"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.actions.AccessToggle">
-         </action>
-         <action
-               label="%modificationAction.label"
-               helpContextId="modification_toggle_action_context"
-               state="false"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.ModificationWatchpointToggleAction"
-               menubarPath="emptyBreakpointGroup"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.actions.ModificationToggle">
-         </action>
-      </objectContribution>
-<!-- Contributions to Debug View Popup Menu -->
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.DebugView"
-            id="org.eclipse.debug.ui.debugview.popupMenu">
-
-         <action
-               label="%CopyToClipboardAction.label"
-               icon="$nl$/icons/full/elcl16/copy_edit_co.gif"
-               definitionId="org.eclipse.ui.edit.copy"
-               helpContextId="copy_to_clipboard_action_context"
-               class="org.eclipse.debug.internal.ui.viewers.model.VirtualCopyToClipboardActionDelegate"
-               menubarPath="editGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.copyToClipboard">
-         </action>
-
-
-         <action
-               label="%RelaunchAction.label"
-               icon="$nl$/icons/full/elcl16/runlast_co.gif"
-               helpContextId="relaunch_action_context"
-               class="org.eclipse.debug.internal.ui.actions.RelaunchActionDelegate"
-               menubarPath="launchGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.relaunch">
-         </action>
-         <action
-               label="%RemoveAllTerminatedAction.label"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               helpContextId="remove_all_terminated_action_context"
-               class="org.eclipse.debug.internal.ui.actions.RemoveAllTerminatedAction"
-               menubarPath="launchGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.removeAllTerminated">
-         </action>
-      </viewerContribution>
-<!-- Contributions to Breakpoints View Popup Menu -->
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.BreakpointView"
-            id="org.eclipse.debug.ui.breakpointview.breakpointGroupActions">
-         <visibility>
-            <objectClass
-               name="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer">
-            </objectClass>
-         </visibility>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.EditBreakpointGroupAction"
-               enablesFor="1"
-               helpContextId="edit_breakpoint_working_set_action_context"
-               id="org.eclipse.debug.ui.actions.editBreakpointGroup"
-               label="%editGroup.label"
-               menubarPath="breakpointGroupGroup">
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.ToggleDefaultGroupAction"
-               helpContextId="set_as_default_breakpoint_working_set_action_context"
-               id="org.eclipse.debug.ui.actions.toggleDefaultGroup"
-               label="%ToggleDefault.label"
-               menubarPath="breakpointGroupGroup"/>
-      </viewerContribution>
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.BreakpointView"
-            id="org.eclipse.debug.ui.breakpointview.popupMenu">
-         <action
-               label="%SelectAll.label"
-               helpContextId="select_all_breakpoints_action_context"
-               definitionId="org.eclipse.ui.edit.selectAll"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.SelectAllBreakpointsAction"
-               menubarPath="breakpointGroup"
-               id="org.eclipse.debug.ui.actions.SelectAllBreakpointsAction">
-         </action>
-         <action
-               label="%RemoveAllAction.label"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               helpContextId="remove_all_breakpoints_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RemoveAllBreakpointsAction"
-               menubarPath="breakpointGroup"
-               id="org.eclipse.debug.ui.actions.RemoveAllBreakpoints">
-         </action>
-        <action
-               label="%RemoveAction.label"
-               icon="$nl$/icons/full/elcl16/rem_co.gif"
-               helpContextId="remove_breakpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.RemoveBreakpointAction"
-               menubarPath="breakpointGroup"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.breakpointsView.toolbar.remove">
-        </action>
-        <action
-               label="%DisableBreakpointsAction.label"
-               icon="$nl$/icons/full/elcl16/disabled_co.gif"
-               helpContextId="disable_breakpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.DisableBreakpointsAction"
-               menubarPath="breakpointGroup"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.actions.DisableBreakpoint">
-        </action>
-        <action
-               label="%EnableBreakpointsAction.label"
-               icon="$nl$/icons/full/elcl16/enabled_co.gif"
-               helpContextId="enable_breakpoint_action_context"
-               class="org.eclipse.debug.internal.ui.actions.breakpoints.EnableBreakpointsAction"
-               menubarPath="breakpointGroup"
-               enablesFor="+"
-               id="org.eclipse.debug.ui.actions.EnableBreakpoint">
-        </action>
-        <action
-              class="org.eclipse.debug.internal.ui.importexport.breakpoints.ImportBreakpoints"
-              helpContextId="import_breakpoints_action_context"
-              icon="$nl$/icons/full/elcl16/import_brkpts.gif"
-              id="org.eclipse.debug.internal.ui.importexport.breakpoints.importBreakpointsContext"
-              label="%importBreakpoints.label"
-              menubarPath="additions"/>
-        <action
-              class="org.eclipse.debug.internal.ui.importexport.breakpoints.ExportBreakpoints"
-              enablesFor="+"
-              helpContextId="export_breakpoints_action_context"
-              icon="$nl$/icons/full/elcl16/export_brkpts.gif"
-              id="org.eclipse.debug.internal.ui.importexport.breakpoints.exportBreakpointsContext"
-              label="%exportBreakpoints.label"
-              menubarPath="additions"/>
-      </viewerContribution>
-      <!-- Breakpoint actions -->
-<!-- Contributions to Variables View Popup Menu -->
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.VariableView"
-            id="org.eclipse.debug.ui.variablesView.popupMenu">
-      <!-- Variable Group -->
-         <action
-               label="%CopyVariablesToClipboardAction.label"
-               icon="$nl$/icons/full/elcl16/copy_edit_co.gif"
-               definitionId="org.eclipse.ui.edit.copy"
-               helpContextId="copy_variables_to_clipboard_action_context"
-               class="org.eclipse.debug.internal.ui.viewers.model.VirtualCopyToClipboardActionDelegate"
-               menubarPath="variableGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.copyVariablesToClipboard">
-         </action>
-         <action
-               label="%SelectAll.label"
-               helpContextId="select_all_variables_action_context"
-               definitionId="org.eclipse.ui.edit.selectAll"
-               class="org.eclipse.debug.internal.ui.actions.variables.SelectAllVariablesAction"
-               menubarPath="variableGroup"
-               id="org.eclipse.debug.ui.actions.SelectAllVariablesAction">
-         </action>
-      </viewerContribution>
-<!-- Contributions to Expression View Popup Menu -->
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.ExpressionView"
-            id="org.eclipse.debug.ui.expressionView.popupMenu">
-      <!-- Expression Group -->
-         <action
-               label="%RemoveAllAction.label"
-               icon="$nl$/icons/full/elcl16/rem_all_co.gif"
-               helpContextId="remove_all_expressions_action_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.RemoveAllExpressionsAction"
-               menubarPath="expressionGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.removeAllExpressionsAction">
-         </action>
-         <action
-               label="%RemoveAction.label"
-               icon="$nl$/icons/full/elcl16/rem_co.gif"
-               helpContextId="remove_expression_action_context"
-               class="org.eclipse.debug.internal.ui.actions.expressions.RemoveExpressionAction"
-               menubarPath="expressionGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.removeExpressionAction">
-            <selection
-                  class="org.eclipse.debug.core.model.IExpression">
-            </selection>
-            <selection
-                  class="org.eclipse.debug.core.model.IVariable">
-            </selection>
-         </action>
-         <action
-               label="%CopyExpressionsToClipboardAction.label"
-               icon="$nl$/icons/full/elcl16/copy_edit_co.gif"
-               definitionId="org.eclipse.ui.edit.copy"
-               helpContextId="copy_variables_to_clipboard_action_context"
-               class="org.eclipse.debug.internal.ui.viewers.model.VirtualCopyToClipboardActionDelegate"
-               menubarPath="expressionGroup"
-               id="org.eclipse.debug.ui.debugview.popupMenu.copyVariablesToClipboard">
-            <selection
-                  class="org.eclipse.debug.core.model.IDebugElement">
-            </selection>
-         </action>
-         <action
-               label="%SelectAll.label"
-               helpContextId="select_all_expressions_action_context"
-               definitionId="org.eclipse.ui.edit.selectAll"
-               class="org.eclipse.debug.internal.ui.actions.expressions.SelectAllExpressionsAction"
-               menubarPath="expressionGroup"
-               id="org.eclipse.debug.ui.actions.SelectAllExpressionsAction">
-         </action>
-      </viewerContribution>
-      <viewerContribution
-            targetID="org.eclipse.debug.ui.RegisterView"
-            id="org.eclipse.debug.ui.registersView.popupMenu">
-      <!-- Variable Group -->
-         <action
-               menubarPath="variableGroup"
-               class="org.eclipse.debug.internal.ui.viewers.model.VirtualCopyToClipboardActionDelegate"
-               definitionId="org.eclipse.ui.edit.copy"
-               icon="$nl$/icons/full/elcl16/copy_edit_co.gif"
-               label="%CopyRegistersToClipboardAction.label"
-               id="org.eclipse.debug.ui.debugview.popupMenu.copyVariablesToClipboard"
-               helpContextId="copy_to_clipboard_action_context">
-            <selection
-                  class="org.eclipse.debug.core.model.IDebugElement">
-            </selection>
-         </action>
-         <action
-               class="org.eclipse.debug.internal.ui.actions.variables.SelectAllVariablesAction"
-               label="%SelectAll.label"
-               menubarPath="variableGroup"
-               definitionId="org.eclipse.ui.edit.selectAll"
-               helpContextId="select_all_variables_action_context"
-               id="org.eclipse.debug.ui.actions.SelectAllVariablesAction">
-         </action>
-      </viewerContribution>
-   </extension>  
-   <extension
-         point="org.eclipse.ui.elementFactories">
-      <factory
-          class="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointFactory"
-          id="org.eclipse.debug.ui.elementFactory.breakpoints"/>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.statusHandlers">
-      <statusHandler
-            code="115"
-            plugin="org.eclipse.debug.core"
-            class="org.eclipse.debug.internal.ui.WorkingDirectoryStatusHandler"
-            id="org.eclipse.debug.ui.statusHandler.workingDirectory">
-      </statusHandler>
-      <statusHandler
-            code="200"
-            plugin="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.sourcelookup.Prompter"
-            id="org.eclipse.debug.ui.statusHandler.prompter">
-      </statusHandler>  
-      <statusHandler
-            code="205"
-            plugin="org.eclipse.debug.ui"
-            class="org.eclipse.debug.internal.ui.sourcelookup.ResolveDuplicatesHandler"
-            id="org.eclipse.debug.ui.statusHandler.selectSourceDialog">
-      </statusHandler>      
-      <statusHandler
-            plugin="org.eclipse.debug.core"
-            code="201"
-            class="org.eclipse.debug.internal.ui.launchConfigurations.DebugModePromptStatusHandler"
-            id="org.eclipse.debug.ui.statusHandler.debugModePromptStatusHandler">
-      </statusHandler>
-      <statusHandler
-            plugin="org.eclipse.debug.core"
-            code="202"
-            class="org.eclipse.debug.internal.ui.launchConfigurations.CompileErrorPromptStatusHandler"
-            id="org.eclipse.debug.ui.statusHandler.compileErrorPromptStatusHandler">
-      </statusHandler>
-      <statusHandler
-            code="203"
-            class="org.eclipse.debug.internal.ui.launchConfigurations.CompileErrorProjectPromptStatusHandler"
-            id="org.eclipse.debug.ui.statusHandler.compileErrorProjectPromptStatusHandler"
-            plugin="org.eclipse.debug.core"/>
-      <statusHandler
-            class="org.eclipse.debug.internal.ui.launchConfigurations.SaveScopeResourcesHandler"
-            code="222"
-            id="org.eclipse.debug.ui.statusHandler.saveScopedResources"
-            plugin="org.eclipse.debug.core"/>
-      <statusHandler
-            class="org.eclipse.debug.internal.ui.launchConfigurations.LaunchDelegateNotAvailableHandler"
-            code="226"
-            id="org.eclipse.debug.ui.statusHandler.launchDelegateNotAvailable"
-            plugin="org.eclipse.debug.core">
-      </statusHandler>
-      <statusHandler
-            class="org.eclipse.debug.internal.ui.launchConfigurations.DuplicateLaunchDelegatesStatusHandler"
-            code="227"
-            id="org.eclipse.debug.ui.statusHandler.duplicateLaunchDelegatesDetected"
-            plugin="org.eclipse.debug.core">
-      </statusHandler> 
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchGroups">
-      <launchGroup
-            label="%DebugLaunchGroup.label"
-            bannerImage="$nl$/icons/full/wizban/debug_wiz.png"
-            image="$nl$/icons/full/etool16/debug_exc.gif"
-            mode="debug"
-            id="org.eclipse.debug.ui.launchGroup.debug"
-            title="%DebugLaunchGroup.title">
-      </launchGroup>
-      <launchGroup
-            label="%RunLaunchGroup.label"
-            bannerImage="$nl$/icons/full/wizban/run_wiz.png"
-            image="$nl$/icons/full/etool16/run_exc.gif"
-            mode="run"
-            id="org.eclipse.debug.ui.launchGroup.run"
-            title="%RunLaunchGroup.title">
-      </launchGroup>
-      <launchGroup
-            label="%ProfileLaunchGroup.label"
-            bannerImage="$nl$/icons/full/wizban/profile_wiz.png"
-            image="$nl$/icons/full/etool16/profile_exc.gif"
-            mode="profile"
-            id="org.eclipse.debug.ui.launchGroup.profile"
-            title="%ProfileLaunchGroup.title">
-      </launchGroup>
-   </extension>
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            name="%processPropertyPageName"
-            class="org.eclipse.debug.internal.ui.preferences.ProcessPropertyPage"
-            id="org.eclipse.debug.ui.properties.process">
-         <enabledWhen>
-            <or>
-               <adapt
-                     type="org.eclipse.debug.core.model.IProcess">
-               </adapt>
-               <adapt
-                     type="org.eclipse.debug.core.model.IDebugElement"></adapt>
-            </or>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingPropertiesPage"
-            id="org.eclipse.debug.ui.properties.tablerendering"
-            name="%TableRenderingInfo.label">
-         <enabledWhen>
-            <or>
-               <adapt
-                     type="org.eclipse.debug.ui.memory.AbstractTableRendering">
-               </adapt>
-               <adapt
-                     type="org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering">
-               </adapt>
-            </or>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.debug.internal.ui.preferences.RunDebugPropertiesPage"
-            id="org.eclipse.debug.ui.properties.defaultLaunchConfigurations"
-            name="%DefaultLaunchConfigurationsPropPage.name"
-            >
-         <enabledWhen>
-            <and>
-               <adapt
-                     type="org.eclipse.core.resources.IResource">
-               </adapt>
-            </and>
-         </enabledWhen>
-      </page>
-   </extension>
-<!-- commands and their bindings
-NOTE: 
-M1 = CTRL/COMMAND 
-M2 = SHIFT 
-M3 = ALT 
-M4 = Platform-specific fourth key
--->
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="%runCategory.name"
-            description="%runCategory.description"
-            id="org.eclipse.debug.ui.category.run">
-      </category>
-      <command
-            name="%ActionDefinition.toggleStepFilters.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.toggleStepFilters.description"
-            id="org.eclipse.debug.ui.commands.ToggleStepFilters">
-      </command>
-      <command
-            name="%ActionDefinition.stepInto.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.stepInto.description"
-            id="org.eclipse.debug.ui.commands.StepInto">
-      </command>
-      <command
-            name="%ActionDefinition.stepOver.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.stepOver.description"
-            id="org.eclipse.debug.ui.commands.StepOver">
-      </command>
-      <command
-            name="%ActionDefinition.stepReturn.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.stepReturn.description"
-            id="org.eclipse.debug.ui.commands.StepReturn">
-      </command>
-      <command
-            name="%ActionDefinition.resume.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.resume.description"
-            id="org.eclipse.debug.ui.commands.Resume">
-      </command>
-      <command
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.terminate.description"
-            helpContextId="terminate_action_context"
-            id="org.eclipse.debug.ui.commands.Terminate"
-            name="%ActionDefinition.terminate.name">
-      </command>
-      <command
-            name="%ActionDefinition.terminateAndRelaunch.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.terminateAndRelaunch.description"
-            id="org.eclipse.debug.ui.commands.TerminateAndRelaunch">
-      </command>
-      <command
-            name="%ActionDefinition.suspend.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.suspend.description"
-            id="org.eclipse.debug.ui.commands.Suspend">
-      </command>
-      <command
-            name="%ActionDefinition.openProfile.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.openProfile.description"
-            id="org.eclipse.debug.ui.commands.OpenProfileConfigurations">
-      </command>
-      <command
-            name="%ActionDefinition.openRun.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.openRun.description"
-            id="org.eclipse.debug.ui.commands.OpenRunConfigurations">
-      </command>
-      <command
-            name="%ActionDefinition.openDebug.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.openDebug.description"
-            id="org.eclipse.debug.ui.commands.OpenDebugConfigurations">
-      </command>
-      <command
-            name="%ActionDefinition.debugLast.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.debugLast.description"
-            id="org.eclipse.debug.ui.commands.DebugLast">
-      </command>
-      <command
-            name="%ActionDefinition.runLast.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.runLast.description"
-            id="org.eclipse.debug.ui.commands.RunLast">
-      </command>
-      <command
-            name="%ActionDefinition.profileLast.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.profileLast.description"
-            id="org.eclipse.debug.ui.commands.ProfileLast">
-      </command>
-      <command
-            name="%ActionDefinition.runToLine.name"
-            description="%ActionDefinition.runToLine.description"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="org.eclipse.debug.ui.commands.RunToLine">
-      </command>  
-      <command
-            name="%ActionDefinition.toggleBreakpoint.name"
-            description="%ActionDefinition.toggleBreakpoint.description"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="org.eclipse.debug.ui.commands.ToggleBreakpoint">
-      </command>
-      <command
-            name="%ActionDefinition.skipAllBreakpoints.name"
-            description="%ActionDefinition.skipAllBreakpoints.description"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="org.eclipse.debug.ui.commands.SkipAllBreakpoints">
-      </command>
-      <command
-            name="%ActionDefinition.toggleWatchpoint.name"
-            description="%ActionDefinition.toggleWatchpoint.description"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="org.eclipse.debug.ui.commands.ToggleWatchpoint">
-      </command>
-      <command
-            name="%ActionDefinition.toggleMethodBreakpoint.name"
-            description="%ActionDefinition.toggleMethodBreakpoint.description"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="org.eclipse.debug.ui.commands.ToggleMethodBreakpoint">
-      </command>
-<!-- console -->      
-      <command
-            name="%ActionDefinition.eof.name"
-            categoryId="org.eclipse.debug.ui.category.run"
-            description="%ActionDefinition.eof.description"
-            id="org.eclipse.debug.ui.commands.eof">
-      </command>
-<!-- Memory View -->
- 	  <command
-       		categoryId="org.eclipse.debug.ui.category.run"
-      		description="%ActionDefinition.addMemoryBlock.description"
-     		id="org.eclipse.debug.ui.commands.addMemoryMonitor"
-     		name="%ActionDefinition.addMemoryBlock.name"/>           
-<!-- views -->
-      <command
-            name="%ViewCommand.debugView.name"
-            description="%ViewCommand.debugView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.debug.ui.DebugView">
-      </command>
-      <command
-            name="%ViewCommand.breakpointView.name"
-            description="%ViewCommand.breakpointView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.debug.ui.BreakpointView">
-      </command>
-      <command
-            name="%ViewCommand.variableView.name"
-            description="%ViewCommand.variableView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.debug.ui.VariableView">
-      </command>
-      <command
-            name="%ViewCommand.expressionView.name"
-            description="%ViewCommand.expressionView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.debug.ui.ExpressionView">
-      </command>
-      <command
-            name="%ViewCommand.registerView.name"
-            description="%ViewCommand.registerView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.debug.ui.RegisterView">
-      </command>
-      <command
-            name="%ViewCommand.memoryView.name"
-            description="%ViewCommand.memoryView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.debug.ui.MemoryView">
-      </command>
-<!-- Perspective -->      
-	<command
-      		name="%DebugPerspective.name"
-      		description="%command.openDebugPerspective.description"
-      		categoryId="org.eclipse.ui.category.perspectives"
-      		id="org.eclipse.debug.ui.DebugPerspective" />
-	<command
-       description="%ActionDefinition.removeAllBreakpoints.description"
-       categoryId="org.eclipse.debug.ui.category.run"
-       name="%ActionDefinition.removeAllBreakpoints.name"
-       id="org.eclipse.debug.ui.commands.RemoveAllBreakpoints"/>
- <command
-       categoryId="org.eclipse.debug.ui.category.run"
-       description="%toggleMemoryMonitorsPane.description"
-       id="org.eclipse.debug.ui.commands.toggleMemoryMonitorsPane"
-       name="%toggleMemoryMonitorsPane.label"/>
- <command
-       categoryId="org.eclipse.debug.ui.category.run"
-       description="%nextMemoryBlockCommand.description"
-       id="org.eclipse.debug.ui.commands.nextMemoryBlock"
-       name="%nextMemoryBlockCommand.label"/>
- <command
-       categoryId="org.eclipse.debug.ui.category.run"
-       description="%command.description.0"
-       id="org.eclipse.debug.ui.command.gotoaddress"
-       name="%command.name.0"/>
- <command
- 	   categoryId="org.eclipse.debug.ui.category.run"
-       id="org.eclipse.debug.ui.command.nextpage"
-       name="%command.name.1"
-       description = "%command.description.1">
- </command>
- <command
- 	   categoryId="org.eclipse.debug.ui.category.run"
-       id="org.eclipse.debug.ui.command.prevpage"
-       name="%command.name.2"
-       description = "%command.description.2">
- </command> 
-   </extension>
-   <extension point="org.eclipse.ui.bindings">
-     <key
-            sequence="M2+F5"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.commands.ToggleStepFilters"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            sequence="F5"
-            contextId="org.eclipse.debug.ui.debugging"
-            commandId="org.eclipse.debug.ui.commands.StepInto"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            sequence="F6"
-            contextId="org.eclipse.debug.ui.debugging"
-            commandId="org.eclipse.debug.ui.commands.StepOver"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            sequence="F7"
-            contextId="org.eclipse.debug.ui.debugging"
-            commandId="org.eclipse.debug.ui.commands.StepReturn"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-       <key
-            sequence="F8"
-            contextId="org.eclipse.debug.ui.debugging"
-            commandId="org.eclipse.debug.ui.commands.Resume"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-       <key
-            sequence="M1+F2"
-            contextId="org.eclipse.debug.ui.debugging"
-            commandId="org.eclipse.debug.ui.commands.Terminate"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>            
-       <key
-            sequence="F11"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.commands.DebugLast"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            sequence="M1+F11"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.commands.RunLast"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            platform="carbon"
-            sequence="F11"
-            contextId="org.eclipse.ui.globalScope"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <!-- This should not be necessary, since it is overwritten in the
-           next <key> declaration, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=185689 : -->
-      <key
-            platform="carbon"
-            sequence="M1+F11"
-            contextId="org.eclipse.ui.globalScope"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            platform="carbon"
-            sequence="M1+F11"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.commands.DebugLast"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            platform="carbon"
-            sequence="M1+M2+F11"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.commands.RunLast"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-       <key
-            sequence="M1+R"
-            contextId="org.eclipse.debug.ui.debugging"
-            commandId="org.eclipse.debug.ui.commands.RunToLine"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            sequence="M1+M2+B"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.commands.ToggleBreakpoint"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-       <key
-            commandId="org.eclipse.debug.ui.commands.eof"
-            contextId="org.eclipse.debug.ui.console"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+D"/>
-      <key
-            contextId="org.eclipse.debug.ui.console"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+D"
-            platform="win32"/>
-      <key
-            commandId="org.eclipse.debug.ui.commands.eof"
-            contextId="org.eclipse.debug.ui.console"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+Z"
-            platform="win32"/>
-       <key
-            sequence="M3+M2+Q B"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.BreakpointView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-       <key
-            sequence="M3+M2+Q V"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.debug.ui.VariableView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-       <key
-             commandId="org.eclipse.debug.ui.commands.addMemoryMonitor"
-             contextId="org.eclipse.debug.ui.memoryview"
-             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-             sequence="M1+M3+M"/>
-       <key
-             commandId="org.eclipse.debug.ui.commands.toggleMemoryMonitorsPane"
-             contextId="org.eclipse.debug.ui.memoryview"
-             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-             sequence="M1+T"/>
-       <key
-             commandId="org.eclipse.debug.ui.commands.nextMemoryBlock"
-             contextId="org.eclipse.debug.ui.memoryview"
-             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-             sequence="M1+M3+N"/>
-       <key
-             commandId="org.eclipse.debug.ui.command.gotoaddress"
-             contextId="org.eclipse.debug.ui.memory.abstractasynctablerendering"
-             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-             sequence="M1+G"/>     
-       <key
-             commandId="org.eclipse.debug.ui.command.nextpage"
-             contextId="org.eclipse.debug.ui.memory.abstractasynctablerendering"
-             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-             sequence="M1+M2+."/>    
-       <key
-             commandId="org.eclipse.debug.ui.command.prevpage"
-             contextId="org.eclipse.debug.ui.memory.abstractasynctablerendering"
-             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-             sequence="M1+M2+,"/>                                    
-  	</extension>
-   <extension
-         point="org.eclipse.ui.editors.annotationTypes">
-      <type
-         name="org.eclipse.debug.core.breakpoint"
-         markerType="org.eclipse.debug.core.breakpointMarker">
-      </type>
-      <type
-         name="org.eclipse.debug.ui.currentIP">
-      </type>
-      <type
-         name="org.eclipse.debug.ui.secondaryIP">
-      </type>
-   </extension>   
-   <extension
-         point="org.eclipse.ui.editors.markerAnnotationSpecification">
-      <specification
-            colorPreferenceValue="0,0,255"
-            annotationType="org.eclipse.debug.core.breakpoint"
-            colorPreferenceKey="breakpointIndicationColor"
-            overviewRulerPreferenceValue="false"
-            presentationLayer="3"
-            label="%BreakpointMarkerPreference.label"
-            textPreferenceValue="false"
-            textPreferenceKey="breakpointIndication"
-            verticalRulerPreferenceKey="breakpointVerticalRuler"
-            verticalRulerPreferenceValue="true"
-            overviewRulerPreferenceKey="breakpointIndicationInOverviewRuler"
-            icon="$nl$/icons/full/obj16/brkp_obj.gif"
-            annotationImageProvider="org.eclipse.debug.internal.ui.BreakpointImageProvider">
-      </specification>
-      <specification
-            annotationImageProvider="org.eclipse.debug.internal.ui.InstructionPointerImageProvider"
-            annotationType="org.eclipse.debug.ui.currentIP"
-            colorPreferenceKey="currentIPColor"
-            colorPreferenceValue="198,219,174"
-            highlightPreferenceKey="currentIPHighlight"
-            highlightPreferenceValue="true"
-            label="%debugCurrentInstructionPointer"
-            overviewRulerPreferenceKey="currentIPOverviewRuler"
-            overviewRulerPreferenceValue="true"
-            presentationLayer="6"
-            textPreferenceKey="currentIPIndication"
-            textPreferenceValue="false"
-            verticalRulerPreferenceKey="currentIPVerticalRuler"
-            verticalRulerPreferenceValue="true">
-      </specification>
-      <specification
-            annotationImageProvider="org.eclipse.debug.internal.ui.InstructionPointerImageProvider"
-            annotationType="org.eclipse.debug.ui.secondaryIP"
-            colorPreferenceKey="secondaryIPColor"
-            colorPreferenceValue="219,235,204"
-            highlightPreferenceKey="secondaryIPHighlight"
-            highlightPreferenceValue="true"
-            label="%debugCallStack"
-            overviewRulerPreferenceKey="secondaryIPOverviewRuler"
-            overviewRulerPreferenceValue="true"
-            presentationLayer="6"
-            textPreferenceKey="secondaryIPIndication"
-            textPreferenceValue="false"
-            verticalRulerPreferenceKey="secondaryIPVerticalRuler"
-            verticalRulerPreferenceValue="true">
-      </specification>
-   </extension>
-<!-- Dynamic (String Substitution) Variables -->
-   <extension
-         point="org.eclipse.core.variables.dynamicVariables">
-      <variable
-            name="workspace_loc"
-            description="%workspace_loc.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.WorkspaceResolver">
-      </variable>
-      <variable
-            name="project_loc"
-            description="%project_loc.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ProjectResolver">
-      </variable>
-      <variable
-            name="project_path"
-            description="%project_path.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ProjectResolver">
-      </variable>
-      <variable
-            name="project_name"
-            description="%project_name.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ProjectResolver">
-      </variable>
-      <variable
-            name="resource_loc"
-            description="%resource_loc.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ResourceResolver">
-      </variable>
-      <variable
-            name="resource_path"
-            description="%resource_path.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ResourceResolver">
-      </variable>
-      <variable
-            name="resource_name"
-            description="%resource_name.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ResourceResolver">
-      </variable>
-      <variable
-            name="container_loc"
-            description="%container_loc.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ContainerResolver">
-      </variable>
-      <variable
-            name="container_path"
-            description="%container_path.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ContainerResolver">
-      </variable>
-      <variable
-            name="container_name"
-            description="%container_name.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.ContainerResolver">
-      </variable>
-      <variable
-            name="string_prompt"
-            description="%string_prompt.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.StringPrompt">
-      </variable>
-      <variable
-            name="file_prompt"
-            description="%file_prompt.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.FilePrompt">
-      </variable>
-      <variable
-            name="folder_prompt"
-            description="%folder_prompt.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.FolderPrompt">
-      </variable>
-      <variable
-            name="selected_text"
-            description="%selected_text.description"
-            resolver="org.eclipse.debug.internal.ui.stringsubstitution.SelectedTextResolver">
-      </variable>
-   </extension>
-<!-- String Variable Presentations -->
-   <extension
-         point="org.eclipse.debug.ui.stringVariablePresentations">
-      <variablePresentation
-            argumentSelector="org.eclipse.debug.internal.ui.stringsubstitution.ResourceSelector"
-            variableName="resource_path">
-      </variablePresentation>
-      <variablePresentation
-            argumentSelector="org.eclipse.debug.internal.ui.stringsubstitution.ResourceSelector"
-            variableName="resource_loc">
-      </variablePresentation>
-      <variablePresentation
-            argumentSelector="org.eclipse.debug.internal.ui.stringsubstitution.ResourceSelector"
-            variableName="resource_name">
-      </variablePresentation>
-      <variablePresentation
-            argumentSelector="org.eclipse.debug.internal.ui.stringsubstitution.SystemPropertyArgumentSelector"
-            variableName="system_property"/>
-   </extension>
-<!-- Launch Config Comparators -->
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationComparators">
-      <launchConfigurationComparator
-            attribute="org.eclipse.debug.core.ATTR_REFRESH_SCOPE"
-            class="org.eclipse.debug.internal.ui.launchConfigurations.WorkingSetComparator"
-            id="org.eclipse.debug.ui.workingSetComparator">
-      </launchConfigurationComparator>
-   </extension>
-   
-<!-- Editor -->
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="%sourceNotFoundEditorName"
-            icon="$nl$/icons/full/obj16/stckframe_obj.gif"
-            class="org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor"
-            id="org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor">
-      </editor>
-      <editor
-            name="%NoSourceFoundEditor.name"
-            icon="$nl$/icons/full/obj16/stckframe_obj.gif"
-            class="org.eclipse.debug.internal.ui.views.launch.SourceNotFoundEditor"
-            contributorClass="org.eclipse.ui.part.EditorActionBarContributor"
-            id="org.eclipse.debug.ui.NoSourceFoundEditor">
-      </editor>
-   </extension>
-<!-- ==================================================================== -->
-<!--  Implementation of the Working set source container type			 -->
-<!-- ==================================================================== -->
-   <extension
-         point="org.eclipse.debug.core.sourceContainerTypes">     
-      <sourceContainerType
-            name="%containerName.workingSet"
-            class="org.eclipse.debug.internal.ui.sourcelookup.WorkingSetSourceContainerType"
-            id="org.eclipse.debug.ui.containerType.workingSet">
-      </sourceContainerType>    
-   </extension>
-<!-- ==================================================================== -->
-<!--  Implementations of the 7 provided source containers presentation support-->
-<!-- ==================================================================== -->
-   <extension
-         point="org.eclipse.debug.ui.sourceContainerPresentations">
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.ProjectSourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.core.containerType.project"
-            icon="$nl$/icons/full/obj16/prj_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.project">
-      </sourceContainerPresentation>
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.WorkingSetSourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.ui.containerType.workingSet"
-            icon="$nl$/icons/full/obj16/workset.gif"
-            id="org.eclipse.debug.ui.containerPresentation.workingSet">
-      </sourceContainerPresentation>           
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.DirectorySourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.core.containerType.directory"
-            icon="$nl$/icons/full/obj16/fldr_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.directory">
-      </sourceContainerPresentation>
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.FolderSourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.core.containerType.folder"
-            icon="$nl$/icons/full/obj16/fldr_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.folder">
-      </sourceContainerPresentation>
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.WorkspaceSourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.core.containerType.workspace"
-            icon="$nl$/icons/full/obj16/prj_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.workspace">
-      </sourceContainerPresentation>
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.ArchiveSourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.core.containerType.archive"
-            icon="$nl$/icons/full/obj16/jar_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.archive">
-      </sourceContainerPresentation>  
-      <sourceContainerPresentation
-            browserClass="org.eclipse.debug.internal.ui.sourcelookup.browsers.ExternalArchiveSourceContainerBrowser"
-            containerTypeID="org.eclipse.debug.core.containerType.externalArchive"
-            icon="$nl$/icons/full/obj16/jar_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.externalArchive">
-      </sourceContainerPresentation>      
-      <sourceContainerPresentation           
-            containerTypeID="org.eclipse.debug.core.containerType.default"
-            icon="$nl$/icons/full/obj16/prj_obj.gif"
-            id="org.eclipse.debug.ui.containerPresentation.default">
-      </sourceContainerPresentation>
-   </extension>
-<!-- ========================================= -->
-<!-- Adapter factories for source lookup       -->
-<!-- ========================================= -->
-	<extension point="org.eclipse.core.runtime.adapters">
-         <factory 
-            class="org.eclipse.debug.internal.ui.sourcelookup.SourceElementAdapterFactory"
-            adaptableType="org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>
-         <factory 
-            class="org.eclipse.debug.internal.ui.sourcelookup.SourceElementAdapterFactory"
-            adaptableType="org.eclipse.debug.core.sourcelookup.containers.ZipEntryStorage">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>         
-         <factory 
-            class="org.eclipse.debug.internal.ui.sourcelookup.SourceContainerAdapterFactory"
-            adaptableType="org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>         
-         <factory 
-            class="org.eclipse.debug.internal.ui.sourcelookup.SourceContainerAdapterFactory"
-            adaptableType="org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>          
-         <factory 
-            class="org.eclipse.debug.internal.ui.sourcelookup.SourceContainerAdapterFactory"
-            adaptableType="org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>
-         <factory
-            class="org.eclipse.debug.internal.ui.sourcelookup.SourceContainerAdapterFactory"
-            adaptableType="org.eclipse.debug.core.sourcelookup.containers.ArchiveSourceContainer">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>
-         <factory 
-            class="" 
-            adaptableType="org.eclipse.ui.part.FileEditorInput">
-            <adapter type="org.eclipse.debug.ui.actions.ILaunchable"/>
-         </factory>
-         <factory 
-            class="org.eclipse.debug.internal.ui.DebugUIAdapterFactory"
-            adaptableType="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter2"/>
-         </factory>
-         <factory 
-            class="org.eclipse.debug.internal.ui.DebugUIAdapterFactory"
-            adaptableType="org.eclipse.debug.ui.BreakpointTypeCategory">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-         </factory>
-         <factory
-               class="org.eclipse.debug.internal.ui.DebugUIAdapterFactory"
-               adaptableType="org.eclipse.debug.core.model.IBreakpoint">
-            <adapter type="org.eclipse.ui.IPersistableElement"/>
-         </factory>
-         <factory
-               class="org.eclipse.debug.internal.ui.DebugUIAdapterFactory"
-               adaptableType="org.eclipse.debug.internal.ui.views.breakpoints.WorkingSetCategory">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter2"/>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IMemoryBlockRetrieval"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.ILaunchManager"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.ILaunch"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IDebugTarget"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IProcess"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IThread"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IStackFrame"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.ui.sourcelookup.ISourceDisplay">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IRegisterGroup"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IVariable"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IExpression"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.IExpressionManager"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IDebugElement"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousLabelAdapter">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.internal.ui.views.memory.renderings.MemorySegment"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousLabelAdapter">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.model.IMemoryBlock"
-               class="org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousLabelAdapter">
-            </adapter>
-            <adapter
-                  type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory">
-            </adapter>
-         </factory>
-         <factory
-               adaptableType="org.eclipse.debug.core.ILaunch"
-               class="org.eclipse.debug.internal.ui.contexts.SuspendTriggerAdapterFactory">
-            <adapter
-                  type="org.eclipse.debug.ui.contexts.ISuspendTrigger">
-            </adapter>
-         </factory>
-    </extension>
-<!-- ========================================= -->
-<!-- Contextual Launch                         -->
-<!-- ========================================= -->
-   <extension point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-      		namespace="org.eclipse.debug.ui"
-            properties="matchesPattern, projectNature, matchesContentType"
-            type="org.eclipse.core.runtime.IAdaptable"
-            class="org.eclipse.debug.internal.ui.ResourceExtender"
-            id="org.eclipse.debug.ui.IResourceExtender">
-      </propertyTester>
-	  <propertyTester
-			namespace="org.eclipse.debug.ui"
-			properties="launchable, contextlaunch"
-			type="java.lang.Object"
-			class="org.eclipse.debug.internal.ui.actions.LaunchablePropertyTester"
-			id="org.eclipse.debug.ui.propertyTesters.launchable">		
-	  </propertyTester>      
-      <propertyTester
-            namespace="org.eclipse.debug.ui"
-            type="org.eclipse.ui.console.IConsole"
-            class="org.eclipse.debug.internal.ui.views.console.ProcessTypePropertyTester"
-            properties="processTypeTest"
-            id="org.eclipse.jdt.debug.ui.JavaConsolePropertyTester"/>
-      <propertyTester
-            class="org.eclipse.debug.internal.ui.DebugModelPropertyTester"
-            id="org.eclipse.debug.ui.debugElementProperties"
-            namespace="org.eclipse.debug.ui"
-            properties="getModelIdentifier,isTerminatedOrDisconnected"
-            type="org.eclipse.core.runtime.IAdaptable">
-      </propertyTester>
-   </extension>
-<!-- Context extensions -->
-  <extension
-        point="org.eclipse.ui.contexts">
-     <context
-           name="%Context.debugging.name"
-           description="%Context.debugging.description"
-           id="org.eclipse.debug.ui.debugging"
-           parentId="org.eclipse.ui.contexts.window">
-     </context>
-     <context
-           name="%Context.console.name"
-           description="%Context.console.description"
-           id="org.eclipse.debug.ui.console"
-           parentId="org.eclipse.ui.contexts.window">
-     </context>  
-     <context
-           name="%Context.memoryview.name"
-           description="%Context.memoryview.description"
-           id="org.eclipse.debug.ui.memoryview"
-           parentId="org.eclipse.ui.contexts.window">
-     </context>
-     <context
-           description="%context.description.0"
-           id="org.eclipse.debug.ui.memory.abstractasynctablerendering"
-           name="%context.name.0"
-           parentId="org.eclipse.debug.ui.debugging"/>      
-  </extension>
-  <extension
-        point="org.eclipse.debug.ui.contextViewBindings">
-     <contextViewBinding
-            viewId="org.eclipse.debug.ui.VariableView"
-            contextId="org.eclipse.debug.ui.debugging">
-     </contextViewBinding>
-     <contextViewBinding
-            viewId="org.eclipse.debug.ui.DebugView"
-            contextId="org.eclipse.debug.ui.debugging">
-     </contextViewBinding>
-     <contextViewBinding
-            viewId="org.eclipse.debug.ui.ExpressionView"
-            contextId="org.eclipse.debug.ui.debugging"
-            autoOpen="false">
-     </contextViewBinding>
-     <contextViewBinding
-           viewId="org.eclipse.debug.ui.BreakpointView"
-           contextId="org.eclipse.debug.ui.debugging">
-     </contextViewBinding>
-     <contextViewBinding
-           autoOpen="false"
-           contextId="org.eclipse.debug.ui.debugging"
-           viewId="org.eclipse.ui.console.ConsoleView"/>
-  </extension>
-  
-   <extension
-         point="org.eclipse.ui.themes">
-		<themeElementCategory label="%debugPresentation.label" id="org.eclipse.debug.ui.presentation"/>
-      <fontDefinition
-            label="%DetailPaneFontDefinition.label"
-            defaultsTo="org.eclipse.jface.textfont"
-            categoryId= "org.eclipse.debug.ui.presentation"
-            id="org.eclipse.debug.ui.DetailPaneFont">
-         <description>
-            %DetailPaneFontDefinition.description
-         </description>         
-      </fontDefinition>
-      <fontDefinition
-            label="%MemoryViewTableFontDefinition.label"
-            defaultsTo="org.eclipse.jface.textfont"
-            categoryId= "org.eclipse.debug.ui.presentation"
-            id="org.eclipse.debug.ui.MemoryViewTableFont">
-         <description>
-            %MemoryViewTableFontDefinition.description
-         </description>
-      </fontDefinition>
-      <fontDefinition
-            defaultsTo="org.eclipse.jface.textfont"
-            label="%ConsoleFont.label"
-            categoryId="org.eclipse.debug.ui.presentation"
-            id="org.eclipse.debug.ui.consoleFont">
-          <description>
-	            %ConsoleFont.description
-          </description>
-		</fontDefinition>
-      <fontDefinition
-            categoryId="org.eclipse.debug.ui.presentation"
-            id="org.eclipse.debug.ui.VariableTextFont"
-            label="%VariableTextFontDefinition.label">
-         <description>
-            %VariableTextFontDefinition.description
-         </description>
-      </fontDefinition>
-   </extension>
-   <extension
-         point="org.eclipse.ui.console.consolePageParticipants">
-      <consolePageParticipant
-            class="org.eclipse.debug.internal.ui.views.console.ProcessConsolePageParticipant"
-            id="org.eclipse.debug.ui.processConsolePageParticipant">
-         <enablement>
-            <instanceof value="org.eclipse.debug.internal.ui.views.console.ProcessConsole"/>
-         </enablement>
-      </consolePageParticipant>
-   </extension>
-   
-    <extension point="org.eclipse.core.runtime.preferences">
-		<initializer class="org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer"/>
-	</extension>
-    <extension
-          point="org.eclipse.debug.ui.breakpointOrganizers">
-          <breakpointOrganizer
-                othersLabel="%Project.others"
-                label="%Project.label"
-                icon="$nl$/icons/full/obj16/prj_obj.gif"
-                class="org.eclipse.debug.internal.ui.views.breakpoints.ProjectBreakpointOrganizer"
-                id="org.eclipse.debug.ui.breakpointProjectOrganizer"/>
-          <breakpointOrganizer
-                othersLabel="%File.others"
-                label="%File.label"
-                icon="$nl$/icons/full/obj16/file_obj.gif"
-                class="org.eclipse.debug.internal.ui.views.breakpoints.FileBreakpointOrganizer"
-                id="org.eclipse.debug.ui.breakpointFileOrganizer"/>
-		  <breakpointOrganizer
-          othersLabel="%WorkingSet.others"
-          label="%WorkingSet.label"
-          class="org.eclipse.debug.internal.ui.views.breakpoints.WorkingSetBreakpointOrganizer"
-          icon="$nl$/icons/full/obj16/fldr_obj.gif"
-          id="org.eclipse.debug.ui.workingSetOrganizer"/>          	
-          <breakpointOrganizer
-                othersLabel="%BreakpointType.others"
-                label="%BreakpointType.label"
-                icon="$nl$/icons/full/obj16/brkp_type.gif"
-                class="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointTypeOrganizer"
-                id="org.eclipse.debug.ui.breakpointTypeOrganizer"/>
-          <breakpointOrganizer
-                othersLabel="%BreakpointWorkingSet.others"
-                label="%BreakpointWorkingSet.label"
-                class="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointSetOrganizer"
-                icon="$nl$/icons/full/obj16/brkp_grp.gif"
-                id="org.eclipse.debug.ui.breakpointWorkingSetOrganizer"/>
-    </extension>    
-   <extension
-          point="org.eclipse.debug.ui.memoryRenderings">
-       <renderingType
-             class="org.eclipse.debug.internal.ui.views.memory.renderings.HexRenderingTypeDelegate"
-             name="%RawHex"
-             id="org.eclipse.debug.ui.rendering.raw_memory"/>
-       <renderingType
-             class="org.eclipse.debug.internal.ui.views.memory.renderings.ASCIIRenderingTypeDelegate"
-             name="%ASCIIName"
-             id="org.eclipse.debug.ui.rendering.ascii"/>
-       <renderingType
-             class="org.eclipse.debug.internal.ui.views.memory.renderings.SignedIntegerRenderingTypeDelegate"
-             name="%SignedIntegerName"
-             id="org.eclipse.debug.ui.rendering.signedint"/>
-       <renderingType
-             class="org.eclipse.debug.internal.ui.views.memory.renderings.UnsignedIntegerRenderingTypeDelegate"
-             name="%UnsignedIntegerName"
-             id="org.eclipse.debug.ui.rendering.unsignedint"/>
-       <renderingType
-             class="org.eclipse.debug.internal.ui.views.memory.renderings.HexIntegerRenderingDelegate"
-             id="org.eclipse.debug.ui.rendering.hexint"
-             name="%HexIntegerName">
-       </renderingType>
-    </extension>
-    <extension
-          point="org.eclipse.ui.workingSets">
-       <workingSet
-             elementAdapterClass="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointWorkingSetElementAdapter"
-             icon="$nl$/icons/full/obj16/brkp_grp.gif"
-             id="org.eclipse.debug.ui.breakpointWorkingSet"
-             name="%BreakpointWorkingSet.name"
-             pageClass="org.eclipse.debug.internal.ui.views.breakpoints.BreakpointWorkingSetPage"/>
-    </extension>
-    <extension
-          point="org.eclipse.ui.keywords">
-       <keyword
-             id="org.eclipse.debug.ui.general"
-             label="%preferenceKeywords.general"/>
-       <keyword
-             id="org.eclipse.debug.ui.console"
-             label="%preferenceKeywords.console"/>
-       <keyword
-             id="org.eclipse.debug.ui.launching"
-             label="%preferenceKeywords.launching"/>
-       <keyword
-             id="org.eclipse.debug.ui.stringSubstitution"
-             label="%preferenceKeywords.stringSubstitution"/>
-       <keyword
-             id="org.eclipse.debug.ui.viewManagement"
-             label="%preferenceKeywords.viewManagement"/>
-       <keyword
-             id="org.eclipse.debug.ui.perspectivesPref"
-             label="%preferenceKeywords.perspective"/>
-       <keyword
-             id="org.eclipse.debug.ui.launchconfigurations"
-             label="%preferenceKeywords.launchConfigurations"/>
-       <keyword
-             id="org.eclipse.debug.ui.launchDelegatesKeywords"
-             label="%preferenceKeywords.launchDelegates">
-       </keyword>
-       <keyword
-             id="org.eclipse.debug.ui.contextLaunching"
-             label="%preferenceKeywords.contextLaunching">
-       </keyword>
-    </extension>
-    <extension
-          point="org.eclipse.ui.importWizards">
-       <wizard
-             category="org.eclipse.ui.Basic"
-             class="org.eclipse.debug.internal.ui.importexport.breakpoints.WizardImportBreakpoints"
-             icon="$nl$/icons/full/elcl16/import_brkpts.gif"
-             id="org.eclipse.debug.internal.ui.importexport.breakpoints.WizardImportBreakpoints"
-             name="%exportBreakpoints.name">
-          <description>
-          		%importBreakpoints.description
-          </description>
-          <selection class="org.eclipse.core.resources.IResource"/>
-       </wizard>
-    </extension>
-    <extension
-          point="org.eclipse.ui.exportWizards">
-       <wizard
-             category="org.eclipse.ui.Basic"
-             class="org.eclipse.debug.internal.ui.importexport.breakpoints.WizardExportBreakpoints"
-             icon="icons/full/elcl16/export_brkpts.gif"
-             id="org.eclipse.debug.internal.ui.importexport.breakpoints.WizardExportBreakpoints"
-             name="%exportBreakpoints.name">
-          <description>
-          	%exportBreakpoints.description
-          </description>
-          <selection class="org.eclipse.core.resources.IResource"/>
-       </wizard>
-    </extension>
-    <extension
-          point="org.eclipse.debug.ui.detailPaneFactories">
-       <detailFactories
-             class="org.eclipse.debug.internal.ui.views.variables.details.DefaultDetailPaneFactory"
-             id="org.eclipse.debug.ui.defaultDetailPaneFactory">
-       </detailFactories>
-    </extension>
-
-</plugin>
diff --git a/org.eclipse.debug.ui/schema/breakpointOrganizers.exsd b/org.eclipse.debug.ui/schema/breakpointOrganizers.exsd
deleted file mode 100644
index f803277..0000000
--- a/org.eclipse.debug.ui/schema/breakpointOrganizers.exsd
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="breakpointOrganizers" name="Breakpoint Organizers"/>
-      </appInfo>
-      <documentation>
-         Breakpoint organizers categorize breakpoints based on some specific criteria. For example, a breakpoint organizer is provided to categorize breakpoints by project.
-
-Organizers with the specified name will be automatically created by the Debug Platform and presented to the user as options for grouping breakpoints. The supplied class, which must implement org.eclipse.debug.ui.IBreakpointOrganizerDelegate, will be loaded only as necessary, to avoid early plugin activation.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="breakpointOrganizer" 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>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="breakpointOrganizer">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Unique identifier for this breakpoint organizer.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Implementation of &lt;code&gt;org.eclipse.debug.ui.IBreakpointOrganizerDelegate&lt;/code&gt; that performs categorization. Since 3.3, the class may optionally implement &lt;code&gt;org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Label for this organizer which is suitable for presentation to the user.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  Optional path to an icon which can be shown for this organizer.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="othersLabel" type="string">
-            <annotation>
-               <documentation>
-                  Optional label for this organizer which is suitable for presentation to the user to describe breakpoints that do not fall into a category supplied by this organizer. For example, if an organizer categorizes breakpoints by working sets, but a breakpoint does not belong to a working set, this label will be used. When unspecified, &quot;Others&quot; is used.
-               </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>
-         Following is an example of a breakpoint organizer extension.
-&lt;pre&gt;
-&lt;extension
-    point=&quot;org.eclipse.debug.ui.breakpointOrganizers&quot;&gt;
-    &lt;breakpointOrganizer
-    class=&quot;com.example.BreakpointOrganizer&quot;
-     id=&quot;com.example.BreakpointOrganizer&quot;
-     label=&quot;Example Organizer&quot;
-     icon=&quot;icons/full/obj16/example_org.gif&quot;/&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, the supplied factory will be included in the list of options for grouping breakpoints (&quot;Group By &gt; Example Organizer&quot;). When selected, the associated organizer will be used to categorize breakpoints.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.ui.IBreakpointOrganizerDelegate&lt;/b&gt;. Since 3.3 the class may optionally implement &lt;b&gt;org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The Debug Platform provides breakpoint organizers for projects, files, breakpoint types, and working sets.
-      </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/org.eclipse.debug.ui/schema/consoleColorProviders.exsd b/org.eclipse.debug.ui/schema/consoleColorProviders.exsd
deleted file mode 100644
index e7be4e7..0000000
--- a/org.eclipse.debug.ui/schema/consoleColorProviders.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="consoleColorProviders" name="Console Color Providers"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing a console document coloring scheme for a process. The color provider will be used to color output in the console.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="consoleColorProvider" 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="consoleColorProvider">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this console color provider.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully qualified name of a Java class that implements &lt;code&gt;IConsoleColorProvider&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.console.IConsoleColorProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="processType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the type of process this color provider is for. This attribute corresponds to the process attribute &lt;code&gt;IProcess.ATTR_PROCESS_TYPE&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a console color provider extension point: 
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.ui.consoleColorProviders&quot;&gt;
-  &lt;consoleColorProvider 
-     id=&quot;com.example.ExampleConsoleColorProvider&quot;
-     class=&quot;com.example.ExampleConsoleColorProvider&quot;
-     processType=&quot;ExampleProcessType&quot;&gt;
-  &lt;/consoleColorProvider&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, the contributed color provider will be used for processes of type &quot;ExampleProcessType&quot;, which corresponds to the process attribute IProcess.ATTR_PROCESS_TYPE. Process types are client defined, and are set by clients that create processes.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.ui.console.IConsoleColorProvider&lt;/b&gt;.
-      </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/org.eclipse.debug.ui/schema/consoleLineTrackers.exsd b/org.eclipse.debug.ui/schema/consoleLineTrackers.exsd
deleted file mode 100644
index 7b9d2eb..0000000
--- a/org.eclipse.debug.ui/schema/consoleLineTrackers.exsd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="consoleLineTrackers" name="Console Line Trackers"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism to listen to console output for a type of process.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="consoleLineTracker" 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="consoleLineTracker">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this console line tracker.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully qualified name of a Java class that implements &lt;code&gt;IConsoleLineTracker&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.console.IConsoleLineTracker"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="processType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the type of process this line tracker is for. This attribute corresponds to the process attribute &lt;code&gt;IProcess.ATTR_PROCESS_TYPE&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a console line tracker extension point: 
-
- &lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.ui.consoleLineTrackers&quot;&gt;
-  &lt;consoleLineTracker 
-     id=&quot;com.example.ExampleConsoleLineTracker&quot;
-     class=&quot;com.example.ExampleConsoleLineTracker&quot;
-     processType=&quot;ExampleProcessType&quot;&gt;
-  &lt;/consoleLineTracker&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, the contributed line tracker will be notified as lines are appended to the console for processes of type &quot;ExampleProcessType&quot;, which corresponds to the process attribute IProcess.ATTR_PROCESS_TYPE. Process types are client defined, and are set by clients that create processes.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.ui.console.IConsoleLineTracker&lt;/b&gt;.
-      </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/org.eclipse.debug.ui/schema/contextViewBindings.exsd b/org.eclipse.debug.ui/schema/contextViewBindings.exsd
deleted file mode 100644
index 0d8211f..0000000
--- a/org.eclipse.debug.ui/schema/contextViewBindings.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="contextViewBindings" name="Context View Bindings"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for associating a view with a context identifier. When a context is activated by the Debug view, views associated with it (and also views associated with any parent contexts) are opened, closed, or activated. Contributors have the option to override the automatic open and close behavior.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="contextViewBinding" 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="contextViewBinding">
-      <complexType>
-         <attribute name="contextId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Specifies the context identifier that this binding is for.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="viewId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Specifies the identifier of the view which should be associated with the specified context. When the specified context is enabled, this view will be automatically brought to the front. When elements are selected in the Debug view, contexts associated with those elements (as specified by extensions of the debugModelContextBindings extension point) are automatically enabled.
-Note that this only occurs in perspectives for which the user has requested &quot;automatic view management&quot; via the preferences (by default, only in the Debug perspective).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="autoOpen" type="boolean">
-            <annotation>
-               <documentation>
-                  Specifies whether the view should be automatically opened when the given context is enabled. If unspecified, the value of this attribute is &lt;code&gt;true&lt;/code&gt;. If this attribute is specified &lt;code&gt;false&lt;/code&gt;, the view will not be automatically opened, but it will still be brought to the front if it is open when the given context is enabled. Clients are intended to specify &lt;code&gt;false&lt;/code&gt; to avoid cluttering the perspective with views that are used infrequently.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="autoClose" type="boolean">
-            <annotation>
-               <documentation>
-                  Clients are not intended to specify this attribute except in rare cases.
-Specifies whether the view should be automatically closed when the given context is disabled (this occurs when all debug targets that contained the specified context have terminated). When unspecified, the value of this attribute is &lt;code&gt;true&lt;/code&gt;. This attribute should only be specified &lt;code&gt;false&lt;/code&gt; in the unlikely case that a debugging view must remain open even when the user is not debugging.
-               </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 a context view binding contribution:
-&lt;pre&gt;
-&lt;extension
-      point=&quot;org.eclipse.debug.ui.contextViewBindings&quot;&gt;
-   &lt;contextViewBinding
-         contextId=&quot;com.example.mydebugger.debugging&quot;
-         viewId=&quot;com.example.view&quot;
-         autoOpen=&quot;true&quot;
-         autoClose=&quot;false&quot;&gt;
-   &lt;/contextViewBinding&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, when a context with the specified identifier is activated by the Debug view, the given view will be automatically opened. When a context which is bound to a different debug model is activated that isn&apos;t associated with the view, the view will not be automatically closed.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-Copyright (c) 2003, 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/org.eclipse.debug.ui/schema/debugModelContextBindings.exsd b/org.eclipse.debug.ui/schema/debugModelContextBindings.exsd
deleted file mode 100644
index 287cbdf..0000000
--- a/org.eclipse.debug.ui/schema/debugModelContextBindings.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="debugModelContextBindings" name="Debug Model Context Bindings"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for specifying a context that should be associated with the given debug model.
-
-The Debug view uses these bindings to automatically enable contexts. When an element in the Debug view which provides an &lt;code&gt;IDebugModelProvider&lt;/code&gt; adapter or a stack frame with the specified debug model identifier is selected, the context with the given identifier will be enabled.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="modelContextBinding" 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="modelContextBinding">
-      <complexType>
-         <attribute name="debugModelId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the debug model identifier this binding is for
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="contextId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the context identifier of the context that should be associated with the given debug model
-               </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 a debug model context binding contribution:
-&lt;pre&gt;
-&lt;extension
-      point=&quot;org.eclipse.debug.ui.debugModelContextBindings&quot;&gt;
-   &lt;modelContextBinding
-         contextId=&quot;com.example.myLanguage.debugging&quot;
-         debugModelId=&quot;com.example.myLanguageDebugModel&quot;&gt;
-   &lt;/modelContextBinding&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, when a stack frame with the debug model identifier of &quot;com.example.myLanguageDebugModel&quot; is selected, the context with the identifier &quot;com.example.myLanguage.debugging&quot; will be enabled.
-      </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/org.eclipse.debug.ui/schema/debugModelPresentations.exsd b/org.eclipse.debug.ui/schema/debugModelPresentations.exsd
deleted file mode 100644
index d6dd5fe..0000000
--- a/org.eclipse.debug.ui/schema/debugModelPresentations.exsd
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="debugModelPresentations" name="Debug Model Presentation"/>
-      </appInfo>
-      <documentation>
-         This extension point allows tools to handle the 
-presentation aspects of a debug model. 
-A debug model presentation is responsible for 
-providing labels, images, and editors for elements 
-in a specific debug model.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="debugModelPresentation" 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="debugModelPresentation">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualifed name of a Java class that implements the 
-&lt;code&gt;org.eclipse.debug.ui.IDebugModelPresentation&lt;/code&gt;
-interface. Since 3.1, debug model presentations may optionally implement &lt;code&gt;IColorProvider&lt;/code&gt; and &lt;code&gt;IFontProvider&lt;/code&gt; to override default fonts and colors for debug elements.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.IDebugModelPresentation"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the identifier of the debug model this presentation is responsible for
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="detailsViewerConfiguration" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified name of the Java class that is an instance of &lt;code&gt;org.eclipse.jface.text.source.SourceViewerConfiguration&lt;/code&gt;. When specified, the source viewer configuration will be used in the &quot;details&quot; area of the variables and expressions view when displaying the details of an element from the debug model associated with this debug model presentation. When unspecified, a default configuration is used.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a debug model presentations extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point = &quot;org.eclipse.debug.ui.debugModelPresentations&quot;&gt; 
-       &lt;debugModelPresentation 
-           class = &quot;com.example.JavaModelPresentation&quot;
-           id = &quot;com.example.JavaDebugModel&quot;&gt;
-       &lt;/debugModelPresentation&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-In the example above, the class 
-&lt;samp&gt;com.example.JavaModelPresentation&lt;/samp&gt; will be 
-used to render and present debug elements originating 
-from the debug model identified by 
-&lt;samp&gt;com.example.JavaDebugModel&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         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.debug.ui.IDebugModelPresentation&lt;/samp&gt;. Since 3.1, debug model presentations may optionally implement &lt;code&gt;IColorProvider&lt;/code&gt; and &lt;code&gt;IFontProvider&lt;/code&gt; to override default fonts and colors for debug elements.
-      </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/org.eclipse.debug.ui/schema/detailPaneFactories.exsd b/org.eclipse.debug.ui/schema/detailPaneFactories.exsd
deleted file mode 100644
index 3a89fb4..0000000
--- a/org.eclipse.debug.ui/schema/detailPaneFactories.exsd
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="detailPaneFactories" name="Detail Pane Factories Extension"/>
-      </appInfo>
-      <documentation>
-         This extension point allows clients to contribute custom renderings for the detail pane in the variables, registers and expression views. To contribute a custom detail pane, an implementation of &lt;code&gt;IDetailPaneFactory&lt;/code&gt; is registered using this extension point.  A detail pane factory creates an &lt;code&gt;IDetailPane&lt;/code&gt; for each custom rendering.
-&lt;p&gt;
-Views with detail panes allow users select from available detail panes via the context menu. All contributions to this extension point are checked agaist the current selection. A detail factory should provide an enablement expression to ensure lazy plug-in loading. A factory will only be instantiated if its expression evaluates to true for the current selection (see the example extension point for an example enablement expression). Each applicable factory is then consulted for the types of detail panes it can produce for the current selection.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="detailFactories"/>
-         </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="detailFactories">
-      <complexType>
-         <sequence>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this factory
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified name of a class that implements &lt;code&gt;org.eclipse.debug.ui.IDetailPaneFactory&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.IDetailPaneFactory"/>
-               </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>
-         Following in an example of a detail pane factory extension with an expression that enables for selections containing exactly two Java variables:
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.ui.detailPaneFactories&quot;&gt;
-       &lt;detailFactories
-             class=&quot;org.eclipse.temp.JavaTableDetailPaneFactory&quot;
-             name=&quot;javaTableDetailPaneFactory&quot;&gt;
-          &lt;enablement&gt;
-          &lt;with
-                variable=&quot;selection&quot;&gt;
-             &lt;count
-                   value=&quot;2&quot;&gt;
-             &lt;/count&gt;
-             &lt;iterate&gt;
-                &lt;instanceof
-                      value=&quot;org.eclipse.jdt.debug.core.IJavaVariable&quot;&gt;
-                &lt;/instanceof&gt;
-             &lt;/iterate&gt;
-          &lt;/with&gt;
-       &lt;/enablement&gt;
-       &lt;/detailFactories&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.ui.IDetailPaneFactory&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The debug platform contributes a detail pane factory providing a default text source viewer detail pane. The default detail pane displays textual details of a selected element based on the corresponding debug model presentation&apos;s implementation of &lt;code&gt;computeDetail(IValue value, IValueDetailListener listener)&lt;/code&gt;.
-      </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/org.eclipse.debug.ui/schema/launchConfigurationTabGroups.exsd b/org.eclipse.debug.ui/schema/launchConfigurationTabGroups.exsd
deleted file mode 100644
index be66be4..0000000
--- a/org.eclipse.debug.ui/schema/launchConfigurationTabGroups.exsd
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="launchConfigurationTabGroups" name="Launch Configuration Tab Groups"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing a group of tabs to the launch configuration
-dialog for a type of launch configuration.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchConfigurationTabGroup" 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="launchConfigurationTabGroup">
-      <complexType>
-         <sequence>
-            <element ref="launchMode" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch configuration tab group.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a launch configuration type that this tab group is applicable to (corresponds to the id of a launch configuration type extension).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully qualified name of a Java class that implements &lt;code&gt;ILaunchConfigurationTabGroup&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier that specifies the help context to associate with this tab group&apos;s launch configuration type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description of the Launch Configuration Type
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="launchMode">
-      <annotation>
-         <documentation>
-            A launch mode element specifies a launch mode this tab group is specific to. A tab group can be associated with one or more launch modes. For backwards compatibility (previous to 3.0), a launch mode does not need to be specified. When unspecified, a tab group is registered as the default tab group for the associated launch configration type (i.e. applicable to all supported launch modes for which a specific tab group has not been contributed).
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="mode" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier for a launch mode this tab group is specific to.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="perspective" type="string">
-            <annotation>
-               <documentation>
-                  the default perspective identifier associated with this launch configuration type and launch mode. This allows an extension to cause a perspective switch (or open) when a corresponding launch is registered with the debug plug-in. When unspecified, it indicates that by default, no perspective switch should occurr.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description of the Launch Configuration Type specific to this launchMode.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a launch configuration tab group extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.ui.launchConfigurationTabGroups&quot;&gt;
-  &lt;launchConfigurationTabGroup
-      id=&quot;com.example.ExampleTabGroup&quot;
-      type=&quot;com.example.ExampleLaunchConfigurationTypeIdentifier&quot;
-      class=&quot;com.example.ExampleLaunchConfigurationTabGroupClass&quot;&gt;
-  &lt;/launchConfigurationTabGroup&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the above example, the contributed tab group will be shown for the launch configuration type with
-identifier &lt;samp&gt;com.example.ExampleLaunchConfigurationTypeIdentifier&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;code&gt;class&lt;/code&gt; must be a fully qualified name of a Java class that implements the 
-interface &lt;code&gt;org.eclipse.debug.ui.ILaunchConfigurationTabGroup&lt;/code&gt;.
-      </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/org.eclipse.debug.ui/schema/launchConfigurationTabs.exsd b/org.eclipse.debug.ui/schema/launchConfigurationTabs.exsd
deleted file mode 100644
index 6cd5d9f..0000000
--- a/org.eclipse.debug.ui/schema/launchConfigurationTabs.exsd
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="launchConfigurationTabs" name="Launch Configuration Tabs"/>
-      </appInfo>
-      <documentation>
-         This extension point is to contribute launch configuration tabs (one or more) to an existing launch configuration tab group.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="tab"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tab">
-      <annotation>
-         <documentation>
-            describes an individual launch configuration tab contribution
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="placement" minOccurs="0" maxOccurs="1"/>
-            <element ref="associatedDelegate" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique id of this contributed tab
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="group" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique id of an existnig &lt;code&gt;ILaunchConfigurationTabGroup&lt;/code&gt; that this tab should be contributed to
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a human readable name for this tab. The provided name does not have to be the name that appears on the tab itself, but should sufficiently describe the tab.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified name of the java class that implements &lt;code&gt;ILaunchConfigurationTab&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.ILaunchConfigurationTab"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="placement">
-      <annotation>
-         <documentation>
-            This element allows contributors to specify relative locale for their contributed tab
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="after" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the id of the tab that this tab should appear immediately after in the left to right arrangement of tabs
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="associatedDelegate">
-      <annotation>
-         <documentation>
-            This attribute is used to map a contrinbuted tab to one or more launch delegates. This allows tabs to be filtered from the launch dialog based on what launch delegate is selected as the current default. For example, if two plug-ins contribute launch delegates and tabs for the same launch mode, only one set of tabs will be displayed to the user based on the enabled delegate chosen by the user.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="delegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the &lt;code&gt;launchDelegate&lt;/code&gt; that this tab is associated with. The association allows the tab to be filtered based on the modesets supported by the delegates.
-               </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>
-         The following example adds the tab &quot;FooTab&quot; to the local java application launch tab group.
-
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.ui.launchConfigurationTabs&quot;&gt;
-    &lt;tab
-       class=&quot;org.eclipse.jdt.debug.ui.launchConfigurations.FooTab&quot;
-        group=&quot;org.eclipse.jdt.debug.ui.launchConfigurationTabGroup.localJavaApplication&quot;
-        id=&quot;org.eclipse.jdt.debug.ui.fooTab&quot;
-        name=&quot;Foo Tab&quot;&gt;
-    &lt;/tab&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 debug platform provides two abstract classes that clients should subclass when implementing launch tabs. See &lt;code&gt;AbstractLaunchConfigurationTab&lt;/code&gt; and &lt;code&gt;AbstractOptionLaunchConfigurationTab&lt;/code&gt; in package &lt;code&gt;org.eclipse.debug.ui&lt;/code&gt;.
-      </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/org.eclipse.debug.ui/schema/launchConfigurationTypeImages.exsd b/org.eclipse.debug.ui/schema/launchConfigurationTypeImages.exsd
deleted file mode 100644
index a9ae616..0000000
--- a/org.eclipse.debug.ui/schema/launchConfigurationTypeImages.exsd
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="launchConfigurationTypeImages" name="Launch Configuration Type Images"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a way to associate an image with a launch configuration type.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchConfigurationTypeImage" 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>
-      </complexType>
-   </element>
-
-   <element name="launchConfigurationTypeImage">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch configuration type image.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="configTypeID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified ID of a launch configuration type.(in 2.1, this attribute can also be specified using the &quot;type&quot; attribute, to be consistent with the launchConfigurationTabGroups extension point).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the plugin-relative path of an image file.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a launch configuration type image extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.ui.launchConfigurationTypeImages&quot;&gt;
-  &lt;launchConfigurationTypeImage
-     id=&quot;com.example.FirstLaunchConfigurationTypeImage&quot;
-     configTypeID=&quot;com.example.FirstLaunchConfigurationType&quot;
-     icon=&quot;icons/FirstLaunchConfigurationType.gif&quot;&gt;
-  &lt;/launchConfigurationTypeImage&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </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/org.eclipse.debug.ui/schema/launchGroups.exsd b/org.eclipse.debug.ui/schema/launchGroups.exsd
deleted file mode 100644
index a2537e9..0000000
--- a/org.eclipse.debug.ui/schema/launchGroups.exsd
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="launchGroups" name="Launch Groups"/>
-      </appInfo>
-      <documentation>
-         This extension point provides support for defining a group of launch configurations to be viewed together in the launch configuration dialog, and support a launch history (recent and favorite launches).
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="launchGroup" 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="launchGroup">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch group.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="mode" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the launch mode associated with this group - i.e. run or debug.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  specifies the category of launch configurations in this group. When unspecified, the category is &lt;code&gt;null&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a translatable label used to render this group.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="image" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a plug-in relative path to an image used to render this group in trees, lists, tabs, etc.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="bannerImage" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a plug-in relative path to an image used to render this group in a wizard or dialog banner area.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="public" type="string">
-            <annotation>
-               <documentation>
-                  specifies whether this launch group is public and should be have a visible launch history tab in the debug preferences. The implied value is &lt;code&gt;true&lt;/code&gt;, when not specified.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="title" type="string">
-            <annotation>
-               <documentation>
-                  title to display in the launch wizard when this launch group is opened - for example &quot;Select or configure an application to debug&quot; (since 3.1)
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a launch group extension point: 
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.ui.launchGroups&quot;&gt;
-  &lt;launchGroup
-     id=&quot;com.example.ExampleLaunchGroupId&quot;
-     mode=&quot;run&quot;
-     label=&quot;Run&quot;
-     image=&quot;icons\run.gif&quot;
-     bannerImage=&quot;icons\runBanner.gif&quot;&gt;
-  &lt;/launchGroup&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-In the above example, the launch group will consist of all launch configurations with no category that support run mode.
-      </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/org.eclipse.debug.ui/schema/launchShortcuts.exsd b/org.eclipse.debug.ui/schema/launchShortcuts.exsd
deleted file mode 100644
index 10ef46a..0000000
--- a/org.eclipse.debug.ui/schema/launchShortcuts.exsd
+++ /dev/null
@@ -1,405 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="launchShortcuts" name="Launch Shortcuts"/>
-      </appInfo>
-      <documentation>
-         This extension point provides support for selection sensitive launching.  Extensions register a shortcut which
-appears in the run and/or debug cascade menus to launch the workbench selection or active editor.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="shortcut" 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="shortcut">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="label"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="perspective" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="contextualLaunch" minOccurs="0" maxOccurs="1"/>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-            <element ref="configurationType" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="description" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this launch shortcut.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="modes" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a comma-separated list of modes this shortcut supports.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the fully qualified name of a class which implements
-&lt;code&gt;org.eclipse.debug.ui.ILaunchShortcut&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.ILaunchShortcut"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a label used to render this shortcut.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  specifies a plugin-relative path to an image used to render this shortcut. Icon is optional because it is up to other plugins (i.e. Views) to render it.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  specifies the launch configuration type category this shortcut is applicable for. When unspecified, the category is &lt;code&gt;null&lt;/code&gt; (default).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier that specifies the help context to associate with this launch shortcut
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="path" type="string">
-            <annotation>
-               <documentation>
-                  an optional menu path used to group launch shortcuts in menus. Launch shortcuts are grouped alphabetically based on the &lt;code&gt;path&lt;/code&gt; attribute, and then sorted alphabetically within groups based on the &lt;code&gt;label&lt;/code&gt; attribute. When unspecified, a shortcut appears in the last group. This attribute was added in the 3.0.1 release.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  Provides a human readable description of what the shortcut does (or will do) if the user selects it. A Description provided in this field will apply as the default description for all of the modes listed in the modes attribute. This attribute was added in the 3.3 release.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="perspective">
-      <annotation>
-         <documentation>
-            The &lt;code&gt;perspective&lt;/code&gt; element has been &lt;b&gt;deprecated&lt;/b&gt; in the 3.1 release. The top level Run/Debug/Profile cascade menus now support contextual (selection sensitive) launching, and clients should provide a &lt;code&gt;contextualLaunch&lt;/code&gt; element instead.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of a perspective in which a menu shortcut for this launch shortcut will appear.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="contextualLaunch">
-      <annotation>
-         <documentation>
-            Holds all descriptions for adding shortcuts to the selection sensitive Run/Debug/Profile cascade menus. Only objects that provide an &lt;code&gt;org.eclipse.debug.ui.actions.ILaunchable&lt;/code&gt; adapter are considered for the cascade menus. The &lt;code&gt;org.eclipse.debug.ui.actions.ILaunchable&lt;/code&gt; interface is simply used to tag objects that support contextual launching.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="contextLabel" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="contextLabel">
-      <annotation>
-         <documentation>
-            Specify the label for a contextual launch mode.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="mode" use="required">
-            <annotation>
-               <documentation>
-                  specifies a mode from the set {&quot;run&quot;,&quot;debug&quot;,&quot;profile&quot;}
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="run">
-                  </enumeration>
-                  <enumeration value="debug">
-                  </enumeration>
-                  <enumeration value="profile">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the label to appear in the contextual launch menu.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="configurationType">
-      <annotation>
-         <documentation>
-            This element allows more that one associated launch configuration type to be specified for this launch shortcut. This element was added in the 3.3 release.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  This attribute is the identifier of an existing launch configuration type that is to be associated with this launch shortcut. This association is then used to determine what launch shortcuts apply to what types for context sensitive launching.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description">
-      <annotation>
-         <documentation>
-            Provdies a mode specific desciption for this launch shortcut. This element was added in the 3.3. release.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="mode" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A launch mode identifier this description applies to. For example, &quot;run&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The desciption for this launch shortcut when invoked in the associated mode.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of the Java Application launch shortcut contribution with an enablement expression, an associated launch configuration type id and descriptions for run and debug mode:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.ui.launchShortcuts&quot;&gt;
-  &lt;shortcut
-    label=&quot;Java Application&quot;
-    icon=&quot;$nl$/icons/full/etool16/java_app.gif&quot;
-    helpContextId=&quot;org.eclipse.jdt.debug.ui.shortcut_local_java_application&quot;
-    modes=&quot;run, debug&quot;
-    class=&quot;org.eclipse.jdt.internal.debug.ui.launcher.JavaApplicationLaunchShortcut&quot;
-    description=&quot;Launch a local Java application&quot;
-    id=&quot;org.eclipse.jdt.debug.ui.localJavaShortcut&quot;&gt;
-    &lt;description
-     description=&quot;Runs a local Java application&quot;
-     mode=&quot;run&quot;&gt;
-    &lt;/description&gt;
-    &lt;description
-     description=&quot;Debugs a local Java application&quot;
-     mode=&quot;debug&quot;&gt;
-    &lt;/description&gt;
-  &lt;contextualLaunch&gt;
-  &lt;enablement&gt;
-    &lt;with variable=&quot;selection&quot;&gt;
-     &lt;count value=&quot;1&quot;/&gt;
-      &lt;iterate&gt;
-       &lt;or&gt;
-        &lt;test property=&quot;org.eclipse.jdt.launching.hasMain&quot;/&gt;
-         &lt;and&gt;
-          &lt;test property=&quot;org.eclipse.jdt.launching.isContainer&quot;/&gt;
-          &lt;test property=&quot;org.eclipse.jdt.launching.hasProjectNature&quot; args=&quot;org.eclipse.jdt.core.javanature&quot;/&gt;
-         &lt;/and&gt;
-        &lt;/or&gt;
-      &lt;/iterate&gt;
-     &lt;/with&gt;
-  &lt;/enablement&gt;
-  &lt;/contextualLaunch&gt;
-  &lt;configurationType
-    id=&quot;org.eclipse.jdt.launching.localJavaApplication&quot;&gt;
-  &lt;/configurationType&gt;
-  &lt;/shortcut&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the above example, a launch shortcut will be shown in the run and debug cascade menus with the label
-&quot;Java Application&quot;. Furthermore, the shortcut will only appear if the selected item contains a main method or is a Java project, and has an &lt;code&gt;org.eclipse.debug.ui.actions.ILaunchable&lt;/code&gt; adapter.
-&lt;/p&gt;
-&lt;p&gt;
-For more information on property testers see &lt;code&gt;org.eclipse.core.expressions.PropertyTester&lt;/code&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the 
-interface &lt;b&gt;org.eclipse.debug.ui.ILaunchShortcut&lt;/b&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-Since 3.1, the debug platform registers a command handler for each launch shortcut and its applicable modes to allow clients to define key-bindings for a launch shortcut. The command id for a handler is generated as the launch shortcut id attribute, followed by a dot and the applicable launch mode. For example, the command id for the above launch shortcut example would be &lt;code&gt;com.example.ExampleLaunchShortcutId.debug&lt;/code&gt; for launching in debug mode. A command and key binding could be defined as follows, to bind &quot;&lt;code&gt;ALT-SHIFT-D, E&lt;/code&gt;&quot; to the launch shortcut.
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.commands&quot;&gt;
-      &lt;command
-            name=&quot;Debug Example Launch&quot;
-            description=&quot;Debug Example Launch&quot;
-            categoryId=&quot;org.eclipse.debug.ui.category.run&quot;
-            id=&quot;com.example.ExampleLaunchShortcutId.debug&quot;&gt;
-      &lt;/command&gt;
-      &lt;keyBinding
-            keySequence=&quot;M3+M2+D E&quot;
-            contextId=&quot;org.eclipse.ui.globalScope&quot;
-            commandId=&quot;com.example.ExampleLaunchShortcutId.debug&quot;
-            keyConfigurationId=&quot;org.eclipse.ui.defaultAcceleratorConfiguration&quot;&gt;
-      &lt;/keyBinding&gt;
-   &lt;/extension&gt;      
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-Since 3.3, launch shortcuts can now indicate what kind of launch configuration(s) they will create using the configurationType element. In the event that a given launch shortcut can create more than one type of launch configuration, more than one type can be specified using this element.&lt;br&gt;
-Example:
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.ui.launchShortcuts&quot;&gt;
-      &lt;shortcut
-            class=&quot;MyShortcut&quot;
-            description=&quot;Launches a simple program&quot;
-            id=&quot;myShortcut&quot;
-            label=&quot;My Shortcut&quot;
-            modes=&quot;run&quot;&gt;
-         &lt;configurationType 
-          id=&quot;mylaunchtypes&quot;&gt;
-         &lt;/configurationType&gt;
-      &lt;/shortcut&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-Since 3.3, launch shortcuts can provdie a human readable description. This is used to aid novice users during the context launching process when they are presented with a listing of launch shortcuts to choose from.&lt;br&gt;
-Descriptions can be provided in one of two ways:
-&lt;ol&gt;
-&lt;li&gt;A general description can be provided for the shortcut, which will apply to all modes that the shortcut supports&lt;/li&gt;
-&lt;li&gt;Each description can be specified for a specific mode&lt;/li&gt;
-&lt;/ol&gt;
-Example of general description which applies to run and debug modes:
-&lt;pre&gt;
- &lt;shortcut
-            class=&quot;MyShortcut&quot;
-            description=&quot;Launches a simple program&quot;
-            id=&quot;myShortcut&quot;
-            label=&quot;My Shortcut&quot;
-            modes=&quot;run, debug&quot;&gt;
-      &lt;/shortcut&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-Example of a description for the run mode only:
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.debug.ui.launchShortcuts&quot;&gt;
-      &lt;shortcut
-            class=&quot;MyShortcut&quot;
-            id=&quot;myShortcut&quot;
-            label=&quot;My Shortcut&quot;
-            modes=&quot;run, debug&quot;&gt;
-         &lt;description
-               description=&quot;Runs a simple program&quot;
-               mode=&quot;run&quot;&gt;
-         &lt;/description&gt;
-      &lt;/shortcut&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&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/org.eclipse.debug.ui/schema/memoryRenderings.exsd b/org.eclipse.debug.ui/schema/memoryRenderings.exsd
deleted file mode 100644
index 1399bb7..0000000
--- a/org.eclipse.debug.ui/schema/memoryRenderings.exsd
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="memoryRenderings" name="Memory Renderings"/>
-      </appInfo>
-      <documentation>
-         Allows plug-ins to contribute arbitrary renderings for memory blocks and bind memory blocks to renderings. For example, a rendering may translate raw bytes of a memory block into ASCII characters.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="renderingType" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="renderingBindings" 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>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="renderingType">
-      <annotation>
-         <documentation>
-            This element defines a rendering type.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  human-readable name of this rendering type
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique identifier for this rendering
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified name of the Java class that implements &lt;code&gt;org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="renderingBindings">
-      <annotation>
-         <documentation>
-            Binds memory blocks with available renderings.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="enablement" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="renderingIds" type="string">
-            <annotation>
-               <documentation>
-                  comma delimited list of memory rendering type identifiers, specifying available rendering types for memory blocks this binding is enabled for. Must not be specified when &lt;code&gt;class&lt;/code&gt; is provided.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="primaryId" type="string">
-            <annotation>
-               <documentation>
-                  memory rendering type identifier, specifying the default rendering type to be considered primary for memory blocks this binding is enabled for. When there is more than one default rendering type bound to a memory block, the UI may use the information to determine which rendering should be made visible (i.e the primrary one). Must not be specified when &lt;code&gt;class&lt;/code&gt; is provided. Clients should be careful to specify only one primary rendering type per memory block.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  fully qualified name of the Java class that implements &lt;code&gt;org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider&lt;/code&gt;, allowing for dynamic rendering bindings. When specified, &lt;code&gt;renderingIds&lt;/code&gt;, &lt;code&gt;defaultIds&lt;/code&gt;, and &lt;code&gt;primaryId&lt;/code&gt; must not be specified.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="defaultIds" type="string">
-            <annotation>
-               <documentation>
-                  comma delimited list of memory rendering type identifiers, specifying default rendering types for memory blocks this binding is enabled for. Must not be specified when &lt;code&gt;class&lt;/code&gt; is provided.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.1 - replacement for memoryRenderingTypes extension point which was considered experimental in 3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example for defining a new rendering type and binding. 
-
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.ui.memoryRenderings&quot;&gt;
-    &lt;renderingType 
-        name=&quot;Sample Rendering&quot;
-        id=&quot;com.example.sampleRendering&quot;
-        class=&quot;com.example.SampleRenderingTypeDelegate&quot;&gt;
-    &lt;/renderingType&gt;
-    &lt;renderingBindings
-        renderingIds=&quot;com.example.sampleRendering&quot;&gt;
-        &lt;enablement&gt;
-            &lt;instanceof value=&quot;com.example.SampleMemoryBlock&quot;/&gt;
-        &lt;/enablement&gt;    
-    &lt;/renderingBindings&gt;          
-&lt;/extension&gt;        
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the above example, a new rendering type, Sample Rendering, is defined. The class &lt;code&gt;com.example.SampleRenderingTypeDelegate&lt;/code&gt; implements &lt;code&gt;org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate&lt;/code&gt; and will be used to create new renderings of this type. The rendering is bound to instances of &lt;code&gt;com.exmaple.SampleMemoryBlock&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;li&gt;Value of the attribute &lt;b&gt;class&lt;/b&gt; in a &lt;b&gt;renderingType&lt;/b&gt; element must be a fully qualifed name of a Java class that implements &lt;b&gt;org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate&lt;/b&gt;.&lt;/li&gt;
-&lt;li&gt;Value of the attribute &lt;b&gt;class&lt;/b&gt; in a &lt;b&gt;renderingBindings&lt;/b&gt; element must be a fully qualifed name of a Java class that implements &lt;b&gt;org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider&lt;/b&gt;.&lt;/li&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-The debug platform provides the following rendering types:&lt;br&gt;
-&lt;li&gt;Hex Rendering (rendering id: org.eclipse.debug.ui.rendering.raw_memory)&lt;/li&gt;
-&lt;li&gt;ASCII Rendering (rendering id: org.eclipse.debug.ui.rendering.ascii)&lt;/li&gt;
-&lt;li&gt;Signed Integer Rendering (rendering id: org.eclipse.debug.ui.rendering.signedint)&lt;/li&gt;
-&lt;li&gt;Unsigned Integer Rendering (rendering id: org.eclipse.debug.ui.rendering.unsignedint) &lt;/li&gt;
-&lt;br&gt;
-&lt;/p&gt;
-&lt;p&gt;
-The debug platform provides a memory view to host renderings.
-&lt;/p&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/org.eclipse.debug.ui/schema/sourceContainerPresentations.exsd b/org.eclipse.debug.ui/schema/sourceContainerPresentations.exsd
deleted file mode 100644
index 0cd1570..0000000
--- a/org.eclipse.debug.ui/schema/sourceContainerPresentations.exsd
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="sourceContainerPresentations" name="Source Container Presentations"/>
-      </appInfo>
-      <documentation>
-         Extension point to define a presentation aspects of a source container type.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="sourceContainerPresentation" 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="sourceContainerPresentation">
-      <annotation>
-         <documentation>
-            An extension point to define presentation aspects of a source container type.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id used to refer to this implementation.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  The icon that should be displayed for the source container type and instances.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="containerTypeID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of the source container type for which this presentation is being provided.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="browserClass" type="string">
-            <annotation>
-               <documentation>
-                  A class that can be called to display a browse dialog for the source container type. Must implement &lt;code&gt;ISourceLocationBrowser&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.debug.internal.ui.sourcelookup.ISourceLocationBrowser"/>
-               </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 an source container presentation definition.
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.debug.ui.sourceContainerPresentations&quot;&gt;
-      &lt;sourceContainerPresentation
-            browserClass=&quot;org.eclipse.debug.internal.ui.sourcelookup.browsers.ProjectSourceContainerBrowser&quot;
-            containerTypeID=&quot;org.eclipse.debug.core.containerType.project&quot;
-            icon=&quot;icons/full/obj16/prj_obj.gif&quot;
-            id=&quot;org.eclipse.debug.ui.containerPresentation.project&quot;&gt;
-      &lt;/sourceContainerPresentation&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;browserClass&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;ISourceLocationBrowser&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-Copyright (c) 2003, 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/org.eclipse.debug.ui/schema/stringVariablePresentations.exsd b/org.eclipse.debug.ui/schema/stringVariablePresentations.exsd
deleted file mode 100644
index d81d9bd..0000000
--- a/org.eclipse.debug.ui/schema/stringVariablePresentations.exsd
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="stringVariablePresentations" name="String Variable Presentations"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing a user interface/presentation for a string substitution variable (i.e. a context variable or value variable).
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="variablePresentation" 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="variablePresentation">
-      <complexType>
-         <attribute name="variableName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the variable this presentation is for
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="argumentSelector" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully qualified name of a Java class that implements &lt;code&gt;IArgumentSelector&lt;/code&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a variable presentation contribution: 
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.debug.ui.stringVariablePresentations&quot;&gt;
-  &lt;variablePresentation 
-     variableName=&quot;example_variable&quot;
-     argumentSelector=&quot;com.example.ExampleArgumentChooser&quot;&gt;
-  &lt;/variablePresentation&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, the contributed presentation will be used for the variable named &quot;example_variable&quot;. An argument selector is specified to configure an argument applicable to the variable.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;argumentSelector&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.ui.stringsubstitution.IArgumentSelector&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-Copyright (c) 2003, 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/org.eclipse.debug.ui/schema/variableValueEditors.exsd b/org.eclipse.debug.ui/schema/variableValueEditors.exsd
deleted file mode 100644
index 0afd186..0000000
--- a/org.eclipse.debug.ui/schema/variableValueEditors.exsd
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.debug.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="variableValueEditors" name="Variable Value Editors"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing variable value editors for a particular debug model. Variable value editors are used to edit/save variable values. When the user invokes the &quot;Change Value...&quot; or &quot;Assign Value&quot; (details pane) actions on a variable in the Variables view, the contributed &lt;code&gt;org.eclipse.debug.ui.actions.IVariableValueEditor&lt;/code&gt; will be invoked to change the value.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="variableValueEditor"/>
-         </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="variableValueEditor">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Implementation of &lt;code&gt;org.eclipse.debug.ui.actions.IVariableValueEditor&lt;/code&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="modelId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The debug model identifier for which the given variable value editor is applicable.
-               </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.debug.ui.variableValueEditors&quot;&gt;
-      &lt;variableEditor
-         modelId=&quot;com.examples.myDebugModel&quot;
-         class=&quot;com.examples.variables.MyVariableValueEditor&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.debug.ui.actions.IVariableValueEditor&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </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/org.eclipse.debug.ui/scripts/exportplugin.xml b/org.eclipse.debug.ui/scripts/exportplugin.xml
deleted file mode 100644
index 2b66e4c..0000000
--- a/org.eclipse.debug.ui/scripts/exportplugin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Export a jar of .class files for the org.eclipse.debug.ui Eclipse plugin
-     along with other important plugin files to the "plugin-export" subdirectory
-     of the target Eclipse installation -->
-<project name="Export debug.ui" default="export" basedir="..">
-
-	<!-- Set the timestamp and important properties -->
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="dest"  value="${destdir}/org.eclipse.debug.ui_3.0.0" />
-	</target>
-
-	<!-- Create the jar of .class files, and copy other important files to export dir -->
-	<target name="export" depends="init">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<jar 
-			jarfile="${dest}/dtui.jar"
-			basedir="bin"
-		/>
-		<!-- Create the source zip -->
-		<zip zipfile="${dest}/dtuisrc.zip">
-			<fileset dir="ui"/>
-		</zip>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy file=".classpath" todir="${dest}"/>
-		<copy file=".options" todir="${dest}"/>
-		<copy todir="${dest}/icons">
-			<fileset dir="icons" />
-		</copy>
-	</target>
-	
-</project>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugCheckboxSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugCheckboxSelectionDialog.java
deleted file mode 100644
index d05d836..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugCheckboxSelectionDialog.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.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.Table;
-
-/**
- * This class provides selection dialog using a checkbox table viewer. 
- * 
- * @since 3.3
- */
-public abstract class AbstractDebugCheckboxSelectionDialog extends AbstractDebugSelectionDialog {
-	
-	/**
-	 * Whether to add Select All / De-select All buttons to the custom footer controls.
-	 */
-	private boolean fShowSelectButtons = false;
-	
-	/**
-	 * Constructor
-	 * @param parentShell
-	 */
-	public AbstractDebugCheckboxSelectionDialog(Shell parentShell) {
-		super(parentShell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-	
-	/**
-	 * Returns the viewer cast to the correct instance.  Possibly <code>null</code> if
-	 * the viewer has not been created yet.
-	 * @return the viewer cast to CheckboxTableViewer
-	 */
-	protected CheckboxTableViewer getCheckBoxTableViewer() {
-		return (CheckboxTableViewer) fViewer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#initializeControls()
-	 */
-	protected void initializeControls() {
-		List selectedElements = getInitialElementSelections();
-		if (selectedElements != null && !selectedElements.isEmpty()){
-			getCheckBoxTableViewer().setCheckedElements(selectedElements.toArray());
-			getCheckBoxTableViewer().setSelection(StructuredSelection.EMPTY);
-		}
-		super.initializeControls();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent){
-		//by default return a checkbox table viewer
-		Table table = new Table(parent, SWT.BORDER | SWT.SINGLE | SWT.CHECK);
-		table.setLayoutData(new GridData(GridData.FILL_BOTH));
-		return new CheckboxTableViewer(table);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#addViewerListeners(org.eclipse.jface.viewers.StructuredViewer)
-	 */
-	protected void addViewerListeners(StructuredViewer viewer) {
-		getCheckBoxTableViewer().addCheckStateListener(new DefaultCheckboxListener());
-	}
-	
-	/**
-	 * A checkbox state listener that ensures that exactly one element is checked
-	 * and enables the OK button when this is the case.
-	 *
-	 */
-	private class DefaultCheckboxListener implements ICheckStateListener{
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.AbstractDebugSelectionDialog#isValid()
-	 */
-	protected boolean isValid() {
-		return getCheckBoxTableViewer().getCheckedElements().length > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		Object[] elements =  getCheckBoxTableViewer().getCheckedElements();
-		setResult(Arrays.asList(elements));
-		super.okPressed();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#addCustomFooterControls(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void addCustomFooterControls(Composite parent) {
-		if (fShowSelectButtons){
-			Composite comp = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_HORIZONTAL);
-			GridData gd = (GridData) comp.getLayoutData();
-			gd.horizontalAlignment = SWT.END;
-			Button button = SWTFactory.createPushButton(comp, DebugUIMessages.AbstractDebugCheckboxSelectionDialog_0, null);
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					getCheckBoxTableViewer().setAllChecked(true);
-					getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-				}
-			});
-			button = SWTFactory.createPushButton(comp, DebugUIMessages.AbstractDebugCheckboxSelectionDialog_1, null);
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					getCheckBoxTableViewer().setAllChecked(false);
-					getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-				}
-			});
-		}
-	}
-	
-	/**
-	 * If this setting is set to true before the dialog is opened, a Select All and 
-	 * a De-select All button will be added to the custom footer controls.  The default
-	 * setting is false.
-	 * 
-	 * @param setting whether to show the select all and de-select all buttons
-	 */
-	protected void setShowSelectAllButtons(boolean setting){
-		fShowSelectButtons = setting;
-	}
-	    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java
deleted file mode 100644
index 89dc3e8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.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.debug.internal.ui;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a simple selection dialog displaying items in a table.
- * 
- * @since 3.3
- */
-public abstract class AbstractDebugListSelectionDialog extends AbstractDebugSelectionDialog {
-
-	protected TableViewer fListViewer;
-	
-	/**
-	 * Constructor
-	 * @param parentShell
-	 */
-	public AbstractDebugListSelectionDialog(Shell parentShell) {
-		super(parentShell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-	
-	/**
-	 * Create and return a viewer to use in this dialog.
-	 * 
-	 * @param parent the composite the viewer should be created in
-	 * @return the viewer to use in the dialog
-	 */
-	protected StructuredViewer createViewer(Composite parent){
-		//by default return a table viewer
-		fListViewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		fListViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
-		return fListViewer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#addViewerListeners(org.eclipse.jface.viewers.StructuredViewer)
-	 */
-	protected void addViewerListeners(StructuredViewer viewer) {
-		viewer.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-			}
-		});
-		viewer.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				if (isValid()){
-					okPressed();
-				}
-			}
-		});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.AbstractDebugSelectionDialog#isValid()
-	 */
-	protected boolean isValid() {
-		if(fListViewer != null) {
-			ISelection sel = fListViewer.getSelection();
-			if(sel instanceof IStructuredSelection) {
-				return ((IStructuredSelection)sel).size() == 1;
-			}
-		}
-		return false;
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-     */
-    protected void okPressed() {
-		ISelection selection = fViewer.getSelection();
-		if (selection instanceof IStructuredSelection) {
-			setResult(((IStructuredSelection) selection).toList());
-		}
-		super.okPressed();
-    }
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java
deleted file mode 100644
index abf7a13..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.graphics.Point;
-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;
-
-/**
- * This class provides the framework for a general selection dialog class.
- * 
- * @see AbstractDebugListSelectionDialog
- * @see AbstractDebugCheckboxSelectionDialog
- * 
- * @since 3.3
- */
-public abstract class AbstractDebugSelectionDialog extends SelectionDialog {
-
-	protected StructuredViewer fViewer = null;
-	
-	/**
-	 * Constructor
-	 * @param parentShell
-	 */
-	public AbstractDebugSelectionDialog(Shell parentShell) {
-		super(parentShell);
-	}
-	
-	/**
-	 * returns the dialog settings area id
-	 * @return the id of the dialog settings area
-	 */
-	protected abstract String getDialogSettingsId();
-	
-	/**
-	 * Returns the object to use as input for the viewer
-	 * @return the object to use as input for the viewer
-	 */
-	protected abstract Object getViewerInput();
-	
-	/**
-	 * Create and return a viewer to use in this dialog.
-	 * 
-	 * @param parent the composite the viewer should be created in
-	 * @return the viewer to use in the dialog
-	 */
-	protected abstract StructuredViewer createViewer(Composite parent);
-	
-	/**
-	 * Returns if the dialog and/or current selection is/are valid.
-	 * This method is polled when selection changes are made to update the enablement
-	 * of the OK button by default 
-	 * @return true if the dialog is in a valid state, false otherwise
-	 * 
-	 * @since 3.4
-	 */
-	protected abstract boolean isValid();
-	
-	/**
-	 * Returns the content provider for the viewer
-	 * @return the content provider for the viewer
-	 */
-	protected IContentProvider getContentProvider() {
-		//by default return a simple array content provider
-		return new ArrayContentProvider();
-	}
-	
-	/**
-	 * Returns the label provider used by the viewer
-	 * @return the label provider used in the viewer
-	 */
-	protected IBaseLabelProvider getLabelProvider() {
-		return new DefaultLabelProvider();
-	}
-	
-	/**
-	 * Returns the help context id for this dialog
-	 * @return the help context id for this dialog
-	 */
-	abstract protected String getHelpContextId();
-	
-	/**
-	 * This method allows listeners to be added to the viewer after it
-	 * is created.
-	 */
-	/**
-	 * This method allows listeners to be added to the viewer.  Called
-	 * after the viewer has been created and its input set.
-	 * 
-	 * @param viewer the viewer returned by createViewer()
-	 */
-	protected void addViewerListeners(StructuredViewer viewer){
-		//do nothing by default
-	}
-	
-	/**
-	 * This method allows custom controls to be added before the viewer
-	 * @param parent the parent composite to add these custom controls to
-	 */
-	protected void addCustomHeaderControls(Composite parent) {
-		//do nothing by default
-	}
-	
-	/**
-	 * This method allows custom controls to be added after the viewer
-	 * @param parent the parent composite to add these controls to
-	 */
-	protected void addCustomFooterControls(Composite parent) {
-		//do nothing by default
-	}
-	
-	/**
-	 * This method allows the newly created controls to be initialized.
-	 * This method is called only once all controls have been created from the 
-	 * <code>createContents</code> method.
-	 * 
-	 * By default this method initializes the OK button control.
-	 */
-	protected void initializeControls() {
-		getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-	}
-	
-	/**
-	 * Returns the viewer used to display information in this dialog.
-	 * Can be <code>null</code> if the viewer has not been created.
-	 * @return viewer used in this dialog
-	 */
-	protected Viewer getViewer(){
-    	return fViewer;
-    }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite comp = (Composite) super.createContents(parent);
-		initializeControls();
-		return comp;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		initializeDialogUnits(parent);
-		Composite comp = (Composite) super.createDialogArea(parent);
-		addCustomHeaderControls(comp);
-		String label = getMessage();
-		if(label != null && !"".equals(label)) { //$NON-NLS-1$
-			SWTFactory.createWrapLabel(comp, label, 1);
-		}
-		label = getViewerLabel();
-		if(label != null && !"".equals(label)) { //$NON-NLS-1$
-			SWTFactory.createLabel(comp, label, 1);
-		}
-		fViewer = createViewer(comp);
-		fViewer.setLabelProvider(getLabelProvider());
-		fViewer.setContentProvider(getContentProvider());
-		fViewer.setInput(getViewerInput());
-		List selectedElements = getInitialElementSelections();
-		if (selectedElements != null && !selectedElements.isEmpty()){
-			fViewer.setSelection(new StructuredSelection(selectedElements));
-		}
-		addViewerListeners(fViewer);
-		addCustomFooterControls(comp);
-		Dialog.applyDialogFont(comp);
-		String help = getHelpContextId();
-		if(help != null) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, help);
-		}
-		return comp;
-	}
-	
-	/**
-	 * This method returns the label describing what to do with the viewer. Typically this label
-	 * will include the key accelerator to get to the viewer via the keyboard
-	 * @return the label for the viewer
-	 */
-	abstract protected String getViewerLabel();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getDialogBoundsSettings()
-	 */
-	protected IDialogSettings getDialogBoundsSettings() {
-		IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-		IDialogSettings section = settings.getSection(getDialogSettingsId());
-		if (section == null) {
-			section = settings.addNewSection(getDialogSettingsId());
-		} 
-		return section;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		IDialogSettings settings = getDialogBoundsSettings();
-		if(settings != null) {
-			try {
-				int width = settings.getInt("DIALOG_WIDTH"); //$NON-NLS-1$
-				int height = settings.getInt("DIALOG_HEIGHT"); //$NON-NLS-1$
-				if(width > 0 & height > 0) {
-					return new Point(width, height);
-				}
-			}
-			catch (NumberFormatException nfe) {
-				return new Point(350, 350);
-			}
-		}
-		return new Point(350, 350);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointImageProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointImageProvider.java
deleted file mode 100644
index 6f8b99e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointImageProvider.java
+++ /dev/null
@@ -1,56 +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.debug.internal.ui;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.texteditor.IAnnotationImageProvider;
-import org.eclipse.ui.texteditor.MarkerAnnotation;
-
-/**
- * Provides managed images for breakpoint annotations.
- * @since 3.0
- */
-public class BreakpointImageProvider implements IAnnotationImageProvider {
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getManagedImage(org.eclipse.jface.text.source.Annotation)
-	 */
-	public Image getManagedImage(Annotation annotation) {
-		if (annotation instanceof MarkerAnnotation) {
-			IMarker marker = ((MarkerAnnotation)annotation).getMarker();
-			if (marker != null) {
-				IBreakpoint breakpoint = DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
-				if (breakpoint != null) {
-					return DebugUIPlugin.getModelPresentation().getImage(breakpoint);
-				}
-			}
-		}
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getImageDescriptorId(org.eclipse.jface.text.source.Annotation)
-	 */
-	public String getImageDescriptorId(Annotation annotation) {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getImageDescriptor(java.lang.String)
-	 */
-	public ImageDescriptor getImageDescriptor(String imageDescritporId) {
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.java
deleted file mode 100644
index a09ae6d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.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.debug.internal.ui;
-
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Generic color manager.
- */
-public class ColorManager {	
-	
-	private static ColorManager fgColorManager;
-	
-	private ColorManager() {
-	}
-	
-	public static ColorManager getDefault() {
-		if (fgColorManager == null) {
-			fgColorManager= new ColorManager();
-		}
-		return fgColorManager;
-	}
-	
-	protected Map fColorTable= new HashMap(10);
-	
-	public Color getColor(RGB rgb) {
-		Color color= (Color) fColorTable.get(rgb);
-		if (color == null) {
-			color= new Color(Display.getCurrent(), rgb);
-			fColorTable.put(rgb, color);
-		}
-		return color;
-	}
-	
-	public void dispose() {
-		Iterator e= fColorTable.values().iterator();
-		while (e.hasNext())
-			((Color) e.next()).dispose();
-	}
-}
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CompositeDebugImageDescriptor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CompositeDebugImageDescriptor.java
deleted file mode 100644
index e43235c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CompositeDebugImageDescriptor.java
+++ /dev/null
@@ -1,122 +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.debug.internal.ui;
-
-
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * A JDIImageDescriptor consists of a main icon and several adornments. The adornments
- * are computed according to flags set on creation of the descriptor.
- */
-public class CompositeDebugImageDescriptor extends CompositeImageDescriptor {
-	
-	/** Flag to render the skip breakpoint adornment */
-	public final static int SKIP_BREAKPOINT= 			0x0001;
-	
-	private Image fBaseImage;
-	private int fFlags;
-	private Point fSize;
-	
-	/**
-	 * Create a new composite image descriptor.
-	 * 
-	 * @param baseImage an image used as the base image
-	 * @param flags flags indicating which adornments are to be rendered
-	 * 
-	 */
-	public CompositeDebugImageDescriptor(Image baseImage, int flags) {
-		setBaseImage(baseImage);
-		setFlags(flags);
-	}
-	
-	/**
-	 * @see CompositeImageDescriptor#getSize()
-	 */
-	protected Point getSize() {
-		if (fSize == null) {
-			ImageData data= getBaseImage().getImageData();
-			setSize(new Point(data.width, data.height));
-		}
-		return fSize;
-	}
-	
-	/**
-	 * @see Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {
-		if (!(object instanceof CompositeDebugImageDescriptor)){
-			return false;
-		}
-		CompositeDebugImageDescriptor other= (CompositeDebugImageDescriptor)object;
-		return (getBaseImage().equals(other.getBaseImage()) && getFlags() == other.getFlags());
-	}
-	
-	/**
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return getBaseImage().hashCode() | getFlags();
-	}
-	
-	/**
-	 * @see CompositeImageDescriptor#drawCompositeImage(int, int)
-	 */
-	protected void drawCompositeImage(int width, int height) {
-		ImageData bg= getBaseImage().getImageData();
-		if (bg == null) {
-			bg= DEFAULT_IMAGE_DATA;
-		}
-		drawImage(bg, 0, 0);
-		drawOverlays();
-	}
-
-	/**
-	 * Add any overlays to the image as specified in the flags.
-	 */
-	protected void drawOverlays() {
-		int flags= getFlags();
-		int x= 0;
-		int y= 0;
-		ImageData data= null;
-		if ((flags & SKIP_BREAKPOINT) != 0) {
-			x= 0;
-			y= 0;
-			data= DebugUITools.getImage(IDebugUIConstants.IMG_OVR_SKIP_BREAKPOINT).getImageData();
-			drawImage(data, x, y);
-		}
-	}
-	
-	protected Image getBaseImage() {
-		return fBaseImage;
-	}
-    
-    protected void setBaseImage(Image image) {
-        fBaseImage = image;
-    }
-
-	protected int getFlags() {
-		return fFlags;
-	}
-
-	protected void setFlags(int flags) {
-		fFlags = flags;
-	}
-
-	protected void setSize(Point size) {
-		fSize = size;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugModelPropertyTester.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugModelPropertyTester.java
deleted file mode 100644
index e2b4b3c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugModelPropertyTester.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.debug.internal.ui;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.ITerminate;
-
-/**
- * This class is used to check properties of a debug model.  Two properties can be checked.
- * Using "getModelIdentifier" compares the debug model identifier of the receiver against the
- * expected value passed as an argument.  The "isTerminatedOrDisconnected" property checks if
- * the receiver is terminated or disconnected.
- *
- *	@since 3.3
- */
-public class DebugModelPropertyTester extends PropertyTester {
-
-	public static final String MODEL_TYPE_PROPERTY = "getModelIdentifier"; //$NON-NLS-1$
-	public static final String IS_TERMINATED_OR_DISCONNECTED_PROPERTY = "isTerminatedOrDisconnected"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.expressions.PropertyTester#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 (MODEL_TYPE_PROPERTY.equals(property)){
-			IDebugTarget target = null;
-			if(receiver instanceof IProcess) {
-				target = (IDebugTarget) ((IProcess)receiver).getAdapter(IDebugTarget.class);
-			}
-			else if(receiver instanceof IDebugElement) { 
-				target = (IDebugTarget) ((IDebugElement)receiver).getAdapter(IDebugTarget.class);
-			}
-			if(target != null) {
-				// check that the expected value argument is valid
-				if (expectedValue == null || expectedValue.equals("")){ //$NON-NLS-1$
-					return false;
-				}
-				//!target.isTerminated() && !target.isDisconnected() 
-				if(expectedValue.equals(target.getModelIdentifier())) {
-					return true;
-				}
-			}
-			return false;
-		} else if (IS_TERMINATED_OR_DISCONNECTED_PROPERTY.equals(property)){
-			if (receiver instanceof ITerminate && ((ITerminate)receiver).isTerminated()){
-				return true;
-			} if (receiver instanceof IDisconnect && ((IDisconnect)receiver).isDisconnected()){
-				return true;
-			} else {
-				return false;
-			}
-		} else {
-			return false;
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspectiveFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspectiveFactory.java
deleted file mode 100644
index 93b2f7d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspectiveFactory.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.debug.internal.ui;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.console.IConsoleConstants;
-
-/**
- * The debug perspective factory.
- */
-public class DebugPerspectiveFactory implements IPerspectiveFactory {
-	
-	/**
-	 * @see IPerspectiveFactory#createInitialLayout(IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		
-		IFolderLayout consoleFolder = layout.createFolder(IInternalDebugUIConstants.ID_CONSOLE_FOLDER_VIEW, IPageLayout.BOTTOM, (float)0.75, layout.getEditorArea());
-		consoleFolder.addView(IConsoleConstants.ID_CONSOLE_VIEW);
-		consoleFolder.addView(IPageLayout.ID_TASK_LIST);
-		consoleFolder.addPlaceholder(IPageLayout.ID_BOOKMARKS);
-		consoleFolder.addPlaceholder(IPageLayout.ID_PROP_SHEET);
-		
-		IFolderLayout navFolder= layout.createFolder(IInternalDebugUIConstants.ID_NAVIGATOR_FOLDER_VIEW, IPageLayout.TOP, (float) 0.45, layout.getEditorArea());
-		navFolder.addView(IDebugUIConstants.ID_DEBUG_VIEW);
-		navFolder.addPlaceholder(IPageLayout.ID_RES_NAV);
-		
-		IFolderLayout toolsFolder= layout.createFolder(IInternalDebugUIConstants.ID_TOOLS_FOLDER_VIEW, IPageLayout.RIGHT, (float) 0.50, IInternalDebugUIConstants.ID_NAVIGATOR_FOLDER_VIEW);
-		toolsFolder.addView(IDebugUIConstants.ID_VARIABLE_VIEW);
-		toolsFolder.addView(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-		toolsFolder.addPlaceholder(IDebugUIConstants.ID_EXPRESSION_VIEW);
-		toolsFolder.addPlaceholder(IDebugUIConstants.ID_REGISTER_VIEW);
-		
-		IFolderLayout outlineFolder= layout.createFolder(IInternalDebugUIConstants.ID_OUTLINE_FOLDER_VIEW, IPageLayout.RIGHT, (float) 0.75, layout.getEditorArea());
-		outlineFolder.addView(IPageLayout.ID_OUTLINE);
-		
-		layout.addActionSet(IDebugUIConstants.LAUNCH_ACTION_SET);
-		layout.addActionSet(IDebugUIConstants.DEBUG_ACTION_SET);
-		
-		setContentsOfShowViewMenu(layout);
-	}
-	
-	/** 
-	 * Sets the initial contents of the "Show View" menu.
-	 */
-	protected void setContentsOfShowViewMenu(IPageLayout layout) {
-		layout.addShowViewShortcut(IDebugUIConstants.ID_DEBUG_VIEW);
-		layout.addShowViewShortcut(IDebugUIConstants.ID_VARIABLE_VIEW);
-		layout.addShowViewShortcut(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-		layout.addShowViewShortcut(IDebugUIConstants.ID_EXPRESSION_VIEW);
-		layout.addShowViewShortcut(IPageLayout.ID_OUTLINE);
-		layout.addShowViewShortcut(IConsoleConstants.ID_CONSOLE_VIEW);
-		layout.addShowViewShortcut(IPageLayout.ID_TASK_LIST);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java
deleted file mode 100644
index e047cee..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 114664
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.osgi.framework.Bundle;
-
-/**
- * The images provided by the debug plugin.
- */
-public class DebugPluginImages {
-
-	/** 
-	 * The image registry containing <code>Image</code>s and <code>ImageDescriptor</code>s.
-	 */
-	private static ImageRegistry imageRegistry;
-	
-	private static final String ATTR_LAUNCH_CONFIG_TYPE_ICON = "icon"; //$NON-NLS-1$
-	private static final String ATTR_LAUNCH_CONFIG_TYPE_ID = "configTypeID"; //$NON-NLS-1$
-	
-	private static String ICONS_PATH = "$nl$/icons/full/"; //$NON-NLS-1$
-
-	// Use IPath and toOSString to build the names to ensure they have the slashes correct
-	private final static String CTOOL= ICONS_PATH + "etool16/"; //basic colors - size 16x16 //$NON-NLS-1$
-    private final static String DTOOL= ICONS_PATH + "dtool16/"; //basic colors - size 16x16 //$NON-NLS-1$
-	private final static String DLCL= ICONS_PATH + "dlcl16/"; //disabled - size 16x16 //$NON-NLS-1$
-	private final static String ELCL= ICONS_PATH + "elcl16/"; //enabled - size 16x16 //$NON-NLS-1$
-	private final static String OBJECT= ICONS_PATH + "obj16/"; //basic colors - size 16x16 //$NON-NLS-1$
-	private final static String WIZBAN= ICONS_PATH + "wizban/"; //basic colors - size 16x16 //$NON-NLS-1$
-	private final static String OVR= ICONS_PATH + "ovr16/"; //basic colors - size 7x8 //$NON-NLS-1$
-	private final static String VIEW= ICONS_PATH + "eview16/"; // views //$NON-NLS-1$
-	
-	/**
-	 * Declare all images
-	 */
-	private static void declareImages() {
-		// Actions
-		declareRegistryImage(IDebugUIConstants.IMG_ACT_DEBUG, CTOOL + "debug_exc.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_ACT_RUN, CTOOL + "run_exc.gif"); //$NON-NLS-1$
-        declareRegistryImage(IDebugUIConstants.IMG_ACT_SYNCED, ELCL + "synced.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_SKIP_BREAKPOINTS, ELCL + "skip_brkp.gif"); //$NON-NLS-1$
-		
-		//menus
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_CHANGE_VARIABLE_VALUE, ELCL + "changevariablevalue_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_CHANGE_VARIABLE_VALUE, DLCL + "changevariablevalue_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_CHANGE_VARIABLE_VALUE, ELCL + "changevariablevalue_co.gif"); //$NON-NLS-1$
-		
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_CONTENT_ASSIST, ELCL + "metharg_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_DLCL_CONTENT_ASSIST, DLCL + "metharg_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_ELCL_CONTENT_ASSIST, ELCL + "metharg_obj.gif"); //$NON-NLS-1$
-		
-		//Local toolbars
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_DETAIL_PANE, ELCL + "toggledetailpane_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_DETAIL_PANE_UNDER, ELCL + "det_pane_under.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_DETAIL_PANE_RIGHT, ELCL + "det_pane_right.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_DETAIL_PANE_HIDE, ELCL + "det_pane_hide.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_LOCK, ELCL + "lock_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_TYPE_NAMES, ELCL + "tnames_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_DISCONNECT, ELCL + "disconnect_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_LCL_REMOVE_ALL, ELCL + "rem_all_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IDebugUIConstants.IMG_LCL_REMOVE, ELCL + "rem_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_SHOW_LOGICAL_STRUCTURE, ELCL + "var_cntnt_prvdr.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_COLLAPSE_ALL, ELCL + "collapseall.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_TERMINATE, ELCL + "terminate_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_RUN_TO_LINE, ELCL + "runtoline_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_MONITOR_EXPRESSION, ELCL + "monitorexpression_tsk.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_REMOVE_MEMORY, ELCL + "removememory_tsk.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_RESET_MEMORY, ELCL + "memoryreset_tsk.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_COPY_VIEW_TO_CLIPBOARD, ELCL + "copyviewtoclipboard_tsk.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_LCL_PRINT_TOP_VIEW_TAB, ELCL + "printview_tsk.gif"); //$NON-NLS-1$
-			
-		// disabled local toolbars
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE, DLCL + "toggledetailpane_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_UNDER, DLCL + "det_pane_under.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_RIGHT, DLCL + "det_pane_right.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_HIDE, DLCL + "det_pane_hide.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_LOCK, DLCL + "lock_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TYPE_NAMES, DLCL + "tnames_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_SHOW_LOGICAL_STRUCTURE, DLCL + "var_cntnt_prvdr.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_COLLAPSE_ALL, DLCL + "collapseall.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TERMINATE, DLCL + "terminate_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_REMOVE_ALL, DLCL + "rem_all_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_REMOVE, DLCL + "rem_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_RUN_TO_LINE, DLCL + "runtoline_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_MONITOR_EXPRESSION, DLCL + "monitorexpression_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_REMOVE_MEMORY, DLCL + "removememory_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_RESET_MEMORY, DLCL + "memoryreset_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_COPY_VIEW_TO_CLIPBOARD, DLCL + "copyviewtoclipboard_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_PRINT_TOP_VIEW_TAB, DLCL + "printview_tsk.gif");  //$NON-NLS-1$		
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DUPLICATE_CONFIG, DLCL + "copy_edit_co.gif");   //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_NEW_CONFIG, DLCL + "new_con.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DELETE_CONFIG, DLCL + "rem_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_FILTER_CONFIGS, DLCL + "filter_ps.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DISCONNECT, DLCL + "disconnect_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_SUSPEND, DLCL + "suspend_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_RESUME, DLCL + "resume_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_STEP_RETURN, DLCL+ "stepreturn_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_STEP_OVER, DLCL + "stepover_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_STEP_INTO, DLCL + "stepinto_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_AND_REMOVE, DLCL + "terminate_rem_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_ALL, DLCL + "terminate_all_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_AND_RELAUNCH, DTOOL + "term_restart.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TOGGLE_STEP_FILTERS, DLCL+"stepbystep_co.gif"); //$NON-NLS-1$
-        
-		// enabled local toolbars
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE, ELCL + "toggledetailpane_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_UNDER, ELCL + "det_pane_under.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_RIGHT, ELCL + "det_pane_right.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_HIDE, ELCL + "det_pane_hide.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_LOCK, ELCL + "lock_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TYPE_NAMES, ELCL + "tnames_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_SHOW_LOGICAL_STRUCTURE, ELCL + "var_cntnt_prvdr.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_COLLAPSE_ALL, ELCL + "collapseall.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TERMINATE, ELCL + "terminate_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_MONITOR_EXPRESSION, ELCL + "monitorexpression_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_REMOVE_MEMORY, ELCL + "removememory_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_RESET_MEMORY, ELCL + "memoryreset_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_COPY_VIEW_TO_CLIPBOARD, ELCL + "copyviewtoclipboard_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_PRINT_TOP_VIEW_TAB, ELCL + "printview_tsk.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_REMOVE_ALL, ELCL + "rem_all_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_REMOVE, ELCL + "rem_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_HIERARCHICAL, ELCL + "hierarchicalLayout.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_FILTER_CONFIGS, ELCL + "filter_ps.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DUPLICATE_CONFIG, ELCL + "copy_edit_co.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_NEW_CONFIG, ELCL + "new_con.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DELETE_CONFIG, ELCL + "delete_config.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_SUSPEND, ELCL + "suspend_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_RESUME, ELCL + "resume_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STEP_RETURN, ELCL + "stepreturn_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STEP_OVER, ELCL + "stepover_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STEP_INTO, ELCL + "stepinto_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DROP_TO_FRAME, ELCL + "drop_to_frame.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_REMOVE, ELCL + "terminate_rem_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_ALL, ELCL + "terminate_all_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_RELAUNCH, CTOOL + "term_restart.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TOGGLE_STEP_FILTERS, ELCL+"stepbystep_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STANDARD_OUT, ELCL+"writeout_co.gif"); //$NON-NLS-1$
-        declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STANDARD_ERR, ELCL+"writeerr_co.gif"); //$NON-NLS-1$
-        
-		//Object
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_LAUNCH_DEBUG, OBJECT + "ldebug_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_LAUNCH_RUN, OBJECT + "lrun_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_LAUNCH_RUN_TERMINATED, OBJECT + "terminatedlaunch_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET, OBJECT + "debugt_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_SUSPENDED, OBJECT + "debugts_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED, OBJECT + "debugtt_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_THREAD_RUNNING, OBJECT + "thread_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED, OBJECT + "threads_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED, OBJECT + "threadt_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_STACKFRAME, OBJECT + "stckframe_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_STACKFRAME_RUNNING, OBJECT + "stckframe_running_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_VARIABLE, OBJECT + "genericvariable_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_REGISTER, OBJECT + "genericregister_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_REGISTER_GROUP, OBJECT + "genericreggroup_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT, OBJECT + "brkp_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED, OBJECT + "brkpd_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT_GROUP, OBJECT + "brkp_grp.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT_GROUP_DISABLED, OBJECT + "brkp_grp_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_WATCHPOINT, OBJECT + "readwrite_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_WATCHPOINT_DISABLED, OBJECT + "readwrite_obj_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_ACCESS_WATCHPOINT, OBJECT + "read_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_ACCESS_WATCHPOINT_DISABLED, OBJECT + "read_obj_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_MODIFICATION_WATCHPOINT, OBJECT + "write_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_MODIFICATION_WATCHPOINT_DISABLED, OBJECT + "write_obj_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_OS_PROCESS, OBJECT + "osprc_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_OS_PROCESS_TERMINATED, OBJECT + "osprct_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_EXPRESSION, OBJECT + "expression_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_INSTRUCTION_POINTER_TOP, OBJECT + "inst_ptr_top.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_INSTRUCTION_POINTER, OBJECT + "inst_ptr.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJS_ARRAY_PARTITION, OBJECT + "arraypartition_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_ENV_VAR, OBJECT + "envvar_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY_CHANGED, OBJECT + "memorychanged_obj.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY, OBJECT + "memory_obj.gif");  //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJS_BREAKPOINT_TYPE, OBJECT + "brkp_type.gif");  //$NON-NLS-1$
-		
-		// tabs
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJS_COMMON_TAB, OBJECT + "common_tab.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJS_REFRESH_TAB, OBJECT + "refresh_tab.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OBJS_PERSPECTIVE_TAB, OBJECT + "persp_tab.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_OBJS_ENVIRONMENT, OBJECT + "environment_obj.gif"); //$NON-NLS-1$
-		
-		// Views
-		declareRegistryImage(IDebugUIConstants.IMG_VIEW_BREAKPOINTS, VIEW + "breakpoint_view.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_VIEW_EXPRESSIONS, VIEW + "watchlist_view.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_VIEW_LAUNCHES, VIEW + "debug_view.gif"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_VIEW_VARIABLES, VIEW + "variable_view.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_CVIEW_MEMORY_VIEW, VIEW + "memory_view.gif");  //$NON-NLS-1$
-		
-		// Perspectives
-		declareRegistryImage(IDebugUIConstants.IMG_PERSPECTIVE_DEBUG, VIEW + "debug_persp.gif"); //$NON-NLS-1$
-		
-		//Wizard Banners
-		declareRegistryImage(IDebugUIConstants.IMG_WIZBAN_DEBUG, WIZBAN + "debug_wiz.png"); //$NON-NLS-1$
-		declareRegistryImage(IDebugUIConstants.IMG_WIZBAN_RUN, WIZBAN + "run_wiz.png"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_WIZBAN_IMPORT_BREAKPOINTS, WIZBAN + "import_brkpts_wizban.png"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_WIZBAN_EXPORT_BREAKPOINTS, WIZBAN + "export_brkpts_wizban.png"); //$NON-NLS-1$
-			
-		// Overlays
-		declareRegistryImage(IDebugUIConstants.IMG_OVR_ERROR, OVR + "error.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_OVR_TRANSPARENT, OVR + "transparent.gif"); //$NON-NLS-1$
-        declareRegistryImage(IDebugUIConstants.IMG_OVR_SKIP_BREAKPOINT, OVR + "skip_breakpoint_ov.gif"); //$NON-NLS-1$
-				
-		//source location
-		declareRegistryImage(IInternalDebugUIConstants.IMG_SRC_LOOKUP_MENU, ELCL + "edtsrclkup_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_SRC_LOOKUP_MENU_DLCL, DLCL + "edtsrclkup_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_SRC_LOOKUP_MENU_ELCL, ELCL + "edtsrclkup_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_SRC_LOOKUP_TAB, ELCL + "edtsrclkup_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ADD_SRC_LOC_WIZ, WIZBAN + "addsrcloc_wiz.png"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_EDIT_SRC_LOC_WIZ, WIZBAN + "edtsrclkup_wiz.png"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_ADD_SRC_DIR_WIZ, WIZBAN + "adddir_wiz.png"); //$NON-NLS-1$
-		declareRegistryImage(IInternalDebugUIConstants.IMG_EDIT_SRC_DIR_WIZ, WIZBAN + "editdir_wiz.png"); //$NON-NLS-1$
-		
-		// launch configuration types
-		//try to get the images from the config types themselves, cache those that could not be found
-		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_LAUNCH_CONFIGURATION_TYPE_IMAGES);
-		IConfigurationElement[] configElements= extensionPoint.getConfigurationElements();
-		for (int i = 0; i < configElements.length; i++) {
-			IConfigurationElement configElement = configElements[i];
-			ImageDescriptor descriptor = DebugUIPlugin.getImageDescriptor(configElement, ATTR_LAUNCH_CONFIG_TYPE_ICON);
-			if (descriptor == null) {
-				descriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			String configTypeID = configElement.getAttribute(ATTR_LAUNCH_CONFIG_TYPE_ID);
-			if (configTypeID == null) {
-				// bug 12652
-				configTypeID = configElement.getAttribute(IConfigurationElementConstants.TYPE);
-			}			
-			imageRegistry.put(configTypeID, descriptor);				
-		}
-	}
-
-	/**
-	 * Declare an Image in the registry table.
-	 * @param key 	The key to use when registering the image
-	 * @param path	The path where the image can be found. This path is relative to where
-	 *				this plugin class is found (i.e. typically the packages directory)
-	 */
-	private final static void declareRegistryImage(String key, String path) {
-		ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
-		Bundle bundle = Platform.getBundle(DebugUIPlugin.getUniqueIdentifier());
-		URL url = null;
-		if (bundle != null){
-			url = FileLocator.find(bundle, new Path(path), null);
-			desc = ImageDescriptor.createFromURL(url);
-		}
-		imageRegistry.put(key, desc);
-	}
-	
-	/**
-	 * Returns the ImageRegistry.
-	 */
-	public static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			initializeImageRegistry();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 *	Initialize the image registry by declaring all of the required
-	 *	graphics. This involves creating JFace image descriptors describing
-	 *	how to create/find the image should it be needed.
-	 *	The image is not actually allocated until requested.
-	 *
-	 * 	Prefix conventions
-	 *		Wizard Banners			WIZBAN_
-	 *		Preference Banners		PREF_BAN_
-	 *		Property Page Banners	PROPBAN_
-	 *		Color toolbar			CTOOL_
-	 *		Enable toolbar			ETOOL_
-	 *		Disable toolbar			DTOOL_
-	 *		Local enabled toolbar	ELCL_
-	 *		Local Disable toolbar	DLCL_
-	 *		Object large			OBJL_
-	 *		Object small			OBJS_
-	 *		View 					VIEW_
-	 *		Product images			PROD_
-	 *		Misc images				MISC_
-	 *
-	 *	Where are the images?
-	 *		The images (typically gifs) are found in the same location as this plugin class.
-	 *		This may mean the same package directory as the package holding this class.
-	 *		The images are declared using this.getClass() to ensure they are looked up via
-	 *		this plugin class.
-	 * @see org.eclipse.jface.resource.ImageRegistry
-	 */
-	public synchronized static ImageRegistry initializeImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry(DebugUIPlugin.getStandardDisplay());
-			declareImages();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 * Returns the <code>Image</code> identified by the given key,
-	 * or <code>null</code> if it does not exist.
-	 */
-	public static Image getImage(String key) {
-		return getImageRegistry().get(key);
-	}
-	
-	/**
-	 * Returns the <code>ImageDescriptor</code> identified by the given key,
-	 * or <code>null</code> if it does not exist.
-	 */
-	public static ImageDescriptor getImageDescriptor(String key) {
-		return getImageRegistry().getDescriptor(key);
-	}
-}
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIAdapterFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIAdapterFactory.java
deleted file mode 100644
index e788f80..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIAdapterFactory.java
+++ /dev/null
@@ -1,61 +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.debug.internal.ui;
-
- 
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainerWorkbenchAdapter;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointPersistableElementAdapter;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.model.IWorkbenchAdapter2;
-
-public class DebugUIAdapterFactory implements IAdapterFactory {
-
-	/**
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(Object, Class)
-	 */
-	public Object getAdapter(Object obj, Class adapterType) {
-		if (adapterType.isInstance(obj)) {
-			return obj;
-		}
-		
-		if (adapterType == IPersistableElement.class) {
-			if (obj instanceof IBreakpoint) {
-			    return new BreakpointPersistableElementAdapter((IBreakpoint)obj);
-            }
-		}
-        
-        if (adapterType == IWorkbenchAdapter.class) {
-            if (obj instanceof BreakpointContainer) {
-                return new BreakpointContainerWorkbenchAdapter();
-            }
-        }
-		
-        if (adapterType == IWorkbenchAdapter2.class) {
-            if (obj instanceof BreakpointContainer) {
-                return new BreakpointContainerWorkbenchAdapter();
-            }
-        }
-        
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] {IPersistableElement.class, IWorkbenchAdapter.class, IWorkbenchAdapter2.class};
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIMessages.java
deleted file mode 100644
index 5b77548..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIMessages.java
+++ /dev/null
@@ -1,238 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-public class DebugUIMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.DebugUIMessages";//$NON-NLS-1$
-
-    public static String AbstractAsyncTableRendering_2;
-
-	public static String AbstractDebugCheckboxSelectionDialog_0;
-
-	public static String AbstractDebugCheckboxSelectionDialog_1;
-
-	public static String DebugUIPlugin_23;
-	public static String DebugUIPlugin_24;
-	public static String DebugUIPlugin_0;
-
-	public static String DebugUIPlugin_25;
-	public static String DebugUIPlugin_Build_error__Check_log_for_details__2;
-	public static String DebugUIPlugin_Run_Debug_1;
-
-	public static String DefaultLabelProvider__disconnected__1;
-	public static String DefaultLabelProvider_1;
-	public static String DefaultLabelProvider__unknown__1;
-	public static String DefaultLabelProvider_Breakpoint_1;
-	public static String DefaultLabelProvider_12;
-	public static String DefaultLabelProvider_13;
-	public static String DefaultLabelProvider_15;
-	public static String DefaultLabelProvider_16;
-	public static String MultipleInputDialog_6;
-	public static String MultipleInputDialog_7;
-	public static String MultipleInputDialog_8;
-
-	public static String SwitchMemoryBlockAction_4;
-
-    public static String WorkingDirectoryStatusHandler_0;
-	public static String WorkingDirectoryStatusHandler_Eclipse_Runtime_1;
-
-	public static String DebugUITools_3;
-	public static String DebugUITools_Error_1;
-	public static String DebugUITools_Exception_occurred_during_launch_2;
-
-	public static String InstructionPointerAnnotation_0;
-	public static String InstructionPointerAnnotation_1;
-
-	public static String DefaultLabelProvider_17;
-
-	//
-	// Action
-	//
-	public static String AddMemoryBlockAction_title;
-	public static String AddMemoryBlockAction_tooltip;
-	public static String AddMemoryBlockAction_failed;
-	public static String AddMemoryBlockAction_input_invalid;
-	public static String AddMemoryRenderingDialog_Memory_Monitor;
-	public static String AddMemoryRenderingAction_Add_renderings;
-	public static String AddMemoryRenderingDialog_Memory_renderings;
-	public static String AddMemoryRenderingDialog_Add_memory_rendering;
-	public static String AddMemoryRenderingAction_Add_rendering_failed;
-	public static String AddMemoryRenderingAction_Unable_to_add_selected_renderings;
-	public static String AddMemoryBlockAction_noMemoryBlock;
-	public static String AddMemoryRenderingDialog_Add_New;
-	public static String AddMemoryRenderingDialog_Unknown;
-	public static String RemoveMemoryBlockAction_title;
-	public static String RemoveMemoryBlockAction_tooltip;
-	public static String MemoryViewCellModifier_failure_title;
-	public static String MemoryViewCellModifier_failed;
-	public static String MemoryViewCellModifier_data_is_invalid;
-	public static String ResetMemoryBlockAction_title;
-	public static String ResetMemoryBlockAction_tootip;
-	public static String GoToAddressAction_title;
-	public static String GoToAddressAction_Go_to_address_failed;
-	public static String GoToAddressAction_Address_is_invalid;
-	public static String CopyViewToClipboardAction_title;
-	public static String CopyViewToClipboardAction_tooltip;
-	public static String PrintViewTabAction_title;
-	public static String PrintViewTabAction_tooltip;
-	public static String PrintViewTabAction_jobtitle;
-	public static String ReformatAction_title;
-
-	//
-	// Dialog
-	//
-	public static String MonitorMemoryBlockDialog_EnterExpressionToMonitor;
-	public static String MonitorMemoryBlockDialog_MonitorMemory;
-	public static String MonitorMemoryBlockDialog_NumberOfBytes;
-	public static String GoToAddressDialog_Address;
-	public static String GoToAddressDialog_GoToAddress;
-	public static String CodePagesPrefDialog_1;
-	public static String CodePagesPrefDialog_2;
-	public static String CodePagesPrefDialog_4;
-	public static String CodePagesPrefDialog_6;
-	public static String CodePagesPrefDialog_7;
-	public static String CodePagesPrefDialog_8;
-	public static String CodePagesPrefDialog_9;
-	public static String CodePagesPrefDialog_0;
-
-	//
-	// View Tab
-	//
-	public static String MemoryView_Memory_monitors;
-	public static String MemoryBlocksTreeViewPane_0;
-	public static String MemoryBlocksTreeViewPane_1;
-	public static String MemoryBlocksTreeViewPane_2;
-	public static String MemoryView_Memory_renderings;
-	public static String MemoryViewContentProvider_Unable_to_retrieve_content;
-
-	//
-	// Views
-	//
-	public static String RemoveMemoryRenderingAction_Remove_rendering;
-	public static String EmptyViewTab_Unable_to_create;
-	public static String CreateRenderingTab_Memory_monitor;
-	public static String CreateRenderingTab_Select_renderings_to_create;
-	public static String CreateRenderingTab_Add_renderings;
-	public static String CreateRenderingTab_0;
-	public static String CreateRenderingTab_1;
-	public static String CreateRenderingTab_2;
-	public static String CreateRendering_0;
-	public static String CreateRendering_1;
-
-	//
-	// Managers
-	//
-	public static String ShowAddressColumnAction_0;
-	public static String ShowAddressColumnAction_1;
-	public static String ImageDescriptorRegistry_0;
-	public static String ErrorRendering_0;
-	public static String AbstractTableRendering_1;
-	public static String AbstractTableRendering_2;
-	public static String AbstractTableRendering_3;
-	public static String AbstractTableRendering_4;
-	public static String AbstractTableRendering_6;
-	public static String AbstractTableRendering_8;
-	public static String AbstractTableRendering_10;
-	public static String AbstractTableRendering_11;
-	public static String AbstractTableRendering_12;
-	public static String AbstractTableRendering_13;
-	public static String AbstractTableRendering_16;
-	public static String AbstractTableRendering_18;
-	public static String AbstractTableRendering_20;
-	public static String SetPaddedStringDialog_0;
-	public static String SetPaddedStringDialog_1;
-
-
-	public static String TableRenderingPropertiesPage_1;
-	public static String TableRenderingPropertiesPage_2;
-	public static String TableRenderingPropertiesPage_3;
-	public static String TableRenderingPropertiesPage_4;
-	public static String TableRenderingPropertiesPage_5;
-	public static String TableRenderingPropertiesPage_6;
-	public static String TableRenderingPropertiesPage_8;
-	public static String TableRenderingPropertiesPage_9;
-	public static String TableRenderingPropertiesPage_10;
-	public static String TableRenderingPropertiesPage_11;
-	public static String TableRenderingPropertiesPage_12;
-	public static String TableRenderingPropertiesPage_13;
-	public static String TableRenderingPropertiesPage_14;
-	public static String TableRenderingPropertiesPage_15;
-	public static String TableRenderingPropertiesPage_16;
-	public static String TableRenderingPropertiesPage_17;
-	public static String TableRenderingPropertiesPage_18;
-	public static String TableRenderingPropertiesPage_19;
-	public static String TableRenderingPropertiesPage_20;
-	public static String TableRenderingPropertiesPage_21;
-	public static String TableRenderingPropertiesPage_22;
-	public static String TableRenderingPropertiesPage_23;
-	public static String TableRenderingPropertiesPage_25;
-	public static String TableRenderingPropertiesPage_26;
-	public static String TableRenderingPrefAction_0;
-	public static String TableRenderingPreferencePage_0;
-	public static String TableRenderingPreferencePage_2;
-	public static String TableRenderingPreferencePage_3;
-	public static String TableRenderingPreferencePage_4;
-	public static String TableRenderingPreferencePage_5;
-	public static String TableRenderingPreferencePage_6;
-	public static String TableRenderingPreferencePage_7;
-	public static String TableRenderingPreferencePage_8;
-	public static String TableRenderingPreferencePage_9;
-	public static String TableRenderingPreferencePage_10;
-	public static String TableRenderingContentProvider_0;
-	public static String TableRenderingContentProvider_1;
-	public static String TableRenderingContentProvider_2;
-	public static String SwitchMemoryBlockAction_0;
-	public static String ResetMemoryBlockPreferencePage_0;
-	public static String ResetMemoryBlockPreferencePage_1;
-	public static String ResetMemoryBlockPreferencePage_2;
-	public static String ResetMemoryBlockPreferencePage_3;
-	public static String FormatTableRenderingAction_0;
-	public static String FormatTableRenderingAction_1;
-	public static String FormatTableRenderingAction_2;
-	public static String FormatTableRenderingAction_3;
-	public static String FormatTableRenderingAction_4;
-	public static String FormatTableRenderingAction_5;
-	public static String FormatTableRenderingAction_6;
-	public static String FormatTableRenderingAction_7;
-	public static String FormatTableRenderingAction_8;
-	public static String FormatTableRenderingAction_9;
-	public static String FormatTableRenderingAction_11;
-	public static String FormatTableRenderingAction_13;
-	public static String FormatTableRenderingAction_15;
-	public static String FormatTableRenderingAction_16;
-	public static String FormatTableRenderingDialog_0;
-	public static String FormatTableRenderingDialog_1;
-	public static String FormatTableRenderingDialog_2;
-	public static String FormatTableRenderingDialog_3;
-	public static String FormatTableRenderingDialog_4;
-	public static String FormatTableRenderingDialog_5;
-	public static String AbstractAsyncTableRendering_1;
-	public static String CreateRendering_2;
-	public static String SetPaddedStringPreferencePage_0;
-	public static String ViewPaneOrientationAction_0;
-	public static String ViewPaneOrientationAction_1;
-	public static String ViewPaneOrientationAction_2;
-	public static String ViewPaneOrientationAction_3;
-	public static String GoToAddressComposite_0;
-	public static String GoToAddressComposite_1;
-	public static String GoToAddressComposite_2;
-	public static String GoToAddressComposite_4;
-	public static String GoToAddressComposite_5;
-	public static String GoToAddressComposite_6;
-	public static String GoToAddressComposite_7;
-	
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, DebugUIMessages.class);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIMessages.properties
deleted file mode 100644
index c3e9d37..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIMessages.properties
+++ /dev/null
@@ -1,219 +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
-###############################################################################
-
-DebugUIPlugin_23=Build in Progress
-DebugUIPlugin_24=Wait for build to finish?
-DebugUIPlugin_25=Launching {0}
-DebugUIPlugin_0=\ (waiting for build...)
-DebugUIPlugin_Build_error__Check_log_for_details__2=Build error. Check log for details.
-DebugUIPlugin_Run_Debug_1=Run/Debug
-
-DefaultLabelProvider__disconnected__1=<disconnected>
-DefaultLabelProvider_1=<terminated>
-DefaultLabelProvider__unknown__1=<unknown>
-DefaultLabelProvider_Breakpoint_1=Breakpoint
-DefaultLabelProvider_12=\ (pending)
-DefaultLabelProvider_13=\ <error(s)_during_the_evaluation>
-DefaultLabelProvider_15=\ (disabled)
-DefaultLabelProvider_16=<terminated, exit value: {0}>
-MultipleInputDialog_6=&Browse...
-MultipleInputDialog_7=Select a file:
-MultipleInputDialog_8=Varia&bles...
-
-WorkingDirectoryStatusHandler_Eclipse_Runtime_1=Eclipse Runtime
-WorkingDirectoryStatusHandler_0=Eclipse is not able to set the working directory specified by the program being launched as the current runtime does not support working directories.\nContinue launch without setting the working directory?
-
-DebugUITools_3=Launching 
-DebugUITools_Error_1=Error
-DebugUITools_Exception_occurred_during_launch_2=Exception occurred during launch
-
-InstructionPointerAnnotation_0=Debug Current Instruction Pointer
-InstructionPointerAnnotation_1=Debug Call Stack
-
-DefaultLabelProvider_17=\ [line: {0}]
-
-##############################################################
-# Action
-##############################################################
-AddMemoryBlockAction_title=Add Memory Monitor
-AddMemoryBlockAction_tooltip=Add Memory Monitor
-AddMemoryBlockAction_failed =Add Memory Monitor Failed.
-AddMemoryBlockAction_input_invalid = Input is invalid.
-AddMemoryRenderingDialog_Memory_Monitor=Memory Monitor
-AddMemoryRenderingAction_Add_renderings=Add Rendering(s)
-AddMemoryRenderingDialog_Memory_renderings=Memory Rendering(s)
-AddMemoryRenderingDialog_Add_memory_rendering=Add Memory Rendering
-AddMemoryRenderingAction_Add_rendering_failed=Add Rendering Failed
-AddMemoryRenderingAction_Unable_to_add_selected_renderings=Unable to add the selected rendering(s)
-AddMemoryBlockAction_noMemoryBlock = Failed to get memory monitor.
-AddMemoryRenderingDialog_Add_New=Add New...
-AddMemoryRenderingDialog_Unknown=Unknown
-RemoveMemoryBlockAction_title=Remove Memory Monitor
-RemoveMemoryBlockAction_tooltip=Remove Memory Monitor
-MemoryViewCellModifier_failure_title = Edit Memory
-MemoryViewCellModifier_failed = Edit failed:
-MemoryViewCellModifier_data_is_invalid = Data is invalid.
-ResetMemoryBlockAction_title = Reset to Base Address
-ResetMemoryBlockAction_tootip = Reset to Base Address
-ResetMemoryBlockPreferencePage_0=Reset Memory Monitor
-ResetMemoryBlockPreferencePage_1=When resetting memory monitor:
-ResetMemoryBlockPreferencePage_2=Reset visible renderings
-ResetMemoryBlockPreferencePage_3=Reset all renderings
-GoToAddressAction_title = Go to Address...
-GoToAddressComposite_0=Go to Address:
-GoToAddressComposite_1=OK
-GoToAddressComposite_2=Cancel
-GoToAddressComposite_4=Go to Offset:
-GoToAddressComposite_5=Jump Memory Units:
-GoToAddressComposite_6=Input as Hex
-GoToAddressComposite_7=Unable to calculate address from offset.
-GoToAddressAction_Go_to_address_failed = Go To Address Failed
-GoToAddressAction_Address_is_invalid = Address is invalid
-FormatTableRenderingAction_0=Format...
-FormatTableRenderingAction_1=Please specify column and row size.
-FormatTableRenderingAction_2=Row Size:
-FormatTableRenderingAction_3=unit(s) per row
-FormatTableRenderingAction_4=Column Size:
-FormatTableRenderingAction_5=unit(s) per column
-FormatTableRenderingAction_6=Restore Defaults
-FormatTableRenderingAction_7=Preview:
-FormatTableRenderingAction_8=Save as Defaults
-FormatTableRenderingAction_9=Preview is not available.
-FormatTableRenderingDialog_0=Default Row Size:
-FormatTableRenderingDialog_1=unit(s) per row
-FormatTableRenderingDialog_2=Default Column Size:
-FormatTableRenderingDialog_3=unit(s) per column
-FormatTableRenderingDialog_4=Failed to Save Settings
-FormatTableRenderingDialog_5=Default settings cannot be saved.
-CopyViewToClipboardAction_title = Copy To Clipboard
-CopyViewToClipboardAction_tooltip = Copy To Clipboard
-PrintViewTabAction_title = Print
-PrintViewTabAction_tooltip = Print
-PrintViewTabAction_jobtitle = Memory for
-ReformatAction_title = Resize to Fit
-
-##############################################################
-# Dialog
-##############################################################
-MonitorMemoryBlockDialog_EnterExpressionToMonitor = Enter address or expression to monitor:
-MonitorMemoryBlockDialog_MonitorMemory = Monitor Memory
-MonitorMemoryBlockDialog_NumberOfBytes = Number of bytes:
-GoToAddressDialog_Address = Address:
-GoToAddressDialog_GoToAddress = Go To Address...
-CodePagesPrefDialog_1=Select Codepages
-CodePagesPrefDialog_2=Memory to ASCII strings:
-CodePagesPrefDialog_4=Memory to EBCDIC strings:
-CodePagesPrefDialog_6=Invalid codepage
-CodePagesPrefDialog_7=ASCII codepage entered is invalid.
-CodePagesPrefDialog_8=Invalid codepage
-CodePagesPrefDialog_9=EBCDIC codepage entered is invalid.
-CodePagesPrefDialog_0=The codepage is not supported.
-
-##############################################################
-# View Tab
-##############################################################
-MemoryView_Memory_monitors=Monitors
-MemoryBlocksTreeViewPane_0=Remove All Memory Monitors
-MemoryBlocksTreeViewPane_1=Are you sure you want to remove all memory monitors?
-MemoryBlocksTreeViewPane_2=Remove All
-MemoryView_Memory_renderings=Renderings
-MemoryViewContentProvider_Unable_to_retrieve_content = Unable to retrieve content.
-
-##############################################################
-# Views
-##############################################################
-RemoveMemoryRenderingAction_Remove_rendering=Remove Rendering
-EmptyViewTab_Unable_to_create=Unable to create
-CreateRenderingTab_Memory_monitor=Memory Monitor:
-CreateRenderingTab_Select_renderings_to_create=Select rendering(s) to create:
-CreateRenderingTab_Add_renderings=Add Rendering(s)
-CreateRenderingTab_0=No rendering is selected.
-CreateRenderingTab_1=Add Rendering Failed
-CreateRenderingTab_2=No rendering is selected.
-CreateRendering_0=Add Memory Rendering Failed
-CreateRendering_1=Unable to add the selected rendering.
-CreateRendering_2=Pending
-
-##############################################################
-# Managers
-##############################################################
-ShowAddressColumnAction_0=Hide Address Column
-ShowAddressColumnAction_1=Show Address Column
-ImageDescriptorRegistry_0=Allocating image for wrong display
-ErrorRendering_0=Reason:\n
-AbstractTableRendering_1=Unable to get the base address from the memory block.
-AbstractTableRendering_2=Address
-AbstractTableRendering_3=Error occurred:\n
-AbstractTableRendering_8=Unknown
-AbstractTableRendering_4=Next Page
-AbstractTableRendering_6=Previous Page
-AbstractTableRendering_10=Unable to get base address.
-AbstractTableRendering_11=Address is out of range.
-AbstractTableRendering_12=Reset Failed.
-AbstractTableRendering_13=Unable to reset to the base address.
-AbstractTableRendering_20=Default format is invalid:
-AbstractTableRendering_16=Please specify row and column sizes to use.
-AbstractTableRendering_18=Save these settings to avoid this problem in the future.
-AbstractAsyncTableRendering_1=Pending...
-AbstractAsyncTableRendering_2=Create Table Rendering
-SetPaddedStringDialog_0=Padded String
-SetPaddedStringDialog_1=Enter string to show unretrievable memory.
-SetPaddedStringPreferencePage_0=Padded String:
-TableRenderingPropertiesPage_1=Rendering:
-TableRenderingPropertiesPage_2=Selected Address:
-TableRenderingPropertiesPage_3=units
-TableRenderingPropertiesPage_4=Length:
-TableRenderingPropertiesPage_5=Selected Content:
-TableRenderingPropertiesPage_6=Addressable Size:
-TableRenderingPropertiesPage_8=bits
-TableRenderingPropertiesPage_9=Changed:
-TableRenderingPropertiesPage_10=Changed:
-TableRenderingPropertiesPage_11=Unknown
-TableRenderingPropertiesPage_12=Unknown
-TableRenderingPropertiesPage_13=Big Endian
-TableRenderingPropertiesPage_14=Little Endian
-TableRenderingPropertiesPage_15=Unknown
-TableRenderingPropertiesPage_16=Data Endianess:
-TableRenderingPropertiesPage_17=Unknown
-TableRenderingPropertiesPage_18=Big Endian
-TableRenderingPropertiesPage_19=Little Endian
-TableRenderingPropertiesPage_20=Unknown
-TableRenderingPropertiesPage_21=Display Endianess:
-TableRenderingPropertiesPage_22=Readable:
-TableRenderingPropertiesPage_23=Writable:
-TableRenderingPropertiesPage_25=Line Address:
-TableRenderingPropertiesPage_26=Units Per Line:
-TableRenderingContentProvider_0=Unable to load memory from the specified address: 0x
-TableRenderingContentProvider_1=Buffer start and end address are invalid.
-TableRenderingContentProvider_2=Buffer start and end address are invalid.
-TableRenderingPreferencePage_10=Select memory loading mode when rendering is scrolled to end of buffer:
-TableRenderingPreferencePage_2=Number of lines per page:
-TableRenderingPreferencePage_3=Page size cannot be less than 1.
-TableRenderingPreferencePage_4=Sizes specified are invalid.
-TableRenderingPreferencePage_0=Automatic
-TableRenderingPreferencePage_5=Number of lines to preload
-TableRenderingPreferencePage_6=Before visible region:
-TableRenderingPreferencePage_7=After visible region:
-TableRenderingPreferencePage_8=Manual
-TableRenderingPreferencePage_9=Minimum number of lines to preload is 1.
-TableRenderingPrefAction_0=Table Renderings
-SwitchMemoryBlockAction_0=Unknown
-SwitchMemoryBlockAction_4=Pending
-FormatTableRenderingAction_11=Format specified is invalid.
-FormatTableRenderingAction_13=Column size cannot be larger than the row size.
-FormatTableRenderingAction_15=<Address>
-FormatTableRenderingAction_16=&Format...
-ViewPaneOrientationAction_0=Horizontal Orientation
-ViewPaneOrientationAction_1=Horizontal Orientation
-ViewPaneOrientationAction_2=Vertical Orientation
-ViewPaneOrientationAction_3=Vertical Orientation
-AbstractDebugCheckboxSelectionDialog_0=&Select All
-AbstractDebugCheckboxSelectionDialog_1=&Deselect All
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
deleted file mode 100644
index c03e66e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
+++ /dev/null
@@ -1,1203 +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
- *     Sascha Radike - bug 56642
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
- 
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IConfigurationElement;
-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.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.core.Launch;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.ClosedProjectFilter;
-import org.eclipse.debug.internal.ui.launchConfigurations.DeletedProjectFilter;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationEditDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationTypeFilter;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
-import org.eclipse.debug.internal.ui.launchConfigurations.PerspectiveManager;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupFacility;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupManager;
-import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointOrganizerManager;
-import org.eclipse.debug.internal.ui.views.console.ProcessConsoleManager;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementHelper;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-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.plugin.AbstractUIPlugin;
-import org.eclipse.ui.progress.IProgressService;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.util.tracker.ServiceTracker;
-import org.w3c.dom.Document;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * The Debug UI Plug-in.
- * 
- * Since 3.3 this plugin registers an <code>ISaveParticipant</code>, allowing this plugin to participate 
- * in workspace persistence life-cycles
- * 
- * @see ISaveParticipant
- * @see ILaunchListener
- * @see LaunchConfigurationManager
- * @see PerspectiveManager
- * @see ContextLaunch
- */
-public class DebugUIPlugin extends AbstractUIPlugin implements ILaunchListener {
-	
-	
-	/**
-	 * The singleton debug plug-in instance
-	 */
-	private static DebugUIPlugin fgDebugUIPlugin = null;
-	
-	/**
-	 * A utility presentation used to obtain labels
-	 */
-	protected static IDebugModelPresentation fgPresentation = null;
-
-	/**
-	 * Default label provider
-	 */	
-	private static DefaultLabelProvider fgDefaultLabelProvider;
-	
-	/**
-	 * Launch configuration attribute - used by the stand-in launch
-	 * config working copies that are created while a launch is waiting
-	 * for a build to finish. This attribute allows the EditLaunchConfigurationAction
-	 * to access the original config if the user asks to edit it.
-	 */
-	public static String ATTR_LAUNCHING_CONFIG_HANDLE= getUniqueIdentifier() + "launching_config_handle"; //$NON-NLS-1$
-	
-	/**
-	 * Singleton console document manager
-	 */
-	private ProcessConsoleManager fProcessConsoleManager = null;
-	
-	/**
-	 * Perspective manager
-	 */
-	private PerspectiveManager fPerspectiveManager = null;
-	
-	/**
-	 * Launch configuration manager
-	 */
-	private LaunchConfigurationManager fLaunchConfigurationManager = null;
-    
-	/**
-	 * Context launching manager
-	 */
-	private LaunchingResourceManager fContextLaunchingManager = null;
-	
-    /**
-     * Image descriptor registry used for images with common overlays.
-     * 
-     * @since 3.1
-     */
-    private ImageDescriptorRegistry fImageDescriptorRegistry;
-    
-    /**
-     * Service tracker and service used for finding plug-ins associated
-     * with a class.
-     */
-    private ServiceTracker fServiceTracker;
-    private PackageAdmin fPackageAdminService;
-    
-    /**
-     * A set of <code>ISaveParticipant</code>s that want to contribute to saving via this plugin
-     * 
-     * @since 3.3
-     */
-    private Set fSaveParticipants = new HashSet();
-    
-    public static boolean DEBUG = false;
-	
-    /**
-     * Dummy launch node representing a launch that is waiting
-     * for a build to finish before proceeding. This node exists
-     * to provide immediate feedback to the user in the Debug view and
-     * allows termination, which equates to cancellation of the launch.
-     */
-	public static class PendingLaunch extends Launch {
-        private Job fJob;
-        public PendingLaunch(ILaunchConfiguration launchConfiguration, String mode, Job job) {
-            super(launchConfiguration, mode, null);
-            fJob= job;
-        }
-
-        // Allow the user to terminate the dummy launch as a means to
-        // cancel the launch while waiting for a build to finish.
-        public boolean canTerminate() {
-            return true;
-        }
-
-        public void terminate() throws DebugException {
-            fJob.cancel();
-        }
-    }
-	
-	/**
-	 * Returns the bundle the given class originated from.
-	 * 
-	 * @param clazz a class
-	 * @return the bundle the given class originated from, or <code>null</code>
-	 * 	if unable to be determined
-	 * @since 3.1
-	 */
-	public Bundle getBundle(Class clazz) {
-		if (fPackageAdminService != null) {
-			return fPackageAdminService.getBundle(clazz);
-		}
-		return null;
-	}
-	
-	/**
-	 * Constructs the debug UI plug-in
-	 */
-	public DebugUIPlugin() {
-		super();
-		fgDebugUIPlugin= this;
-	}
-	
-	/**
-	 * If the debug flag is set the specified message is printed to the console
-	 * @param message
-	 */
-	public static void debug(String message) {
-		if (DEBUG) {
-			System.out.println(message);
-		}
-	}
-		
-	/**
-	 * Returns the singleton instance of the debug plug-in.
-	 */
-	public static DebugUIPlugin getDefault() {
-		if(fgDebugUIPlugin == null) {
-			fgDebugUIPlugin = new DebugUIPlugin();
-		}
-		return fgDebugUIPlugin;
-	}
-	
-	/**
-	 * Convenience method which returns the unique identifier of this plug-in.
-	 */
-	public static String getUniqueIdentifier() {
-		return IDebugUIConstants.PLUGIN_ID;
-	}
-
-	/**
-	 * Returns the default delegating model presentation
-	 * @return the default delegating model presentation
-	 */
-	public static IDebugModelPresentation getModelPresentation() {
-		if (fgPresentation == null) {
-			fgPresentation = new DelegatingModelPresentation();
-		}
-		return fgPresentation;
-	}
-	
-	/**
-	 * Returns the launch configuration manager
-	 * @return the launch configuration manager
-	 */
-	public LaunchConfigurationManager getLaunchConfigurationManager() {
-		if (fLaunchConfigurationManager == null) {
-			fLaunchConfigurationManager = new LaunchConfigurationManager();
-		} 
-		return fLaunchConfigurationManager;
-	}
-	
-	/**
-	 * Returns the context launching resource manager. If one has not been created prior to this 
-	 * method call, a new manager is created and initialized, by calling its startup() method.
-	 * @return the context launching resource manager
-	 * 
-	 * @since 3.3
-	 */
-	public LaunchingResourceManager getLaunchingResourceManager() {
-		if(fContextLaunchingManager == null) {
-			fContextLaunchingManager = new LaunchingResourceManager();
-			fContextLaunchingManager.startup();
-		}
-		return fContextLaunchingManager;
-	}
-	
-	/**
-	 * Returns the currently active workbench window or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the currently active workbench window or <code>null</code>
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-	
-	/**
-	 * Returns the currently active workbench window shell or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the currently active workbench window shell or <code>null</code>
-	 */
-	public static Shell getShell() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		if (window == null) {
-			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-			if (windows.length > 0) {
-				return windows[0].getShell();
-			}
-		} 
-		else {
-			return window.getShell();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the default label provider for the debug UI.
-	 */
-	public static ILabelProvider getDefaultLabelProvider() {
-		if (fgDefaultLabelProvider == null) {
-			fgDefaultLabelProvider = new DefaultLabelProvider();
-		}
-		return fgDefaultLabelProvider;
-	}
-
-	/**
-	 * Creates an extension.  If the extension plug-in 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 the extension object
-	 */
-	public static Object createExtension(final IConfigurationElement element, final String classAttribute) throws CoreException {
-		// If plug-n has been loaded create extension.
-		// Otherwise, show busy cursor then create extension.
-		Bundle bundle = Platform.getBundle(element.getContributor().getName());
-		if (bundle.getState() == Bundle.ACTIVE) {
-			return element.createExecutableExtension(classAttribute);
-		} 
-		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];
-		}
-		return ret[0];
-	}	
-	
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#createImageRegistry()
-	 */
-	protected ImageRegistry createImageRegistry() {
-		return DebugPluginImages.initializeImageRegistry();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		try {
-            if (fProcessConsoleManager != null) {
-                fProcessConsoleManager.shutdown();
-            }
-            
-            BreakpointOrganizerManager.getDefault().shutdown();
-            
-			if (fPerspectiveManager != null) {
-				fPerspectiveManager.shutdown();
-			}
-			if (fLaunchConfigurationManager != null) {
-				fLaunchConfigurationManager.shutdown();
-			}
-			if(fContextLaunchingManager != null) {
-				fContextLaunchingManager.shutdown();
-			}
-	
-			ColorManager.getDefault().dispose();
-			
-			if (fgPresentation != null) {
-				fgPresentation.dispose();
-			}
-            
-            if (fImageDescriptorRegistry != null) {
-                fImageDescriptorRegistry.dispose();
-            }
-            
-            SourceLookupFacility.shutdown();
-			
-			DebugElementHelper.dispose();
-			
-			fServiceTracker.close();
-			fPackageAdminService = null;
-			
-			fSaveParticipants.clear();
-			
-			ResourcesPlugin.getWorkspace().removeSaveParticipant(this);
-			
-		} finally {
-			super.stop(context);
-		}
-	}
-
-	/**
-	 * Add the specified <code>ISaveParticipant</code> to the current listing of
-	 * registered participants
-	 * @param participant
-	 * @return true if this current listing did not already contain the specified participant
-	 * @since 3.3
-	 */
-	public boolean addSaveParticipant(ISaveParticipant participant) {
-		return fSaveParticipants.add(participant);
-	}
-	
-	/**
-	 * Removes the specified <code>ISaveParticipant</code> from the current listing of registered
-	 * participants
-	 * @param participant
-	 * @return true if the set contained the specified element
-	 * 
-	 * @since 3.3
-	 */
-	public boolean removeSaveParticipant(ISaveParticipant participant) {
-		return fSaveParticipants.remove(participant);
-	}
-	
-	/**
-	 * @see AbstractUIPlugin#startup()
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		ResourcesPlugin.getWorkspace().addSaveParticipant(this,
-				new ISaveParticipant() {
-					public void saving(ISaveContext saveContext) throws CoreException {
-						savePluginPreferences();
-						for(Iterator iter = fSaveParticipants.iterator(); iter.hasNext();) {
-							((ISaveParticipant)iter.next()).saving(saveContext);
-						}
-					}				
-					public void rollback(ISaveContext saveContext) {
-						for(Iterator iter = fSaveParticipants.iterator(); iter.hasNext();) {
-							((ISaveParticipant)iter.next()).rollback(saveContext);
-						}
-					}
-					public void prepareToSave(ISaveContext saveContext) throws CoreException {
-						for(Iterator iter = fSaveParticipants.iterator(); iter.hasNext();) {
-							((ISaveParticipant)iter.next()).prepareToSave(saveContext);
-						}
-					}
-					public void doneSaving(ISaveContext saveContext) {
-						for(Iterator iter = fSaveParticipants.iterator(); iter.hasNext();) {
-							((ISaveParticipant)iter.next()).doneSaving(saveContext);
-						}
-					}
-				});
-		DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.debug.ui/debug"));  //$NON-NLS-1$//$NON-NLS-2$
-		
-		// make sure the perspective manager is created
-		// and be the first debug event listener
-		fPerspectiveManager = new PerspectiveManager();
-		fPerspectiveManager.startup();		
-		
-		getLaunchingResourceManager();
-		
-		// Listen to launches to lazily create "launch processors"
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-        
-        // start the breakpoint organizer manager
-        BreakpointOrganizerManager.getDefault();
-				
-		getStandardDisplay().asyncExec(
-			new Runnable() {
-				public void run() {
-					//initialize the selected resource `
-					SelectedResourceManager.getDefault();
-					// forces launch shortcuts to be initialized so their key-bindings work
-					getLaunchConfigurationManager().getLaunchShortcuts();
-				}
-			});	
-		
-		fServiceTracker = new ServiceTracker(context, PackageAdmin.class.getName(), null);
-		fServiceTracker.open();
-		fPackageAdminService = (PackageAdmin) fServiceTracker.getService();
-		
-		getLaunchConfigurationManager().startup();
-	}
-
-	/**
-	 * Utility method with conventions
-	 */
-	public static void errorDialog(Shell shell, String title, String message, IStatus s) {
-		// if the 'message' resource string and the IStatus' message are the same,
-		// don't show both in the dialog
-		if (s != null && message.equals(s.getMessage())) {
-			message= null;
-		}
-		ErrorDialog.openError(shell, title, message, s);
-	}
-	
-	/**
-	 * Utility method with conventions
-	 */
-	public static void errorDialog(Shell shell, String title, String message, Throwable t) {
-		IStatus status;
-		if (t instanceof CoreException) {
-			status= ((CoreException)t).getStatus();
-			// if the 'message' resource string and the IStatus' message are the same,
-			// don't show both in the dialog
-			if (status != null && message.equals(status.getMessage())) {
-				message= null;
-			}
-		} else {
-			status= new Status(IStatus.ERROR, getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR, "Error within Debug UI: ", t); //$NON-NLS-1$
-			log(status);	
-		}
-		ErrorDialog.openError(shell, title, message, status);
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-	
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Debug UI: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		// this message is intentionally not internationalized, as an exception may
-		// be due to the resource bundle itself
-		log(newErrorStatus("Internal message logged from Debug UI: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR, message, exception);
-	}
-	
-	/**
-     * Open the launch configuration dialog on the specified launch
-     * configuration. The dialog displays the tabs for a single configuration
-     * only (a tree of launch configuration is not displayed)
-     * <p>
-     * If a status is specified, a status handler is consulted to handle the
-     * status. The status handler is passed the instance of the launch
-     * configuration dialog that is opened. This gives the status handler an
-     * opportunity to perform error handling/initialization as required.
-     * </p>
-     * @param shell the parent shell for the launch configuration dialog
-     * @param configuration the configuration to display
-     * @param groupIdentifier group identifier of the launch group the launch configuration
-     * belongs to
-     * @param status the status to display, or <code>null</code> if none 
-     * @param showCancel if the cancel button should be shown in the particular instance of the dialog
-     * @return the return code from opening the launch configuration dialog -
-     *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-     *  
-     * @since 3.3
-     *
-     */
-    public static int openLaunchConfigurationEditDialog(Shell shell, ILaunchConfiguration configuration, String groupIdentifier, IStatus status, boolean showCancel) {
-    	LaunchGroupExtension group = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier);
-    	if (group != null) {
-    		LaunchConfigurationEditDialog dialog = new LaunchConfigurationEditDialog(shell, configuration, group, showCancel);
-    		dialog.setInitialStatus(status);
-    		return dialog.open();
-    	} 
-    	return Window.CANCEL;
-    }
-	
-    /**
-     * Open the launch configuration dialog on the specified launch
-     * configuration. The dialog displays the tabs for a single configuration
-     * only (a tree of launch configuration is not displayed)
-     * <p>
-     * If a status is specified, a status handler is consulted to handle the
-     * status. The status handler is passed the instance of the launch
-     * configuration dialog that is opened. This gives the status handler an
-     * opportunity to perform error handling/initialization as required.
-     * </p>
-     * @param shell the parent shell for the launch configuration dialog
-     * @param configuration the configuration to display
-     * @param groupIdentifier group identifier of the launch group the launch configuration
-     * belongs to
-     * @param reservednames a set of launch configuration names that cannot be used when creating or renaming
-     * the specified launch configuration
-     * @param status the status to display, or <code>null</code> if none 
-     * @param setDefaults whether to set default values in the configuration
-     * @return the return code from opening the launch configuration dialog -
-     *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-     *  
-     * @since 3.3
-     * 
-     */
-    public static int openLaunchConfigurationPropertiesDialog(Shell shell, ILaunchConfiguration configuration, String groupIdentifier, Set reservednames, IStatus status, boolean setDefaults) {
-    	LaunchGroupExtension group = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier);
-    	if (group != null) {
-    		LaunchConfigurationPropertiesDialog dialog = new LaunchConfigurationPropertiesDialog(shell, configuration, group, reservednames);
-    		dialog.setInitialStatus(status);
-    		dialog.setDefaultsOnOpen(setDefaults);
-    		return dialog.open();
-    	} 
-    	return Window.CANCEL;
-    }
-    
-	/**
-	 * Save all dirty editors in the workbench.
-	 * Returns whether the operation succeeded.
-	 * 
-	 * @return whether all saving was completed
-	 * @deprecated Saving has been moved to the launch delegate <code>LaunchConfigurationDelegate</code> to allow for scoped saving
-	 * of resources that are only involved in the current launch, no longer the entire workspace
-	 */
-	protected static boolean saveAllEditors(boolean confirm) {
-		if (getActiveWorkbenchWindow() == null) {
-			return false;
-		}
-		return PlatformUI.getWorkbench().saveAllEditors(confirm);
-	}	
-	
-	/**
-	 * Save & build the workspace according to the user-specified preferences.  Return <code>false</code> if
-	 * any problems were encountered, <code>true</code> otherwise.
-	 * 
-	 * @deprecated this method is no longer to be used. It is an artifact from 2.0, and all saving is now done with the
-	 * launch delegate <code>LaunchConfigurationDelegate</code>
-	 */
-	public static boolean saveAndBuild() {
-		boolean status = true;
-		String saveDirty = getDefault().getPreferenceStore().getString(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH);
-		boolean buildBeforeLaunch = getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_BUILD_BEFORE_LAUNCH);
-		
-		// If we're ignoring dirty editors, check if we need to build
-		if (saveDirty.equals(MessageDialogWithToggle.NEVER)) {
-			if (buildBeforeLaunch) {
-				return doBuild();
-			}
-		} else {
-			status = saveAllEditors(saveDirty.equals(MessageDialogWithToggle.PROMPT));
-			if (status && buildBeforeLaunch) {
-				status = doBuild();
-			}
-		}
-				
-		return status;
-	}
-	
-	private static boolean doBuild() {
-		try {
-			PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) throws InvocationTargetException {
-					try {
-						ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
-					} catch (CoreException e) {
-						throw new InvocationTargetException(e);
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			// canceled by user
-			return false;
-		} catch (InvocationTargetException e) {
-			String title= DebugUIMessages.DebugUIPlugin_Run_Debug_1; 
-			String message= DebugUIMessages.DebugUIPlugin_Build_error__Check_log_for_details__2; 
-			Throwable t = e.getTargetException();
-			errorDialog(getShell(), title, message, t);
-			return false;
-		}
-		return true;
-	}	
-	
-	/**
-	 * Returns the standard display to be used. The method first checks, if
-	 * the thread calling this method has an associated display. If so, this
-	 * display is returned. Otherwise the method returns the default display.
-	 * 
-	 */
-	public static Display getStandardDisplay() {
-		Display display= Display.getCurrent();
-		if (display == null) {
-			display= Display.getDefault();
-		}
-		return display;		
-	}	
-	
-	/**
-	 * Returns the a color based on the type of output.
-	 * Valid types:
-	 * <li>CONSOLE_SYS_OUT_RGB</li>
-	 * <li>CONSOLE_SYS_ERR_RGB</li>
-	 * <li>CONSOLE_SYS_IN_RGB</li>
-	 * <li>CHANGED_VARIABLE_RGB</li>
-	 */
-	public static Color getPreferenceColor(String type) {
-		return ColorManager.getDefault().getColor(PreferenceConverter.getColor(getDefault().getPreferenceStore(), type));
-	}
-
-	/**
-	 * Returns the process console manager. The manager will be created lazily on 
-	 * the first access.
-	 * 
-	 * @return ProcessConsoleManager
-	 */
-	public ProcessConsoleManager getProcessConsoleManager() {
-		if (fProcessConsoleManager == null) {
-			fProcessConsoleManager = new ProcessConsoleManager();
-		}
-		return fProcessConsoleManager;
-	}
-	
-	/**
-	 * Returns a Document that can be used to build a DOM tree
-	 * @return the Document
-	 * @throws ParserConfigurationException if an exception occurs creating the document builder
-	 * @since 3.0
-	 */
-	public static Document getDocument() throws ParserConfigurationException {
-		DocumentBuilderFactory dfactory= DocumentBuilderFactory.newInstance();
-
-		DocumentBuilder docBuilder= dfactory.newDocumentBuilder();
-		Document doc= docBuilder.newDocument();
-		return doc;
-	}
-		
-	/**
-	 * When the first launch is added, instantiate launch processors,
-	 * and stop listening to launch notifications.
-	 * <p>
-	 * Launch processors are:
-	 * <ul>
-	 * <li>console document manager</li>
-	 * <li>perspective manager</li>
-	 * </ul>
-	 * </p>
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-		getProcessConsoleManager().startup();
-		SourceLookupManager.getDefault();
-	}
-	
-	/**
-	 * Returns the perspective manager.
-	 * 
-	 * @return
-	 */
-	public PerspectiveManager getPerspectiveManager() {
-		return fPerspectiveManager;
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {}
-
-	/**
-	 * Save dirty editors before launching, according to preferences.
-	 * 
-	 * @return whether to proceed with launch 
-	 * @deprecated Saving has been moved to the launch delegate <code>LaunchConfigurationDelegate</code> to allow for scoped saving
-	 * of resources that are only involved in the current launch, no longer the entire workspace
-	 */
-	public static boolean preLaunchSave() {
-		String saveDirty = getDefault().getPreferenceStore().getString(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH);
-		if (saveDirty.equals(MessageDialogWithToggle.NEVER)) {
-			return true;
-		} 
-		return saveAllEditors(saveDirty.equals(MessageDialogWithToggle.PROMPT));
-	}
-	
-	/**
-	 * Builds the workspace (according to preferences) and launches the given launch
-	 * configuration in the specified mode. May return null if auto build is in process and 
-	 * user cancels the launch.
-	 * 
-	 * @param configuration the configuration to launch
-	 * @param mode launch mode - run or debug
-	 * @param monitor progress monitor
-	 * @exception CoreException if an exception occurs while building or launching
-	 * @return resulting launch or <code>null</code> if user cancels
-	 */
-	public static ILaunch buildAndLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		boolean buildBeforeLaunch = getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_BUILD_BEFORE_LAUNCH);
-		
-		monitor.beginTask("", 1); //$NON-NLS-1$
-		try
-		{
-			return configuration.launch(
-					mode,
-					new SubProgressMonitor(monitor, 1),
-					buildBeforeLaunch);	
-		}
-		finally
-		{
-			monitor.done();
-		}
-	}
-	
-	/**
-	 * Saves and builds the workspace according to current preference settings and
-	 * launches the given launch configuration in the specified mode in the
-	 * foreground with a progress dialog. Reports any exceptions that occur
-	 * in an error dialog.
-	 * 
-	 * @param configuration the configuration to launch
-	 * @param mode launch mode
-	 * @since 3.0
-	 */
-	public static void launchInForeground(final ILaunchConfiguration configuration, final String mode) {
-		final IJobManager jobManager = Job.getJobManager();
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-		boolean wait = false;
-		
-		if (jobManager.find(ResourcesPlugin.FAMILY_AUTO_BUILD).length > 0 || jobManager.find(ResourcesPlugin.FAMILY_MANUAL_BUILD).length >0) {
-			String waitForBuild = store.getString(IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD);
-
-			if (waitForBuild.equals(MessageDialogWithToggle.PROMPT)) {
-				MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoCancelQuestion(getShell(), DebugUIMessages.DebugUIPlugin_23, DebugUIMessages.DebugUIPlugin_24, null, false, store, IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD); // 
-				
-				switch (dialog.getReturnCode()) {
-					case IDialogConstants.CANCEL_ID:
-						return;
-					case IDialogConstants.YES_ID:
-						wait = false;
-						break;
-					case IDialogConstants.NO_ID:
-						wait = true;
-						break;
-				}
-			} else if (waitForBuild.equals(MessageDialogWithToggle.ALWAYS)) {
-				wait = true;
-			}
-		}
-
-		if (wait) {
-			IWorkbench workbench = DebugUIPlugin.getDefault().getWorkbench();
-			IProgressService progressService = workbench.getProgressService();
-			final IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) throws InvocationTargetException {
-					/* Setup progress monitor
-					 * - Waiting for jobs to finish (2)
-					 * - Build & launch (98) */
-					monitor.beginTask(MessageFormat.format(DebugUIMessages.DebugUIPlugin_25, new Object[] {configuration.getName()}), 100);
-
-					try {
-						jobManager.join(ResourcesPlugin.FAMILY_MANUAL_BUILD, new SubProgressMonitor(monitor, 1));
-						jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD, new SubProgressMonitor(monitor, 1));
-					} 
-					catch (InterruptedException e) {/* continue*/}
-					if (!monitor.isCanceled()) {
-						try {
-							buildAndLaunch(configuration, mode,	new SubProgressMonitor(monitor, 98));
-						} 
-						catch (CoreException e) {
-							throw new InvocationTargetException(e);
-						}
-					}
-				}		
-			};			
-			try {
-				progressService.busyCursorWhile(runnable);
-			} 
-			catch (InterruptedException e) {} 
-			catch (InvocationTargetException e2) {
-				handleInvocationTargetException(e2, configuration, mode);
-			}
-		} else {
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) throws InvocationTargetException {
-					/* Setup progress monitor
-					 * - Build & launch (1) */
-					monitor.beginTask(MessageFormat.format(DebugUIMessages.DebugUIPlugin_25, new Object[] {configuration.getName()}), 1);
-					try {
-						buildAndLaunch(configuration, mode,	new SubProgressMonitor(monitor, 1));
-					} 
-					catch (CoreException e) {
-						throw new InvocationTargetException(e);
-					}
-				}		
-			};
-			try {
-				PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
-			} 
-			catch (InvocationTargetException e) {
-				handleInvocationTargetException(e, configuration, mode);
-			} 
-			catch (InterruptedException e) {}							
-
-		}
-	}
-	
-	private static void handleInvocationTargetException(InvocationTargetException e, ILaunchConfiguration configuration, String mode) {
-		Throwable targetException = e.getTargetException();
-		Throwable t = e;
-		if (targetException instanceof CoreException) {
-			t = targetException;
-		}
-		if (t instanceof CoreException) {
-			CoreException ce = (CoreException)t;
-			IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(ce.getStatus());
-			if (handler != null) {
-				ILaunchGroup group = DebugUITools.getLaunchGroup(configuration, mode);
-				if (group != null) {
-					DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), new StructuredSelection(configuration), group.getIdentifier(), ce.getStatus());
-					return;
-				}
-			}
-			if ((ce.getStatus().getSeverity() & (IStatus.ERROR | IStatus.WARNING)) == 0) {
-				// If the exception is a CoreException with a status other
-				// than ERROR or WARNING, don't open an error dialog.
-				return;
-			}
-		}
-		DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), DebugUIMessages.DebugUITools_Error_1, DebugUIMessages.DebugUITools_Exception_occurred_during_launch_2, t); // 		
-	}
-	
-	/**
-	 * Saves and builds the workspace according to current preference settings and
-	 * launches the given launch configuration in the specified mode in a background
-	 * Job with progress reported via the Job. Exceptions are reported in the Progress
-	 * view.
-	 * 
-	 * @param configuration the configuration to launch
-	 * @param mode launch mode
-	 * @since 3.0
-	 */
-	public static void launchInBackground(final ILaunchConfiguration configuration, final String mode) {
-		final IJobManager jobManager = Job.getJobManager();
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-		boolean wait = (jobManager.find(ResourcesPlugin.FAMILY_AUTO_BUILD).length > 0) || (jobManager.find(ResourcesPlugin.FAMILY_MANUAL_BUILD).length > 0);
-		String waitPref = store.getString(IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD);
-		if (wait) { // if there are build jobs running, do we wait or not??
-			if (waitPref.equals(MessageDialogWithToggle.PROMPT)) {
-				MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoCancelQuestion(getShell(), DebugUIMessages.DebugUIPlugin_23, DebugUIMessages.DebugUIPlugin_24, null, false, store, IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD); // 
-				switch (dialog.getReturnCode()) {
-					case IDialogConstants.CANCEL_ID:
-						return;
-					case IDialogConstants.YES_ID:
-						wait = true;
-						break;
-					case IDialogConstants.NO_ID:
-						wait = false;
-						break;
-				}
-			} 
-			else {
-				wait = waitPref.equals(MessageDialogWithToggle.ALWAYS);
-			}
-		}		
-		final boolean waitInJob = wait;
-		Job job = new Job(MessageFormat.format(DebugUIMessages.DebugUIPlugin_25, new Object[] {configuration.getName()})) {
-			public IStatus run(final IProgressMonitor monitor) {
-				/* Setup progress monitor
-				 * - Waiting for jobs to finish (2)
-				 * - Build & launch (98) */
-				monitor.beginTask(DebugUIMessages.DebugUITools_3, 100);
-				try {
-					if(waitInJob) {						
-						StringBuffer buffer = new StringBuffer(configuration.getName());
-						buffer.append(DebugUIMessages.DebugUIPlugin_0); 
-						ILaunchConfigurationWorkingCopy workingCopy = configuration.copy(buffer.toString());
-						workingCopy.setAttribute(ATTR_LAUNCHING_CONFIG_HANDLE, configuration.getMemento());
-						final ILaunch pendingLaunch = new PendingLaunch(workingCopy, mode, this);
-						DebugPlugin.getDefault().getLaunchManager().addLaunch(pendingLaunch);
-                        IJobChangeListener listener= new IJobChangeListener() {
-                            public void sleeping(IJobChangeEvent event) {}
-                            public void scheduled(IJobChangeEvent event) {}
-                            public void running(IJobChangeEvent event) {}
-                            public void awake(IJobChangeEvent event) {}
-                            public void aboutToRun(IJobChangeEvent event) {}
-                            public void done(IJobChangeEvent event) {
-                                DebugPlugin dp = DebugPlugin.getDefault();
-                                if (dp != null) {
-                                	dp.getLaunchManager().removeLaunch(pendingLaunch);
-                                }
-                                removeJobChangeListener(this);
-                            }
-                        };
-                        addJobChangeListener(listener);
-						try {
-							jobManager.join(ResourcesPlugin.FAMILY_MANUAL_BUILD, new SubProgressMonitor(monitor, 1));
-							jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD, new SubProgressMonitor(monitor, 1));
-						} 
-						catch (InterruptedException e) {/*just continue.*/}
-                        DebugPlugin.getDefault().getLaunchManager().removeLaunch(pendingLaunch);
-					}
-					else {
-						monitor.worked(2); /* don't wait for jobs to finish */
-					}
-					if (!monitor.isCanceled()) {
-						buildAndLaunch(configuration, mode, new SubProgressMonitor(monitor, 98));
-					}
-				} catch (CoreException e) {
-					final IStatus status = e.getStatus();
-					IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status);
-					if (handler == null) {
-						return status;
-					}
-					final ILaunchGroup group = DebugUITools.getLaunchGroup(configuration, mode);
-					if (group == null) {
-						return status;
-					}
-					Runnable r = new Runnable() {
-						public void run() {
-							DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), new StructuredSelection(configuration), group.getIdentifier(), status);
-						}	
-					};
-					DebugUIPlugin.getStandardDisplay().asyncExec(r);
-				}
-				finally	{
-					monitor.done();
-				}
-				
-				return Status.OK_STATUS;
-			}
-		};
-
-		IWorkbench workbench = DebugUIPlugin.getDefault().getWorkbench();
-		IProgressService progressService = workbench.getProgressService();
-
-		job.setPriority(Job.INTERACTIVE);
-		job.setName(MessageFormat.format(DebugUIMessages.DebugUIPlugin_25, new Object[] {configuration.getName()}));
-		
-		if (wait) {
-			progressService.showInDialog(workbench.getActiveWorkbenchWindow().getShell(), job); 
-		}
-		job.schedule();
-	}
-
-	/**
-	 * Returns the label with any accelerators removed.
-	 * 
-	 * @return label without accelerators
-	 */
-    public static String removeAccelerators(String label) {
-        String title = label;
-        if (title != null) {
-            // strip out any '&' (accelerators)
-            int index = title.indexOf('&');
-            if (index == 0) {
-                title = title.substring(1);
-            } else if (index > 0) {
-                //DBCS languages use "(&X)" format
-                if (title.charAt(index - 1) == '(' && title.length() >= index + 3 && title.charAt(index + 2) == ')') {
-                    String first = title.substring(0, index - 1);
-                    String last = title.substring(index + 3);
-                    title = first + last;
-                } else if (index < (title.length() - 1)) {
-                    String first = title.substring(0, index);
-                    String last = title.substring(index + 1);
-                    title = first + last;
-                }
-            }
-        }
-        return title;
-    }
-    
-	/**
-	 * Returns the label with any DBCS accelerator moved to the end of the string.
-	 * See bug 186921.
-	 * 
-	 * @return label with moved accelerator
-	 */
-    public static String adjustDBCSAccelerator(String label) {
-        String title = label;
-        if (title != null) {
-            // strip out any '&' (accelerators)
-            int index = title.indexOf('&');
-            if (index > 0) {
-                //DBCS languages use "(&X)" format
-                if (title.charAt(index - 1) == '(' && title.length() >= index + 3 && title.charAt(index + 2) == ')') {
-                    String first = title.substring(0, index - 1);
-                    String accel = title.substring(index - 1, index + 3);
-                    String last = title.substring(index + 3);
-                    title = first + last;
-                    if (title.endsWith("...")) { //$NON-NLS-1$
-                    	title = title.substring(0, title.length() - 3);
-                    	title = title + accel + "..."; //$NON-NLS-1$
-                    } else {
-                    	title = title + accel;
-                    }
-                }
-            }
-        }
-        return title;
-    }    
-
-    /**
-     * Returns the image descriptor registry used for this plug-in.
-     * 
-     * @since 3.1
-     */
-    public static ImageDescriptorRegistry getImageDescriptorRegistry() {
-        if (getDefault().fImageDescriptorRegistry == null) {
-            getDefault().fImageDescriptorRegistry = new ImageDescriptorRegistry();
-        }
-        return getDefault().fImageDescriptorRegistry;
-    }
-    
-    /**
-     * Returns an image descriptor for the icon referenced by the given attribute
-     * and configuration element, or <code>null</code> if none.
-     * 
-     * @param element
-     * @param attr
-     * @return image descriptor or <code>null</code>
-     */
-    public static ImageDescriptor getImageDescriptor(IConfigurationElement element, String attr) {
-		Bundle bundle = Platform.getBundle(element.getContributor().getName());
-		String iconPath = element.getAttribute(attr);
-		if (iconPath != null) {
-			URL iconURL = FileLocator.find(bundle , new Path(iconPath), null);
-			if (iconURL != null) {
-				return ImageDescriptor.createFromURL(iconURL);
-			}
-		}    	
-		return null;
-    }
-    
-    /**
-     * Returns an image descriptor for the icon referenced by the given path
-     * and contributor name, or <code>null</code> if none.
-     * 
-     * @param name the name of the contributor
-     * @param path the path of the icon (from the configuration element)
-     * @return image descriptor or <code>null</code>
-     * @since 3.3
-     */
-    public static ImageDescriptor getImageDescriptor(String name, String path) {
-		Bundle bundle = Platform.getBundle(name);
-		if (path != null) {
-			URL iconURL = FileLocator.find(bundle , new Path(path), null);
-			if (iconURL != null) {
-				return ImageDescriptor.createFromURL(iconURL);
-			}
-		}    	
-		return null;
-    }
-    
-    /**
-	 * Performs extra filtering for launch configurations based on the preferences set on the 
-	 * Launch Configurations page
-	 * @param config the config to filter
-	 * @return true if it should pass the filter, false otherwise
-	 * @since 3.2
-	 */
-	public static boolean doLaunchConfigurationFiltering(ILaunchConfiguration config) {
-		boolean ret = true;
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED)) {
-			ret &= new ClosedProjectFilter().select(null, null, config);
-		}
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED)) {
-			ret &= new DeletedProjectFilter().select(null, null, config);
-		}
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES)) {
-			try {
-				ret &= new LaunchConfigurationTypeFilter().select(null, null, config.getType());
-			}
-			catch(CoreException e) {
-			    DebugUIPlugin.log(e);
-			}
-		}
-		return ret;
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java
deleted file mode 100644
index 971bd02..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPreferenceInitializer.java
+++ /dev/null
@@ -1,156 +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.debug.internal.ui;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-public class DebugUIPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	public DebugUIPreferenceInitializer() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore prefs = DebugUIPlugin.getDefault().getPreferenceStore();
-//		Debug PreferencePage
-		prefs.setDefault(IDebugUIConstants.PREF_BUILD_BEFORE_LAUNCH, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH, MessageDialogWithToggle.PROMPT);
-		prefs.setDefault(IDebugUIConstants.PREF_SHOW_DEBUG_PERSPECTIVE_DEFAULT, IDebugUIConstants.ID_DEBUG_PERSPECTIVE);
-		prefs.setDefault(IDebugUIConstants.PREF_SHOW_RUN_PERSPECTIVE_DEFAULT, IDebugUIConstants.PERSPECTIVE_NONE);
-		prefs.setDefault(IDebugUIConstants.PREF_AUTO_REMOVE_OLD_LAUNCHES, true);
-		prefs.setDefault(IDebugUIConstants.PREF_ACTIVATE_WORKBENCH, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, MessageDialogWithToggle.NEVER);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.PROMPT);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD, MessageDialogWithToggle.ALWAYS);
-		prefs.setDefault(IDebugUIConstants.PREF_REUSE_EDITOR, true);
-		prefs.setDefault(IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE, false);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_RELAUNCH_IN_DEBUG_MODE, MessageDialogWithToggle.NEVER);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR, MessageDialogWithToggle.PROMPT);
-		prefs.setDefault(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_ALL_BREAKPOINTS, true);
-		prefs.setDefault(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, true);
-		
-		/**
-		 * Context launching preferences. Appear on the the Launching preference page
-		 * 
-		 * @since 3.3.0
-		 */
-		prefs.setDefault(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_LAUNCH_PARENT_PROJECT, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE, false);
-		
-		//View Management preference page
-		prefs.setDefault(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, IDebugUIConstants.ID_DEBUG_PERSPECTIVE);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_TRACK_VIEWS, true);
-		
-		//ConsolePreferencePage
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_WRAP, false);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_WIDTH, 80);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT, true);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR, true);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT, true);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK, 80000);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK, 100000);
-		prefs.setDefault(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH, 8);
-		
-		// colors
-		PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR, new RGB(0, 0, 0));
-		PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR, new RGB(0, 200, 125));
-		PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR, new RGB(255, 0, 0));
-		// can be called in non-UI thread, so we must play safe
-		Display display = DebugUIPlugin.getStandardDisplay();
-		if (Thread.currentThread().equals(display.getThread())) {
-			PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR, display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB());
-		} else {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					PreferenceConverter.setDefault(
-						DebugUIPlugin.getDefault().getPreferenceStore(),
-						IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR,
-						DebugUIPlugin.getStandardDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB());
-				}
-			});
-		}
-		
-		PreferenceConverter.setDefault(prefs, IInternalDebugUIConstants.PREF_CHANGED_VALUE_BACKGROUND, new RGB(255, 255, 0));
-		PreferenceConverter.setDefault(prefs, IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR, new RGB(114, 119, 129));
-		PreferenceConverter.setDefault(prefs, IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR, new RGB(0, 0, 0));
-
-		//LaunchHistoryPreferencePage
-		prefs.setDefault(IDebugUIConstants.PREF_MAX_HISTORY_SIZE, 10);
-		
-		//VariableViewsPreferencePage
-		prefs.setDefault(IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_ORIENTATION, IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_UNDERNEATH);
-		PreferenceConverter.setDefault(prefs, IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR, new RGB(255, 0, 0));
-		prefs.setDefault(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP, false);
-		prefs.setDefault(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH, 10000);
-		
-		//Registers View
-		prefs.setDefault(IDebugPreferenceConstants.REGISTERS_DETAIL_PANE_ORIENTATION, IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_UNDERNEATH);
-		
-		// Variable/Expression view default settings
-		prefs.setDefault(IDebugUIConstants.ID_VARIABLE_VIEW + '+' + "org.eclipse.debug.ui.ShowDetailPaneAction", true); //$NON-NLS-1$
-		prefs.setDefault(IDebugUIConstants.ID_EXPRESSION_VIEW + '+' + "org.eclipse.debug.ui.ShowDetailPaneAction", true); //$NON-NLS-1$
-		prefs.setDefault(IDebugUIConstants.ID_VARIABLE_VIEW + '+' + "org.eclipse.debug.ui.ShowTypeNamesAction", false); //$NON-NLS-1$
-		prefs.setDefault(IDebugUIConstants.ID_EXPRESSION_VIEW + '+' + "org.eclipse.debug.ui.ShowTypeNamesAction", false);		 //$NON-NLS-1$
-		
-		// set default for column size preference
-		prefs.setDefault(IDebugPreferenceConstants.PREF_COLUMN_SIZE, 
-				IDebugPreferenceConstants.PREF_COLUMN_SIZE_DEFAULT);
-		
-		// set default for row size preference
-		prefs.setDefault(IDebugPreferenceConstants.PREF_ROW_SIZE, 
-				IDebugPreferenceConstants.PREF_ROW_SIZE_DEFAULT);
-		
-		// set default padded string
-		prefs.setDefault(IDebugUIConstants.PREF_PADDED_STR, 
-				IDebugPreferenceConstants.PREF_PADDED_STR_DEFAULT);
-		
-		// set default code page for ascii and ebcdic 
-		prefs.setDefault(IDebugUIConstants.PREF_DEFAULT_ASCII_CODE_PAGE, 
-				IDebugPreferenceConstants.DEFAULT_ASCII_CP);
-		prefs.setDefault(IDebugUIConstants.PREF_DEFAULT_EBCDIC_CODE_PAGE, 
-				IDebugPreferenceConstants.DEFAULT_EBCDIC_CP);
-		
-		if (MemoryViewUtil.isLinuxGTK()) {
-			prefs.setDefault(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM, false);
-		}
-		else {
-			prefs.setDefault(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM, true);
-		}
-		
-		prefs.setDefault(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE, IDebugPreferenceConstants.DEFAULT_PAGE_SIZE);
-		prefs.setDefault(IDebugPreferenceConstants.PREF_RESET_MEMORY_BLOCK, IDebugPreferenceConstants.RESET_VISIBLE);
-		prefs.setDefault(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE,IDebugPreferenceConstants.DEFAULT_PAGE_SIZE);
-		prefs.setDefault(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE,IDebugPreferenceConstants.DEFAULT_PAGE_SIZE);
-		
-		/**
-		 * new launch configuration filtering options
-		 * @since 3.2
-		 */
-		prefs.setDefault(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_FILTER_WORKING_SETS, true);
-		prefs.setDefault(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES, false);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DefaultLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DefaultLabelProvider.java
deleted file mode 100644
index 49a602c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DefaultLabelProvider.java
+++ /dev/null
@@ -1,552 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.ILineBreakpoint;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IRegister;
-import org.eclipse.debug.core.model.IRegisterGroup;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.core.model.IWatchpoint;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension;
-import org.eclipse.debug.internal.ui.views.variables.IndexedVariablePartition;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-import com.ibm.icu.text.MessageFormat;
-
-public class DefaultLabelProvider implements ILabelProvider {
-
-	/**
-	 * @see ILabelProvider#getImage(Object)
-	 */
-	public Image getImage(Object element) {
-		String key= getImageKey(element);
-		if (key == null && element instanceof ILaunch) {
-			return null;
-		}
-		if (key == null && element instanceof IAdaptable) {
-			IWorkbenchAdapter de= (IWorkbenchAdapter) ((IAdaptable) element).getAdapter(IWorkbenchAdapter.class);
-			if (de != null) {
-				ImageDescriptor descriptor= de.getImageDescriptor(element);
-				if( descriptor != null) {
-					return descriptor.createImage();
-				}
-			}
-			return null;
-		}
-		if(element instanceof LaunchShortcutExtension) {
-			return ((LaunchShortcutExtension)element).getImageDescriptor().createImage();
-		}
-		return DebugPluginImages.getImage(key);
-	}
-	
-	/**
-	 * Returns the key (<code>String</code>) of the default image
-	 * appropriate for the given element or <code>null</code>
-	 * if no default image is defined.
-	 */
-	public String getImageKey(Object element) {
-		if (element instanceof IDebugElement) {
-			// Group elements into debug elements and non-debug elements
-			// to reduce the number of instanceof checks performed
-			if (element instanceof IRegister) {
-				return IDebugUIConstants.IMG_OBJS_REGISTER;
-			} else if (element instanceof IRegisterGroup) {
-				return IDebugUIConstants.IMG_OBJS_REGISTER_GROUP;
-			} else if (element instanceof IVariable || element instanceof IValue) {
-				if (element instanceof IndexedVariablePartition) {
-					return IInternalDebugUIConstants.IMG_OBJS_ARRAY_PARTITION;
-				} 
-				return IDebugUIConstants.IMG_OBJS_VARIABLE;
-			} else if (element instanceof IStackFrame) {
-				if (((IStackFrame)element).getThread().isSuspended()) {
-					return IDebugUIConstants.IMG_OBJS_STACKFRAME;
-				}
-				return IDebugUIConstants.IMG_OBJS_STACKFRAME_RUNNING;
-			} else if (element instanceof IThread) {
-				IThread thread = (IThread)element;
-				if (thread.isSuspended()) {
-					return IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED;
-				} else if (thread.isTerminated()) {
-					return IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED;
-				} else {
-					return IDebugUIConstants.IMG_OBJS_THREAD_RUNNING;
-				}
-			} else if (element instanceof IDebugTarget) {
-				IDebugTarget target= (IDebugTarget) element;
-				if (target.isTerminated() || target.isDisconnected()) {
-					return IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED;
-				} else if (target.isSuspended()) {
-					return IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_SUSPENDED;
-				} else {
-					return IDebugUIConstants.IMG_OBJS_DEBUG_TARGET;
-				}
-			} else if (element instanceof IExpression) {
-				return IDebugUIConstants.IMG_OBJS_EXPRESSION;
-			}
-		} else {
-			if (element instanceof IMarker) {
-				return getMarkerImageKey((IMarker)element);
-			} else if (element instanceof IBreakpoint) {
-				return getBreakpointImageKey((IBreakpoint)element);
-			} else if (element instanceof IProcess) {
-				if (((IProcess) element).isTerminated()) {
-					return IDebugUIConstants.IMG_OBJS_OS_PROCESS_TERMINATED;
-				} 
-				return IDebugUIConstants.IMG_OBJS_OS_PROCESS;
-			} else if (element instanceof ILaunch) {
-				// determine the image from the launch config type
-				ILaunch launch= (ILaunch)element;
-				ILaunchConfiguration configuration = launch.getLaunchConfiguration();
-				if (configuration != null) {
-					try {
-						return configuration.getType().getIdentifier();
-					} catch (CoreException e) {
-						DebugUIPlugin.log(e);
-						return null;
-					}
-				}
-				// if no config, use the old "mode" way
-				if (launch.getLaunchMode().equals(ILaunchManager.DEBUG_MODE)) {
-					return IDebugUIConstants.IMG_OBJS_LAUNCH_DEBUG;
-				} else if (launch.isTerminated()) {
-					return IDebugUIConstants.IMG_OBJS_LAUNCH_RUN_TERMINATED;
-				} else {
-					return IDebugUIConstants.IMG_OBJS_LAUNCH_RUN;
-				}	
-			} else if (element instanceof ILaunchConfigurationType) {
-				return ((ILaunchConfigurationType)element).getIdentifier();
-			} else if (element instanceof ILaunchConfiguration) {
-				try {
-					return ((ILaunchConfiguration)element).getType().getIdentifier();
-				} catch (CoreException e) {
-					DebugUIPlugin.log(e);
-					return null;
-				}
-			}
-		}
-		return null;		
-	}
-
-	/**
-	 * @see ILabelProvider#getText(Object)
-	 */
-	public String getText(Object element) {
-		StringBuffer label= new StringBuffer();
-		try {
-			// Group elements into debug elements and non-debug elements
-			// to reduce the number of instanceof checks performed
-			if (element instanceof IDebugElement) {
-				if (element instanceof IStackFrame) {
-					label.append(((IStackFrame)element).getName());
-				} else if (element instanceof IndexedVariablePartition) {
-					label.append(((IndexedVariablePartition)element).getName());
-				} else if (element instanceof IVariable) {
-					label.append(getVariableText((IVariable)element));
-				} else if (element instanceof IThread) {
-					label.append(((IThread)element).getName());
-				} else if (element instanceof IDebugTarget) {
-					label.append((((IDebugTarget)element).getName()));
-				} else if (element instanceof IExpression) {
-					label.append(getExpressionText((IExpression)element));
-				} else if (element instanceof IRegisterGroup) {
-					label.append(getRegisterGroupText((IRegisterGroup)element));
-				} else if (element instanceof IValue) {
-					label.append(((IValue)element).getValueString()); 
-				}
-			} else {
-				if (element instanceof IMarker) {
-					label.append(getMarkerText((IMarker) element));
-				} else if (element instanceof IBreakpoint) {
-					label.append(getBreakpointText((IBreakpoint)element));
-				} else if (element instanceof IProcess) {
-					label.append(((IProcess) element).getLabel());
-				} else if (element instanceof ILaunch) {
-					label.append(getLaunchText((ILaunch) element));
-				} else if (element instanceof ILaunchConfiguration) {
-					label.append(((ILaunchConfiguration)element).getName());
-				} else if (element instanceof ILaunchConfigurationType) {
-					label.append(((ILaunchConfigurationType)element).getName());
-				} else if(element instanceof ILaunchDelegate) {
-					ILaunchDelegate delegate = (ILaunchDelegate) element;
-					String name = delegate.getName();
-					if(name == null) {
-						name = delegate.getContributorName();
-					}
-					label.append(name);
-				} else if(element instanceof LaunchShortcutExtension) {
-					label.append(((LaunchShortcutExtension)element).getLabel());
-				} else if (element instanceof String) {
-					label.append(element);
-				} else {
-					label.append(getAdapterLabel(element));
-				}
-			}
-			if (element instanceof ITerminate) {
-				if (((ITerminate) element).isTerminated()) {
-					String terminatedMessage= null;
-					if (element instanceof IProcess) {
-						IProcess process = (IProcess)element;
-						int exit = process.getExitValue();
-						terminatedMessage= MessageFormat.format(DebugUIMessages.DefaultLabelProvider_16, new String[]{new Integer(exit).toString()}); 
-					} else {
-						terminatedMessage= DebugUIMessages.DefaultLabelProvider_1; 
-					}
-					label.insert(0, terminatedMessage);
-				}
-			} else if (element instanceof IDisconnect) {
-				if (((IDisconnect) element).isDisconnected()) {
-					label.insert(0, DebugUIMessages.DefaultLabelProvider__disconnected__1); 
-				}
-			}
-		} catch (DebugException e) {
-			DebugUIPlugin.log(e);
-			label.append(DebugUIMessages.DefaultLabelProvider__unknown__1); 
-		}
-		return label.toString();
-	}
-	
-	/**
-	 * Returns default label for a breakpoint.
-	 * 
-	 * @param breakpoint
-	 * @return default label for a breakpoint
-	 */
-	private String getBreakpointText(IBreakpoint breakpoint) {
-		IResource resource = breakpoint.getMarker().getResource();
-		StringBuffer label = new StringBuffer();
-		if (resource != null) {
-			label.append(resource.getName());
-		}
-		if (breakpoint instanceof ILineBreakpoint) {
-			try {
-				int lineNumber = ((ILineBreakpoint)breakpoint).getLineNumber();
-				label.append(MessageFormat.format(DebugUIMessages.DefaultLabelProvider_17, new String[]{Integer.toString(lineNumber)})); 
-			} catch (CoreException e) {
-			}
-		}
-		return label.toString();
-	}
-
-	public String getAdapterLabel(Object object) {
-		if (object instanceof IAdaptable) {
-			IWorkbenchAdapter de= (IWorkbenchAdapter) ((IAdaptable) object).getAdapter(IWorkbenchAdapter.class);
-			if (de != null) {
-				return de.getLabel(object);
-			}
-		}
-		return DebugUIMessages.DefaultLabelProvider__unknown__1; 
-	}
-	
-	/**
-	 * Used to render launch history items in the re-launch drop downs
-	 */
-	protected String getLaunchText(ILaunch launch) {
-		if (launch.getLaunchConfiguration() == null || (!launch.getLaunchConfiguration().exists() && !launch.getLaunchConfiguration().isWorkingCopy())) {
-			return DebugUIMessages.DefaultLabelProvider__unknown__1; 
-		} 
-		// new launch configuration
-		ILaunchConfiguration config = launch.getLaunchConfiguration();
-		StringBuffer buff= new StringBuffer(config.getName());
-		buff.append(" ["); //$NON-NLS-1$
-		try {
-			buff.append(config.getType().getName());
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}
-		buff.append("]"); //$NON-NLS-1$
-		return buff.toString();			
-	}
-
-	protected String getExpressionText(IExpression expression) {
-		if (expression instanceof IWatchExpression) {
-			return getWatchExpressionText((IWatchExpression) expression);
-		}
-		StringBuffer buffer= new StringBuffer(expression.getExpressionText());
-		String valueString= null;
-		IValue value= expression.getValue();
-		if (value != null) {
-			try {
-				valueString= value.getValueString();
-			} catch (DebugException de) {
-				DebugUIPlugin.log(de);
-			}
-		}
-		if (valueString != null && valueString.length() > 0) {
-			buffer.append("= "); //$NON-NLS-1$
-			buffer.append(valueString);		
-		}
-		return buffer.toString();
-	}	
-	
-	/**
-	 * @param expression
-	 * @return
-	 */
-	protected String getWatchExpressionText(IWatchExpression expression) {
-		StringBuffer result= new StringBuffer();
-		result.append('"').append(expression.getExpressionText()).append('"');
-		if (expression.isPending()) {
-			result.append(DebugUIMessages.DefaultLabelProvider_12); 
-		} else if (expression.hasErrors()) {
-			result.append(DebugUIMessages.DefaultLabelProvider_13); 
-		} else {
-			IValue value= expression.getValue();
-			if (value != null) {	
-				String valueString= DebugUIPlugin.getModelPresentation().getText(value);
-				if (valueString.length() > 0) {
-					result.append(" = ").append(valueString); //$NON-NLS-1$
-				}
-			}
-		}
-		if (!expression.isEnabled()) {
-			result.append(DebugUIMessages.DefaultLabelProvider_15); 
-		}
-		return result.toString();
-	}
-
-	protected String getVariableText(IVariable variable) {
-		StringBuffer buffer= new StringBuffer();
-		try {
-			IValue value = variable.getValue();
-			buffer.append(variable.getName());
-			buffer.append(" = "); //$NON-NLS-1$
-			buffer.append(value.getValueString());
-		} catch (DebugException de) {
-			DebugUIPlugin.log(de);
-		}
-		return buffer.toString();
-	}
-	
-	protected String getRegisterGroupText(IRegisterGroup registerGroup) {
-		StringBuffer buffer= new StringBuffer();
-		try {
-			buffer.append(registerGroup.getName());
-		} catch (DebugException de) {
-			DebugUIPlugin.log(de);
-		}
-		return buffer.toString();
-	}
-	
-	protected String getMarkerText(IMarker marker) {
-		try {
-			if (marker.exists() && marker.isSubtypeOf(IBreakpoint.BREAKPOINT_MARKER)) {
-				return DebugUIMessages.DefaultLabelProvider_Breakpoint_1; 
-			}
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}
-		return ""; //$NON-NLS-1$
-	}
-	
-	protected String getMarkerImageKey(IMarker marker) {
-		try {
-			IBreakpoint breakpoint= DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
-			if (breakpoint != null && marker.exists()) {
-				if (breakpoint.isEnabled()) {
-					return IDebugUIConstants.IMG_OBJS_BREAKPOINT;
-				} 
-				return IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED;
-			}
-		} catch (CoreException e) {
-		}
-		return null;
-	}
-	
-	protected String getBreakpointImageKey(IBreakpoint breakpoint) {
-		if (breakpoint != null && breakpoint.getMarker().exists()) {
-		    try {
-			    boolean enabled = breakpoint.isEnabled();
-			    if (breakpoint instanceof IWatchpoint) {
-	                IWatchpoint watchpoint = (IWatchpoint) breakpoint;
-	        		if (watchpoint.isAccess()) {
-	        			if (watchpoint.isModification()) {
-	        				//access and modification
-	        				if (enabled) {
-	        					return IDebugUIConstants.IMG_OBJS_WATCHPOINT;
-	        				} 
-	        				return IDebugUIConstants.IMG_OBJS_WATCHPOINT_DISABLED;
-	        			}
-	        			if (enabled) {
-        					return IDebugUIConstants.IMG_OBJS_ACCESS_WATCHPOINT;
-        				} 
-	        			return IDebugUIConstants.IMG_OBJS_ACCESS_WATCHPOINT_DISABLED;
-	        		} else if (watchpoint.isModification()) {
-	        			if (enabled) {
-	        				return IDebugUIConstants.IMG_OBJS_MODIFICATION_WATCHPOINT;
-	        			} 
-	        			return IDebugUIConstants.IMG_OBJS_MODIFICATION_WATCHPOINT_DISABLED;
-	        		} else {
-	        			//neither access nor modification
-	        			return IDebugUIConstants.IMG_OBJS_WATCHPOINT_DISABLED;
-	        		}
-	            }
-			    if (enabled) {
-					return IDebugUIConstants.IMG_OBJS_BREAKPOINT;
-				} 
-				return IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED;
-		    } catch (CoreException e) {
-		    }
-		}
-		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) {
-	}
-	
-	/**
-	 * Returns the given string with special chars in escaped sequences.
-	 * 
-	 * @param label
-	 * @return the given string with special chars in escaped sequences
-	 * @since 3.3
-	 */
-	public static String escapeSpecialChars(String string) {
-		if (string == null) {
-			return null;
-		}
-		StringBuffer escaped = new StringBuffer();
-		for (int i = 0; i < string.length(); i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '\b':
-					escaped.append("\\b"); //$NON-NLS-1$
-					break;
-				case '\f':
-					escaped.append("\\f"); //$NON-NLS-1$
-					break;					
-				case '\n':
-					escaped.append("\\n"); //$NON-NLS-1$
-					break;
-				case '\r':
-					escaped.append("\\r"); //$NON-NLS-1$
-					break;
-				case '\t':
-					escaped.append("\\t"); //$NON-NLS-1$
-					break;
-				case '\\':
-					escaped.append("\\\\"); //$NON-NLS-1$
-					break;					
-				default:
-					escaped.append(c);
-					break;
-			}
-		}
-		return escaped.toString();
-	}	
-	
-	/**
-	 * Returns the string with escaped sequences replaced with single chars.
-	 * 
-	 * @param string
-	 * @return the string with escaped sequences replaced with single chars
-	 * @since 3.3
-	 */
-	public static String encodeEsacpedChars(String string) {
-		if (string == null) {
-			return null;
-		}
-		StringBuffer encoded = new StringBuffer();
-		if (string.length() == 1) {
-			return string;
-		}
-		for (int i = 0; i < string.length(); i++) {
-			char c = string.charAt(i);
-			if (c == '\\') {
-				switch (string.charAt(i+1)) {
-					case 'b':
-						c= '\b';
-						i++;
-						break;
-					case 'f':
-						c= '\f';
-						i++;
-						break;
-					case 'n':
-						c= '\n';
-						i++;
-						break;
-					case 'r':
-						c= '\r';
-						i++;
-						break;
-					case 't':
-						c= '\t';
-						i++;
-						break;
-					case '\'':
-						c= '\'';
-						i++;
-						break;
-					case '\\':
-						c= '\\';
-						i++;
-						break;
-					default :
-						break;
-				}	
-			}
-			encoded.append(c);
-		}
-		return encoded.toString();		
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java
deleted file mode 100644
index 8abee66..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-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.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugEditorPresentation;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IInstructionPointerPresentation;
-import org.eclipse.debug.ui.IValueDetailListener;
-import org.eclipse.jface.text.source.Annotation;
-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.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A model presentation that delegates to the appropriate extension. This
- * presentation contains a table of specialized presentations that are defined
- * as <code>org.eclipse.debug.ui.debugModelPresentations</code> extensions. When
- * asked to render an object from a debug model, this presentation delegates
- * to the extension registered for that debug model. 
- */
-public class DelegatingModelPresentation implements IDebugModelPresentation, IDebugEditorPresentation, IColorProvider, IFontProvider, IInstructionPointerPresentation {
-	
-	/**
-	 * A mapping of attribute ids to their values
-	 * @see IDebugModelPresentation#setAttribute
-	 */
-	private HashMap fAttributes= new HashMap(3);
-	/**
-	 * A table of label providers keyed by debug model identifiers.
-	 */
-	private HashMap fLabelProviders= new HashMap(5);
-	
-	/**
-	 * Whether the image registry has been initialized.
-	 */
-	private boolean fInitialized = false;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugEditorPresentation#removeAnnotations(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IThread)
-	 */
-	public void removeAnnotations(IEditorPart editorPart, IThread thread) {
-		IDebugModelPresentation presentation = getConfiguredPresentation(thread);
-		if (presentation instanceof IDebugEditorPresentation) {
-			((IDebugEditorPresentation)presentation).removeAnnotations(editorPart, thread);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugEditorPresentation#addAnnotations(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public boolean addAnnotations(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getConfiguredPresentation(frame);
-		if (presentation instanceof IDebugEditorPresentation) {
-			return((IDebugEditorPresentation)presentation).addAnnotations(editorPart, frame);
-		}
-		return false;
-	}
-
-	/**
-	 * Constructs a new DelegatingLabelProvider that delegates to extensions
-	 * of kind <code>org.eclipse.debug.ui.debugLabelProvider</code>
-	 */
-	public DelegatingModelPresentation() {
-		IExtensionPoint point= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.ID_DEBUG_MODEL_PRESENTATION);
-		if (point != null) {
-			IExtension[] extensions= point.getExtensions();
-			for (int i= 0; i < extensions.length; i++) {
-				IExtension extension= extensions[i];
-				IConfigurationElement[] configElements= extension.getConfigurationElements();
-				for (int j= 0; j < configElements.length; j++) {
-					IConfigurationElement elt= configElements[j];
-					String id= elt.getAttribute("id"); //$NON-NLS-1$
-					if (id != null) {
-						IDebugModelPresentation lp= new LazyModelPresentation(elt);
-						getLabelProviders().put(id, lp);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Delegate to all extensions.
-	 *
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		Iterator i= getLabelProviders().values().iterator();
-		while (i.hasNext()) {
-			((ILabelProvider) i.next()).addListener(listener);
-		}
-	}
-
-	/**
-	 * Delegate to all extensions.
-	 *
-	 * @see IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		Iterator i= getLabelProviders().values().iterator();
-		while (i.hasNext()) {
-			((ILabelProvider) i.next()).dispose();
-		}
-	}
-
-	/**
-	 * @see IDebugModelPresentation#getImage(Object)
-	 */
-	public Image getImage(Object item) {
-		initImageRegistries();
-		// Attempt to delegate
-		IDebugModelPresentation lp= getConfiguredPresentation(item);
-		if (lp != null) {
-			Image image= lp.getImage(item);
-			if (image != null) {
-				return image;
-			}
-		}
-		// If no delegate returned an image, use the default
-		return getDefaultImage(item);
-	}
-	
-	/**
-     * @see IDebugModelPresentation#getText(Object)
-     */
-    public String getText(Object item) {
-    	IDebugModelPresentation lp= getConfiguredPresentation(item);
-    	if (lp != null) {
-    		return lp.getText(item);
-    	}
-    	return getDefaultText(item);
-    }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(java.lang.Object)
-	 */
-	public IEditorInput getEditorInput(Object item) {
-		IDebugModelPresentation lp= getConfiguredPresentation(item);
-		if (lp != null) {
-			return lp.getEditorInput(item);
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(org.eclipse.ui.IEditorInput, java.lang.Object)
-	 */
-	public String getEditorId(IEditorInput input, Object objectInput) {
-		IDebugModelPresentation lp= getConfiguredPresentation(objectInput);
-		if (lp != null) {
-			return lp.getEditorId(input, objectInput);
-		}
-		return null;
-	}
-
-
-	/**
-	 * Returns a default text label for the debug element
-	 */
-	protected String getDefaultText(Object element) {
-		return DebugUIPlugin.getDefaultLabelProvider().getText(element);
-	}
-
-	/**
-	 * Returns a default image for the debug element
-	 */
-	protected Image getDefaultImage(Object element) {
-		return DebugUIPlugin.getDefaultLabelProvider().getImage(element);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugModelPresentation#computeDetail(org.eclipse.debug.core.model.IValue, org.eclipse.debug.ui.IValueDetailListener)
-	 */
-	public void computeDetail(IValue value, IValueDetailListener listener) {
-		IDebugModelPresentation lp= getConfiguredPresentation(value);
-		if (lp != null) {
-			lp.computeDetail(value, listener);			
-		} else {
-			listener.detailComputed(value, getText(value));
-		}
-	}	
-
-	/**
-	 * Delegate to all extensions.
-	 *
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		Iterator i= getLabelProviders().values().iterator();
-		while (i.hasNext()) {
-			((ILabelProvider) i.next()).removeListener(listener);
-		}
-	}
-
-	/**
-	 * Delegate to the appropriate label provider.
-	 *
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		if (element instanceof IDebugElement) {
-			IDebugModelPresentation lp= getConfiguredPresentation(element);
-			if (lp != null) {
-				return lp.isLabelProperty(element, property);
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Returns a configured model presentation for the given object,
-	 * or <code>null</code> if one is not registered.
-	 */
-	protected IDebugModelPresentation getConfiguredPresentation(Object element) {
-		String id= null;
-		if (element instanceof IDebugElement) {
-			IDebugElement de= (IDebugElement) element;
-			id= de.getModelIdentifier();
-		} else if (element instanceof IMarker) {
-			IMarker m= (IMarker) element;
-			IBreakpoint bp = DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(m);
-			if (bp != null) {
-				id= bp.getModelIdentifier();
-			}
-		} else if (element instanceof IBreakpoint) {
-			id = ((IBreakpoint)element).getModelIdentifier();
-		}
-		if (id != null) {
-			return getPresentation(id);
-		}
-
-		return null;
-	}
-	
-	/**
-	 * Returns the presentation registered for the given id, or <code>null</code>
-	 * of nothing is registered for the id.
-	 */
-	public IDebugModelPresentation getPresentation(String id) {
-		return (IDebugModelPresentation) getLabelProviders().get(id);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugModelPresentation#setAttribute(java.lang.String, java.lang.Object)
-	 */
-	public void setAttribute(String id, Object value) {
-		if (value == null) {
-			return;
-		}
-		getAttributes().put(id, value);
-		Iterator presentations = fLabelProviders.values().iterator();
-		while (presentations.hasNext()) {
-			((IDebugModelPresentation)presentations.next()).setAttribute(id, value);
-		}
-	}
-
-	/**
-	 * Whether or not to show variable type names.
-	 * This option is configured per model presentation.
-	 * This allows this option to be set per view, for example.
-	 */
-	protected boolean showVariableTypeNames() {
-		Boolean show= (Boolean) fAttributes.get(DISPLAY_VARIABLE_TYPE_NAMES);
-		show= show == null ? Boolean.FALSE : show;
-		return show.booleanValue();
-	}
-		
-	public HashMap getAttributes() {
-		return fAttributes;
-	}
-	
-	/**
-	 * Returns a copy of the attribute map for this presentation.
-	 * 
-	 * @return a copy of the attribute map for this presentation
-	 * @since 3.0
-	 */
-	public Map getAttributeMap() {
-		return (Map) getAttributes().clone();
-	}
-
-	protected HashMap getLabelProviders() {
-		return fLabelProviders;
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-     */
-    public Color getForeground(Object element) {
-        IDebugModelPresentation presentation = getConfiguredPresentation(element);
-        if (presentation instanceof IColorProvider) {
-            IColorProvider colorProvider = (IColorProvider) presentation;
-            return colorProvider.getForeground(element);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-     */
-    public Color getBackground(Object element) {
-        IDebugModelPresentation presentation = getConfiguredPresentation(element);
-        if (presentation instanceof IColorProvider) {
-            IColorProvider colorProvider = (IColorProvider) presentation;
-            return colorProvider.getBackground(element);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-     */
-    public Font getFont(Object element) {
-        IDebugModelPresentation presentation = getConfiguredPresentation(element);
-        if (presentation instanceof IFontProvider) {
-            IFontProvider fontProvider = (IFontProvider) presentation;
-            return fontProvider.getFont(element);
-        }
-        return null;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getInstructionPointerAnnotation(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public Annotation getInstructionPointerAnnotation(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getConfiguredPresentation(frame);
-		Annotation annotation = null;
-		String id = null;
-		Image image = null;
-		String text = null;
-		if (presentation instanceof IInstructionPointerPresentation) {
-			// first check if an annotaion object is provided
-			IInstructionPointerPresentation pointerPresentation = (IInstructionPointerPresentation) presentation;
-			annotation = pointerPresentation.getInstructionPointerAnnotation(editorPart, frame);
-			if (annotation == null) {
-				// next check for a marker annotation specification extension
-				id = pointerPresentation.getInstructionPointerAnnotationType(editorPart, frame);
-				if (id == null) {
-					// check for an image
-					image = pointerPresentation.getInstructionPointerImage(editorPart, frame);
-				}
-				text = pointerPresentation.getInstructionPointerText(editorPart, frame);
-			}
-		}
-		if (annotation == null) {
-            boolean defaultAnnotation = id == null;
-			if (id == null || text == null || (defaultAnnotation && image == null)) {
-				IThread thread = frame.getThread();
-				IStackFrame tos = null;
-				boolean top = false;
-				try {
-					tos = thread.getTopStackFrame();
-					top = frame.equals(tos);
-				} catch (DebugException de) {
-				}
-				if (id == null) {
-					if (top) {
-						id = IDebugUIConstants.ANNOTATION_TYPE_INSTRUCTION_POINTER_CURRENT;
-					} else {
-						id = IDebugUIConstants.ANNOTATION_TYPE_INSTRUCTION_POINTER_SECONDARY;
-					}
-				}
-				if (text == null) {
-					if (top) {
-						text = DebugUIMessages.InstructionPointerAnnotation_0;
-					} else {
-						text = DebugUIMessages.InstructionPointerAnnotation_1;
-					}
-				}
-				if (defaultAnnotation && image == null) {
-					if (top) {
-						image = DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_INSTRUCTION_POINTER_TOP);
-					} else {
-						image = DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_INSTRUCTION_POINTER);
-					}
-				}
-			}
-			if (defaultAnnotation) {
-				annotation = new InstructionPointerAnnotation(frame, id, text, image);
-			} else {
-				annotation = new DynamicInstructionPointerAnnotation(frame, id, text);
-			}
-		}
-		return annotation;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getMarkerAnnotationSpecificationId(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public String getInstructionPointerAnnotationType(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getConfiguredPresentation(frame);
-		if (presentation instanceof IInstructionPointerPresentation) {
-			return ((IInstructionPointerPresentation)presentation).getInstructionPointerAnnotationType(editorPart, frame);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getInstructionPointerImage(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public Image getInstructionPointerImage(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getConfiguredPresentation(frame);
-		if (presentation instanceof IInstructionPointerPresentation) {
-			return ((IInstructionPointerPresentation)presentation).getInstructionPointerImage(editorPart, frame);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getInstructionPointerText(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public String getInstructionPointerText(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getConfiguredPresentation(frame);
-		if (presentation instanceof IInstructionPointerPresentation) {
-			return ((IInstructionPointerPresentation)presentation).getInstructionPointerText(editorPart, frame);
-		}
-		return null;
-	}
-
-	public boolean isInitialized(Object element) {
-		LazyModelPresentation configuredPresentation = (LazyModelPresentation) getConfiguredPresentation(element);
-		if (configuredPresentation != null) {
-			return configuredPresentation.isImageRegistryInitialized();
-		}
-		return false;
-	}
-	
-	/**
-	 * Initialize image registries that this model presentation references to
-	 */
-	private synchronized void initImageRegistries() {
-		// if not initialized and this is called on the UI thread
-		if (!fInitialized && Thread.currentThread().equals(DebugUIPlugin.getStandardDisplay().getThread())) {
-			// force image registries to be created on the UI thread
-			DebugUIPlugin.getDefault().getImageRegistry();
-			fInitialized = true;
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DynamicInstructionPointerAnnotation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DynamicInstructionPointerAnnotation.java
deleted file mode 100644
index 6ca45c4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DynamicInstructionPointerAnnotation.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.debug.internal.ui;
-
- 
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.jface.text.source.Annotation;
-
-/**
- * Client specified instruction pointer annotation.
- */
-public class DynamicInstructionPointerAnnotation extends Annotation {
-
-	/**
-	 * The frame for this instruction pointer annotation.  This is necessary only so that
-	 * instances of this class can be distinguished by equals().
-	 */
-	private IStackFrame fStackFrame;
-		
-	/**
-	 * 
-	 * @param frame
-	 * @param markerAnnotationSpecificationId
-	 * @param text
-	 */
-	public DynamicInstructionPointerAnnotation(IStackFrame frame, String markerAnnotationSpecificationId, String text) {
-		super(markerAnnotationSpecificationId, false, text);
-		fStackFrame = frame;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object other) {
-		if (other instanceof DynamicInstructionPointerAnnotation) {
-			return getStackFrame().equals(((DynamicInstructionPointerAnnotation)other).getStackFrame());			
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getStackFrame().hashCode();
-	}
-
-	/**
-	 * Returns the stack frame associated with this annotation
-	 * 
-	 * @return the stack frame associated with this annotation
-	 */
-	private IStackFrame getStackFrame() {
-		return fStackFrame;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.java
deleted file mode 100644
index 93814aa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.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
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
- 
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Help context ids for the debug ui.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-public interface IDebugHelpContextIds {
-	
-	public static final String PREFIX = IDebugUIConstants.PLUGIN_ID + "."; //$NON-NLS-1$
-	
-	// Actions
-	public static final String CHANGE_VALUE_ACTION = PREFIX + "change_value_action_context"; //$NON-NLS-1$	
-	public static final String OPEN_BREAKPOINT_ACTION = PREFIX + "open_breakpoint_action_context"; //$NON-NLS-1$
-	public static final String RELAUNCH_HISTORY_ACTION = PREFIX + "relaunch_history_action_context"; //$NON-NLS-1$	
-	public static final String SHOW_BREAKPOINTS_FOR_MODEL_ACTION = PREFIX + "show_breakpoints_for_model_action_context"; //$NON-NLS-1$
-	public static final String COPY_BREAKPOINTS_ACTION = PREFIX + "copy_breakpoints_action_context"; //$NON-NLS-1$
-	public static final String PASTE_BREAKPOINTS_ACTION = PREFIX + "paste_breakpoints_action_context"; //$NON-NLS-1$
-	public static final String SHOW_TYPES_ACTION = PREFIX + "show_types_action_context"; //$NON-NLS-1$
-	public static final String VARIABLES_CONTENT_PROVIDERS_ACTION = PREFIX + "variables_content_providers_action_context"; //$NON-NLS-1$
-	public static final String VARIABLES_SELECT_LOGICAL_STRUCTURE = PREFIX + "variables_select_logical_structure"; //$NON-NLS-1$
-	public static final String VARIABLES_SELECT_DETAIL_PANE = PREFIX + "variables_select_detail_pane_action_context"; //$NON-NLS-1$
-	public static final String SELECT_WORKING_SET_ACTION = PREFIX + "select_working_set_context"; //$NON-NLS-1$			
-	public static final String CLEAR_WORKING_SET_ACTION = PREFIX + "clear_working_set_context"; //$NON-NLS-1$
-	public static final String EDIT_LAUNCH_CONFIGURATION_ACTION = PREFIX + "edit_launch_configuration_action_context"; //$NON-NLS-1$
-	public static final String OPEN_LAUNCH_CONFIGURATION_ACTION = PREFIX + "open_launch_configuration_action_context"; //$NON-NLS-1$
-	public static final String LINK_BREAKPOINTS_WITH_DEBUG_ACTION= PREFIX + "link_breakpoints_with_debug_context"; //$NON-NLS-1$
-	public static final String EDIT_SOURCELOOKUP_ACTION = PREFIX + "edit_source_lookup_path_context";//$NON-NLS-1$
-	public static final String LOOKUP_SOURCE_ACTION = PREFIX + "lookup_source_context";//$NON-NLS-1$
-	public static final String SKIP_ALL_BREAKPOINT_ACTION = PREFIX + "skip_all_breakpoints_context"; //$NON-NLS-1$
-	public static final String AUTO_MANAGE_VIEWS_ACTION = PREFIX + "auto_manage_views_context"; //$NON-NLS-1$
-	public static final String FIND_ELEMENT_ACTION = PREFIX + "find_element_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE = PREFIX + "detail_pane_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_ASSIGN_VALUE_ACTION = PREFIX + "detail_pane_assign_value_action_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_CONTENT_ASSIST_ACTION = PREFIX + "detail_pane_content_assist_action_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_CUT_ACTION = PREFIX + "detail_pane_cut_action_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_COPY_ACTION = PREFIX + "detail_pane_copy_action_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_PASTE_ACTION = PREFIX + "detail_pane_paste_action_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_SELECT_ALL_ACTION = PREFIX + "detail_pane_select_all_action_context"; //$NON-NLS-1$
-	public static final String DETAIL_PANE_FIND_REPLACE_ACTION = PREFIX + "detail_pane_find_replace_action_context"; //$NON-NLS-1$
-    public static final String DETAIL_PANE_WORD_WRAP_ACTION = PREFIX + "detail_pane_word_wrap_action_context"; //$NON-NLS-1$
-    public static final String DETAIL_PANE_MAX_LENGTH_ACTION = PREFIX + "detail_pane_max_length_action_context"; //$NON-NLS-1$
-    public static final String CONSOLE_TERMINATE_ACTION = PREFIX + "console_terminate_action_context"; //$NON-NLS-1$
-    public static final String CONSOLE_REMOVE_ALL_TERMINATED = PREFIX + "console_remove_all_terminated_context"; //$NON-NLS-1$
-    public static final String CONSOLE_REMOVE_LAUNCH = PREFIX + "console_remove_launch_context"; //$NON-NLS-1$;
-    public static final String CONSOLE_SHOW_PREFERENCES = PREFIX + "console_show_preferences_action_context"; //$NON-NLS-1$
-    public static final String SHOW_COLUMNS_ACTION = PREFIX + "show_columns_context"; //$NON-NLS-1$;
-    public static final String CONFIGURE_COLUMNS_ACTION = PREFIX + "configure_columns_context"; //$NON-NLS-1$;
-    public static final String MEMORY_VIEW_PANE_ORIENTATION_ACTION = PREFIX + "memory_view_pane_orientation_action_context"; //$NON-NLS-1$
-    public static final String SHOW_WHEN_STDOUT_CHANGES_ACTION = PREFIX + "show_stdout_action_context"; //$NON-NLS-1$
-    public static final String SHOW_WHEN_STDERR_CHANGES_ACTION = PREFIX + "show_stderr_action_context"; //$NON-NLS-1$
-    public static final String HORIZONTAL_DETAIL_PANE_LAYOUT_ACTION = PREFIX + "horizontal_detail_pane_layout_action_context"; //$NON-NLS-1$
-    public static final String VERTICAL_DETAIL_PANE_LAYOUT_ACTION = PREFIX + "vertical_detail_pane_layout_action_context"; //$NON-NLS-1$
-    public static final String DETAIL_PANE_HIDDEN_LAYOUT_ACTION = PREFIX + "detail_pane_hidden_layout_action_context"; //$NON-NLS-1$
-    
-	// Views
-	public static final String DEBUG_VIEW = PREFIX + "debug_view_context"; //$NON-NLS-1$
-	public static final String VARIABLE_VIEW = PREFIX + "variable_view_context"; //$NON-NLS-1$
-	public static final String BREAKPOINT_VIEW = PREFIX + "breakpoint_view_context"; //$NON-NLS-1$
-	public static final String EXPRESSION_VIEW = PREFIX + "expression_view_context"; //$NON-NLS-1$
-	public static final String LAUNCH_CONFIGURATION_VIEW = PREFIX + "launch_configuration_view_context"; //$NON-NLS-1$
-	public static final String REGISTERS_VIEW = PREFIX + "registers_view_context"; //$NON-NLS-1$
-	public static final String PROCESS_CONSOLE = PREFIX + "process_console_context";  //$NON-NLS-1$
-	
-	// Preference pages
-	public static final String DEBUG_PREFERENCE_PAGE = PREFIX + "debug_preference_page_context"; //$NON-NLS-1$
-	public static final String CONSOLE_PREFERENCE_PAGE = PREFIX + "console_preference_page_context"; //$NON-NLS-1$
-	public static final String SIMPLE_VARIABLE_PREFERENCE_PAGE = PREFIX + "simple_variable_preference_page_context"; //$NON-NLS-1$
-	public static final String PERSPECTIVE_PREFERENCE_PAGE = PREFIX + "perspective_preference_page_context"; //$NON-NLS-1$
-	public static final String LAUNCHING_PREFERENCE_PAGE = PREFIX + "launching_preference_page_context"; //$NON-NLS-1$
-	public static final String LAUNCH_CONFIGURATION_PREFERENCE_PAGE = PREFIX + "launch_configuration_preference_page_context"; //$NON-NLS-1$
-	public static final String VIEW_MANAGEMENT_PREFERENCE_PAGE = PREFIX + "view_management_preference_page_context"; //$NON-NLS-1$
-	public static final String LAUNCH_DELEGATES_PREFERENCE_PAGE = PREFIX + "launch_delegate_preference_page_context"; //$NON-NLS-1$
-	
-	// Dialogs
-	public static final String LAUNCH_CONFIGURATION_DIALOG = PREFIX + "launch_configuration_dialog"; //$NON-NLS-1$
-	public static final String LAUNCH_CONFIGURATION_PROPERTIES_DIALOG = PREFIX + "launch_configuration_properties_dialog"; //$NON-NLS-1$
-	public static final String SINGLE_LAUNCH_CONFIGURATION_DIALOG = PREFIX + "single_launch_configuration_dialog"; //$NON-NLS-1$
-	public static final String VARIABLE_SELECTION_DIALOG = PREFIX + "variable_selection_dialog_context"; //$NON-NLS-1$
-	public static final String EDIT_SOURCELOOKUP_DIALOG = PREFIX + "edit_source_lookup_path_dialog";//$NON-NLS-1$
-	public static final String SOURCELOOKUP_TAB = PREFIX + "launch_configuration_dialog_source_tab";//$NON-NLS-1$
-	public static final String ADD_SOURCE_CONTAINER_DIALOG = PREFIX + "add_source_container_dialog";//$NON-NLS-1$
-	public static final String ADD_PROJECT_CONTAINER_DIALOG = PREFIX + "project_source_container_dialog";//$NON-NLS-1$
-	public static final String ADD_FOLDER_CONTAINER_DIALOG = PREFIX + "folder_source_container_dialog";//$NON-NLS-1$
-	public static final String ADD_ARCHIVE_CONTAINER_DIALOG = PREFIX + "archive_source_container_dialog";//$NON-NLS-1$
-	public static final String MULTIPLE_SOURCE_DIALOG = PREFIX + "multiple_source_selection_dialog";//$NON-NLS-1$
-	public static final String ADD_WATCH_EXPRESSION_DIALOG= PREFIX + "add_watch_expression_dialog_context"; //$NON-NLS-1$
-	public static final String EDIT_WATCH_EXPRESSION_DIALOG = PREFIX + "edit_watch_expression_dialog_context"; //$NON-NLS-1$
-	public static final String FIND_ELEMENT_DIALOG = PREFIX + "find_element_dialog_context"; //$NON-NLS-1$
-	public static final String CONFIGURE_COLUMNS_DIALOG = PREFIX + "configure_columns_dialog_context"; //$NON-NLS-1$;
-	public static final String GROUP_BREAKPOINTS_DIALOG = PREFIX + "group_breakpoints_dialog_context"; //$NON-NLS-1$
-	public static final String ORGANIZE_FAVORITES_DIALOG = PREFIX + "organize_favorites_dialog_context"; //$NON-NLS-1$
-	public static final String SELECT_DEFAULT_WORKINGSET_DIALOG = PREFIX + "select_breakpoint_workingset_dialog"; //$NON-NLS-1$
-	public static final String DELETE_ASSOCIATED_LAUNCH_CONFIGS_DIALOG = PREFIX + "delete_associated_launch_configs_dialog"; //$NON-NLS-1$
-	public static final String SELECT_LAUNCH_MODES_DIALOG = PREFIX + "select_launch_modes_dialog"; //$NON-NLS-1$
-	public static final String SELECT_LAUNCHERS_DIALOG = PREFIX + "select_launchers_dialog"; //$NON-NLS-1$
-	public static final String SELECT_RESOURCES_TO_SAVE_DIALOG = PREFIX + "select_resources_to_save_dialog"; //$NON-NLS-1$
-	public static final String SELECT_LAUNCH_METHOD_DIALOG = PREFIX + "select_launch_method_dialog"; //$NON-NLS-1$
-	public static final String SELECT_LAUNCH_CONFIGURATION_DIALOG = PREFIX + "select_launch_configuration_dialog"; //$NON-NLS-1$
-	public static final String SELECT_DIRECTORY_SOURCE_CONTAINER_DIALOG = PREFIX + "select_directory_source_container_dialog"; //$NON-NLS-1$
-	public static final String SELECT_CONFIGURATION_TYPE_DIALOG = PREFIX + "select_configuration_type_dialog";  //$NON-NLS-1$
-	public static final String SELECT_FAVORITES_DIALOG = PREFIX + "select_favorites_dialog"; //$NON-NLS-1$
-	public static final String SELECT_NATIVE_ENVIRONMENT_DIALOG = PREFIX + "select_native_environment_dialog"; //$NON-NLS-1$
-	public static final String SELECT_LAUNCH_CONFIGURATION_MIGRATION_DIALOG = PREFIX + "select_launch_configuration_migration_dialog"; //$NON-NLS-1$
-	
-	// Property pages
-	public static final String PROCESS_PROPERTY_PAGE = PREFIX + "process_property_page_context"; //$NON-NLS-1$
-	public static final String PROCESS_PAGE_RUN_AT = PREFIX + "process_page_run_at_time_widget"; //$NON-NLS-1$
-	public static final String RUN_DEBUG_RESOURCE_PROPERTY_PAGE = PREFIX + "run_debug_resource_property_page"; //$NON-NLS-1$
-	
-	// Launch configuration dialog pages
-	public static final String LAUNCH_CONFIGURATION_DIALOG_COMMON_TAB = PREFIX + "launch_configuration_dialog_common_tab"; //$NON-NLS-1$
-	public static final String LAUNCH_CONFIGURATION_DIALOG_PERSPECTIVE_TAB = PREFIX + "launch_configuration_dialog_perspective_tab"; //$NON-NLS-1$	
-	public static final String LAUNCH_CONFIGURATION_DIALOG_REFRESH_TAB = PREFIX + "launch_configuration_dialog refresh_tab"; //$NON-NLS-1$
-	public static final String LAUNCH_CONFIGURATION_DIALOG_ENVIRONMENT_TAB = PREFIX +  "launch_configuration_dialog_environment_tab"; //$NON-NLS-1$
-	
-	// Working set page
-	public static final String WORKING_SET_PAGE = PREFIX + "working_set_page_context"; //$NON-NLS-1$			
-	
-	//Wizards
-	public static final String IMPORT_BREAKPOINTS_WIZARD_PAGE = PREFIX + "import_breakpoints_wizard_page_context"; //$NON-NLS-1$
-	public static final String EXPORT_BREAKPOINTS_WIZARD_PAGE = PREFIX + "export_breakpoints_wizard_page_context"; //$NON-NLS-1$
-	
-	//Editor	
-	public static final String NO_SOURCE_EDITOR = PREFIX + "debugger_editor_no_source_common";//$NON-NLS-1$
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java
deleted file mode 100644
index faf69ce..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 114664
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-import org.eclipse.debug.internal.ui.views.memory.MemoryBlocksTreeViewPane;
-import org.eclipse.debug.internal.ui.views.memory.RenderingViewPane;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
- 
-public interface IInternalDebugUIConstants {
-    
-    public static final String DIALOGSTORE_LASTEXTJAR= "org.eclipse.debug.ui.lastextjar"; //$NON-NLS-1$
-        
-    //Folders
-    public static final String ID_NAVIGATOR_FOLDER_VIEW= "org.eclipse.debug.internal.ui.NavigatorFolderView"; //$NON-NLS-1$
-    public static final String ID_TOOLS_FOLDER_VIEW= "org.eclipse.debug.internal.ui.ToolsFolderView"; //$NON-NLS-1$
-    public static final String ID_CONSOLE_FOLDER_VIEW= "org.eclipse.debug.internal.ui.ConsoleFolderView"; //$NON-NLS-1$
-    public static final String ID_OUTLINE_FOLDER_VIEW= "org.eclipse.debug.internal.ui.OutlineFolderView"; //$NON-NLS-1$
-    
-    // tool images
-    public static final String IMG_LCL_COLLAPSE_ALL = "IMG_LCL_COLLAPSE_ALL"; //$NON-NLS-1$
-    public static final String IMG_LCL_TERMINATE = "IMG_LCL_TERMINATE"; //$NON-NLS-1$
-    public static final String IMG_LCL_SHOW_LOGICAL_STRUCTURE = "IMG_LCL_SHOW_LOGICAL_STRUCTURE"; //$NON-NLS-1$
-    public static final String IMG_LCL_RUN_TO_LINE= "IMG_LCL_RUN_TO_LINE"; //$NON-NLS-1$
-    public static final String IMG_SRC_LOOKUP_MENU = "IMG_SRC_LOOKUP_MENU"; //$NON-NLS-1$
-    public static final String IMG_LCL_MONITOR_EXPRESSION= "IMG_LCL_MONITOR_EXPRESSION"; //$NON-NLS-1$
-    public static final String IMG_LCL_REMOVE_MEMORY= "IMG_LCL_REMOVE_MEMORY"; //$NON-NLS-1$
-    public static final String IMG_LCL_RESET_MEMORY= "IMG_LCL_RESET_MEMORY";//$NON-NLS-1$
-    public static final String IMG_LCL_COPY_VIEW_TO_CLIPBOARD = "IMG_LCL_COPY_VIEW_TO_CLIPBOARD"; //$NON-NLS-1$
-    public static final String IMG_LCL_PRINT_TOP_VIEW_TAB = "IMG_LCL_PRINT_TOP_VIEW_TAB"; //$NON-NLS-1$
-    
-    // disabled local tool images
-    public static final String IMG_DLCL_LOCK= "IMG_DLCL_LOCK"; //$NON-NLS-1$
-    public static final String IMG_DLCL_DETAIL_PANE= "IMG_DLCL_DETAIL_PANE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_CHANGE_VARIABLE_VALUE= "IMG_DLCL_CHANGE_VARIABLE_VALUE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_TYPE_NAMES= "IMG_DLCL_TYPE_NAMES"; //$NON-NLS-1$
-    public static final String IMG_DLCL_SHOW_LOGICAL_STRUCTURE= "IMG_DLCL_SHOW_LOGICAL_STRUCTURE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_DETAIL_PANE_UNDER= "IMG_DLCL_DETAIL_PANE_UNDER"; //$NON-NLS-1$
-    public static final String IMG_DLCL_DETAIL_PANE_RIGHT= "IMG_DLCL_DETAIL_PANE_RIGHT"; //$NON-NLS-1$
-    public static final String IMG_DLCL_DETAIL_PANE_HIDE= "IMG_DLCL_DETAIL_PANE_HIDE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_COLLAPSE_ALL = "IMG_DLCL_COLLAPSE_ALL"; //$NON-NLS-1$
-    public static final String IMG_DLCL_TERMINATE = "IMG_DLCL_TERMINATE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_REMOVE_ALL = "IMG_DLCL_REMOVE_ALL"; //$NON-NLS-1$
-    public static final String IMG_DLCL_REMOVE = "IMG_DLCL_REMOVE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_RUN_TO_LINE= "IMG_DLCL_RUN_TO_LINE"; //$NON-NLS-1$
-    public static final String IMG_SRC_LOOKUP_MENU_DLCL = "IMG_SRC_LOOKUP_MENU_DISABLED"; //$NON-NLS-1$
-    public static final String IMG_DLCL_MONITOR_EXPRESSION= "IMG_DLCL_MONITOR_EXPRESSION"; //$NON-NLS-1$
-    public static final String IMG_DLCL_REMOVE_MEMORY= "IMG_DLCL_REMOVE_MEMORY"; //$NON-NLS-1$
-    public static final String IMG_DLCL_RESET_MEMORY= "IMG_DLCL_RESET_MEMORY"; //$NON-NLS-1$
-    public static final String IMG_DLCL_COPY_VIEW_TO_CLIPBOARD= "IMG_DLCL_COPY_VIEW_TO_CLIPBOARD"; //$NON-NLS-1$
-    public static final String IMG_DLCL_PRINT_TOP_VIEW_TAB= "IMG_DLCL_PRINT_TOP_VIEW_TAB"; //$NON-NLS-1$
-    public static final String IMG_DLCL_NEW_CONFIG = "IMG_DLCL_NEW_CONFIG"; //$NON-NLS-1$
-    public static final String IMG_DLCL_DUPLICATE_CONFIG = "IMG_DLCL_DUPLICATE_CONFIG"; //$NON-NLS-1$
-    public static final String IMG_DLCL_DELETE_CONFIG = "IMG_DLCL_DELETE_CONFIG"; //$NON-NLS-1$
-    public static final String IMG_DLCL_FILTER_CONFIGS = "IMG_DLCL_FILTER_CONFIGS"; //$NON-NLS-1$
-    public static final String IMG_DLCL_SUSPEND = "IMG_DLCL_SUSPEND"; //$NON-NLS-1$
-    public static final String IMG_DLCL_RESUME = "IMG_DLCL_RESUME"; //$NON-NLS-1$
-    public static final String IMG_DLCL_STEP_RETURN = "IMG_DLCL_STEP_RETURN"; //$NON-NLS-1$
-    public static final String IMG_DLCL_STEP_OVER = "IMG_DLCL_STEP_OVER"; //$NON-NLS-1$
-    public static final String IMG_DLCL_STEP_INTO = "IMG_DLCL_STEP_INTO"; //$NON-NLS-1$
-    public static final String IMG_DLCL_TERMINATE_AND_REMOVE = "IMG_DLCL_TERMINATE_AND_REMOVE"; //$NON-NLS-1$
-    public static final String IMG_DLCL_TERMINATE_ALL = "IMG_DLCL_TERMINATE_ALL"; //$NON-NLS-1$
-    public static final String IMG_DLCL_TERMINATE_AND_RELAUNCH = "IMG_DLCL_TERMINATE_AND_RELAUNCH"; //$NON-NLS-1$
-    public static final String IMG_DLCL_TOGGLE_STEP_FILTERS = "IMG_DLCL_TOGGLE_STEP_FILTERS"; //$NON-NLS-1$
-    
-    //TODO: Move this IDebugUIConstants. Created too late in 3.2 cycle to add API.
-    //The enabled icon is already API.
-    public static final String IMG_DLCL_DISCONNECT= "IMG_DLCL_DISCONNECT"; //$NON-NLS-1$
-    
-    // enabled local tool images    
-    public static final String IMG_ELCL_LOCK= "IMG_ELCL_LOCK"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DETAIL_PANE= "IMG_ELCL_DETAIL_PANE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_CHANGE_VARIABLE_VALUE= "IMG_ELCL_CHANGE_VARIABLE_VALUE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_TYPE_NAMES= "IMG_ELCL_TYPE_NAMES"; //$NON-NLS-1$
-    public static final String IMG_ELCL_SHOW_LOGICAL_STRUCTURE= "IMG_ELCL_SHOW_LOGICAL_STRUCTURE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DETAIL_PANE_UNDER= "IMG_ELCL_DETAIL_PANE_UNDER"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DETAIL_PANE_RIGHT= "IMG_ELCL_DETAIL_PANE_RIGHT"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DETAIL_PANE_HIDE= "IMG_ELCL_DETAIL_PANE_HIDE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_COLLAPSE_ALL = "IMG_ELCL_COLLAPSE_ALL"; //$NON-NLS-1$
-    public static final String IMG_ELCL_TERMINATE = "IMG_ELCL_TERMINATE"; //$NON-NLS-1$
-    public static final String IMG_SRC_LOOKUP_MENU_ELCL = "IMG_SRC_LOOKUP_MENU_ENABLED"; //$NON-NLS-1$
-    public static final String IMG_ELCL_MONITOR_EXPRESSION= "IMG_ELCL_MONITOR_EXPRESSION";  //$NON-NLS-1$
-    public static final String IMG_ELCL_REMOVE_MEMORY= "IMG_ELCL_REMOVE_MEMORY";  //$NON-NLS-1$
-    public static final String IMG_ELCL_RESET_MEMORY= "IMG_ELCL_RESET_MEMORY";  //$NON-NLS-1$
-    public static final String IMG_ELCL_COPY_VIEW_TO_CLIPBOARD= "IMG_ELCL_COPY_VIEW_TO_CLIPBOARD";  //$NON-NLS-1$
-    public static final String IMG_ELCL_PRINT_TOP_VIEW_TAB= "IMG_ELCL_PRINT_TOP_VIEW_TAB";  //$NON-NLS-1$
-    public static final String IMG_ELCL_REMOVE_ALL = "IMG_ELCL_REMOVE_ALL"; //$NON-NLS-1$
-    public static final String IMG_ELCL_REMOVE = "IMG_ELCL_REMOVE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_HIERARCHICAL = "IMG_ELCL_HIERARCHICAL"; //$NON-NLS-1$
-    public static final String IMG_ELCL_HELP = "IMG_ELCL_HELP"; //$NON-NLS-1$
-    public static final String IMG_ELCL_NEW_CONFIG = "IMG_ELCL_NEW_CONFIG"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DELETE_CONFIG = "IMG_ELCL_DELETE_CONFIG"; //$NON-NLS-1$
-    public static final String IMG_ELCL_FILTER_CONFIGS = "IMG_ELCL_FILTER_CONFIGS"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DUPLICATE_CONFIG = "IMG_ELCL_DUPLICATE_CONFIG"; //$NON-NLS-1$
-    public static final String IMG_ELCL_SUSPEND = "IMG_ELCL_SUSPEND"; //$NON-NLS-1$
-    public static final String IMG_ELCL_RESUME = "IMG_ELCL_RESUME"; //$NON-NLS-1$
-    public static final String IMG_ELCL_STEP_RETURN = "IMG_ELCL_STEP_RETURN"; //$NON-NLS-1$
-    public static final String IMG_ELCL_STEP_OVER = "IMG_ELCL_STEP_OVER"; //$NON-NLS-1$
-    public static final String IMG_ELCL_STEP_INTO = "IMG_ELCL_STEP_INTO"; //$NON-NLS-1$
-    public static final String IMG_ELCL_DROP_TO_FRAME = "IMG_ELCL_DROP_TO_FRAME"; //$NON-NLS-1$
-    public static final String IMG_ELCL_TERMINATE_AND_REMOVE = "IMG_ELCL_TERMINATE_AND_REMOVE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_TERMINATE_ALL = "IMG_ELCL_TERMINATE_ALL"; //$NON-NLS-1$
-    public static final String IMG_ELCL_TERMINATE_AND_RELAUNCH = "IMG_ELCL_TERMINATE_AND_RELAUNCH"; //$NON-NLS-1$
-    public static final String IMG_ELCL_TOGGLE_STEP_FILTERS = "IMG_ELCL_TOGGLE_STEP_FILTERS"; //$NON-NLS-1$
-    public static final String IMG_ELCL_STANDARD_OUT = "IMG_ELCL_STANDARD_OUT"; //$NON-NLS-1$
-    public static final String IMG_ELCL_STANDARD_ERR = "IMG_ELCL_STANDARD_ERR"; //$NON-NLS-1$
-    
-    public static final String IMG_OBJS_COMMON_TAB = "IMG_OBJS_COMMON_TAB"; //$NON-NLS-1$
-    public static final String IMG_OBJS_REFRESH_TAB = "IMG_OBJS_REFRESH_TAB"; //$NON-NLS-1$
-    public static final String IMG_OBJS_PERSPECTIVE_TAB = "IMG_OBJS_PERSPECTIVE_TAB"; //$NON-NLS-1$
-    public static final String IMG_OBJS_ARRAY_PARTITION = "IMG_OBJS_ARRAY_PARTITION"; //$NON-NLS-1$
-    public static final String IMG_SRC_LOOKUP_TAB = "IMG_SRC_LOOKUP_TAB"; //$NON-NLS-1$
-    public static final String IMG_OBJECT_MEMORY_CHANGED="IMG_OBJECT_MEMORY_CHANGED";  //$NON-NLS-1$
-    public static final String IMG_OBJECT_MEMORY="IMG_OBJECT_MEMORY";  //$NON-NLS-1$
-    public static final String IMG_OBJS_BREAKPOINT_TYPE="IMG_OBJ_BREAKPOINT_TYPE"; //$NON-NLS-1$
-    
-    // wizard images
-    public static final String IMG_WIZBAN_IMPORT_BREAKPOINTS = "IMG_WIZBAN_IMPORT_BREAKPOINTS"; //$NON-NLS-1$
-    public static final String IMG_WIZBAN_EXPORT_BREAKPOINTS = "IMG_WIZBAN_EXPORT_BREAKPOINTS"; //$NON-NLS-1$
-    public static final String IMG_ADD_SRC_LOC_WIZ = "IMG_ADD_SRC_LOCATION"; //$NON-NLS-1$
-    public static final String IMG_EDIT_SRC_LOC_WIZ = "IMG_EDIT_SRC_LOCATION"; //$NON-NLS-1$
-    public static final String IMG_ADD_SRC_DIR_WIZ = "IMG_ADD_SRC_DIRECTORY"; //$NON-NLS-1$
-    public static final String IMG_EDIT_SRC_DIR_WIZ = "IMG_EDIT_SRC_DIRECTORY"; //$NON-NLS-1$
-    
-    // internal preferences
-    /**
-     * XML for perspective settings - see PerspectiveManager.
-     * @since 3.0
-     */
-    public static final String PREF_LAUNCH_PERSPECTIVES = IDebugUIConstants.PLUGIN_ID + ".PREF_LAUNCH_PERSPECTIVES"; //$NON-NLS-1$
-    
-    /**
-     * Represents the empty string
-     * @since 3.3
-     */
-    public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-    
-    /**
-     * Preference for enabling/disabling launch configuration filtering based on project accessibility status
-     * 
-     * @since 3.2
-     */
-    public static final String PREF_FILTER_LAUNCH_CLOSED = IDebugUIConstants.PLUGIN_ID + ".PREF_FILTER_LAUNCH_CLOSED"; //$NON-NLS-1$
-    
-    /**
-     * Preference for enabling/disabling launch configuration filtering based on project context
-     * 
-     * @since 3.2
-     */
-    public static final String PREF_FILTER_LAUNCH_DELETED = IDebugUIConstants.PLUGIN_ID + ".PREF_FILTER_LAUNCH_DELETED"; //$NON-NLS-1$
-        
-    /**
-     * Preference for enabling/disabling filtering based on selected items from the launch configuration type table
-     * @since 3.2
-     */
-    public static final String PREF_FILTER_LAUNCH_TYPES = IDebugUIConstants.PLUGIN_ID + ".PREF_FILTER_LAUNCH_TYPES"; //$NON-NLS-1$
-    
-    /**
-     * Preference that saves which launch configuration types have been checked on the Launch Configurations pref page
-     * @since 3.2
-     */
-    public static final String PREF_FILTER_TYPE_LIST = IDebugUIConstants.PLUGIN_ID + ".PREF_FILTER_TYPE_LIST"; //$NON-NLS-1$
-    
-    /**
-     * Preference for filtering launch configurations based on the currently active working sets
-     * @since 3.2
-     */
-    public static final String PREF_FILTER_WORKING_SETS = IDebugUIConstants.PLUGIN_ID + ".PREF_FILTER_WORKING_SETS"; //$NON-NLS-1$ 
-     
-    /** 
-     * Transparent overlay image identifier. 
-     */
-    public static final String IMG_OVR_TRANSPARENT = "IMG_OVR_TRANSPARENT";  //$NON-NLS-1$
-    
-    /**
-     * Editor Id for the "Source Not Found" editor
-     */
-    public static final String ID_SOURCE_NOT_FOUND_EDITOR = "org.eclipse.debug.ui.NoSourceFoundEditor"; //$NON-NLS-1$
-    
-    /**
-     * The name of the font to use for detail panes. This font is managed via
-     * the workbench font preference page.
-     * 
-     * @since 2.1
-     */ 
-    public static final String DETAIL_PANE_FONT= "org.eclipse.debug.ui.DetailPaneFont"; //$NON-NLS-1$   
-    
-    /**
-     * The name of the font to use for the variable text in the variables, registers and expression views.
-     * This font is managed via the workbench font preference page.
-     * 
-     * @since 3.3
-     */ 
-    public static final String VARIABLE_TEXT_FONT= "org.eclipse.debug.ui.VariableTextFont"; //$NON-NLS-1$   
-
-    /**
-     * Boolean preference indicating if contextual launch options should be visible
-     * to the user rather than the "run as" menu.
-     * 
-     * @since 3.3.0
-     * CONTEXTLAUNCHING
-     */ 
-    public static final String PREF_USE_CONTEXTUAL_LAUNCH = IDebugUIConstants.PLUGIN_ID + ".UseContextualLaunch"; //$NON-NLS-1$
-    
-    /**
-     * Boolean preference indicating that if the selected resource is not launchable, then we should
-     * launch the last configuration that was launched.
-     * 
-     * @since 3.3.0
-     * CONTEXTLAUNCHING
-     */
-    public static final String PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE = IDebugUIConstants.PLUGIN_ID + ".LaunchLastIfNotLaunchable"; //$NON-NLS-1$
-    
-    /**
-     * Boolean preference indicating if we should always consider the parent project when
-     * a selected context is not runnable
-     * 
-     *  @since 3.3.0
-     *  CONTEXTLAUNCHING
-     */
-    public static final String PREF_LAUNCH_PARENT_PROJECT = IDebugUIConstants.PLUGIN_ID + ".LaunchParentProject"; //$NON-NLS-1$
-    
-    /**
-     * String preference controlling whether editors are saved before launching.
-     * Valid values are either "always", "never", or "prompt".
-     * If "always" or "never", launching will save editors (or not) automatically.
-     * If "prompt", the user will be prompted each time.
-     * 
-     * @since 3.0
-     */
-    public static final String PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH = IDebugUIConstants.PLUGIN_ID + ".save_dirty_editors_before_launch"; //$NON-NLS-1$
-    
-    /**
-     * Preference specifying that all launches should be DEBUG_MODE if breakpoints exist in the workspace
-     * @since 3.0
-     */
-    public static final String PREF_RELAUNCH_IN_DEBUG_MODE = IDebugUIConstants.PLUGIN_ID + ".relaunch_in_debug_mode"; //$NON-NLS-1$
-
-    /**
-     * Preference specifying that launches should continue when compile errors exist.
-     * @since 3.0
-     */
-    public static final String PREF_CONTINUE_WITH_COMPILE_ERROR = IDebugUIConstants.PLUGIN_ID + ".cancel_launch_with_compile_errors"; //$NON-NLS-1$ 
-
-    /**
-     * Boolean preference controlling whether the debugger will force activate the debug
-     * view when a breakpoint is hit.
-     * 
-     * @since 3.0
-     */
-    public static final String PREF_ACTIVATE_DEBUG_VIEW= IDebugUIConstants.PLUGIN_ID + ".activate_debug_view"; //$NON-NLS-1$
-
-    /**
-     * String preference controlling whether the debugger switching to
-     * the associated perspective when launching.
-     * Valid values are either "always", "never", or "prompt".
-     * If "always" or "never", launching will switch perspectives (or not) automatically.
-     * If "prompt", the user will be prompted each time.
-     * 
-     * @since 3.0
-     */
-    public static final String PREF_SWITCH_TO_PERSPECTIVE= IDebugUIConstants.PLUGIN_ID + ".switch_to_perspective"; //$NON-NLS-1$
-
-    /**
-     * String preference controlling whether the debugger switching to
-     * the associated perspective when a launch suspends.
-     * Valid values are either "always", "never", or "prompt".
-     * If "always" or "never", suspension will switch perspectives (or not) automatically.
-     * If "prompt", the user will be prompted each time.
-     * 
-     * @since 3.0
-     */
-    public static final String PREF_SWITCH_PERSPECTIVE_ON_SUSPEND= IDebugUIConstants.PLUGIN_ID + ".switch_perspective_on_suspend"; //$NON-NLS-1$
-
-	/**
-	 * String preference controlling whether the debugger waits for a currently
-	 * pending (running or waiting) background build to complete before launching.
-	 * Valid values are either "always", "never", or "prompt".
-	 * If "always" or "never", launching will wait for builds to finish (or not) automatically.
-	 * If "prompt", the user will be prompted each time.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String PREF_WAIT_FOR_BUILD= IDebugUIConstants.PLUGIN_ID + ".wait_for_build"; //$NON-NLS-1$
-	
-	/**
-	 * Font for Memory View
-	 * 
-	 * @since 3.0
-	 */
-	public final static String FONT_NAME = IDebugUIConstants.PLUGIN_ID + ".MemoryViewTableFont"; //$NON-NLS-1$
-	
-	public final static int ADD_UNIT_PER_LINE = 16;	// number of addressable unit per line
-	public final static int CHAR_PER_BYTE = 2;		// number of characters to represent one byte
-
-    /**
-     * Memory view's rendering view pane identifier (value <code>"org.eclipse.debug.ui.MemoryView.RenderingViewPane"</code>).
-     * @since 3.1
-     */
-    public static String ID_RENDERING_VIEW_PANE = RenderingViewPane.RENDERING_VIEW_PANE_ID;
-    
-    /**
-     * Memory view's memory block tree viewer's identifier. (value <code>"org.eclipse.debug.ui.MemoryView.MemoryBlocksTreeViewPane"</code>).
-     * @since 3.1
-     */
-    public static String ID_MEMORY_BLOCK_TREE_VIEWER = MemoryBlocksTreeViewPane.PANE_ID;
-
-    /** 
-     * Memory view image identifier
-     * 
-     * @since 3.0
-     * */
-    public static final String IMG_CVIEW_MEMORY_VIEW= "IMG_CVIEW_MEMORY_VIEW";  //$NON-NLS-1$
-
-    /**
-     * Boolean preference controlling whether the debug view tracks
-     * views as the user manually opens/closes them for the purpose
-     * of not automatically opening/closing such views.
-     * 
-     * @since 3.0
-     */
-    public static final String PREF_TRACK_VIEWS= IDebugUIConstants.PLUGIN_ID + ".track_views"; //$NON-NLS-1$
-	
-    /**
-     * Comma separated list of view ids closed by the user, that have view context bindings.
-     * @since 3.2
-     */
-    public static final String PREF_USER_VIEW_BINDINGS = IDebugUIConstants.PLUGIN_ID + ".user_view_bindings"; //$NON-NLS-1$
-    
-    /**
-     * Preference storing memento for the default breakpoint working set in
-     * the breakpoints view.
-     * 
-     * @since 3.1
-     */
-    public static final String MEMENTO_BREAKPOINT_WORKING_SET_NAME = DebugUIPlugin.getUniqueIdentifier() + ".MEMENTO_BREAKPOINT_WORKING_SET_NAME"; //$NON-NLS-1$
-
-    /**
-     * Breakpoint working set identifier.
-     * 
-     * @since 3.1
-     */
-    public static final String ID_BREAKPOINT_WORKINGSET = "org.eclipse.debug.ui.breakpointWorkingSet"; //$NON-NLS-1$
-    
-    
-    /**
-     * Address at the beginning of a page in a table rendering.
-     * @since 3.1
-     */
-    public static final String PROPERTY_PAGE_START_ADDRESS = "pageStart"; //$NON-NLS-1$
-
-    
-    /**
-     * This constant is used as a "quick-fix" for the issue of breakpoint to working set
-     * persistence when the state of a project changes.
-     * 
-     * @since 3.2
-     */
-    public static final String WORKING_SET_NAME = "workingset_name"; //$NON-NLS-1$
-    
-    /**
-     * This constant is used as a "quick-fix" for the issue of breakpoint to working set
-     * persistence when the state of a project changes.
-     * 
-     * @since 3.2
-     */
-    public static final String WORKING_SET_ID = "workingset_id";  //$NON-NLS-1$
-    
-    /**
-     * Annotation type identifier for annotation of the an instruction
-     * pointer with a dynamic image. Value is <code>org.eclipse.debug.ui.dynamicIP</code>,
-     * identifying a <code>org.eclipse.ui.editors.markerAnnotationSpecification</code>
-     * extension.
-     * 
-     * @since 3.2
-     */
-    public static final String ANNOTATION_TYPE_DYNAMIC_INSTRUCTION_POINTER = "org.eclipse.debug.ui.dynamicIP"; //$NON-NLS-1$
-    
-    /**
-     * Preference for background color in tree columns when a value changes color.
-     * 
-     * @since 3.2
-     */
-    public static final String PREF_CHANGED_VALUE_BACKGROUND = IDebugUIConstants.PLUGIN_ID + ".PREF_CHANGED_VALUE_BACKGROUND"; //$NON-NLS-1$
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ILaunchHistoryChangedListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ILaunchHistoryChangedListener.java
deleted file mode 100644
index 1156d2f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ILaunchHistoryChangedListener.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.debug.internal.ui;
-
-
-/**
- * Implementors of this interface are notified whenever there is a change is
- * made to the launch history. This could be an addition or deletion from either
- * of the run or debug histories, a change to the last launched item, or a
- * change in favorites.
- */
-public interface ILaunchHistoryChangedListener {
-
-	/**
-	 * Notification that the launch history has changed.  Any of the run history, debug history
-	 * or last launched items could have changed.  To examine the history items, retrieve them
-	 * from the <code>DebugUIPlugin</code>.
-	 */
-	public void launchHistoryChanged();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ILaunchLabelChangedListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ILaunchLabelChangedListener.java
deleted file mode 100644
index fe30134..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ILaunchLabelChangedListener.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.debug.internal.ui;
-
-import org.eclipse.debug.ui.ILaunchGroup;
-
-/**
- * Implementors of this interface are notified when a changed has been made to 
- * the cache of context sensitive labels stored in the <code>LaunchingResourceManager</code>.
- * A change can come from either a selection change, or from a change to the launch history(s).
- * 
- * <p>
- * Clients are intended to implement this interface
- * </p>
- * 
- * @since 3.3
- */
-public interface ILaunchLabelChangedListener {
-	
-	/**
-	 * This method is called back to by <code>LaunchingResourceManager</code> iff the cache of labels
-	 * for the current set of listeners has changed
-	 */
-	public void labelChanged();
-	
-	/**
-	 * Returns the launch group that this listener is associated with.
-	 * @return the launch group that this listener is associated with, or <code>null</code> if none
-	 */
-	public ILaunchGroup getLaunchGroup();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ImageDescriptorRegistry.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ImageDescriptorRegistry.java
deleted file mode 100644
index 35be296..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ImageDescriptorRegistry.java
+++ /dev/null
@@ -1,91 +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.debug.internal.ui;
-
- 
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
- */
-public class ImageDescriptorRegistry {
-
-	private HashMap fRegistry= new HashMap(10);
-	private Display fDisplay;
-	
-	/**
-	 * Creates a new image descriptor registry for the current or default display,
-	 * respectively.
-	 */
-	public ImageDescriptorRegistry() {
-		this(DebugUIPlugin.getStandardDisplay());
-	}
-	
-	/**
-	 * Creates a new image descriptor registry for the given display. All images
-	 * managed by this registry will be disposed when the display gets disposed.
-	 * 
-	 * @param display the display the images managed by this registry are allocated for 
-	 */
-	public ImageDescriptorRegistry(Display display) {
-		fDisplay= display;
-		Assert.isNotNull(fDisplay);
-		hookDisplay();
-	}
-	
-	/**
-	 * Returns the image associated with the given image descriptor.
-	 * 
-	 * @param descriptor the image descriptor for which the registry manages an image
-	 * @return the image associated with the image descriptor or <code>null</code>
-	 *  if the image descriptor can't create the requested image.
-	 */
-	public Image get(ImageDescriptor descriptor) {
-		if (descriptor == null)
-			descriptor= ImageDescriptor.getMissingImageDescriptor();
-			
-		Image result= (Image)fRegistry.get(descriptor);
-		if (result != null)
-			return result;
-	
-		Assert.isTrue(fDisplay == DebugUIPlugin.getStandardDisplay(), DebugUIMessages.ImageDescriptorRegistry_0); 
-		result= descriptor.createImage();
-		if (result != null)
-			fRegistry.put(descriptor, result);
-		return result;
-	}
-
-	/**
-	 * Disposes all images managed by this registry.
-	 */	
-	public void dispose() {
-		for (Iterator iter= fRegistry.values().iterator(); iter.hasNext(); ) {
-			Image image= (Image)iter.next();
-			image.dispose();
-		}
-		fRegistry.clear();
-	}
-	
-	private void hookDisplay() {
-		fDisplay.disposeExec(new Runnable() {
-			public void run() {
-				dispose();
-			}	
-		});
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerAnnotation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerAnnotation.java
deleted file mode 100644
index 38443e0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerAnnotation.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.debug.internal.ui;
-
- 
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Default instruction pointer annotation.
- */
-public class InstructionPointerAnnotation extends DynamicInstructionPointerAnnotation {
-	
-	/**
-	 * The image for this annotation.
-	 */
-	private Image fImage;
-	
-	/**
-	 * Constructs an instruction pointer image.
-	 * 
-	 * @param frame stack frame the instruction pointer is associated with
-	 * @param annotationType the type of annotation to display (annotation identifier)
-	 * @param text the message to display with the annotation as hover help
-	 * @param image the image used to display the annotation
-	 */
-	public InstructionPointerAnnotation(IStackFrame frame, String annotationType, String text, Image image) {
-		super(frame, annotationType, text);
-		fImage = image;
-	}
-		
-	/**
-	 * Returns this annotation's image.
-	 * 
-	 * @return image
-	 */
-	protected Image getImage() {
-		return fImage;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerContext.java
deleted file mode 100644
index e7ca30e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerContext.java
+++ /dev/null
@@ -1,100 +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.debug.internal.ui;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Represents the context for a single instruction pointer.  This is a convenience class
- * used to store the four objects that comprise an instruction pointer 'context' so it
- * can be stored in collections.
- */
-public class InstructionPointerContext {
-
-	/**
-	 * The thread this context belongs to.
-	 */
-	private IThread fThread;
-	
-	/**
-	 * The debug target this context belongs to.
-	 */
-	private IDebugTarget fDebugTarget;
-	
-	/**
-	 * The editor that the annotation is being displayed in
-	 */
-	private ITextEditor fEditor;
-	
-	/**
-	 * The vertical ruler annotation for this context.
-	 */
-	private Annotation fAnnotation;
-
-	public InstructionPointerContext(IDebugTarget target, IThread thread, ITextEditor editor, Annotation annotation) {
-		fDebugTarget = target;
-		fThread = thread;
-		fEditor = editor;
-		fAnnotation = annotation;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object other) {
-		if (other instanceof InstructionPointerContext) {
-			InstructionPointerContext otherContext = (InstructionPointerContext) other;
-			if (getAnnotation().equals(otherContext.getAnnotation())){
-				return getEditor().equals(otherContext.getEditor());
-			}
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getAnnotation().hashCode() + getEditor().hashCode();
-	}
-
-	/**
-	 * @return the thread
-	 */
-	public IThread getThread() {
-		return fThread;
-	}
-
-	/**
-	 * @return the debug target
-	 */
-	public IDebugTarget getDebugTarget() {
-		return fDebugTarget;
-	}
-
-	/**
-	 * @return the editor
-	 */
-	public ITextEditor getEditor() {
-		return fEditor;
-	}
-	
-	/**
-	 * @return the annotation
-	 */
-	public Annotation getAnnotation() {
-		return fAnnotation;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerImageProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerImageProvider.java
deleted file mode 100644
index 93a5ef7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerImageProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.texteditor.IAnnotationImageProvider;
-
-public class InstructionPointerImageProvider implements IAnnotationImageProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getManagedImage(org.eclipse.jface.text.source.Annotation)
-	 */
-	public Image getManagedImage(Annotation annotation) {
-		return ((InstructionPointerAnnotation)annotation).getImage();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getImageDescriptorId(org.eclipse.jface.text.source.Annotation)
-	 */
-	public String getImageDescriptorId(Annotation annotation) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IAnnotationImageProvider#getImageDescriptor(java.lang.String)
-	 */
-	public ImageDescriptor getImageDescriptor(String imageDescritporId) {
-		return null;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerManager.java
deleted file mode 100644
index 51a6ab4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InstructionPointerManager.java
+++ /dev/null
@@ -1,338 +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.debug.internal.ui;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * This class tracks instruction pointer contexts for all active debug targets and threads
- * in the current workbench.  There should only ever be one instance of this class, obtained
- * via 'getDefault()'.
- */
-public class InstructionPointerManager{
-
-	/**
-	 * The singleton instance of this class.
-	 */
-	private static InstructionPointerManager fgDefault;
-
-	/**
-	 * Set containing all instruction pointer contexts this class manages
-	 */
-	private Set fIPCSet = new HashSet();
-	
-	/**
-	 * Maps ITextEditors to the set of instruction pointer contexts that are displayed in the editor
-	 */
-	private Map fEditorMap = new HashMap();
-	
-	/**
-	 * Part listener added to editors that contain annotations.  Allows instruction pointer contexts to
-	 * be removed when the editor they are displayed in is removed.
-	 */
-	private IPartListener2 fPartListener;
-	
-	/**
-	 * Page listener added to the workbench window to remove part listeners when the page is closed.  
-	 */
-	private IPageListener fPageListener;
-	
-	/**
-	 * Clients must not instantiate this class.
-	 */
-	private InstructionPointerManager() {
-	}
-	
-	/**
-	 * Return the singleton instance of this class, creating it if necessary.
-	 */
-	public static InstructionPointerManager getDefault() {
-		if (fgDefault == null) {
-			fgDefault = new InstructionPointerManager();
-		}
-		return fgDefault;
-	}
-	
-	/**
-	 * Adds an instruction pointer annotation in the specified editor for the 
-	 * specified stack frame.
-	 */
-	public void addAnnotation(ITextEditor textEditor, IStackFrame frame, Annotation annotation) {
-		
-		IDocumentProvider docProvider = textEditor.getDocumentProvider();
-		IEditorInput editorInput = textEditor.getEditorInput();
-        // If there is no annotation model, there's nothing more to do
-        IAnnotationModel annModel = docProvider.getAnnotationModel(editorInput);
-        if (annModel == null) {
-            return;
-        }        
-		
-		// Create the Position object that specifies a location for the annotation
-		Position position = null;
-		int charStart = -1;
-		int length = -1; 
-		try {
-			charStart = frame.getCharStart();
-			length = frame.getCharEnd() - charStart;
-		} catch (DebugException de) {
-		}
-		if (charStart < 0) {
-			IDocument doc = docProvider.getDocument(editorInput);
-			if (doc == null) {
-				return;
-			}
-			try {
-				int lineNumber = frame.getLineNumber() - 1;
-				IRegion region = doc.getLineInformation(lineNumber);
-				charStart = region.getOffset();
-				length = region.getLength();
-			} catch (BadLocationException ble) {
-				return;
-			} catch (DebugException de) {
-				return;
-			}
-		}
-		if (charStart < 0) {
-			return;
-		}
-		position = new Position(charStart, length);
-		
-		if (frame.isTerminated()) {
-			return;
-		}
-		
-		synchronized (fIPCSet) {
-					
-			// Add the annotation at the position to the editor's annotation model.
-			annModel.removeAnnotation(annotation);
-			annModel.addAnnotation(annotation, position);
-			
-			// Create the instruction pointer context
-			InstructionPointerContext ipc = new InstructionPointerContext(frame.getDebugTarget(), frame.getThread(), textEditor, annotation);
-			
-			// Add the IPC to the set and map
-			Set editorIPCs = (Set)fEditorMap.get(textEditor);
-			if (editorIPCs == null){
-				editorIPCs = new HashSet();
-				fEditorMap.put(textEditor, editorIPCs);
-			} else {
-				editorIPCs.remove(ipc);
-			}
-			editorIPCs.add(ipc);
-			fIPCSet.remove(ipc);
-			fIPCSet.add(ipc);
-			
-			// Add a listener to the editor so we can remove the IPC when the editor is closed
-			textEditor.getSite().getPage().addPartListener(getPartListener());
-			textEditor.getSite().getPage().getWorkbenchWindow().addPageListener(getPageListener());
-		}
-	}
-	
-	/**
-	 * Remove all annotations associated with the specified debug target that this class
-	 * is tracking.
-	 */
-	public void removeAnnotations(IDebugTarget debugTarget) {
-		synchronized (fIPCSet) {
-			Iterator ipcIter = fIPCSet.iterator();
-			while (ipcIter.hasNext()) {
-				InstructionPointerContext currentIPC = (InstructionPointerContext) ipcIter.next();
-				if (currentIPC.getDebugTarget().equals(debugTarget)){
-					removeAnnotationFromModel(currentIPC);
-					ipcIter.remove();
-					removeAnnotationFromEditorMapping(currentIPC);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Remove all annotations associated with the specified thread that this class
-	 * is tracking.
-	 */
-	public void removeAnnotations(IThread thread) {
-		synchronized (fIPCSet) {
-			Iterator ipcIter = fIPCSet.iterator();
-			while (ipcIter.hasNext()) {
-				InstructionPointerContext currentIPC = (InstructionPointerContext) ipcIter.next();
-				if (currentIPC.getThread().equals(thread)){
-					removeAnnotationFromModel(currentIPC);
-					ipcIter.remove();
-					removeAnnotationFromEditorMapping(currentIPC);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Remove all annotations associated with the specified editor that this class
-	 * is tracking.
-	 */
-	public void removeAnnotations(ITextEditor editor) {
-		synchronized (fIPCSet) {
-			Set editorIPCs = (Set)fEditorMap.get(editor);
-			if (editorIPCs != null){
-				Iterator ipcIter = editorIPCs.iterator();
-				while (ipcIter.hasNext()) {
-					InstructionPointerContext currentIPC = (InstructionPointerContext) ipcIter.next();
-					removeAnnotationFromModel(currentIPC);
-					fIPCSet.remove(currentIPC);
-				}
-				fEditorMap.remove(editor);
-			}
-		}
-	}
-
-	/**
-	 * Remove the given ipc from the mapping of editors.
-	 */
-	private void removeAnnotationFromEditorMapping(InstructionPointerContext ipc) {
-		Set editorIPCs = (Set)fEditorMap.get(ipc.getEditor());
-		if (editorIPCs != null){
-			editorIPCs.remove(ipc);
-			if (editorIPCs.isEmpty()){
-				fEditorMap.remove(ipc.getEditor());
-			}
-		}
-		
-	}
-	
-	/**
-	 * Remove the annotation from the document model.
-	 */
-	private void removeAnnotationFromModel(InstructionPointerContext ipc){
-		IDocumentProvider docProvider = ipc.getEditor().getDocumentProvider();
-		if (docProvider != null) {
-			IAnnotationModel annotationModel = docProvider.getAnnotationModel(ipc.getEditor().getEditorInput());
-			if (annotationModel != null) {
-				annotationModel.removeAnnotation(ipc.getAnnotation());
-			}
-		}
-	}
-	
-	/**
-	 * Returns the number of instruction pointers.
-	 * Used by the test suite.
-	 * 
-	 * @return the number of instruction pointers
-	 * @since 3.2
-	 */
-	public int getInstructionPointerCount() {
-		return fIPCSet.size();
-	}
-	
-	/**
-	 * Returns the number of keys in the editor to IPC mapping
-	 * Used by the test suite.
-	 * 
-	 * @return the number of keys in the editor mapping
-	 * @since 3.3
-	 */
-	public int getEditorMappingCount() {
-		return fEditorMap.size();
-	}
-	
-	/**
-	 * @return the page listener to add to workbench window.
-	 */
-	private IPageListener getPageListener(){
-		if (fPageListener == null){
-			fPageListener = new PageListener();
-		}
-		return fPageListener;
-	}
-	
-	/**
-	 * @return the part listener to add to editors.
-	 */
-	private IPartListener2 getPartListener(){
-		if (fPartListener == null){
-			fPartListener = new PartListener();
-		}
-		return fPartListener;
-	}
-
-	/**
-	 * Part listener that is added to editors to track when the editor is no longer is displaying
-	 * the input containing instruction pointer annotations.
-	 */
-	class PartListener implements IPartListener2{
-		public void partActivated(IWorkbenchPartReference partRef) {}
-		public void partDeactivated(IWorkbenchPartReference partRef) {}
-		public void partHidden(IWorkbenchPartReference partRef) {}
-		public void partOpened(IWorkbenchPartReference partRef) {}
-		public void partVisible(IWorkbenchPartReference partRef) {}
-		public void partBroughtToTop(IWorkbenchPartReference partRef) {}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partClosed(IWorkbenchPartReference partRef) {
-			IWorkbenchPart part = partRef.getPart(false);
-			if (part instanceof ITextEditor){
-				removeAnnotations((ITextEditor)part);
-			}
-			
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partInputChanged(IWorkbenchPartReference partRef) {
-			IWorkbenchPart part = partRef.getPart(false);
-			if (part instanceof ITextEditor){
-				removeAnnotations((ITextEditor)part);
-			}
-		}
-	}
-	
-	/**
-	 * Page listener that is added to the workbench to remove the part listener when the page is closed.
-	 */
-	class PageListener implements IPageListener{
-
-		public void pageActivated(IWorkbenchPage page) {}
-		public void pageOpened(IWorkbenchPage page) {}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPageListener#pageClosed(org.eclipse.ui.IWorkbenchPage)
-		 */
-		public void pageClosed(IWorkbenchPage page) {
-			page.removePartListener(getPartListener());
-			page.getWorkbenchWindow().removePageListener(getPageListener());
-		}
-		
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchConfigurationTabExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchConfigurationTabExtension.java
deleted file mode 100644
index fbede66..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchConfigurationTabExtension.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.debug.internal.ui;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-
-/**
- * Provides a proxy to a launchConfigurationTabs extension point
- * 
- * @since 3.3
- */
-public final class LaunchConfigurationTabExtension {
-
-	/**
-	 * The configuration element backing this proxy
-	 */
-	IConfigurationElement fElement = null;
-	private Set fDelegates = null;
-	
-	/**
-	 * Constructor
-	 * @param element the <code>IConfigurationElement</code> for this proxy
-	 */
-	public LaunchConfigurationTabExtension(IConfigurationElement element) {
-		fElement = element;
-	}
-	
-	/**
-	 * Returns the unique id of the tab
-	 * @return the unique id of the tab
-	 */
-	public String getIdentifier() {
-		return fElement.getAttribute(IConfigurationElementConstants.ID);
-	}
-
-	/**
-	 * Returns the human readable name for the tab, not to be confused with the name that appears on the tab itself
-	 * @return the name of the tab
-	 */
-	public String getName() {
-		return fElement.getAttribute(IConfigurationElementConstants.NAME);
-	}
-
-	/**
-	 * Returns the instantiated class of this tab
-	 * @return the instantiated class of this tab
-	 */
-	public ILaunchConfigurationTab getTab() {
-		try {
-			Object object = fElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			if(object instanceof ILaunchConfigurationTab) {
-				return (ILaunchConfigurationTab) object;
-			}
-		} catch (CoreException e) {DebugUIPlugin.log(e);}
-		return null;
-	}
-
-	/**
-	 * Returns the unique id of the <code>ILaunchConfigurationTabGroup</code> that this tab contributes to
-	 * @return the id of the <code>ILaunchConfigurationTabGroup</code> this tab contributes to
-	 */
-	public String getTabGroupId() {
-		return fElement.getAttribute(IConfigurationElementConstants.GROUP);
-	}
-	
-	/**
-	 * This method returns the id of the tab that this tab should be placed immediately after.
-	 * @return the id of the relative tab or <code>null</code> if one has not been specified
-	 * 
-	 */
-	public String getRelativeTabId() {
-		IConfigurationElement[] elems = fElement.getChildren(IConfigurationElementConstants.PLACEMENT);
-		if(elems.length == 1) {
-			return elems[0].getAttribute(IConfigurationElementConstants.AFTER);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the id of the plugin that contributed this tab extension
-	 * @return the id of the plugin tat contributed this tab
-	 */
-	public String getPluginIdentifier() {
-		return fElement.getContributor().getName();
-	}
-	
-	/**
-	 * Returns a set of strings of the launch delegates that this tab contribution is associated with
-	 * @return the set of strings of the associated launch delegates, which can be an empty collection, never <code>null</code>.
-	 */
-	public Set getDelegateSet() {
-		if(fDelegates == null) {
-			fDelegates = new HashSet();
-			IConfigurationElement[] children = fElement.getChildren(IConfigurationElementConstants.ASSOCIATED_DELEGATE);
-			String id = null;
-			for(int i = 0; i < children.length; i++) {
-				id = children[i].getAttribute(IConfigurationElementConstants.DELEGATE);
-				if(id != null) {
-					fDelegates.add(id);
-				}
-			}
-		}
-		return fDelegates;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java
deleted file mode 100644
index e9f07c6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java
+++ /dev/null
@@ -1,438 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.views.variables.IndexedVariablePartition;
-import org.eclipse.debug.ui.IDebugEditorPresentation;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IInstructionPointerPresentation;
-import org.eclipse.debug.ui.IValueDetailListener;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A proxy to an IDebugModelPresentation extension. Instantiates the extension
- * when it is needed.
- */
-
-public class LazyModelPresentation implements IDebugModelPresentation, IDebugEditorPresentation, IColorProvider, IFontProvider, IInstructionPointerPresentation {
-	
-	/**
-	 * A temporary mapping of attribute ids to their values
-	 * @see IDebugModelPresentation#setAttribute
-	 */
-	protected HashMap fAttributes= new HashMap(3);
-
-	/**
-	 * The config element that defines the extension
-	 */
-	protected IConfigurationElement fConfig = null;
-	
-	/**
-	 * The actual presentation instance - null until called upon
-	 */
-	protected IDebugModelPresentation fPresentation = null;
-	
-	/**
-	 * Temp holding for listeners - we do not add to presentation until
-	 * it needs to be instantiated.
-	 */
-	protected ListenerList fListeners= new ListenerList();	
-	
-	protected boolean fImageRegistryInitialized = false;
-	
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugEditorPresentation#removeAnntations(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IThread)
-	 */
-	public void removeAnnotations(IEditorPart editorPart, IThread thread) {
-		IDebugModelPresentation presentation = getPresentation();
-		if (presentation instanceof IDebugEditorPresentation) {
-			((IDebugEditorPresentation)presentation).removeAnnotations(editorPart, thread);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugEditorPresentation#addAnnotations(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public boolean addAnnotations(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getPresentation();
-		if (presentation instanceof IDebugEditorPresentation) {
-			return ((IDebugEditorPresentation)presentation).addAnnotations(editorPart, frame);
-		}
-		return false;
-	}
-
-	/**
-	 * Constructs a lazy presentation from the config element.
-	 */
-	public LazyModelPresentation(IConfigurationElement configElement) {
-		fConfig = configElement;
-	}
-
-	/**
-	 * @see IDebugModelPresentation#getImage(Object)
-	 */
-	public Image getImage(Object element) {
-		fImageRegistryInitialized = true;
-		Image image = getPresentation().getImage(element);
-        if (image == null) {
-            image = getDefaultImage(element);
-        }
-        if (image != null) {
-            int flags= computeAdornmentFlags(element);
-            if (flags > 0) {
-                CompositeDebugImageDescriptor descriptor= new CompositeDebugImageDescriptor(image, flags);
-                return DebugUIPlugin.getImageDescriptorRegistry().get(descriptor);
-            }
-        }
-        return image;
-	}
-	
-	public boolean isImageRegistryInitialized() {
-		return fImageRegistryInitialized;
-	}
-
-	/**
-     * Computes and return common adornment flags for the given element.
-     * 
-     * @param element
-     * @return adornment flags defined in CompositeDebugImageDescriptor
-     */
-    private int computeAdornmentFlags(Object element) {
-        if (element instanceof IBreakpoint) {
-            if (!DebugPlugin.getDefault().getBreakpointManager().isEnabled()) {
-                return CompositeDebugImageDescriptor.SKIP_BREAKPOINT;
-            }
-        }
-        return 0;
-    }
-
-    /**
-     * Returns a default text label for the debug element
-     */
-    protected String getDefaultText(Object element) {
-        return DebugUIPlugin.getDefaultLabelProvider().getText(element);
-    }
-
-    /**
-     * Returns a default image for the debug element
-     */
-    protected Image getDefaultImage(Object element) {
-        return DebugUIPlugin.getDefaultLabelProvider().getImage(element);
-    }
-    
-    /**
-	 * @see IDebugModelPresentation#getText(Object)
-	 */
-	public String getText(Object element) {
-        if (!(element instanceof IndexedVariablePartition)) {
-            // Attempt to delegate        
-            String text = getPresentation().getText(element);
-            if (text != null) {
-                return text;
-            }
-        }
-        // If no delegate returned a text label, use the default
-        if (showVariableTypeNames()) {
-            try {
-                if (element instanceof IExpression) {
-                    StringBuffer buf = new StringBuffer();
-                    IValue value = ((IExpression)element).getValue();
-                    if (value != null) {
-                        buf.append(value.getReferenceTypeName());
-                        buf.append(' ');
-                    }
-                    buf.append(getDefaultText(element));
-                    return buf.toString(); 
-                } else if (element instanceof IVariable) {
-                    return new StringBuffer(((IVariable)element).getValue().getReferenceTypeName()).append(' ').append(getDefaultText(element)).toString();
-                }
-            } catch (DebugException de) {
-                DebugUIPlugin.log(de);
-            }
-        }
-        return getDefaultText(element);
-	}
-	
-    /**
-     * Whether or not to show variable type names.
-     * This option is configured per model presentation.
-     * This allows this option to be set per view, for example.
-     */
-    protected boolean showVariableTypeNames() {
-        Boolean show= (Boolean) fAttributes.get(DISPLAY_VARIABLE_TYPE_NAMES);
-        show= show == null ? Boolean.FALSE : show;
-        return show.booleanValue();
-    }
-    
-	/**
-	 * @see IDebugModelPresentation#computeDetail(IValue, IValueDetailListener)
-	 */
-	public void computeDetail(IValue value, IValueDetailListener listener) {
-		getPresentation().computeDetail(value, listener);
-	}	
-	
-	/**
-	 * @see ISourcePresentation#getEditorInput(Object)
-	 */
-	public IEditorInput getEditorInput(Object element) {
-		return getPresentation().getEditorInput(element);
-	}
-	
-	/**
-	 * @see ISourcePresentation#getEditorId(IEditorInput, Object)
-	 */
-	public String getEditorId(IEditorInput input, Object inputObject) {
-		return getPresentation().getEditorId(input, inputObject);
-	}
-
-	/**
-	 * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		if (fPresentation != null) {
-			getPresentation().addListener(listener);
-		}
-		fListeners.add(listener);
-	}
-
-	/**
-	 * @see IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (fPresentation != null) {
-			getPresentation().dispose();
-		}
-		fListeners = null;
-	}
-
-	/**
-	 * @see IBaseLabelProvider#isLabelProperty(Object, String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		if (fPresentation != null) {
-			return getPresentation().isLabelProperty(element, property);
-		} 
-		return false;
-	}
-
-	/**
-	 * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		if (fPresentation != null) {
-			getPresentation().removeListener(listener);
-		}
-		ListenerList listeners = fListeners;
-		if (listeners != null) {
-		    listeners.remove(listener);
-		}
-	}
-	
-	/**
-	 * Returns the real presentation, instantiating if required.
-	 */
-	protected IDebugModelPresentation getPresentation() {
-		if (fPresentation == null) {
-		    synchronized (this) {
-		        if (fPresentation != null) {
-		            // In the case that the synchronization is enforced, the "blocked" thread
-		            // should return the presentation configured by the "owning" thread.
-		            return fPresentation;
-		        }
-				try {
-					IDebugModelPresentation tempPresentation= (IDebugModelPresentation) DebugUIPlugin.createExtension(fConfig, "class"); //$NON-NLS-1$
-					// configure it
-					if (fListeners != null) {
-						Object[] list = fListeners.getListeners();
-						for (int i= 0; i < list.length; i++) {
-						    tempPresentation.addListener((ILabelProviderListener)list[i]);
-						}
-					}
-					Iterator keys= fAttributes.keySet().iterator();
-					while (keys.hasNext()) {
-						String key= (String)keys.next();
-						tempPresentation.setAttribute(key, fAttributes.get(key));
-					}
-					// Only assign to the instance variable after it's been configured. Otherwise,
-					// the synchronization is defeated (a thread could return the presentation before
-					// it's been configured).
-					fPresentation= tempPresentation;
-				} catch (CoreException e) {
-					DebugUIPlugin.log(e);
-				}
-		    }
-		}
-		return fPresentation;
-	}
-
-	/**
-	 * @see IDebugModelPresentation#setAttribute(String, Object)
-	 */
-	public void setAttribute(String id, Object value) {
-		if (value == null) {
-			return;
-		}
-		if (fPresentation != null) {
-			getPresentation().setAttribute(id, value);
-		}
-
-		fAttributes.put(id, value);
-	}
-	
-	/**
-	 * Returns the identifier of the debug model this
-	 * presentation is registered for.
-	 */
-	public String getDebugModelIdentifier() {
-		return fConfig.getAttribute("id"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Returns a new source viewer configuration for the details
-	 * area of the variables view, or <code>null</code> if
-	 * unspecified.
-	 * 
-	 * @return source viewer configuration or <code>null</code>
-	 * @exception CoreException if unable to create the specified
-	 * 	source viewer configuration
-	 */
-	public SourceViewerConfiguration newDetailsViewerConfiguration() throws CoreException {
-		String attr  = fConfig.getAttribute("detailsViewerConfiguration"); //$NON-NLS-1$
-		if (attr != null) {
-			return (SourceViewerConfiguration)fConfig.createExecutableExtension("detailsViewerConfiguration"); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns a copy of the attributes in this model presentation.
-	 * 
-	 * @return a copy of the attributes in this model presentation
-	 * @since 3.0
-	 */
-	public Map getAttributeMap() {
-		return (Map) fAttributes.clone();
-	}
-	
-	public Map getAttributes() {
-		return fAttributes;
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-     */
-    public Color getForeground(Object element) {
-        IDebugModelPresentation presentation = getPresentation();
-        if (presentation instanceof IColorProvider) {
-            IColorProvider colorProvider = (IColorProvider) presentation;
-            return colorProvider.getForeground(element);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-     */
-    public Color getBackground(Object element) {
-        IDebugModelPresentation presentation = getPresentation();
-        if (presentation instanceof IColorProvider) {
-            IColorProvider colorProvider = (IColorProvider) presentation;
-            return colorProvider.getBackground(element);
-        }
-        return null;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-     */
-    public Font getFont(Object element) {
-        IDebugModelPresentation presentation = getPresentation();
-        if (presentation instanceof IFontProvider) {
-            IFontProvider fontProvider = (IFontProvider) presentation;
-            return fontProvider.getFont(element);
-        }
-        return null;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getInstructionPointerAnnotation(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public Annotation getInstructionPointerAnnotation(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getPresentation();
-		if (presentation instanceof IInstructionPointerPresentation) {
-			IInstructionPointerPresentation pointerPresentation = (IInstructionPointerPresentation) presentation;
-			return pointerPresentation.getInstructionPointerAnnotation(editorPart, frame);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getMarkerAnnotationSpecificationId(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public String getInstructionPointerAnnotationType(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getPresentation();
-		if (presentation instanceof IInstructionPointerPresentation) {
-			IInstructionPointerPresentation pointerPresentation = (IInstructionPointerPresentation) presentation;
-			return pointerPresentation.getInstructionPointerAnnotationType(editorPart, frame);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getInstructionPointerImage(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public Image getInstructionPointerImage(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getPresentation();
-		if (presentation instanceof IInstructionPointerPresentation) {
-			IInstructionPointerPresentation pointerPresentation = (IInstructionPointerPresentation) presentation;
-			return pointerPresentation.getInstructionPointerImage(editorPart, frame);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IInstructionPointerPresentation#getInstructionPointerText(org.eclipse.ui.IEditorPart, org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public String getInstructionPointerText(IEditorPart editorPart, IStackFrame frame) {
-		IDebugModelPresentation presentation = getPresentation();
-		if (presentation instanceof IInstructionPointerPresentation) {
-			IInstructionPointerPresentation pointerPresentation = (IInstructionPointerPresentation) presentation;
-			return pointerPresentation.getInstructionPointerText(editorPart, frame);
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java
deleted file mode 100644
index bae918a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java
+++ /dev/null
@@ -1,338 +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.debug.internal.ui;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.debug.ui.StringVariableSelectionDialog;
-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.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.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class MultipleInputDialog extends Dialog {
-	protected static final String FIELD_NAME = "FIELD_NAME"; //$NON-NLS-1$
-	protected static final int TEXT = 100;
-	protected static final int BROWSE = 101;
-	protected static final int VARIABLE = 102;
-	
-	protected Composite panel;
-	
-	protected List fieldList = new ArrayList();
-	protected List controlList = new ArrayList();
-	protected List validators = new ArrayList();
-	protected Map valueMap = new HashMap();
-
-	private String title;
-	
-	
-	
-	public MultipleInputDialog(Shell shell, String title) {
-		super(shell);
-		this.title = title;
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (title != null) {
-			shell.setText(title);
-		}
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createButtonBar(Composite parent) {
-		Control bar = super.createButtonBar(parent);
-		validateFields();
-		return bar;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = (Composite)super.createDialogArea(parent);
-		container.setLayout(new GridLayout(2, false));
-		container.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
-		panel = new Composite(container, SWT.NONE);
-		GridLayout layout = new GridLayout(2, false);
-		panel.setLayout(layout);
-		panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		for (Iterator i = fieldList.iterator(); i.hasNext();) {
-			FieldSummary field = (FieldSummary)i.next();
-			switch(field.type) {
-				case TEXT:
-					createTextField(field.name, field.initialValue, field.allowsEmpty);
-					break;
-				case BROWSE:
-					createBrowseField(field.name, field.initialValue, field.allowsEmpty);
-					break;
-				case VARIABLE:
-					createVariablesField(field.name, field.initialValue, field.allowsEmpty);
-					break;
-			}
-		}
-		
-		fieldList = null; // allow it to be gc'd
-		Dialog.applyDialogFont(container);
-		return container;
-	}
-	
-	public void addBrowseField(String labelText, String initialValue, boolean allowsEmpty) {
-		fieldList.add(new FieldSummary(BROWSE, labelText, initialValue, allowsEmpty));
-	}
-	public void addTextField(String labelText, String initialValue, boolean allowsEmpty) {
-		fieldList.add(new FieldSummary(TEXT, labelText, initialValue, allowsEmpty));
-	}
-	public void addVariablesField(String labelText, String initialValue, boolean allowsEmpty) {
-		fieldList.add(new FieldSummary(VARIABLE, labelText, initialValue, allowsEmpty));
-	}
-
-	protected void createTextField(String labelText, String initialValue, boolean allowEmpty) { 
-		Label label = new Label(panel, SWT.NONE);
-		label.setText(labelText);
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-		
-		final Text text = new Text(panel, SWT.SINGLE | SWT.BORDER);
-		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		text.setData(FIELD_NAME, labelText);
-		
-		// make sure rows are the same height on both panels.
-		label.setSize(label.getSize().x, text.getSize().y); 
-		
-		if (initialValue != null) {
-			text.setText(initialValue);
-		}
-		
-		if (!allowEmpty) {
-			validators.add(new Validator() {
-				public boolean validate() {
-					return !text.getText().equals(""); //$NON-NLS-1$
-				}
-			});
-			text.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
-		}
-		
-		controlList.add(text);
-	}
-	
-	protected void createBrowseField(String labelText, String initialValue, boolean allowEmpty) {
-		Label label = new Label(panel, SWT.NONE);
-		label.setText(labelText);
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-		
-		Composite comp = new Composite(panel, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight=0;
-		layout.marginWidth=0;
-		comp.setLayout(layout);
-		comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = 200;
-		text.setLayoutData(data);
-		text.setData(FIELD_NAME, labelText);
-
-		// make sure rows are the same height on both panels.
-		label.setSize(label.getSize().x, text.getSize().y); 
-		
-		if (initialValue != null) {
-			text.setText(initialValue);
-		}
-
-		if (!allowEmpty) {
-			validators.add(new Validator() {
-				public boolean validate() {
-					return !text.getText().equals(""); //$NON-NLS-1$
-				}
-			});
-
-			text.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
-		}
-		
-		Button button = createButton(comp, IDialogConstants.IGNORE_ID, DebugUIMessages.MultipleInputDialog_6, false); 
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				DirectoryDialog dialog = new DirectoryDialog(getShell());
-				dialog.setMessage(DebugUIMessages.MultipleInputDialog_7);  
-				String currentWorkingDir = text.getText();
-				if (!currentWorkingDir.trim().equals("")) { //$NON-NLS-1$
-					File path = new File(currentWorkingDir);
-					if (path.exists()) {
-						dialog.setFilterPath(currentWorkingDir);
-					}			
-				}
-				
-				String selectedDirectory = dialog.open();
-				if (selectedDirectory != null) {
-					text.setText(selectedDirectory);
-				}		
-			}
-		});
-
-		controlList.add(text);
-		
-	}
-	
-	
-	public void createVariablesField(String labelText, String initialValue, boolean allowEmpty) {
-		Label label = new Label(panel, SWT.NONE);
-		label.setText(labelText);
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-		
-		Composite comp = new Composite(panel, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight=0;
-		layout.marginWidth=0;
-		comp.setLayout(layout);
-		comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = 200;
-		text.setLayoutData(data);
-		text.setData(FIELD_NAME, labelText);
-
-		// make sure rows are the same height on both panels.
-		label.setSize(label.getSize().x, text.getSize().y); 
-		
-		if (initialValue != null) {
-			text.setText(initialValue);
-		}
-
-		if (!allowEmpty) {
-			validators.add(new Validator() {
-				public boolean validate() {
-					return !text.getText().equals(""); //$NON-NLS-1$
-				}
-			});
-
-			text.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					validateFields();
-				}
-			});
-		}
-		
-		Button button = createButton(comp, IDialogConstants.IGNORE_ID, DebugUIMessages.MultipleInputDialog_8, false); 
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
-				int code = dialog.open();
-				if (code == IDialogConstants.OK_ID) {
-					String variable = dialog.getVariableExpression();
-					if (variable != null) {
-						text.insert(variable);
-					}
-				}
-			}
-		});
-
-		controlList.add(text);
-				
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		for (Iterator i = controlList.iterator(); i.hasNext(); ) {
-			Control control = (Control)i.next();
-			if (control instanceof Text) {
-				valueMap.put(control.getData(FIELD_NAME), ((Text)control).getText());
-			}
-		}
-		controlList = null;
-		super.okPressed();
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		applyDialogFont(panel);
-		return super.open();
-	}
-	
-	public Object getValue(String key) {
-		return valueMap.get(key);
-	}
-	
-	public String getStringValue(String key) {
-		return  (String) getValue(key);
-	}
-	
-	public void validateFields() {
-		for(Iterator i = validators.iterator(); i.hasNext(); ) {
-			Validator validator = (Validator) i.next();
-			if (!validator.validate()) {
-				getButton(IDialogConstants.OK_ID).setEnabled(false);
-				return;
-			}
-		}
-		getButton(IDialogConstants.OK_ID).setEnabled(true);
-	}
-    
-	protected class FieldSummary {
-		int type;
-		String name;
-		String initialValue;
-		boolean allowsEmpty;
-		
-		public FieldSummary(int type, String name, String initialValue, boolean allowsEmpty) {
-			this.type = type;
-			this.name = name;
-			this.initialValue = initialValue;
-			this.allowsEmpty = allowsEmpty;
-		}
-	}
-	
-	protected class Validator {
-		boolean validate() {
-			return true;
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/Pair.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/Pair.java
deleted file mode 100644
index 69a6bf3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/Pair.java
+++ /dev/null
@@ -1,34 +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.debug.internal.ui;
-
-/**
- * Pair is a basic tuple of two with classic first and second members.
- * Since Java is non-polymorphic, we use Object(s) for the pair elements
- * and cast our brains out.
- */
-public class Pair {
-	public Object fFirst = null;
-	public Object fSecond = null;
-	public Pair(Object first, Object second) {
-		fFirst = first;
-		fSecond = second;
-	}
-	/*
-	 * String accessors
-	 */
-	public String firstAsString() {
-		return (String) fFirst;
-	}
-	public String secondAsString() {
-		return (String) fSecond;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/PixelConverter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/PixelConverter.java
deleted file mode 100644
index bc97afe..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/PixelConverter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-public class PixelConverter {
-	
-	private FontMetrics fFontMetrics;
-	
-	public PixelConverter(Control control) {
-		GC gc = new GC(control);
-		gc.setFont(control.getFont());
-		fFontMetrics= gc.getFontMetrics();
-		gc.dispose();
-	}
-		
-	/**
-	 * @see DialogPage#convertHorizontalDLUsToPixels
-	 */
-	public int convertHorizontalDLUsToPixels(int dlus) {
-		return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-	}
-	
-	/**
-	 * @see DialogPage#convertWidthInCharsToPixels
-	 */
-	public int convertWidthInCharsToPixels(int chars) {
-		return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResourceExtender.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResourceExtender.java
deleted file mode 100644
index 050acd6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResourceExtender.java
+++ /dev/null
@@ -1,140 +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.debug.internal.ui;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.expressions.PropertyTester;
-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.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.ui.IPathEditorInput;
-
-/**
- * ResourceExtender provides property testers for the XML expression language
- * evaluation. We provide a copy in Debug so that launch shortcuts can add
- * contextual launch enablement that does not require their plugins to be
- * loaded. Copied from
- * org.eclipse.jdt.internal.corext.refactoring.participants.xml.ResourceExtender
- */
-public class ResourceExtender extends PropertyTester {
-
-    private static final String PROPERTY_MATCHES_PATTERN = "matchesPattern"; //$NON-NLS-1$
-
-    private static final String PROJECT_NATURE = "projectNature"; //$NON-NLS-1$
-
-    private static final String PROPERTY_MATCHES_CONTENT_TYPE = "matchesContentType"; //$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 method, Object[] args, Object expectedValue) {
-        IResource resource = (IResource) ((IAdaptable) receiver).getAdapter(IResource.class);
-        if (resource == null) {
-        	if (PROPERTY_MATCHES_CONTENT_TYPE.equals(method)) {
-		        IPathEditorInput editorInput = (IPathEditorInput) ((IAdaptable) receiver).getAdapter(IPathEditorInput.class);
-		        if (editorInput != null) {
-		            IPath path= editorInput.getPath();
-		            File file= path.toFile();
-		            if (file.exists()) {
-		                try {
-		                    FileReader reader= new FileReader(file);
-		                    IContentType contentType= Platform.getContentTypeManager().getContentType((String)expectedValue);
-		                    IContentDescription description= contentType.getDescriptionFor(reader, IContentDescription.ALL);
-		                    reader.close();
-		                    if (description != null) {
-		                    	return matchesContentType(description.getContentType(), (String)expectedValue);
-		                    }
-		                } catch (FileNotFoundException e) {
-		                    return false;
-		                } catch (IOException e) {
-		                    return false;
-		                }
-		            }
-		        }
-        	}
-        } else {
-            if (PROPERTY_MATCHES_PATTERN.equals(method)) { 
-                String fileName = resource.getName();
-                String expected = (String) expectedValue;
-                expected = expected.replaceAll("\\.", "\\\\.");  //$NON-NLS-1$//$NON-NLS-2$
-                expected = expected.replaceAll("\\*", "\\.\\*");  //$NON-NLS-1$//$NON-NLS-2$
-                Pattern pattern = Pattern.compile(expected);
-                boolean retVal = pattern.matcher(fileName).find();
-                return retVal;
-            } else if (PROJECT_NATURE.equals(method)) {
-                try {
-                    IProject proj = resource.getProject();
-                    return proj.isAccessible() && proj.hasNature((String) expectedValue);
-                } catch (CoreException e) {
-                    return false;
-                }
-            } else if (PROPERTY_MATCHES_CONTENT_TYPE.equals(method)) {
-                return matchesContentType(resource, (String) expectedValue);
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * Returns whether the given type or one of its base types matches the 
-     * given content type identifier.
-     *  
-     * @param type content type or <code>null</code>
-     * @param typeId content type identifier
-     * @return
-     */
-    private boolean matchesContentType(IContentType type, String typeId) {
-        while (type != null) {
-        	if (typeId.equals(type.getId())) {
-        		return true;
-        	}
-        	type = type.getBaseType();
-        }
-        return false;
-    }
-
-    /**
-     * Returns whether or not the given file's content type matches the
-     * specified content type.
-     * 
-     * Content types are looked up in the content type registry.
-     * 
-     * @return whether or not the given resource has the given content type
-     */
-    private boolean matchesContentType(IResource resource, String contentType) {
-        if (resource == null || !(resource instanceof IFile) || !resource.exists()) {
-            return false;
-        }
-        IFile file = (IFile) resource;
-        IContentDescription description;
-        try {
-            description = file.getContentDescription();
-        } catch (CoreException e) {
-            return false;
-        }
-        if (description != null) {
-        	return matchesContentType(description.getContentType(), contentType);
-        }
-        return false;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/SWTFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/SWTFactory.java
deleted file mode 100755
index 4b5960a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/SWTFactory.java
+++ /dev/null
@@ -1,481 +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.debug.internal.ui;
-
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-
-/**
- * Factory class to create some SWT resources. 
- */
-public class SWTFactory {
-		
-	/**
-	 * Returns a width hint for a button control.
-	 */
-	public static int getButtonWidthHint(Button button) {
-		button.setFont(JFaceResources.getDialogFont());
-		PixelConverter converter= new PixelConverter(button);
-		int widthHint= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-	}
-	
-	/**
-	 * Sets width and height hint for the button control.
-	 * <b>Note:</b> This is a NOP if the button's layout data is not
-	 * an instance of <code>GridData</code>.
-	 * 
-	 * @param	the button for which to set the dimension hint
-	 */		
-	public static void setButtonDimensionHint(Button button) {
-		Assert.isNotNull(button);
-		Object gd= button.getLayoutData();
-		if (gd instanceof GridData) {
-			((GridData)gd).widthHint= getButtonWidthHint(button);	
-			((GridData)gd).horizontalAlignment = GridData.FILL;	 
-		}
-	}		
-	
-	/**
-	 * Creates a check box button using the parents' font
-	 * @param parent the parent to add the button to
-	 * @param label the label for the button
-	 * @param image the image for the button 
-	 * @param checked the initial checked state of the button
-	 * @param hspan the horizontal span to take up in the parent composite
-	 * @return a new checked button set to the initial checked state
-	 * @since 3.3
-	 */
-	public static Button createCheckButton(Composite parent, String label, Image image, boolean checked, int hspan) {
-		Button button = new Button(parent, SWT.CHECK);
-		button.setFont(parent.getFont());
-		button.setSelection(checked);
-		if(image != null) {
-			button.setImage(image);
-		}
-		if(label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData();
-		gd.horizontalSpan = hspan;
-		button.setLayoutData(gd);
-		setButtonDimensionHint(button);
-		return button;
-	}
-	
-	/**
-	 * Creates and returns a new push button with the given
-	 * label and/or image.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * @param image image of <code>null</code>
-	 * 
-	 * @return a new push button
-	 */
-	public static Button createPushButton(Composite parent, String label, Image image) {
-		Button button = new Button(parent, SWT.PUSH);
-		button.setFont(parent.getFont());
-		if (image != null) {
-			button.setImage(image);
-		}
-		if (label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData();
-		button.setLayoutData(gd);	
-		SWTFactory.setButtonDimensionHint(button);
-		return button;	
-	}	
-
-	/**
-	 * Creates and returns a new radio button with the given
-	 * label.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * 
-	 * @return a new radio button
-	 */
-	public static Button createRadioButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.RADIO);
-		button.setFont(parent.getFont());
-		if (label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData();
-		button.setLayoutData(gd);	
-		SWTFactory.setButtonDimensionHint(button);
-		return button;	
-	}	
-	
-	/**
-	 * Creates a new label widget
-	 * @param parent the parent composite to add this label widget to
-	 * @param text the text for the label
-	 * @param hspan the horizontal span to take up in the parent composite
-	 * @return the new label
-	 * @since 3.2
-	 * 
-	 */
-	public static Label createLabel(Composite parent, String text, int hspan) {
-		Label l = new Label(parent, SWT.NONE);
-		l.setFont(parent.getFont());
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		gd.grabExcessHorizontalSpace = false;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a new label widget
-	 * @param parent the parent composite to add this label widget to
-	 * @param text the text for the label
-	 * @param font the font for the label
-	 * @param hspan the horizontal span to take up in the parent composite
-	 * @return the new label
-	 * @since 3.3
-	 */
-	public static Label createLabel(Composite parent, String text, Font font, int hspan) {
-		Label l = new Label(parent, SWT.NONE);
-		l.setFont(font);
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a wrapping label
-	 * @param parent the parent composite to add this label to
-	 * @param text the text to be displayed in the label
-	 * @param hspan the horizontal span that label should take up in the parent composite
-	 * @param wrapwidth the width hint that the label should wrap at
-	 * @return a new label that wraps at a specified width
-	 * @since 3.3
-	 */
-	public static Label createWrapLabel(Composite parent, String text, int hspan, int wrapwidth) {
-		Label l = new Label(parent, SWT.NONE | SWT.WRAP);
-		l.setFont(parent.getFont());
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		gd.widthHint = wrapwidth;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a new <code>CLabel</code> that will wrap at the specified width and has the specified image
-	 * @param parent the parent to add this label to
-	 * @param text the text for the label
-	 * @param image the image for the label
-	 * @param hspan the h span to take up in the parent
-	 * @param wrapwidth the with to wrap at
-	 * @return a new <code>CLabel</code>
-	 * @since 3.3
-	 */
-	public static CLabel createWrapCLabel(Composite parent, String text, Image image, int hspan, int wrapwidth) {
-		CLabel label = new CLabel(parent, SWT.NONE | SWT.WRAP);
-		label.setFont(parent.getFont());
-		if(text != null) {
-			label.setText(text);
-		}
-		if(image != null) {
-			label.setImage(image);
-		}
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		gd.widthHint = wrapwidth;
-		label.setLayoutData(gd);
-		return label;
-	}
-	
-	/**
-	 * Creates a wrapping label
-	 * @param parent the parent composite to add this label to
-	 * @param text the text to be displayed in the label
-	 * @param hspan the horizontal span that label should take up in the parent composite
-	 * @return a new label that wraps at a specified width
-	 * @since 3.3
-	 */
-	public static Label createWrapLabel(Composite parent, String text, int hspan) {
-		Label l = new Label(parent, SWT.NONE | SWT.WRAP);
-		l.setFont(parent.getFont());
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @return the new text widget
-	 * @since 3.2
-	 * 
-	 */
-	public static Text createSingleText(Composite parent, int hspan) {
-    	Text t = new Text(parent, SWT.SINGLE | SWT.BORDER);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param style the style bits for the text widget
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param fill the fill for the grid layout
-	 * @return the new text widget
-	 * @since 3.3
-	 */
-	public static Text createText(Composite parent, int style, int hspan, int fill) {
-    	Text t = new Text(parent, style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param style the style bits for the text widget
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @return the new text widget
-	 * @since 3.3
-	 */
-	public static Text createText(Composite parent, int style, int hspan) {
-    	Text t = new Text(parent, style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param style the style bits for the text widget
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param width the desired width of the text widget
-	 * @param height the desired height of the text widget
-	 * @param fill the fill style for the widget
-	 * @return the new text widget
-	 * @since 3.3
-	 */
-	public static Text createText(Composite parent, int style, int hspan, int width, int height, int fill) {
-    	Text t = new Text(parent, style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-    	gd.horizontalSpan = hspan;
-    	gd.widthHint = width;
-    	gd.heightHint = height;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a Group widget
-	 * @param parent the parent composite to add this group to
-	 * @param text the text for the heading of the group
-	 * @param columns the number of columns within the group
-	 * @param hspan the horizontal span the group should take up on the parent
-	 * @param fill the style for how this composite should fill into its parent
-	 * @return the new group
-	 * @since 3.2
-	 * 
-	 */
-	public static Group createGroup(Composite parent, String text, int columns, int hspan, int fill) {
-    	Group g = new Group(parent, SWT.NONE);
-    	g.setLayout(new GridLayout(columns, false));
-    	g.setText(text);
-    	g.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-    }
-	
-	/**
-	 * Creates a Composite widget
-	 * @param parent the parent composite to add this composite to
-	 * @param columns the number of columns within the composite
-	 * @param hspan the horizontal span the composite should take up on the parent
-	 * @param fill the style for how this composite should fill into its parent
-	 * @return the new group
-	 * @since 3.3
-	 */
-	public static Composite createComposite(Composite parent, Font font, int columns, int hspan, int fill) {
-    	Composite g = new Composite(parent, SWT.NONE);
-    	g.setLayout(new GridLayout(columns, false));
-    	g.setFont(font);
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-    }
-	
-	/**
-	 * Creates a composite that uses the parents' font and has a grid layout
-	 * @param parent the parent to add the composite to
-	 * @param columns the number of columns the composite should have
-	 * @param hspan the horizontal span the new composite should take up in the parent
-	 * @param fill the fill style of the composite {@link GridData}
-	 * @return a new composite with a grid layout
-	 * 
-	 * @since 3.3
-	 */
-	public static Composite createComposite(Composite parent, int columns, int hspan, int fill) {
-		Composite g = new Composite(parent, SWT.NONE);
-    	g.setLayout(new GridLayout(columns, false));
-    	g.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-	}
-	
-	/**
-	 * Creates a vertical spacer for separating components. If applied to a 
-	 * <code>GridLayout</code>, this method will automatically span all of the columns of the parent
-	 * to make vertical space
-	 * 
-	 * @param parent the parent composite to add this spacer to
-	 * @param numlines the number of vertical lines to make as space
-	 * @since 3.3
-	 */
-	public static void createVerticalSpacer(Composite parent, int numlines) {
-		Label lbl = new Label(parent, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		Layout layout = parent.getLayout();
-		if(layout instanceof GridLayout) {
-			gd.horizontalSpan = ((GridLayout)parent.getLayout()).numColumns;
-		}
-		gd.heightHint = numlines;
-		lbl.setLayoutData(gd);
-	}
-	
-	/**
-	 * creates a horizontal spacer for separating components
-	 * @param comp
-	 * @param numlines
-	 * @since 3.3
-	 */
-	public static void createHorizontalSpacer(Composite comp, int numlines) {
-		Label lbl = new Label(comp, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = numlines;
-		lbl.setLayoutData(gd);
-	}
-	
-	/**
-	 * Creates a Composite widget
-	 * @param parent the parent composite to add this composite to
-	 * @param columns the number of columns within the composite
-	 * @param hspan the horizontal span the composite should take up on the parent
-	 * @param fill the style for how this composite should fill into its parent
-	 * @param marginwidth the width of the margin to place around the composite (default is 5, specified by GridLayout)
-	 * @return the new group
-	 * @since 3.3
-	 */
-	public static Composite createComposite(Composite parent, Font font, int columns, int hspan, int fill, int marginwidth, int marginheight) {
-		Composite g = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout(columns, false);
-		layout.marginWidth = marginwidth;
-		layout.marginHeight = marginheight;
-    	g.setLayout(layout);
-    	g.setFont(font);
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-	}
-	
-	/**
-	 * This method is used to make a combo box
-	 * @param parent the parent composite to add the new combo to
-	 * @param style the style for the Combo
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param fill how the combo will fill into the composite
-	 * Can be one of <code>GridData.FILL_HORIZONAL</code>, <code>GridData.FILL_BOTH</code> or <code>GridData.FILL_VERTICAL</code>
-	 * @param items the item to put into the combo
-	 * @return a new Combo instance
-	 * @since 3.3
-	 */
-	public static Combo createCombo(Composite parent, int style, int hspan, int fill, String[] items) {
-		Combo c = new Combo(parent, style);
-		c.setFont(parent.getFont());
-		GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-		c.setLayoutData(gd);
-		c.setItems(items);
-		c.select(0);
-		return c;
-	}
-	
-	/**
-	 * This method is used to make a combo box with a default fill style of GridData.FILL_HORIZONTAL
-	 * @param parent the parent composite to add the new combo to
-	 * @param style the style for the Combo
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param items the item to put into the combo
-	 * @return a new Combo instance
-	 * @since 3.3
-	 */
-	public static Combo createCombo(Composite parent, int style, int hspan, String[] items) {
-		Combo c = new Combo(parent, style);
-		c.setFont(parent.getFont());
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		c.setLayoutData(gd);
-		c.setItems(items);
-		c.select(0);
-		return c;
-	}
-	
-	/**
-	 * This method allows us to open the preference dialog on the specific page, in this case the perspective page
-	 * @param id the id of preference page to show
-	 * @param page the actual page to show
-	 * @since 3.2
-	 */
-	public static void showPreferencePage(String id) {
-		PreferencesUtil.createPreferenceDialogOn(DebugUIPlugin.getShell(), id, new String[] {id}, null).open();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariableValueEditorManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariableValueEditorManager.java
deleted file mode 100644
index c02ac4d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariableValueEditorManager.java
+++ /dev/null
@@ -1,108 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.IVariableValueEditor;
-
-/**
- * Manager which provides the variable value editors contributed
- * via the org.eclipse.debug.ui.variableValueEditors extension
- * point.
- * 
- * @see org.eclipse.debug.ui.actions.IVariableValueEditor
- * @since 3.1
- */
-public class VariableValueEditorManager {
-    
-    /**
-     * Mapping of debug model identifiers to variable value editors.
-     * The keys in this map are always Strings (model ids).
-     * The values in the map are IConfigurationElements at startup,
-     * which are replaced by IVariableValueEditors as the editors
-     * are instantiated (editors are loaded lazily, then cached).
-     */
-    private Map fEditorMap= new HashMap();
-    
-    /**
-     * The singleton instance of this manager.
-     */
-    private static VariableValueEditorManager fgManager;
-
-    /**
-     * Creates a new variable value editor manager. Clients
-     * should access the singleton instance of this manager
-     * by calling getDefault()
-     */
-    private VariableValueEditorManager() {
-        loadVariableEditors();
-    }
-
-    /**
-     * Returns the singleton instance of this manager.
-     * @return the singleton instance of this manager
-     */
-    public static VariableValueEditorManager getDefault() {
-        if (fgManager == null) {
-            fgManager= new VariableValueEditorManager();
-        }
-        return fgManager;
-    }
-    
-    /**
-     * Returns the variable value editor associated with the given debug
-     * model identifier or <code>null</code> if no editor has been supplied
-     * for the given debug model.
-     * @param modelIdentifier the debug model identifier
-     * @return the variable value editor associated with the given debug model
-     *  identifier or <code>null</code>
-     */
-    public IVariableValueEditor getVariableValueEditor(String modelIdentifier) {
-        Object object = fEditorMap.get(modelIdentifier);
-        IVariableValueEditor editor= null;
-        if (object instanceof IVariableValueEditor) {
-            editor= (IVariableValueEditor) object;
-        } else if (object instanceof IConfigurationElement) {
-            try {
-                editor = (IVariableValueEditor) ((IConfigurationElement) object).createExecutableExtension("class"); //$NON-NLS-1$
-                fEditorMap.put(modelIdentifier, editor);
-            } catch (CoreException e) {
-                // If an exception occurs, loading the extension, just log it and
-                // return null.
-                DebugUIPlugin.log(e);
-            }
-        }
-        return editor;
-    }
-	
-	/**
-	 * Loads contributors to the org.eclipse.debug.ui.variableValueEditors extension point,
-	 * for use when the user runs this action.
-	 */
-	private void loadVariableEditors() {
-		IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_VARIABLE_VALUE_EDITORS);
-		IConfigurationElement[] elements = ep.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-            IConfigurationElement element = elements[i];
-            String modelId = element.getAttribute("modelId"); //$NON-NLS-1$
-            if (modelId != null) {
-                fEditorMap.put(modelId, element);
-            }
-        }
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariablesViewModelPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariablesViewModelPresentation.java
deleted file mode 100644
index 2084afc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariablesViewModelPresentation.java
+++ /dev/null
@@ -1,59 +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.debug.internal.ui;
-
-
-import java.util.StringTokenizer;
-
-public class VariablesViewModelPresentation extends DelegatingModelPresentation {
-
-	/**
-	 * @see DelegatingModelPresentation#getText(Object)
-	 * 
-	 * Strips out control characters and replaces them with string representations
-	 */
-	public String getText(Object element) {
-		StringBuffer string= new StringBuffer();
-		StringTokenizer tokenizer= new StringTokenizer(super.getText(element), "\b\f\n\r\t\\", true); //$NON-NLS-1$
-		String token;
-		while (tokenizer.hasMoreTokens()) {
-			token= tokenizer.nextToken();
-			if (token.length() > 1) {
-				string.append(token);
-			} else {
-				switch (token.charAt(0)) {
-					case '\b':
-						string.append("\\b"); //$NON-NLS-1$
-						break;
-					case '\f':
-						string.append("\\f"); //$NON-NLS-1$
-						break;
-					case '\n':
-						string.append("\\n"); //$NON-NLS-1$
-						break;
-					case '\r':
-						string.append("\\r"); //$NON-NLS-1$
-						break;
-					case '\t':
-						string.append("\\t"); //$NON-NLS-1$
-						break;
-					case '\\':
-						string.append("\\\\"); //$NON-NLS-1$
-						break;
-					default:
-						string.append(token);
-				}
-			}
-		}
-		return string.toString();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/WorkingDirectoryStatusHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/WorkingDirectoryStatusHandler.java
deleted file mode 100644
index 8b25758..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/WorkingDirectoryStatusHandler.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.debug.internal.ui;
-
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-/**
- * Prompts the user to re-launch when a working directory
- * is not supported by the Eclipse runtime.
- */
-public class WorkingDirectoryStatusHandler implements IStatusHandler {
-
-	/**
-	 * @see IStatusHandler#handleStatus(IStatus, Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) {
-		final boolean[] result = new boolean[1];
-		DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-			public void run() {
-				String title= DebugUIMessages.WorkingDirectoryStatusHandler_Eclipse_Runtime_1; 
-				String message= DebugUIMessages.WorkingDirectoryStatusHandler_0; 
-				result[0]= (MessageDialog.openQuestion(DebugUIPlugin.getShell(), title, message));
-			}
-		});
-		return Boolean.valueOf(result[0]);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractDebugActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractDebugActionDelegate.java
deleted file mode 100644
index af5d5e8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractDebugActionDelegate.java
+++ /dev/null
@@ -1,307 +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.debug.internal.ui.actions;
-
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * This class is an abstract implementation of common features for a debug <code>IViewActionDelegate</code>
- *
- * This class is intended to be extended by clients
- * @see {@link IViewActionDelegate}
- * @see {@link IActionDelegate2}
- */
-public abstract class AbstractDebugActionDelegate implements IViewActionDelegate, IActionDelegate2 {
-	
-	/**
-	 * The underlying action for this delegate
-	 */
-	private IAction fAction;
-	/**
-	 * This action's view part, or <code>null</code>
-	 * if not installed in a view.
-	 */
-	private IViewPart fViewPart;
-	
-	/**
-	 * Cache of the most recent selection
-	 */
-	private IStructuredSelection fSelection = StructuredSelection.EMPTY;
-	
-	/**
-	 * Whether this delegate has been initialized
-	 */
-	private boolean fInitialized = false;
-	
-	/**
-	 * It's crucial that delegate actions have a zero-argument constructor so that
-	 * they can be reflected into existence when referenced in an action set
-	 * in the plugin's plugin.xml file.
-	 */
-	public AbstractDebugActionDelegate() {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose(){
-        fSelection= null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action){
-	    if (action.isEnabled()) {
-			IStructuredSelection selection = getSelection();
-			// disable the action so it cannot be run again until an event or selection change
-			// updates the enablement
-			action.setEnabled(false);
-			runInForeground(selection);
-	    }
-	}
-	
-	/**
-	 * Runs this action in the UI thread.
-	 */
-	private void runInForeground(final IStructuredSelection selection) {
-	    final MultiStatus status= 
-			new MultiStatus(DebugUIPlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, getStatusMessage(), null); 	    
-		BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
-			public void run() {
-			    Iterator selectionIter = selection.iterator();
-				while (selectionIter.hasNext()) {
-					Object element= selectionIter.next();
-					try {
-						// Action's enablement could have been changed since
-						// it was last enabled.  Check that the action is still
-						// enabled before running the action.
-						if (isEnabledFor(element))
-							doAction(element);
-					} catch (DebugException e) {
-						status.merge(e.getStatus());
-					}
-				}
-			}
-		});
-		reportErrors(status);
-	}
-
-	/**
-	 * Reports the specified <code>MultiStatus</code> in an error dialog
-	 * @param ms the specified <code>MultiStatus</code>
-	 */
-	private void reportErrors(final MultiStatus ms) {
-		if (!ms.isOK()) {
-			IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-			if (window != null) {
-				DebugUIPlugin.errorDialog(window.getShell(), ActionMessages.AbstractDebugActionDelegate_0, getErrorDialogMessage(), ms);
-			} else {
-				DebugUIPlugin.log(ms);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection s) {
-		boolean wasInitialized= initialize(action, s);		
-		if (!wasInitialized) {
-			if (getView() != null) {
-				update(action, s);
-			}
-		}
-	}
-	
-	/**
-	 * Updates the specified selection based on the selection, as well as setting the selection
-	 * for this action
-	 * @param action the action to update
-	 * @param s the selection
-	 */
-	protected void update(IAction action, ISelection s) {
-		if (s instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection)s;
-			action.setEnabled(getEnableStateForSelection(ss));
-			setSelection(ss);
-		} else {
-			action.setEnabled(false);
-			setSelection(StructuredSelection.EMPTY);
-		}
-	}
-	
-	/**
-	 * Performs the specific action on this element.
-	 */
-	protected abstract void doAction(Object element) throws DebugException;
-
-	/**
-	 * Returns the String to use as an error dialog message for
-	 * a failed action. This message appears as the "Message:" in
-	 * the error dialog for this action.
-	 * Default is to return null.
-	 */
-	protected String getErrorDialogMessage(){
-		return null;
-	}
-	/**
-	 * Returns the String to use as a status message for
-	 * a failed action. This message appears as the "Reason:"
-	 * in the error dialog for this action.
-	 * Default is to return the empty String.
-	 */
-	protected String getStatusMessage(){
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fViewPart = view;
-	}
-	
-	/**
-	 * Returns this action's view part, or <code>null</code>
-	 * if not installed in a view.
-	 * 
-	 * @return view part or <code>null</code>
-	 */
-	protected IViewPart getView() {
-		return fViewPart;
-	}
-
-	/**
-	 * Initialize this delegate, updating this delegate's
-	 * presentation.
-	 * As well, all of the flavors of AbstractDebugActionDelegates need to 
-	 * have the initial enabled state set with a call to update(IAction, ISelection).
-	 * 
-	 * @param action the presentation for this action
-	 * @return whether the action was initialized
-	 */
-	protected boolean initialize(IAction action, ISelection selection) {
-		if (!isInitialized()) {
-			setAction(action);
-			update(action, selection);
-			setInitialized(true);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the most recent selection
-	 * 
-	 * @return structured selection
-	 */	
-	protected IStructuredSelection getSelection() {
-		return fSelection;
-	}
-	
-	/**
-	 * Sets the most recent selection
-	 * 
-	 * @parm selection structured selection
-	 */	
-	private void setSelection(IStructuredSelection selection) {
-		fSelection = selection;
-	}	
-	
-	/**
-	 * Allows the underlying <code>IAction</code> to be set to the specified <code>IAction</code>
-	 * @param action the action to set
-	 */
-	protected void setAction(IAction action) {
-		fAction = action;
-	}
-
-	/**
-	 * Allows access to the underlying <code>IAction</code>
-	 * @return the underlying <code>IAction</code>
-	 */
-	protected IAction getAction() {
-		return fAction;
-	}
-	
-	/**
-	 * Returns if this action has been initialized or not
-	 * @return if this action has been initialized or not
-	 */
-	protected boolean isInitialized() {
-		return fInitialized;
-	}
-
-	/**
-	 * Sets the initialized state of this action to the specified boolean value
-	 * @param initialized the value to set the initialized state to
-	 */
-	protected void setInitialized(boolean initialized) {
-		fInitialized = initialized;
-	}
-	
-	/**
-	 * Return whether the action should be enabled or not based on the given selection.
-	 */
-	protected boolean getEnableStateForSelection(IStructuredSelection selection) {
-		if (selection.size() == 0) {
-			return false;
-		}
-		Iterator itr= selection.iterator();
-		while (itr.hasNext()) {
-			Object element= itr.next();
-			if (!isEnabledFor(element)) {
-				return false;
-			}
-		}
-		return true;		
-	}
-
-	/**
-	 * Returns if this action is enabled for the specified object context
-	 * @param element the context
-	 * @return true if it is, false otherwise
-	 */
-	protected boolean isEnabledFor(Object element) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		fAction = action;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractRemoveActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractRemoveActionDelegate.java
deleted file mode 100644
index f804e9b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractRemoveActionDelegate.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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Base implementation of the 'remove' action for a debug view
- * 
- * This class is intended to be extended by clients
- * @see {@link AbstractSelectionActionDelegate}
- * @see {@link org.eclipse.ui.IViewActionDelegate}
- * @see {@link org.eclipse.ui.IActionDelegate2}
- *
- */
-public abstract class AbstractRemoveActionDelegate extends AbstractSelectionActionDelegate {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractSelectionActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		super.init(view);
-		IDebugView debugView= (IDebugView)getView().getAdapter(IDebugView.class);
-		if (debugView != null) {
-			debugView.setAction(IDebugView.REMOVE_ACTION, getAction());
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractRemoveAllActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractRemoveAllActionDelegate.java
deleted file mode 100644
index 62f8019..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractRemoveAllActionDelegate.java
+++ /dev/null
@@ -1,117 +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.debug.internal.ui.actions;
-
- 
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * This class is a base implementation of a 'remove all' debug action
- * 
- * This class is intended to be extended by clients
- * @see {@link IViewActionDelegate}
- * @see {@link IActionDelegate2}}
- * @see {@link IWorkbenchWindowActionDelegate}
- */
-public abstract class AbstractRemoveAllActionDelegate implements IViewActionDelegate, IActionDelegate2, IWorkbenchWindowActionDelegate {
-	
-	/**
-	 * The underlying <code>IAction</code>
-	 */
-	private IAction fAction;
-
-	/**
-	 * Needed for reflective creation
-	 */
-	public AbstractRemoveAllActionDelegate() {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		fAction = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		fAction = action;
-	}
-
-	/**
-	 * Returns this delegate's action.
-	 * 
-	 * @return the underlying <code>IAction</code>
-	 */
-	protected IAction getAction() {
-		return fAction;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		initialize();
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		initialize();
-		update();
-	}
-
-	/**
-	 * Initializes any listeners, etc.
-	 */
-	protected abstract void initialize();
-	
-	/**
-	 * Update enablement.
-	 */
-	protected void update() {
-		IAction action = getAction();
-		if (action != null) {
-			action.setEnabled(isEnabled());
-		}
-	}
-	
-	/**
-	 * Returns whether this action is enabled
-	 * 
-	 * @return true if this action is enabled, false otherwise
-	 */
-	protected abstract boolean isEnabled();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection s) {
-		// do nothing
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractSelectionActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractSelectionActionDelegate.java
deleted file mode 100644
index 27e43b7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AbstractSelectionActionDelegate.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.debug.internal.ui.actions;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-
-/**
- * This class provides a base implementation of a selection action delegate, more specifically a delegate
- * that uses a selection context to update its underlying <code>IAction</code>.
- * 
- * This class is intended to be extended by clients
- * 
- * @see {@link IViewActionDelegate}
- * @see {@link IActionDelegate2}
- *
- */
-public abstract class AbstractSelectionActionDelegate implements IViewActionDelegate, IActionDelegate2 {
-
-	/**
-	 * The underlying action for this delegate
-	 */
-	private IAction fAction;
-	
-	/**
-	 * This action's view part, or <code>null</code> if not installed in a
-	 * view.
-	 */
-	private IViewPart fViewPart;
-
-	/**
-	 * Cache of the most recent selection
-	 */
-	private IStructuredSelection fSelection = StructuredSelection.EMPTY;
-
-	/**
-	 * Used to schedule jobs, or <code>null</code> if none
-	 */
-	private IWorkbenchSiteProgressService fProgressService = null;
-	
-	/**
-	 * It's crucial that delegate actions have a zero-arg constructor so that
-	 * they can be reflected into existence when referenced in an action set in
-	 * the plugin's plugin.xml file.
-	 */
-	public AbstractSelectionActionDelegate() {}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		fSelection = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection s) {
-		if (s instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) s;
-			action.setEnabled(getEnableStateForSelection(ss));
-			setSelection(ss);
-		} else {
-			action.setEnabled(false);
-			setSelection(StructuredSelection.EMPTY);
-		}
-	}
-
-	/**
-	 * Returns the String to use as an error dialog message for a failed action.
-	 * This message appears as the "Message:" in the error dialog for this
-	 * action. Default is to return null.
-	 * 
-	 * @return the message for the error dialog
-	 */
-	protected String getErrorDialogMessage() {
-		return null;
-	}
-
-	/**
-	 * Returns the String to use as a status message for a failed action. This
-	 * message appears as the "Reason:" in the error dialog for this action.
-	 * Default is to return the empty String.
-	 * 
-	 * @return the status message
-	 */
-	protected String getStatusMessage() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		setView(view);
-		fProgressService = (IWorkbenchSiteProgressService) view.getAdapter(IWorkbenchSiteProgressService.class);
-	}
-
-	/**
-	 * Returns this action's view part, or <code>null</code> if not installed
-	 * in a view.
-	 * 
-	 * @return the underlying <code>IViewPart</code> or <code>null</code>
-	 */
-	protected IViewPart getView() {
-		return fViewPart;
-	}
-
-	/**
-	 * Returns the most recent selection
-	 * 
-	 * @return structured selection
-	 */
-	protected IStructuredSelection getSelection() {
-		return fSelection;
-	}
-
-	/**
-	 * Sets the most recent selection
-	 * 
-	 * @parm selection structured selection
-	 */
-	private void setSelection(IStructuredSelection context) {
-		fSelection = context;
-	}
-
-	/**
-	 * Allows the underlying <code>IAction</code> to be set to the specified one
-	 * @param action the action to set
-	 */
-	protected void setAction(IAction action) {
-		fAction = action;
-	}
-
-	/**
-	 * Allows access to the underlying <code>IAction</code>
-	 * @return the underlying <code>IAction</code>
-	 */
-	protected IAction getAction() {
-		return fAction;
-	}
-
-	/**
-	 * Allows the underlying <code>IViewPart</code> to be set
-	 * @param viewPart the <code>IViewPart</code> to set
-	 */
-	protected void setView(IViewPart viewPart) {
-		fViewPart = viewPart;
-	}
-
-	/**
-	 * Return whether the action should be enabled or not based on the given
-	 * selection.
-	 * 
-	 * @return true if the action should be enabled for the specified selection context
-	 * false otherwise
-	 */
-	protected boolean getEnableStateForSelection(IStructuredSelection selection) {
-		if (selection.size() == 0) {
-			return false;
-		}
-		Iterator itr = selection.iterator();
-		while (itr.hasNext()) {
-			Object element = itr.next();
-			if (!isEnabledFor(element)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns if the action should be enabled for the specified object context
-	 * @param element the object context
-	 * @return true if the action should be enabled for the specified object context
-	 * false otherwise
-	 */
-	protected boolean isEnabledFor(Object element) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		setAction(action);
-	}
-
-	/**
-	 * Schedules the given job with this action's progress service
-	 * 
-	 * @param job
-	 */
-	protected void schedule(Job job) {
-		if (fProgressService == null) {
-			job.schedule();
-		} else {
-			fProgressService.schedule(job);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ActionMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ActionMessages.java
deleted file mode 100644
index f2c2858..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ActionMessages.java
+++ /dev/null
@@ -1,205 +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 - Initial API and implementation
- **********************************************************************/
-package org.eclipse.debug.internal.ui.actions;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ActionMessages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.actions.ActionMessages";//$NON-NLS-1$
-
-    public static String AbstractLaunchHistoryAction_0;
-    public static String AbstractLaunchHistoryAction_1;
-    public static String AbstractLaunchHistoryAction_2;
-    public static String AbstractLaunchHistoryAction_3;
-    public static String AbstractLaunchHistoryAction_4;
-
-	public static String AbstractLaunchHistoryAction_5;
-    
-    public static String AddToFavoritesAction_1;
-    public static String AddToFavoritesAction_2;
-    public static String AddToFavoritesAction_3;
-
-    public static String ChangeVariableValue_errorDialogMessage;
-    public static String ChangeVariableValue_errorDialogTitle;
-    public static String ChangeVariableValue_title;
-    public static String ChangeVariableValue_toolTipText;
-    public static String ChangeVariableValue_1;
-    public static String ChangeVariableValue_2;
-    public static String ChangeVariableValue_3;
-    public static String ChangeVariableValue_4;
-
-    public static String CollapseAllAction_0;
-
-    public static String ConfigureColumnsAction_0;
-	public static String ConfigureColumnsAction_1;
-	public static String ConfigureColumnsAction_2;
-    
-    public static String CopyToClipboardActionDelegate_Problem_Copying_to_Clipboard_1;
-    public static String CopyToClipboardActionDelegate_There_was_a_problem_when_accessing_the_system_clipboard__Retry__2;
-
-	public static String DebugLastAction_0;
-
-	public static String DebugLastAction_1;
-	public static String DebugLastAction_2;
-	public static String DebugLastAction_3;
-
-	public static String DetailPaneAssignValueAction_0;
-	public static String DetailPaneAssignValueAction_1;
-	public static String DetailPaneAssignValueAction_2;
-	public static String DetailPaneAssignValueAction_3;
-	public static String DetailPaneAssignValueAction_4;
-    public static String DetailPaneWordWrapAction_0;
-    public static String DetailPaneMaxLengthAction_0;
-
-    public static String EditLaunchConfigurationAction_1;
-
-    public static String EnableBreakpointAction_Enable_breakpoint_s__failed_2;
-    public static String EnableBreakpointAction_Enabling_breakpoints_3;
-    public static String EnableBreakpointAction_Exceptions_occurred_enabling_the_breakpoint_s___4;
-
-	public static String LaunchConfigurationAction_0;
-
-    public static String OpenBreakpointMarkerAction__Go_to_File_1;
-    public static String OpenBreakpointMarkerAction_Exceptions_occurred_attempting_to_open_the_editor_for_the_breakpoint_resource_2;
-    public static String OpenBreakpointMarkerAction_Go_to_Breakpoint_1;
-    public static String OpenBreakpointMarkerAction_Go_to_File_for_Breakpoint_2;
-
-	public static String OpenLaunchDialogAction_1;
-
-	public static String ProfileLastAction_0;
-
-	public static String ProfileLastAction_1;
-	public static String ProfileLastAction_2;
-	public static String ProfileLastAction_3;
-
-    public static String RelaunchActionDelegate_An_exception_occurred_while_launching_2;
-    public static String RelaunchActionDelegate_Launch_Failed_1;
-    public static String RelaunchLastAction_Cannot_relaunch_1;
-    public static String RelaunchLastAction_Cannot_relaunch___0___because_it_does_not_support__2__mode_2;
-    public static String RelaunchLastAction_Error_relaunching_3;
-    public static String RelaunchLastAction_Error_encountered_attempting_to_relaunch_4;
-    
-    public static String RemoveAllBreakpointsAction_0;
-    public static String RemoveAllBreakpointsAction_1;
-    public static String RemoveAllBreakpointsAction_2;
-	public static String RemoveAllBreakpointsAction_3;
-    public static String RemoveBreakpointAction_0;
-    public static String RemoveBreakpointAction_1;
-    public static String RemoveBreakpointAction_2;
-    public static String RemoveBreakpointAction_3;
-	public static String RemoveBreakpointAction_4;
-	public static String RemoveBreakpointAction_5;
-	public static String RemoveBreakpointAction_6;
-    public static String RemoveBreakpointAction_Exceptions_occurred_attempting_to_remove_a_breakpoint__5;
-    public static String RemoveBreakpointAction_Removing_a_breakpoint_4;
-
-	public static String RetargetRunToLineAction_0;
-
-	public static String RunLastAction_0;
-
-	public static String RunLastAction_1;
-	public static String RunLastAction_2;
-	public static String RunLastAction_3;
-
-    public static String ShowSupportedBreakpointsAction_Show_For_Selected;
-    public static String ShowSupportedBreakpointsAction_tooltip;
-
-    public static String ShowTypesAction_Show__Type_Names_1;
-    public static String ShowTypesAction_Show_Type_Names;
-
-    public static String SkipAllBreakpointsAction_0;
-    public static String SkipAllBreakpointsAction_2;
-    
-    public static String TerminateAndRelaunchAction_0;
-    public static String TerminateAndRelaunchAction_3;
-    public static String TerminateAndRelaunchAction_4;
-    public static String TerminateAndRemoveAction_0;
-    public static String TerminateAndRemoveAction_3;
-    
-    public static String ToggleDetailPaneAction_1;
-    public static String ToggleDetailPaneAction_2;
-    public static String ToggleDetailPaneAction_3;
-    public static String ToggleDetailPaneAction_4;
-    public static String ToggleDetailPaneAction_5;
-    public static String ToggleDetailPaneAction_6;
-    public static String ToggleDetailPaneAction_8;
-    public static String ToggleDetailPaneAction_9;
-    public static String ToggleBreakpointAction_0;
-    public static String ToggleBreakpointAction_1;
-    public static String ToggleBreakpointAction_2;
-	public static String ToggleStepFiltersAction_0;
-	public static String ToggleStepFiltersAction_1;
-
-    public static String WatchExpressionDialog_0;
-    public static String WatchExpressionDialog_1;
-    public static String WatchExpressionDialog_2;
-    public static String WatchExpressionDialog_3;
-    public static String WatchExpressionDialog_4;
-    public static String WatchAction_0;
-    public static String WatchAction_1;
-    
-    public static String RunToLineAction_0;
-    public static String RunToLineAction_1;
-    public static String RunToLineHandler_0;
-    public static String RunToLineActionDelegate_4;
-
-    public static String RetargetAction_2;
-    public static String RetargetAction_3;
-    public static String ModifyWatchpointAction_0;
-    public static String ModifyWatchpointAction_1;
-    public static String RemoveAllExpressionsAction_0;
-    public static String RemoveAllExpressionsAction_1;
-    public static String LaunchShortcutsAction_1;
-    public static String FindDialog_1;
-    public static String FindDialog_3;
-    public static String FindAction_0;
-
-    static {
-        // load message values from bundle file
-        NLS.initializeMessages(BUNDLE_NAME, ActionMessages.class);
-    }
-
-    public static String AbstractDebugActionDelegate_0;
-
-    public static String RetargetAddMemoryBlockAction_0;
-    public static String RetargetAddMemoryBlockAction_1;
-    public static String AddMemoryRenderingActionDelegate_0;
-    public static String AddMemoryRenderingActionDelegate_1;
-    public static String AddMemoryRenderingActionDelegate_2;
-
-    public static String RulerEnableDisableBreakpointAction_0;
-    public static String RulerEnableDisableBreakpointAction_1;
-    public static String RulerEnableDisableBreakpointAction_2;
-    public static String RulerEnableDisableBreakpointAction_3;
-
-    public static String DisconnectAction_0;
-    public static String DisconnectAction_3;
-    public static String DropToFrameAction_0;
-    public static String DropToFrameAction_3;
-    public static String ResumeAction_0;
-    public static String ResumeAction_3;
-    public static String StepIntoAction_0;
-    public static String StepIntoAction_3;
-    public static String StepOverAction_0;
-    public static String StepOverAction_3;
-    public static String StepReturnAction_2;
-    public static String StepReturnAction_3;
-    public static String SuspendAction_0;
-    public static String SuspendAction_3;
-    public static String TerminateAction_0;
-    public static String TerminateAction_3;
-    public static String TerminateAllAction_2;
-    public static String TerminateAllAction_3;
-
-	public static String DeleteWorkingsetsMessageDialog_0;
-	public static String DeleteWorkingsetsMessageDialog_1;
-
-	public static String ShowTypesAction_0;
-}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ActionMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ActionMessages.properties
deleted file mode 100644
index 56155e3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ActionMessages.properties
+++ /dev/null
@@ -1,193 +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
-###############################################################################
-
-AddToFavoritesAction_1=Add to {0} &Favorites
-AddToFavoritesAction_2=Error
-AddToFavoritesAction_3=Unable to add to favorites.
-
-ChangeVariableValue_errorDialogMessage=Setting the value failed.
-ChangeVariableValue_errorDialogTitle=Setting Value
-ChangeVariableValue_title=&Change Value...
-ChangeVariableValue_toolTipText=Change the Value of the Selected Variable or Register
-ChangeVariableValue_1=Set Value
-ChangeVariableValue_2=Enter a new value for {0}:
-ChangeVariableValue_3=An exception occurred
-ChangeVariableValue_4=Invalid value
-
-
-CollapseAllAction_0=Collapse All
-
-CopyToClipboardActionDelegate_Problem_Copying_to_Clipboard_1=Problem Copying to Clipboard
-CopyToClipboardActionDelegate_There_was_a_problem_when_accessing_the_system_clipboard__Retry__2=There was a problem when accessing the system clipboard. Retry?
-
-EditLaunchConfigurationAction_1=Edit {0}...
-
-EnableBreakpointAction_Enable_breakpoint_s__failed_2=Enable/Disable breakpoint(s) failed
-EnableBreakpointAction_Enabling_breakpoints_3=Enabling/disabling breakpoints
-EnableBreakpointAction_Exceptions_occurred_enabling_the_breakpoint_s___4=Exceptions occurred enabling/disabling the breakpoint(s).
-
-OpenBreakpointMarkerAction__Go_to_File_1=&Go to File
-OpenBreakpointMarkerAction_Exceptions_occurred_attempting_to_open_the_editor_for_the_breakpoint_resource_2=Exceptions occurred attempting to open the editor for the breakpoint resource
-OpenBreakpointMarkerAction_Go_to_Breakpoint_1=Go to File
-OpenBreakpointMarkerAction_Go_to_File_for_Breakpoint_2=Go to File for Breakpoint
-
-RelaunchActionDelegate_An_exception_occurred_while_launching_2=An exception occurred while launching
-RelaunchActionDelegate_Launch_Failed_1=Launch Failed
-
-RemoveAllBreakpointsAction_0=Remove All Breakpoints
-RemoveAllBreakpointsAction_1=Are you sure you want to remove all breakpoints?
-RemoveAllBreakpointsAction_2=Remove Breakpoints
-RemoveAllBreakpointsAction_3=Do not ask me again.
-RemoveAllExpressionsAction_0=Remove All Expressions
-RemoveAllExpressionsAction_1=Are you sure you want to remove all expressions?
-
-RemoveBreakpointAction_0=Delete Breakpoints
-RemoveBreakpointAction_1=Delete all breakpoints in the selected group(s)?
-RemoveBreakpointAction_2=Remove Breakpoints
-RemoveBreakpointAction_3=Remove Items
-RemoveBreakpointAction_4=Which item(s) would you like to remove?
-RemoveBreakpointAction_5=OK
-RemoveBreakpointAction_6=Cancel
-RemoveBreakpointAction_Exceptions_occurred_attempting_to_remove_a_breakpoint__5=An exception occurred attempting to remove breakpoint(s).
-RemoveBreakpointAction_Removing_a_breakpoint_4=Removing a breakpoint
-DeleteWorkingsetsMessageDialog_0=&Selected working set(s).
-DeleteWorkingsetsMessageDialog_1=&All breakpoints contained in selected working set(s).
-
-ShowSupportedBreakpointsAction_Show_For_Selected=Show Supported &Breakpoints
-ShowSupportedBreakpointsAction_tooltip=Show Breakpoints Supported by Selected Target
-
-ShowTypesAction_Show__Type_Names_1=Show &Type Names
-ShowTypesAction_Show_Type_Names=Show Type Names
-ShowTypesAction_0='Show Type Names' unavailable when columns are displayed.\nConfigure columns to display type names.
-
-RelaunchLastAction_Cannot_relaunch_1=Cannot relaunch
-RelaunchLastAction_Cannot_relaunch___0___because_it_does_not_support__2__mode_2=Cannot relaunch [{0}] because it does not support {1} mode
-RelaunchLastAction_Error_relaunching_3=Error relaunching
-RelaunchLastAction_Error_encountered_attempting_to_relaunch_4=Error encountered attempting to relaunch
-
-##
-# @see Bug 105733 TVT 3.1 - TCT 531 - Poor grammar in "Run Eclipse Application" and "Profile Eclipse Application"
-#	- the following string is used to display the tooltip for run/debug/profile buttons and is
-#     the concatenation of "{mode} {configuration name}", for example "Run HelloWorld". In some languages
-#     this may need to be reversed to be translated properly. 
-##
-AbstractLaunchHistoryAction_0={0} {1}
-AbstractLaunchHistoryAction_1=Run
-AbstractLaunchHistoryAction_2=Debug
-AbstractLaunchHistoryAction_3=Profile
-AbstractLaunchHistoryAction_4=Launch
-##
-#     The following string is used to display the tooltip for run/debug/profile buttons in the
-# 	  event there is no configuration name to concatenate (as mentioned for AbstractLaunchHistoryAction_0)
-#	  For example "Run" or "External Tools".
-##
-AbstractLaunchHistoryAction_5={0}
-AbstractDebugActionDelegate_0=Error
-
-ToggleDetailPaneAction_1=Vertical View Orientation
-ToggleDetailPaneAction_2=Place the Detail Pane Underneath the Main Tree View
-ToggleDetailPaneAction_3=Place the Detail Pane Underneath the Main Tree View
-ToggleDetailPaneAction_4=Horizontal View Orientation
-ToggleDetailPaneAction_5=Place the Detail Pane on the Right of the Main Tree View
-ToggleDetailPaneAction_6=Place the Detail Pane on the Right of the Main Tree View
-ToggleDetailPaneAction_8=Hide the Detail Pane so that only the Main Tree View is Visible
-ToggleDetailPaneAction_9=Hide the Detail Pane so that only the Main Tree View is Visible
-ToggleBreakpointAction_0=Toggle Brea&kpoint
-ToggleBreakpointAction_1=Error
-ToggleBreakpointAction_2=Unable to toggle breakpoint
-
-ToggleStepFiltersAction_0=Use Step Filters
-ToggleStepFiltersAction_1=&Use Step Filters
-
-WatchExpressionDialog_0=Edit Watch Expression
-WatchExpressionDialog_1=Add Watch Expression
-WatchExpressionDialog_2=E&xpression:
-WatchExpressionDialog_3=&Enable
-WatchExpressionDialog_4=Expression must not be empty
-WatchAction_0=Error creating watch
-WatchAction_1=An exception occurred while attempting to create watch item.
-SkipAllBreakpointsAction_0=Skip All Breakpoints
-SkipAllBreakpointsAction_2=Skip all breakpoints, whether they are enabled or not
-DetailPaneAssignValueAction_1=Assign Value
-DetailPaneAssignValueAction_2=Invalid Value
-DetailPaneAssignValueAction_3=The value {0} cannot be assigned to {1}
-DetailPaneAssignValueAction_4=Invalid Value
-DetailPaneAssignValueAction_0=Error Setting Value
-DetailPaneWordWrapAction_0=&Wrap Text
-DetailPaneMaxLengthAction_0=&Max Length...
-
-RunToLineAction_0=Error
-RunToLineAction_1=Run to line failed
-RunToLineHandler_0=Run To Line
-RunToLineActionDelegate_4=Run to &Line
-
-RetargetAction_2=Error
-RetargetAction_3=Operation failed
-ModifyWatchpointAction_0=Error
-ModifyWatchpointAction_1=Failed to modify watchpoint
-LaunchShortcutsAction_1=(none applicable)
-##
-# The following string is used to display launch histories using an integer mnemonic - i.e. 
-# "{number} {configuration name}". For example "1 HelloWorld". 
-##
-LaunchConfigurationAction_0=&{0} {1}
-FindDialog_1=&Specify an element to select (? = any character, * = any String):
-FindDialog_3=Find
-FindAction_0=&Find...
-RetargetAddMemoryBlockAction_0=Add Memory Monitor Failed.
-RetargetAddMemoryBlockAction_1=Unable to add memory monitor.
-RetargetRunToLineAction_0=The operation is unavailable on the current selection. Please place the cursor on valid line to run to.
-AddMemoryRenderingActionDelegate_0=Add Memory Rendering Failed
-AddMemoryRenderingActionDelegate_1=Unable to add the selected rendering.
-AddMemoryRenderingActionDelegate_2=Add Memory Rendering
-RulerEnableDisableBreakpointAction_0=Error
-RulerEnableDisableBreakpointAction_1=Failed to toggle breakpoint enablement
-RulerEnableDisableBreakpointAction_2=&Disable Breakpoint
-RulerEnableDisableBreakpointAction_3=&Enable Breakpoint
-TerminateAndRelaunchAction_0=org.eclipse.debug.ui.commands.TerminateAndRelaunch
-TerminateAndRelaunchAction_3=Terminate and Relaunch
-TerminateAndRelaunchAction_4=Terminate and Relaunch
-TerminateAndRemoveAction_0=Terminate and Remo&ve
-TerminateAndRemoveAction_3=Terminate and Remove
-TerminateAllAction_2=Termi&nate All
-TerminateAllAction_3=Terminate All
-TerminateAction_0=&Terminate
-TerminateAction_3=Terminate
-StepReturnAction_2=Step Return
-StepReturnAction_3=Step Ret&urn
-StepIntoAction_0=Step &Into
-StepIntoAction_3=Step Into
-StepOverAction_0=Step &Over
-StepOverAction_3=Step Over
-ResumeAction_0=Resu&me
-ResumeAction_3=Resume
-DisconnectAction_0=Disconn&ect
-DisconnectAction_3=Disconnect
-DropToFrameAction_0=Drop To Frame
-DropToFrameAction_3=Drop To Frame
-SuspendAction_0=&Suspend
-SuspendAction_3=Suspend
-ConfigureColumnsAction_0=Select &Columns...
-ConfigureColumnsAction_1=Select the &columns to display:
-ConfigureColumnsAction_2=Select Columns
-ProfileLastAction_0=Profi&le Last Launched
-ProfileLastAction_1=Profi&le
-ProfileLastAction_2=Profile the selected resource or active editor
-ProfileLastAction_3=Profile the previously launched application
-DebugLastAction_0=&Debug Last Launched
-DebugLastAction_1=&Debug
-DebugLastAction_2=Debug the selected resource or active editor
-DebugLastAction_3=Debug the previously launched application
-RunLastAction_0=&Run Last Launched
-RunLastAction_1=&Run
-RunLastAction_2=Run the selected resource or active editor
-RunLastAction_3=Run the previously launched application
-OpenLaunchDialogAction_1=Open {0} Dialog...
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AddToFavoritesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AddToFavoritesAction.java
deleted file mode 100644
index 7351000..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/AddToFavoritesAction.java
+++ /dev/null
@@ -1,188 +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.debug.internal.ui.actions;
-
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * Adds the selected launch configuration to the launch favorites.
- */
-public class AddToFavoritesAction extends SelectionListenerAction {
-	
-	private ILaunchConfiguration fConfiguration = null;
-	private String fMode =null;
-	private ILaunchGroup fGroup = null;
-
-	/**
-	 * Constructs a new action.
-	 */
-	public AddToFavoritesAction() {
-		super(""); //$NON-NLS-1$
-		setEnabled(false);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.EDIT_LAUNCH_CONFIGURATION_ACTION);
-	}
-
-	/**
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		setLaunchConfiguration(null);
-		setMode(null);
-		setGroup(null);
-		if (selection.size() == 1) {
-			Object object = selection.getFirstElement();
-			ILaunch launch = null;
-			if (object instanceof IAdaptable) {
-				launch = (ILaunch)((IAdaptable)object).getAdapter(ILaunch.class); 
-			}
-			if (launch == null) {
-				if (object instanceof ILaunch) {
-					launch = (ILaunch)object;
-				} else if (object instanceof IDebugElement) {
-					launch = ((IDebugElement)object).getLaunch();
-				} else if (object instanceof IProcess) {
-					launch = ((IProcess)object).getLaunch();
-				}
-			}
-			if (launch != null) {
-				ILaunchConfiguration configuration = launch.getLaunchConfiguration();
-				if (configuration != null) {
-					ILaunchGroup group= DebugUITools.getLaunchGroup(configuration, getMode());
-					if (group == null) {
-					    return false;
-					}
-					setGroup(group);
-					setLaunchConfiguration(configuration);
-					setMode(launch.getLaunchMode());				
-					setText(MessageFormat.format(ActionMessages.AddToFavoritesAction_1, new String[]{DebugUIPlugin.removeAccelerators(getGroup().getLabel())})); 
-				}
-			}
-		}
-		
-		// Disable the action if the launch config is private
-		ILaunchConfiguration config = getLaunchConfiguration();
-		if (config == null) {
-			return false;
-		} 
-		if (DebugUITools.isPrivate(config)) {
-				return false;
-		}
-		
-		if (getGroup() != null) {
-			try {
-				List groups = config.getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, (List)null);
-				if (groups != null) {
-					return !groups.contains(getGroup().getIdentifier());
-				}
-				return true;
-			} catch (CoreException e) {
-			}
-			
-		}
-		
-		return false;
-	}
-
-	/**
-	 * Allows the underlying <code>ILaunchConfiguration</code> to be set
-	 * @param configuration the new configuration to set
-	 */
-	protected void setLaunchConfiguration(ILaunchConfiguration configuration) {
-		fConfiguration = configuration;
-	}
-	
-	/**
-	 * Returns the underlying <code>ILaunchConfiguration</code>
-	 * @return the underlying <code>ILaunchConfiguration</code>
-	 */
-	protected ILaunchConfiguration getLaunchConfiguration() {
-		return fConfiguration;
-	}
-	
-	/**
-	 * Sets the mode this action applies to
-	 * @param mode the modes to set
-	 */
-	protected void setMode(String mode) {
-		fMode = mode;
-	}
-	
-	/**
-	 * Returns the mode this action applies to
-	 * @return
-	 */
-	protected String getMode() {
-		return fMode;
-	}
-	
-	/**
-	 * Sets the <code>ILaunchGroup</code> this action applies to
-	 * @param group the new <code>ILaunchGroup</code>
-	 */
-	protected void setGroup(ILaunchGroup group) {
-		fGroup = group;
-	}
-	
-	/**
-	 * Returns the underlying <code>ILaunchGroup</code>
-	 * @return the underlying <code>ILaunchGroup</code>
-	 */
-	protected ILaunchGroup getGroup() {
-		return fGroup;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		final CoreException[] ex = new CoreException[1];
-		BusyIndicator.showWhile(DebugUIPlugin.getStandardDisplay(), new Runnable() {
-			public void run() {
-				try {
-					List list = getLaunchConfiguration().getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, (List)null);
-					if (list == null) {
-						list = new ArrayList();
-					}
-					list.add(getGroup().getIdentifier());
-					ILaunchConfigurationWorkingCopy copy = getLaunchConfiguration().getWorkingCopy();
-					copy.setAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, list);
-					copy.doSave();
-					setEnabled(false);
-				} catch (CoreException e) {
-					ex[0] = e;
-				}
-			}
-		});
-		if (ex[0] != null) {
-			DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.AddToFavoritesAction_2, ActionMessages.AddToFavoritesAction_3, ex[0].getStatus()); // 
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/CollapseAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/CollapseAllAction.java
deleted file mode 100644
index 76c1110..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/CollapseAllAction.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.debug.internal.ui.actions;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * CollapseAllAction
- */
-public class CollapseAllAction extends Action {
-	
-	private TreeViewer fViewer;
-	
-	public CollapseAllAction(TreeViewer viewer) {
-		super(ActionMessages.CollapseAllAction_0, DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_COLLAPSE_ALL));
-		setToolTipText(ActionMessages.CollapseAllAction_0);
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_COLLAPSE_ALL));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_COLLAPSE_ALL));
-		fViewer = viewer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		fViewer.collapseAll();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ConfigureColumnsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ConfigureColumnsAction.java
deleted file mode 100644
index 6116173..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ConfigureColumnsAction.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.debug.internal.ui.actions;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Configures visible columns in an asynch tree viewer/
- * 
- * @since 3.2
- */
-public class ConfigureColumnsAction extends Action implements IUpdate {
-	
-	private TreeModelViewer fViewer;
-	
-	class ColumnContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((IColumnPresentation)inputElement).getAvailableColumns();
-		}
-
-		/* (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) {			
-		}
-		
-	}
-	
-	class ColumnLabelProvider extends LabelProvider {
-		
-		private Map fImages = new HashMap();
-
-		public Image getImage(Object element) {
-			ImageDescriptor imageDescriptor = fViewer.getColumnPresentation().getImageDescriptor((String)element);
-			if (imageDescriptor != null) {
-				Image image = (Image) fImages.get(imageDescriptor);
-				if (image == null) {
-					image = imageDescriptor.createImage();
-					fImages.put(imageDescriptor, image);
-				}
-				return image;
-			}
-			return null;
-		}
-
-		public String getText(Object element) {
-			return fViewer.getColumnPresentation().getHeader((String)element);
-		}
-
-		public void dispose() {
-			super.dispose();
-			Iterator iterator = fImages.values().iterator();
-			while (iterator.hasNext()) {
-				Image image = (Image) iterator.next();
-				image.dispose();
-			}
-			fImages.clear();
-		}
-		
-		
-		
-	}
-
-	public ConfigureColumnsAction(TreeModelViewer viewer) {
-		setText(ActionMessages.ConfigureColumnsAction_0);
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ConfigureColumnsAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONFIGURE_COLUMNS_ACTION);
-		fViewer = viewer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		setEnabled(fViewer.isShowColumns());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		ListSelectionDialog dialog = new ListSelectionDialog(
-				fViewer.getControl().getShell(),
-				fViewer.getColumnPresentation(),
-				new ColumnContentProvider(),
-				new ColumnLabelProvider(),
-				ActionMessages.ConfigureColumnsAction_1);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONFIGURE_COLUMNS_DIALOG);
-		String[] visibleColumns = fViewer.getVisibleColumns();
-		List initialSelection = new ArrayList(visibleColumns.length);
-		for (int i = 0; i < visibleColumns.length; i++) {
-			initialSelection.add(visibleColumns[i]);
-		}
-		dialog.setTitle(ActionMessages.ConfigureColumnsAction_2);
-		dialog.setInitialElementSelections(initialSelection);
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			if (result.length == 0) {
-				fViewer.setShowColumns(false);
-			} else {
-				String[] ids = new String[result.length];
-				System.arraycopy(result, 0, ids, 0, result.length);
-				fViewer.resetColumnSizes(ids);
-				fViewer.setVisibleColumns(ids);
-			}
-		}
-			
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugAsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugAsAction.java
deleted file mode 100644
index 9a870f6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugAsAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.LaunchShortcutsAction;
-
-/**
- * "Debug As" action in the top level "Run" menu.
- */
-public class DebugAsAction extends LaunchShortcutsAction {
-
-	public DebugAsAction() {
-		super(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugContextualLaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugContextualLaunchAction.java
deleted file mode 100644
index d114aab..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugContextualLaunchAction.java
+++ /dev/null
@@ -1,29 +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.debug.internal.ui.actions;
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.actions.ContextualLaunchAction;
-
-/**
- * Specialization of <code>ContextualLaunchAction</code> for the debug mode
- * 
- * @see {@link ContextualLaunchAction}
- */
-public class DebugContextualLaunchAction extends ContextualLaunchAction {
-	
-	/**
-	 * Constructor
-	 */
-	public DebugContextualLaunchAction() {
-		super(ILaunchManager.DEBUG_MODE);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugHistoryMenuAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugHistoryMenuAction.java
deleted file mode 100644
index 496a5e3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugHistoryMenuAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.AbstractLaunchHistoryAction;
-
-/**
- * Debug history menu in the top-level "Run" menu.
- */ 
-public class DebugHistoryMenuAction extends AbstractLaunchHistoryAction {
-	
-	public DebugHistoryMenuAction() {
-		super(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugLastAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugLastAction.java
deleted file mode 100644
index cb82f4c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugLastAction.java
+++ /dev/null
@@ -1,80 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Relaunches the last debug-mode launch
- * 
- * This menu item appears in the main 'Run' menu
- * 
- * @see RelaunchLastAction
- * @see RunLastAction
- * @see ProfileLastAction
- */
-public class DebugLastAction extends RelaunchLastAction {
-	
-	/**
-	 * @see RelaunchLastAction#getMode()
-	 */
-	public String getMode() {
-		return ILaunchManager.DEBUG_MODE;
-	}	
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.LaunchDropDownAction#getLaunchGroupId()
-	 */
-	public String getLaunchGroupId() {
-		return IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getText()
-	 */
-	protected String getText() {
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			return ActionMessages.DebugLastAction_1;
-		}
-		else {
-			return ActionMessages.DebugLastAction_0;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getTooltipText()
-	 */
-	protected String getTooltipText() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getCommandId()
-	 */
-	protected String getCommandId() {
-		return "org.eclipse.debug.ui.commands.DebugLast"; //$NON-NLS-1$
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getDescription()
-	 */
-	protected String getDescription() {
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			return ActionMessages.DebugLastAction_2;
-		}
-		else {
-			return ActionMessages.DebugLastAction_3;
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugToolbarAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugToolbarAction.java
deleted file mode 100644
index 6e8152f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/DebugToolbarAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.AbstractLaunchToolbarAction;
-
-/**
- * Debug drop-down history/favorites action.
- */
-public class DebugToolbarAction extends AbstractLaunchToolbarAction {
-
-	public DebugToolbarAction() {
-		super(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/EditLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/EditLaunchConfigurationAction.java
deleted file mode 100644
index 17bdd8c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/EditLaunchConfigurationAction.java
+++ /dev/null
@@ -1,155 +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.debug.internal.ui.actions;
-
-
-import com.ibm.icu.text.MessageFormat;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * Opens the launch configuration dialog on a single launch configuration, based
- * on the the launch associated with the selected element.
- */
-public class EditLaunchConfigurationAction extends SelectionListenerAction {
-	
-	private ILaunchConfiguration fConfiguration = null;
-	private String fMode = null;
-	private boolean fTerminated = false;
-
-	/**
-	 * Constructs a new action.
-	 */
-	public EditLaunchConfigurationAction() {
-		super(""); //$NON-NLS-1$
-		setEnabled(false);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.EDIT_LAUNCH_CONFIGURATION_ACTION);
-	}
-
-	/**
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		setLaunchConfiguration(null);
-		setMode(null);
-		if (selection.size() == 1) {
-			Object object = selection.getFirstElement();
-			ILaunch launch = null;
-			if (object instanceof IAdaptable) {
-				launch = (ILaunch)((IAdaptable)object).getAdapter(ILaunch.class); 
-			}
-			if (launch == null) {
-				if (object instanceof ILaunch) {
-					launch = (ILaunch)object;
-				} else if (object instanceof IDebugElement) {
-					launch = ((IDebugElement)object).getLaunch();
-				} else if (object instanceof IProcess) {
-					launch = ((IProcess)object).getLaunch();
-				}
-			}
-			if (launch != null) {
-				ILaunchConfiguration configuration = launch.getLaunchConfiguration();
-				if (configuration != null) {
-					try {
-						// The DebugUIPlugin creates stand-in launches with copied configurations
-						// while a launch is waiting for a build. These copied configurations
-						// have an attribute that points to the config that the user is really
-						// launching.
-						String underlyingHandle = configuration.getAttribute(DebugUIPlugin.ATTR_LAUNCHING_CONFIG_HANDLE, ""); //$NON-NLS-1$
-						if (underlyingHandle.length() > 0) {
-							ILaunchConfiguration underlyingConfig = DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(underlyingHandle);
-							if (underlyingConfig != null) {
-								configuration = underlyingConfig;
-							}
-						}
-					} catch (CoreException e1) {
-					}	
-					setLaunchConfiguration(configuration);
-					setMode(launch.getLaunchMode());
-					setIsTerminated(launch.isTerminated());
-					setText(MessageFormat.format(ActionMessages.EditLaunchConfigurationAction_1, new String[]{configuration.getName()})); 
-					ImageDescriptor descriptor = null;
-					try {
-						descriptor = DebugPluginImages.getImageDescriptor(configuration.getType().getIdentifier());
-					} catch (CoreException e) {
-						DebugUIPlugin.log(e);
-					}
-					setImageDescriptor(descriptor);
-				}
-			}
-		}
-		
-		// Disable the action if the launch config is private
-		ILaunchConfiguration config = getLaunchConfiguration();
-		if (config == null) {
-			return false;
-		}
-		return !DebugUITools.isPrivate(config);
-	}
-
-	protected void setLaunchConfiguration(ILaunchConfiguration configuration) {
-		fConfiguration = configuration;
-	}
-	
-	protected ILaunchConfiguration getLaunchConfiguration() {
-		return fConfiguration;
-	}
-	
-	protected void setMode(String mode) {
-		fMode = mode;
-	}
-	
-	protected String getMode() {
-		return fMode;
-	}
-	
-	protected boolean isTerminated() {
-		return fTerminated;
-	}
-	
-	protected void setIsTerminated(boolean terminated) {
-		fTerminated = terminated;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		ILaunchGroup group = DebugUITools.getLaunchGroup(getLaunchConfiguration(), getMode());
-		if (group != null) {
-			if(isTerminated()) {
-				DebugUITools.openLaunchConfigurationDialog(
-					DebugUIPlugin.getShell(), getLaunchConfiguration(),
-					group.getIdentifier(), null);
-			}
-			else {
-				DebugUIPlugin.openLaunchConfigurationEditDialog(
-						DebugUIPlugin.getShell(), getLaunchConfiguration(),
-						group.getIdentifier(), null, false);
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ExecutionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ExecutionAction.java
deleted file mode 100644
index 8ffc08d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ExecutionAction.java
+++ /dev/null
@@ -1,93 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * This is the super class of the Run & Debug actions which appears in the desktop menu and toolbar.
- */
-public abstract class ExecutionAction implements IActionDelegate2 {
-	
-	private String fLaunchGroupIdentifier;
-	
-	public ExecutionAction(String launchGroupIdentifier) {
-		fLaunchGroupIdentifier = launchGroupIdentifier;
-	}
-	
-	/**
-	 * @see IActionDelegate2#runWithEvent(IAction, Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/**
-	 * Open the launch configuration dialog, passing in the current workbench selection.
-	 */
-	private void openLaunchConfigurationDialog() {
-		IWorkbenchWindow dwindow= DebugUIPlugin.getActiveWorkbenchWindow();
-		if (dwindow == null) {
-			return;
-		}
-		DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), new StructuredSelection(), fLaunchGroupIdentifier);
-	}
-	
-	protected LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}
-	
-	/**
-	 * Returns the mode of a launcher to use for this action
-	 */
-	protected abstract String getMode();
-	
-	/**
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		ILaunchConfiguration configuration = getLaunchConfigurationManager().getLastLaunch(fLaunchGroupIdentifier);
-		if (configuration == null) {
-			openLaunchConfigurationDialog();
-		} else {
-			DebugUITools.launch(configuration, getMode());
-		}
-	}
-
-	/**
-	 * @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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchConfigurationAction.java
deleted file mode 100644
index 89678c8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchConfigurationAction.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This class provides an action wrapper for adding launch configuration actions to the context menu
- * of the Run->... menu item
- * 
- * @since 3.3
- */
-public class LaunchConfigurationAction extends Action {
-
-	private ILaunchConfiguration fConfig;
-	private String fMode;
-	
-	/**
-	 * Constructor
-	 * @param text the text for the action
-	 * @param image the image for the action
-	 */
-	public LaunchConfigurationAction(ILaunchConfiguration config, String mode, String text, ImageDescriptor image, int accelerator) {
-		super(MessageFormat.format(ActionMessages.LaunchConfigurationAction_0, new String[] {Integer.toString(accelerator), text}), image);
-		fConfig = config;
-		fMode = mode;
-	}
-	
-	/**
-	 * Allows access to the launch configuration associated with the action
-	 * @return the associated launch configuration
-	 */
-	public ILaunchConfiguration getLaunchConfiguration() {
-		return fConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		DebugUITools.launch(fConfig, fMode);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchShortcutAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchShortcutAction.java
deleted file mode 100644
index 0f7aba1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchShortcutAction.java
+++ /dev/null
@@ -1,110 +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.debug.internal.ui.actions;
-
-
-import java.util.List;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension;
-import org.eclipse.jface.action.Action;
-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.IWorkbenchWindow;
-
-/**
- * Launch shortcut action (proxy to a launch shortcut extension)
- */
-public class LaunchShortcutAction extends Action {
-	
-	private String fMode;
-	private LaunchShortcutExtension fShortcut; 
-
-
-	/**
-	 * Constructor for LaunchShortcutAction.
-	 */
-	public LaunchShortcutAction(String mode, LaunchShortcutExtension shortcut) {
-		super(shortcut.getLabel(), shortcut.getImageDescriptor());
-		fMode = mode;
-		fShortcut = shortcut;
-		updateEnablement();
-	}
-	
-	/**
-	 * Runs with either the active editor or workbench selection.
-	 * 
-	 * @see IAction#run()
-	 */
-	public void run() {
-		IWorkbenchWindow wb = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (wb != null) {
-			IWorkbenchPage page = wb.getActivePage();
-			if (page != null) {
-				if (page.getActivePart() == page.getActiveEditor()) {
-					IEditorPart editor = page.getActiveEditor();
-					if (editor != null) {
-						fShortcut.launch(editor, fMode);
-					}
-				} else {
-					ISelection selection = page.getSelection();
-					if (selection instanceof IStructuredSelection) {
-						fShortcut.launch(selection, fMode);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Since these actions are re-created each time the run/debug as menu is
-	 * filled, the enablement of this action is static.
-	 */
-	private void updateEnablement() {
-		IWorkbenchWindow wb = DebugUIPlugin.getActiveWorkbenchWindow();
-		boolean enabled = false;
-		if (wb != null) {
-			IWorkbenchPage page = wb.getActivePage();
-			if (page != null) {
-				ISelection selection = page.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					IStructuredSelection structuredSelection = (IStructuredSelection)selection;
-					try {
-						// check enablement logic, if any
-						Expression expression = fShortcut.getShortcutEnablementExpression();
-						if (expression == null) {
-							enabled = !structuredSelection.isEmpty();
-						} else {
-							List list = structuredSelection.toList();
-							IEvaluationContext context = new EvaluationContext(null, list);
-							context.addVariable("selection", list); //$NON-NLS-1$
-							enabled = fShortcut.evalEnablementExpression(context, expression);
-						}
-					} catch (CoreException e) {
-					}
-				} else {
-					IEditorPart editor = page.getActiveEditor();
-					if (editor != null) {
-						enabled = true;
-					}
-				}
-			}
-		}		
-		setEnabled(enabled);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchablePropertyTester.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchablePropertyTester.java
deleted file mode 100644
index c669967..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/LaunchablePropertyTester.java
+++ /dev/null
@@ -1,70 +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.debug.internal.ui.actions;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.ui.actions.ILaunchable;
-
-/**
- * Tests if an object is launchable.
- */
-public class LaunchablePropertyTester extends PropertyTester {
-
-	/**
-	 * @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 ("launchable".equals(property)) { //$NON-NLS-1$
-				if (DebugUIPlugin.getDefault().getLaunchConfigurationManager().launchModeAvailable((String)expectedValue)) {
-					return Platform.getAdapterManager().hasAdapter(receiver, ILaunchable.class.getName());
-				}
-		}
-		if("contextlaunch".equals(property)) { //$NON-NLS-1$
-			if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH)) {
-				IResource res = getResource(receiver);
-				if(res != null) {
-					return res.isAccessible() && getLaunchConfiguraitonManager().getLaunchShortcuts(getResource(receiver)).size() > 0 && getLaunchConfiguraitonManager().isSharedConfig(receiver) == null;
-				}
-				return false;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the launch configuration manager
-	 * @return the launch configuration manager
-	 */
-	protected LaunchConfigurationManager getLaunchConfiguraitonManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}
-	
-	/**
-	 * Returns the resource this property page is open on.
-	 * 
-	 * @return resource
-	 */
-	protected IResource getResource(Object element) {
-		IResource resource = null;
-		if (element instanceof IResource) {
-			resource = (IResource) element;
-		} else if (element instanceof IAdaptable) {
-			resource = (IResource) ((IAdaptable)element).getAdapter(IResource.class);
-		}
-		return resource;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenDebugConfigurations.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenDebugConfigurations.java
deleted file mode 100644
index 4445eee..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenDebugConfigurations.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.OpenLaunchDialogAction;
-
-/**
- * Opens the launch config dialog on the debug launch group.
- */
-public class OpenDebugConfigurations extends OpenLaunchDialogAction {
-
-	public OpenDebugConfigurations() {
-		super(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenProfileConfigurations.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenProfileConfigurations.java
deleted file mode 100644
index 51e62ee..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenProfileConfigurations.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.OpenLaunchDialogAction;
-
-/**
- * Opens the launch config dialog on the run launch group.
- */
-public class OpenProfileConfigurations extends OpenLaunchDialogAction {
-
-	public OpenProfileConfigurations() {
-		super(IDebugUIConstants.ID_PROFILE_LAUNCH_GROUP);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenRunConfigurations.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenRunConfigurations.java
deleted file mode 100644
index b84d912..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/OpenRunConfigurations.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.OpenLaunchDialogAction;
-
-/**
- * Opens the launch config dialog on the run launch group.
- */
-public class OpenRunConfigurations extends OpenLaunchDialogAction {
-
-	public OpenRunConfigurations() {
-		super(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileAsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileAsAction.java
deleted file mode 100644
index 321d03c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileAsAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.LaunchShortcutsAction;
-
-/**
- * "Profile As" action in the top level "Run" menu.
- */
-public class ProfileAsAction extends LaunchShortcutsAction {
-
-	public ProfileAsAction() {
-		super(IDebugUIConstants.ID_PROFILE_LAUNCH_GROUP);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileContextualLaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileContextualLaunchAction.java
deleted file mode 100644
index 257eee5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileContextualLaunchAction.java
+++ /dev/null
@@ -1,29 +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.debug.internal.ui.actions;
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.actions.ContextualLaunchAction;
-
-/**
- * Specialization of <code>ContextualLaunchAction</code> for the profile mode
- * 
- * @see {@link ContextualLaunchAction}
- */
-public class ProfileContextualLaunchAction extends ContextualLaunchAction {
-	
-	/**
-	 * Constructor
-	 */
-	public ProfileContextualLaunchAction() {
-		super(ILaunchManager.PROFILE_MODE);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileHistoryMenuAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileHistoryMenuAction.java
deleted file mode 100644
index 317ae7a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileHistoryMenuAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.AbstractLaunchHistoryAction;
-
-/**
- * Profile history menu in the top-level "Run" menu.
- */ 
-public class ProfileHistoryMenuAction extends AbstractLaunchHistoryAction {
-	
-	public ProfileHistoryMenuAction() {
-		super(IDebugUIConstants.ID_PROFILE_LAUNCH_GROUP);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileLastAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileLastAction.java
deleted file mode 100644
index 34780d9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileLastAction.java
+++ /dev/null
@@ -1,81 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Relaunches the last profile-mode launch
- * 
- * This menu item appears in the main 'Run' menu
- * 
- * @see RelaunchLastAction
- * @see RunLastAction
- * @see DebugLastAction
- * 
- */
-public class ProfileLastAction extends RelaunchLastAction {
-
-	/**
-	 * @see RelaunchLastAction#getMode()
-	 */
-	public String getMode() {
-		return ILaunchManager.PROFILE_MODE;
-	}	
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.LaunchDropDownAction#getLaunchGroupId()
-	 */
-	public String getLaunchGroupId() {
-		return IDebugUIConstants.ID_PROFILE_LAUNCH_GROUP;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getText()
-	 */
-	protected String getText() {
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			return ActionMessages.ProfileLastAction_1;
-		}
-		else {
-			return ActionMessages.ProfileLastAction_0;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getTooltipText()
-	 */
-	protected String getTooltipText() {
-		return ""; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getCommandId()
-	 */
-	protected String getCommandId() {
-		return "org.eclipse.debug.ui.commands.ProfileLast"; //$NON-NLS-1$
-	}		
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getDescription()
-	 */
-	protected String getDescription() {
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			return ActionMessages.ProfileLastAction_2;
-		}
-		else {
-			return ActionMessages.ProfileLastAction_3;
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileToolbarAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileToolbarAction.java
deleted file mode 100644
index 469f8fd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ProfileToolbarAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.AbstractLaunchToolbarAction;
-
-/**
- * Profile drop-down history/favorites action.
- */
-public class ProfileToolbarAction extends AbstractLaunchToolbarAction {
-
-	public ProfileToolbarAction() {
-		super(IDebugUIConstants.ID_PROFILE_LAUNCH_GROUP);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RelaunchActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RelaunchActionDelegate.java
deleted file mode 100644
index d461458..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RelaunchActionDelegate.java
+++ /dev/null
@@ -1,81 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.ui.DebugUITools;
-
-public class RelaunchActionDelegate extends AbstractDebugActionDelegate {
-	
-	/**
-	 * @see AbstractDebugActionDelegate#doAction(Object)
-	 */
-	protected void doAction(Object object) {
-		ILaunch launch= getLaunch(object);
-        if (launch != null) {
-            relaunch(launch.getLaunchConfiguration(), launch.getLaunchMode());
-        }
-	}
-    
-    public static ILaunch getLaunch(Object element) {
-        ILaunch launch= null;
-        if (element instanceof IDebugElement) {
-            launch= ((IDebugElement)element).getLaunch();
-        } else if (element instanceof ILaunch) {
-            launch= ((ILaunch)element);
-        } else if (element instanceof IProcess) {
-            launch= ((IProcess)element).getLaunch();
-        }
-        return launch;
-    }
-	
-	/**
-	 * Re-launches the given configuration in the specified mode.
-	 */
-	public static void relaunch(ILaunchConfiguration config, String mode) {
-		DebugUITools.launch(config, mode);		
-	}
-	
-	/**
-	 * @see AbstractDebugActionDelegate#isEnabledFor(Object)
-	 */
-	protected boolean isEnabledFor(Object element) {
-		ILaunch launch= null;
-		if (element instanceof ILaunch) {
-			launch= (ILaunch)element;
-		} else if (element instanceof IDebugElement) {
-			launch= ((IDebugElement)element).getLaunch();
-		} else if (element instanceof IProcess) {
-			launch= ((IProcess)element).getLaunch();
-		}
-		
-		return launch != null && launch.getLaunchConfiguration() != null && LaunchConfigurationManager.isVisible(launch.getLaunchConfiguration());
-	}
-			
-	/**
-	 * @see AbstractDebugActionDelegate#getErrorDialogMessage()
-	 */
-	protected String getErrorDialogMessage() {
-		return ActionMessages.RelaunchActionDelegate_Launch_Failed_1; 
-	}
-	
-	/**
-	 * @see AbstractDebugActionDelegate#getStatusMessage()
-	 */
-	protected String getStatusMessage() {
-		return ActionMessages.RelaunchActionDelegate_An_exception_occurred_while_launching_2; 
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RelaunchLastAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RelaunchLastAction.java
deleted file mode 100644
index e257f49..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RelaunchLastAction.java
+++ /dev/null
@@ -1,228 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.contextlaunching.ContextRunner;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Relaunches the last launch.
- * 
- * @see ContextRunner
- * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager
- * @see ILaunchConfiguration
- * @see RunLastAction
- * @see DebugLastAction
- * @see ProfileLastAction
- * 
- */
-public abstract class RelaunchLastAction implements IWorkbenchWindowActionDelegate, IPropertyChangeListener {
-
-	private IWorkbenchWindow fWorkbenchWindow;
-	
-	private IAction fAction;
-	
-	/**
-	 * @see IWorkbenchWindowActionDelegate
-	 */
-	public void dispose(){
-		DebugUIPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(this);
-	}
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate
-	 */
-	public void init(IWorkbenchWindow window){
-		fWorkbenchWindow = window;
-		DebugUIPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action){		
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			ILaunchGroup group = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(getLaunchGroupId());
-			ContextRunner.getDefault().launch(group);
-			return;
-		}
-		try {
-			final ILaunchConfiguration configuration = getLastLaunch();
-			if (configuration != null) {
-				if (configuration.supportsMode(getMode())) {
-					DebugUITools.launch(configuration, getMode());
-				} else {
-					String configName = configuration.getName();
-					String title = ActionMessages.RelaunchLastAction_Cannot_relaunch_1; 
-					String message = MessageFormat.format(ActionMessages.RelaunchLastAction_Cannot_relaunch___0___because_it_does_not_support__2__mode_2, new String[] {configName, getMode()}); 
-					MessageDialog.openError(getShell(), title, message);				
-				}
-			} else {
-				// If the history is empty, just open the launch config dialog
-				openLaunchConfigurationDialog();
-			}
-		} catch (CoreException ce) {
-			DebugUIPlugin.errorDialog(getShell(), ActionMessages.RelaunchLastAction_Error_relaunching_3, ActionMessages.RelaunchLastAction_Error_encountered_attempting_to_relaunch_4, ce); // 
-		}
-	}
-	
-	/**
-	 * Open the launch configuration dialog, passing in the current workbench selection.
-	 */
-	private void openLaunchConfigurationDialog() {
-		IWorkbenchWindow dwindow= DebugUIPlugin.getActiveWorkbenchWindow();
-		if (dwindow == null) {
-			return;
-		}
-		LaunchConfigurationsDialog dialog = new LaunchConfigurationsDialog(DebugUIPlugin.getShell(), DebugUIPlugin.getDefault().getLaunchConfigurationManager().getDefaultLaunchGroup(getMode()));		
-		dialog.setOpenMode(LaunchConfigurationsDialog.LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_LAST_LAUNCHED);
-		dialog.open();
-	}
-	
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection){
-		if (fAction == null) {
-			initialize(action);
-		}		
-	}
-	
-	/**
-	 * Set the enabled state of the underlying action based on whether there are any
-	 * registered launch configuration types that understand how to launch in the
-	 * mode of this action.
-	 */
-	private void initialize(IAction action) {
-		fAction = action;
-		if(fAction != null) {
-			fAction.setEnabled(existsConfigTypesForMode());
-			fAction.setText(getText());
-			fAction.setToolTipText(getTooltipText());
-			String commandId = getCommandId();
-			ICommandService service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
-			if (service != null) {
-				Command command = service.getCommand(commandId);
-				command.undefine();
-				command = service.getCommand(commandId);
-				command.define(DebugUIPlugin.removeAccelerators(getText()), getDescription(), service.getCategory("org.eclipse.debug.ui.category.run")); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	/**
-	 * Return whether there are any registered launch configuration types for
-	 * the mode of this action.
-	 * 
-	 * @return whether there are any registered launch configuration types for
-	 * the mode of this action
-	 */
-	private boolean existsConfigTypesForMode() {
-		ILaunchConfigurationType[] configTypes = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
-		for (int i = 0; i < configTypes.length; i++) {
-			ILaunchConfigurationType configType = configTypes[i];
-			if (configType.supportsMode(getMode())) {
-				return true;
-			}
-		}		
-		return false;
-	}
-	
-	/**
-	 * Return the last launch that occurred in the workspace.
-	 */
-	protected ILaunchConfiguration getLastLaunch() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(getLaunchGroupId());
-	}
-	
-	/**
-	 * Returns the parent shell for this menu item
-	 * @return the parent shell
-	 */
-	protected Shell getShell() {
-		return fWorkbenchWindow.getShell();
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Preferences$IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if(event.getProperty().equals(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH)) {
-			initialize(fAction);
-		}
-	}
-	
-	/**
-	 * Returns the mode (run or debug) of this action.
-	 */
-	public abstract String getMode();
-	
-	/**
-	 * Returns the launch group id of this action.
-	 */
-	public abstract String getLaunchGroupId();	
-
-	/**
-	 * Returns the text to display on the menu item.
-	 * @return the text for the menu item
-	 * 
-	 * @since 3.3
-	 */
-	protected abstract String getText();
-	
-	/**
-	 * Returns the text to display in the menu item tooltip
-	 * @return the text for the tooltip
-	 * 
-	 * @since 3.3
-	 */
-	protected abstract String getTooltipText();
-	
-	/**
-	 * Returns the command id this action is associated with.
-	 * 
-	 * @return command id
-	 * @since 3.3
-	 */
-	protected abstract String getCommandId();
-	
-	/**
-	 * Returns a description for this action (to associate with command).
-	 * 
-	 * @return command description
-	 * @since 3.3
-	 */
-	protected abstract String getDescription();	
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RemoveAllTerminatedAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RemoveAllTerminatedAction.java
deleted file mode 100644
index 70a3493..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RemoveAllTerminatedAction.java
+++ /dev/null
@@ -1,112 +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.debug.internal.ui.actions;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.jface.action.IAction;
- 
-/**
- * Removes all terminated/detached launches from the
- * active debug view.
- */
-public class RemoveAllTerminatedAction extends AbstractRemoveAllActionDelegate implements ILaunchesListener2 {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#isEnabled()
-	 */
-	protected boolean isEnabled() {
-		ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-		if (launches != null) {
-			for (int i= 0; i < launches.length; i++) {
-				if (launches[i].isTerminated()) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	public static void removeTerminatedLaunches(ILaunch[] elements) {
-		List removed = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			ILaunch launch = elements[i];
-			if (launch.isTerminated()) {
-				removed.add(launch);
-			}
-		}
-		if (!removed.isEmpty()) {
-			ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-			manager.removeLaunches((ILaunch[])removed.toArray(new ILaunch[removed.size()]));
-		}				
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#initialize()
-	 */
-	protected void initialize() {
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {
-		IAction action = getAction();
-		if (action != null) {
-			if (action.isEnabled()) {
-				update();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-		removeTerminatedLaunches(launches);
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RetargetAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RetargetAction.java
deleted file mode 100644
index 089429d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RetargetAction.java
+++ /dev/null
@@ -1,282 +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.debug.internal.ui.actions;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPartService;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * Global retargettable debug action.
- * 
- * @since 3.0
- */
-public abstract class RetargetAction implements IWorkbenchWindowActionDelegate, IPartListener, IActionDelegate2 {
-	
-	protected IWorkbenchWindow fWindow = null;
-	private IWorkbenchPart fActivePart = null;
-	private Object fTargetAdapter = null;
-	private IAction fAction = null;
-	private static final ISelection EMPTY_SELECTION = new EmptySelection();  
-	
-	static class EmptySelection implements ISelection {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelection#isEmpty()
-		 */
-		public boolean isEmpty() {
-			return true;
-		}
-	}
-	
-	/**
-	 * Returns the current selection in the active part, possibly
-	 * and empty selection, but never <code>null</code>.
-	 * 
-	 * @return the selection in the active part, possibly empty
-	 */
-	private ISelection getTargetSelection() {
-		if (fActivePart != null) {
-			ISelectionProvider selectionProvider = fActivePart.getSite().getSelectionProvider();
-			if (selectionProvider != null) {
-				return selectionProvider.getSelection();
-			}
-		}
-		return EMPTY_SELECTION;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		fWindow.getPartService().removePartListener(this);
-		fActivePart = null;
-		fTargetAdapter = null;
-		
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.fWindow = window;
-		IPartService partService = window.getPartService();
-		partService.addPartListener(this);
-		IWorkbenchPart part = partService.getActivePart();
-		if (part != null) {
-			partActivated(part);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (fTargetAdapter != null) {
-			try {
-				if (isTargetEnabled()) {
-					performAction(fTargetAdapter, getTargetSelection(), fActivePart);
-				} else {
-					String message = getOperationUnavailableMessage();
-					IStatus status = new Status(IStatus.INFO, DebugUIPlugin.getUniqueIdentifier(), message);
-					DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), DebugUIPlugin.removeAccelerators(action.getText()), message, status);
-				}
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(fWindow.getShell(), ActionMessages.RetargetAction_2, ActionMessages.RetargetAction_3, e.getStatus()); // 
-			}
-		}
-	}
-	
-	/**
-	 * Returns a message to display when we find that the operation is not enabled
-	 * when invoked in an editor (we check enabled state before running in this case,
-	 * rather than updating on each selection change - see bug 180441).
-	 * 
-	 * @return information message when unavailable
-	 */
-	protected abstract String getOperationUnavailableMessage();
-	
-	/**
-	 * Performs the specific breakpoint toggling.
-	 * 
-	 * @param selection selection in the active part 
-	 * @param part active part
-	 * @throws CoreException if an exception occurs
-	 */
-	protected abstract void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException;
-	
-	/* (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) {
-		// if the active part did not provide an adapter, see if the selection does
-		if (fTargetAdapter == null && selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			if (!ss.isEmpty()) {
-				Object object = ss.getFirstElement();
-				if (object instanceof IAdaptable) {
-					fTargetAdapter = getAdapter((IAdaptable) object);
-				}
-			}
-		}
-		boolean enabled = fTargetAdapter != null;
-		if (selection instanceof IStructuredSelection) {
-			enabled = isTargetEnabled();
-		}
-		action.setEnabled(enabled);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-		fActivePart = part;
-		IResource resource = (IResource) part.getAdapter(IResource.class);
-		if (resource == null && part instanceof IEditorPart) {
-			resource = (IResource) ((IEditorPart)part).getEditorInput().getAdapter(IResource.class);
-		}
-		if (resource != null) {
-			fTargetAdapter = getAdapter(resource);
-		}
-		if (fTargetAdapter == null) {
-			fTargetAdapter = getAdapter(part);
-		}
-		if (fAction != null) {
-			fAction.setEnabled(fTargetAdapter != null);
-		}
-	}
-	
-	protected Object getAdapter(IAdaptable adaptable) {
-		Object adapter  = adaptable.getAdapter(getAdapterClass());
-		if (adapter == null) {
-			IAdapterManager adapterManager = Platform.getAdapterManager();
-			if (adapterManager.hasAdapter(adaptable, getAdapterClass().getName())) { 
-				fTargetAdapter = adapterManager.loadAdapter(adaptable, getAdapterClass().getName()); 
-			}
-		}
-		return adapter;
-	}
-	
-	/**
-	 * Returns the type of adapter (target) this action works on.
-	 * 
-	 * @return the type of adapter this action works on
-	 */
-	protected abstract Class getAdapterClass();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partBroughtToTop(IWorkbenchPart part) {		
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-		clearPart(part);
-	}
-	
-	/**
-	 * Clears reference to active part and adapter when a relevant part
-	 * is closed or no longer active.
-	 * 
-	 * @param part workbench part that has been closed or no longer active
-	 */
-	protected void clearPart(IWorkbenchPart part) {
-		if (part.equals(fActivePart)) {
-			fActivePart = null;
-			fTargetAdapter = null;
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-		clearPart(part);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partOpened(IWorkbenchPart part) {		
-	}
-
-	/**
-	 * Returns whether the target adapter is enabled
-	 * 
-	 * @return whether target adapter is enabled
-	 */
-	protected boolean isTargetEnabled() {
-		if (fTargetAdapter != null) {
-            if (fActivePart != null) {
-                return canPerformAction(fTargetAdapter, getTargetSelection(), fActivePart);
-            }
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns whether the specific operation is supported.
-	 * 
-	 * @param target the target adapter 
-	 * @param selection the selection to verify the operation on
-	 * @param part the part the operation has been requested on
-	 * @return whether the operation can be performed
-	 */
-	protected abstract boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		fAction = action;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/**
-	 * Returns the proxy to this action delegate or <code>null</code>
-	 * 
-	 * @return action proxy or <code>null</code>
-	 */
-	protected IAction getAction() {
-		return fAction;
-	}
-
-	/**
-	 * Returns whether there is currently a target adapter for this action.
-	 * 
-	 * @return whether the action has a target adapter.
-	 */
-	protected boolean hasTargetAdapter() {
-		return fTargetAdapter != null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RetargetRunToLineAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RetargetRunToLineAction.java
deleted file mode 100644
index 4df5e30..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RetargetRunToLineAction.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.debug.internal.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.actions.IRunToLineTarget;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Global retargettable run to line action.
- * 
- * @since 3.0
- */
-public class RetargetRunToLineAction extends RetargetAction {
-	
-	private DebugContextListener fContextListener = new DebugContextListener();
-	private ISuspendResume fTargetElement = null;
-	
-	class DebugContextListener implements IDebugContextListener {
-
-		protected void contextActivated(ISelection selection) {
-			fTargetElement = null;
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection) selection;
-				if (ss.size() == 1) {
-					Object object = ss.getFirstElement();
-					if (object instanceof ISuspendResume) {
-						fTargetElement = (ISuspendResume) object;
-					}
-				}
-			}
-			IAction action = getAction();
-			if (action != null) {
-				action.setEnabled(fTargetElement != null && hasTargetAdapter());
-			}
-		}
-
-		public void debugContextChanged(DebugContextEvent event) {
-			contextActivated(event.getContext());
-		}
-		
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		DebugUITools.getDebugContextManager().getContextService(fWindow).removeDebugContextListener(fContextListener);
-		super.dispose();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		super.init(window);
-		IDebugContextService service = DebugUITools.getDebugContextManager().getContextService(window);
-		service.addDebugContextListener(fContextListener);
-		ISelection activeContext = service.getActiveContext();
-		fContextListener.contextActivated(activeContext);
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean canPerformAction(Object target, ISelection selection,	IWorkbenchPart part) {
-		return fTargetElement != null &&
-			((IRunToLineTarget)target).canRunToLine(part, selection, fTargetElement);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getAdapterClass()
-	 */
-	protected Class getAdapterClass() {
-		return IRunToLineTarget.class;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException {
-		((IRunToLineTarget)target).runToLine(part, selection, fTargetElement);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getOperationUnavailableMessage()
-	 */
-	protected String getOperationUnavailableMessage() {
-		return ActionMessages.RetargetRunToLineAction_0;
-	}	
-	
-	/* (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) {
-		if (fTargetElement == null) {
-			action.setEnabled(false);
-		} else {
-			super.selectionChanged(action, selection);
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunAsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunAsAction.java
deleted file mode 100644
index efbd375..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunAsAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.LaunchShortcutsAction;
-
-/**
- * "Run As" action in the top level "Run" menu.
- */
-public class RunAsAction extends LaunchShortcutsAction {
-
-	public RunAsAction() {
-		super(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunContextualLaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunContextualLaunchAction.java
deleted file mode 100644
index 25b9964..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunContextualLaunchAction.java
+++ /dev/null
@@ -1,29 +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.debug.internal.ui.actions;
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.actions.ContextualLaunchAction;
-
-/**
- * Specialization of <code>ContextualLaunchAction</code> for the run mode
- * 
- * @see {@link ContextualLaunchAction}
- */
-public class RunContextualLaunchAction extends ContextualLaunchAction {
-	
-	/**
-	 * Constructor
-	 */
-	public RunContextualLaunchAction() {
-		super(ILaunchManager.RUN_MODE);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunHistoryMenuAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunHistoryMenuAction.java
deleted file mode 100644
index fedfecc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunHistoryMenuAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.AbstractLaunchHistoryAction;
-
-/**
- * Run history menu in the top-level "Run" menu.
- */ 
-public class RunHistoryMenuAction extends AbstractLaunchHistoryAction {
-	
-	public RunHistoryMenuAction() {
-		super(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunLastAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunLastAction.java
deleted file mode 100644
index abf5d30..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunLastAction.java
+++ /dev/null
@@ -1,80 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Relaunches the last run-mode launch
- * 
- * This menu item appears in the main 'Run' menu
- * 
- * @see RelaunchLastAction
- * @see DebugLastAction
- * @see ProfileLastAction
- */
-public class RunLastAction extends RelaunchLastAction {
-
-	/**
-	 * @see RelaunchLastAction#getMode()
-	 */
-	public String getMode() {
-		return ILaunchManager.RUN_MODE;
-	}	
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.LaunchDropDownAction#getLaunchGroupId()
-	 */
-	public String getLaunchGroupId() {
-		return IDebugUIConstants.ID_RUN_LAUNCH_GROUP;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getText()
-	 */
-	protected String getText() {
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			return ActionMessages.RunLastAction_1;
-		}
-		else {
-			return ActionMessages.RunLastAction_0;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getTooltipText()
-	 */
-	protected String getTooltipText() {
-		return ""; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getCommandId()
-	 */
-	protected String getCommandId() {
-		return "org.eclipse.debug.ui.commands.RunLast"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RelaunchLastAction#getDescription()
-	 */
-	protected String getDescription() {
-		if(LaunchingResourceManager.isContextLaunchEnabled()) {
-			return ActionMessages.RunLastAction_2;
-		}
-		else {
-			return ActionMessages.RunLastAction_3;
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunToolbarAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunToolbarAction.java
deleted file mode 100644
index 353cc19..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/RunToolbarAction.java
+++ /dev/null
@@ -1,26 +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.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.AbstractLaunchToolbarAction;
-
-/**
- * Run drop-down history/favorites action.
- */
-public class RunToolbarAction extends AbstractLaunchToolbarAction {
-
-	public RunToolbarAction() {
-		super(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/SelectAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/SelectAllAction.java
deleted file mode 100644
index 39384a0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/SelectAllAction.java
+++ /dev/null
@@ -1,56 +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.debug.internal.ui.actions;
-
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IViewPart;
-
-public abstract class SelectAllAction extends AbstractRemoveAllActionDelegate {
-	
-	private IViewPart fView;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractSelectionActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView = view;
-		IDebugView debugView = (IDebugView) getView().getAdapter(IDebugView.class);
-		if (debugView != null) {
-			debugView.setAction(getActionId(), getAction());
-		}
-		super.init(view);
-	}
-	
-	protected IViewPart getView() {
-		return fView;
-	}
-	
-	protected abstract String getActionId();
-	
-	/**
-	 * @see IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action){
-		if (!(getView() instanceof IDebugView)) {
-			return;
-		}
-		Viewer viewer = ((IDebugView) getView()).getViewer();
-		Control control = viewer.getControl();
-		if (control instanceof Tree) {
-			((Tree)control).selectAll();
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/StatusInfo.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/StatusInfo.java
deleted file mode 100644
index 6263e6d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/StatusInfo.java
+++ /dev/null
@@ -1,171 +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.debug.internal.ui.actions;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * A settable IStatus. 
- * Can be an error, warning, info or ok. For error, info and warning states,
- * a message describes the problem.
- */
-public class StatusInfo implements IStatus {
-	
-	private String fStatusMessage;
-	private int fSeverity;
-	
-	/**
-	 * Creates a status set to OK (no message)
-	 */
-	public StatusInfo() {
-		this(OK, null);
-	}
-
-	/**
-	 * Creates a status .
-	 * @param severity The status severity: ERROR, WARNING, INFO and OK.
-	 * @param message The message of the status. Applies only for ERROR,
-	 * WARNING and INFO.
-	 */	
-	public StatusInfo(int severity, String message) {
-		fStatusMessage= message;
-		fSeverity= severity;
-	}		
-	
-	/**
-	 *  Returns if the status' severity is OK.
-	 */
-	public boolean isOK() {
-		return fSeverity == IStatus.OK;
-	}
-
-	/**
-	 *  Returns if the status' severity is WARNING.
-	 */	
-	public boolean isWarning() {
-		return fSeverity == IStatus.WARNING;
-	}
-
-	/**
-	 *  Returns if the status' severity is INFO.
-	 */	
-	public boolean isInfo() {
-		return fSeverity == IStatus.INFO;
-	}	
-
-	/**
-	 *  Returns if the status' severity is ERROR.
-	 */	
-	public boolean isError() {
-		return fSeverity == IStatus.ERROR;
-	}
-	
-	/**
-	 * @see IStatus#getMessage
-	 */
-	public String getMessage() {
-		return fStatusMessage;
-	}
-	
-	/**
-	 * Sets the status to ERROR.
-	 * @param The error message (can be empty, but not null)
-	 */	
-	public void setError(String errorMessage) {
-		Assert.isNotNull(errorMessage);
-		fStatusMessage= errorMessage;
-		fSeverity= IStatus.ERROR;
-	}
-
-	/**
-	 * Sets the status to WARNING.
-	 * @param The warning message (can be empty, but not null)
-	 */		
-	public void setWarning(String warningMessage) {
-		Assert.isNotNull(warningMessage);
-		fStatusMessage= warningMessage;
-		fSeverity= IStatus.WARNING;
-	}
-
-	/**
-	 * Sets the status to INFO.
-	 * @param The info message (can be empty, but not null)
-	 */		
-	public void setInfo(String infoMessage) {
-		Assert.isNotNull(infoMessage);
-		fStatusMessage= infoMessage;
-		fSeverity= IStatus.INFO;
-	}	
-
-	/**
-	 * Sets the status to OK.
-	 */		
-	public void setOK() {
-		fStatusMessage= null;
-		fSeverity= IStatus.OK;
-	}
-	
-	/*
-	 * @see IStatus#matches(int)
-	 */
-	public boolean matches(int severityMask) {
-		return (fSeverity & severityMask) != 0;
-	}
-
-	/**
-	 * Returns always <code>false</code>.
-	 * @see IStatus#isMultiStatus()
-	 */
-	public boolean isMultiStatus() {
-		return false;
-	}
-
-	/*
-	 * @see IStatus#getSeverity()
-	 */
-	public int getSeverity() {
-		return fSeverity;
-	}
-
-	/*
-	 * @see IStatus#getPlugin()
-	 */
-	public String getPlugin() {
-		return DebugUIPlugin.getUniqueIdentifier();
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * @see IStatus#getException()
-	 */
-	public Throwable getException() {
-		return null;
-	}
-
-	/**
-	 * Returns always the error severity.
-	 * @see IStatus#getCode()
-	 */
-	public int getCode() {
-		return fSeverity;
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * @see IStatus#getChildren()
-	 */
-	public IStatus[] getChildren() {
-		return new IStatus[0];
-	}	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ToggleFilterAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ToggleFilterAction.java
deleted file mode 100644
index b2ba81c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ToggleFilterAction.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.debug.internal.ui.actions;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.custom.BusyIndicator;
-
-/**
- * A generic Toggle filter action, meant to be subclassed to provide
- * a specific filter.
- */
-public abstract class ToggleFilterAction extends Action {
-
-	/**
-	 * The viewer that this action works for
-	 */
-	private StructuredViewer fViewer;
-	
-	/**
-	 * The filter this action applies to the viewer
-	 */
-	private ViewerFilter fViewerFilter;
-
-	public void run() {
-		valueChanged(isChecked());
-	}
-	/**
-	 * Adds or removes the viewer filter depending
-	 * on the value of the parameter.
-	 */
-	protected void valueChanged(final boolean on) {
-		if (getViewer().getControl().isDisposed()) {
-			return;
-		}
-		BusyIndicator.showWhile(getViewer().getControl().getDisplay(), new Runnable() {
-			public void run() {
-				if (on) {
-					ViewerFilter filter= getViewerFilter();
-					ViewerFilter[] filters= getViewer().getFilters();
-					boolean alreadyAdded= false;
-					for (int i= 0; i < filters.length; i++) {
-						ViewerFilter addedFilter= filters[i];
-						if (addedFilter.equals(filter)) {
-							alreadyAdded= true;
-							break;
-						}
-					}
-					if (!alreadyAdded) {
-						getViewer().addFilter(filter);
-					}
-					
-				} else {
-					getViewer().removeFilter(getViewerFilter());
-				}
-			}
-		});
-	}
-
-	/**
-	 * Returns the <code>ViewerFilter</code> that this action
-	 * will add/remove from the viewer, or <code>null</code>
-	 * if no filter is involved.
-	 */
-	protected ViewerFilter getViewerFilter() {
-		return fViewerFilter;
-	}
-
-	protected void setViewerFilter(ViewerFilter filter) {
-		fViewerFilter= filter;
-	}
-	
-	protected StructuredViewer getViewer() {
-		return fViewer;
-	}
-
-	protected void setViewer(StructuredViewer viewer) {
-		fViewer = viewer;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ViewManagementAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ViewManagementAction.java
deleted file mode 100644
index 7bd91d6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/ViewManagementAction.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.debug.internal.ui.actions;
-
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.actions.ActionDelegate;
-
-/**
- * An action which opens the view management preference page.
- */
-public class ViewManagementAction extends ActionDelegate implements IViewActionDelegate {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		SWTFactory.showPreferencePage("org.eclipse.debug.ui.ViewManagementPreferencePage"); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractBreakpointsViewAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractBreakpointsViewAction.java
deleted file mode 100644
index b396f79..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractBreakpointsViewAction.java
+++ /dev/null
@@ -1,62 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Abstract implementation of an action contributed to the breakpoints view.
- */
-public abstract class AbstractBreakpointsViewAction implements IViewActionDelegate, IActionDelegate2 {
-    
-    /**
-     * The breakpoints view that this action has been contributed to.
-     */
-    protected BreakpointsView fView;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-     */
-    public void init(IViewPart view) {
-        fView= (BreakpointsView) view;
-    }
-    
-    /* (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.ui.IActionDelegate2#dispose()
-     */
-    public void dispose() {
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-     */
-    public void init(IAction action) {
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-     */
-    public void runWithEvent(IAction action, Event event) {
-        run(action);
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AdvancedGroupBreakpointsByAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AdvancedGroupBreakpointsByAction.java
deleted file mode 100644
index 3f01116..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AdvancedGroupBreakpointsByAction.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.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.window.Window;
-
-/**
- * Action that opens a dialog to select which breakpoint
- * container factories should be applies to the breakpoints
- * view.
- */
-public class AdvancedGroupBreakpointsByAction extends Action {
-	
-	private BreakpointsView fView;
-	
-	public AdvancedGroupBreakpointsByAction(BreakpointsView view) {
-        super("", IAction.AS_RADIO_BUTTON); //$NON-NLS-1$
-		fView= view;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-        if (isChecked()) {
-    	    GroupBreakpointsByDialog dialog = new GroupBreakpointsByDialog(fView);
-    		if (dialog.open() == Window.OK) {
-    			fView.setBreakpointOrganizers(dialog.getOrganizers());
-    		}
-        }
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointGroupMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointGroupMessages.java
deleted file mode 100644
index a9e8955..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointGroupMessages.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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.osgi.util.NLS;
-
-public class BreakpointGroupMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.actions.breakpointGroups.BreakpointGroupMessages";//$NON-NLS-1$
-	//
-	// 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
-	//
-
-	public static String GroupBreakpointsByAction_0;
-	public static String GroupBreakpointsByAction_1;
-	public static String GroupBreakpointsByDialog_0;
-	public static String GroupBreakpointsByDialog_1;
-	public static String GroupBreakpointsByDialog_2;
-	public static String GroupBreakpointsByDialog_3;
-	public static String GroupBreakpointsByDialog_4;
-	public static String GroupBreakpointsByDialog_5;
-	public static String GroupBreakpointsByDialog_6;
-	public static String GroupBreakpointsByDialog_7;
-	public static String CopyBreakpointsAction_0;
-	public static String CopyBreakpointsAction_1;
-	public static String CopyBreakpointsAction_2;
-	public static String CopyBreakpointsAction_3;
-	public static String PasteBreakpointsAction_0;
-	public static String PasteBreakpointsAction_1;
-	public static String RemoveFromWorkingSetAction_0;
-
-	public static String SelectBreakpointWorkingsetDialog_0;
-
-	public static String SetDefaultBreakpointGroupAction_0;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, BreakpointGroupMessages.class);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointGroupMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointGroupMessages.properties
deleted file mode 100644
index a1787c3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointGroupMessages.properties
+++ /dev/null
@@ -1,30 +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
-###############################################################################
-
-GroupBreakpointsByAction_0=&Breakpoints
-GroupBreakpointsByAction_1=&Advanced...
-GroupBreakpointsByDialog_0=Specify nested groupings for the Breakpoints view.
-GroupBreakpointsByDialog_1=A&vailable Groups:
-GroupBreakpointsByDialog_2=&Add -->
-GroupBreakpointsByDialog_3=&Selected Groups:
-GroupBreakpointsByDialog_4=<-- &Remove
-GroupBreakpointsByDialog_5=Move &Up
-GroupBreakpointsByDialog_6=Move &Down
-GroupBreakpointsByDialog_7=Group Breakpoints
-CopyBreakpointsAction_0=&Copy
-CopyBreakpointsAction_1=Copy Breakpoints
-CopyBreakpointsAction_2=Problem Copying to Clipboard
-CopyBreakpointsAction_3=There was a problem when accessing the system clipboard. Retry?
-PasteBreakpointsAction_0=&Paste
-PasteBreakpointsAction_1=Paste Breakpoints
-RemoveFromWorkingSetAction_0=Remove from &Working Set
-SetDefaultBreakpointGroupAction_0=Select Default Working Set
-SelectBreakpointWorkingsetDialog_0=Select &default working set:
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointSelectionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointSelectionAction.java
deleted file mode 100644
index a1c90fb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointSelectionAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * A selection listener action for the breakpoints view.
- */
-public abstract class BreakpointSelectionAction extends SelectionListenerAction {
-    
-    private BreakpointsView fView;
-    
-    /**
-     * Constructs an action for the breakpoints view.
-     * 
-     * @param text action name
-     * @param view breakpoints view
-     */
-    public BreakpointSelectionAction(String text, BreakpointsView view) {
-        super(text);
-        fView = view;
-    }
-    
-    /**
-     * Returns the breakpoints view.
-     * 
-     * @return breakpoints view
-     */
-    protected BreakpointsView getBreakpointsView() {
-        return fView;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointWorkingSetAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointWorkingSetAction.java
deleted file mode 100644
index 1ed2fff..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/BreakpointWorkingSetAction.java
+++ /dev/null
@@ -1,70 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewPart;
-
-/**
- * An action which clears (sets the null) the default breakpoint group.
- * @see org.eclipse.debug.core.IBreakpointManager#setAutoGroup(String)
- */
-public abstract class BreakpointWorkingSetAction extends AbstractBreakpointsViewAction implements IPropertyChangeListener {
-    
-    protected IAction fAction; 
-
-    /* (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) {
-        update();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-     */
-    public void init(IViewPart view) {
-        super.init(view);
-        DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#dispose()
-     */
-    public void dispose() {
-        DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-        super.dispose();
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-     */
-    public void init(IAction action) {
-        fAction = action;
-        super.init(action);
-        update();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent event) {
-        if (event.getProperty().equals(IInternalDebugUIConstants.MEMENTO_BREAKPOINT_WORKING_SET_NAME)) {
-            update();
-        }
-
-    }
-    protected abstract void update();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/ClearDefaultBreakpointGroupAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/ClearDefaultBreakpointGroupAction.java
deleted file mode 100644
index f6d50a8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/ClearDefaultBreakpointGroupAction.java
+++ /dev/null
@@ -1,32 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointSetOrganizer;
-import org.eclipse.jface.action.IAction;
-
-/**
- * An action which clears (sets the null) the default breakpoint group.
- * @see org.eclipse.debug.core.IBreakpointManager#setAutoGroup(String)
- */
-public class ClearDefaultBreakpointGroupAction extends BreakpointWorkingSetAction {
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-        BreakpointSetOrganizer.setDefaultWorkingSet(null);
-    }
-
-    protected void update() {
-        fAction.setEnabled(BreakpointSetOrganizer.getDefaultWorkingSet() != null);
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/CopyBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/CopyBreakpointsAction.java
deleted file mode 100644
index 3ee9a64..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/CopyBreakpointsAction.java
+++ /dev/null
@@ -1,136 +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.debug.internal.ui.actions.breakpointGroups;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * Action for copying the currently selected breakpoints to the clipboard.
- */
-public class CopyBreakpointsAction extends BreakpointSelectionAction {
-
-    /**
-     * System clipboard
-     */
-    private Clipboard clipboard;
-
-    /**
-     * Associated paste action. May be <code>null</code>
-     */
-    private PasteBreakpointsAction pasteAction;
-    
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard a platform clipboard
-     */
-    public CopyBreakpointsAction(BreakpointsView view, Clipboard clipboard) {
-        super(BreakpointGroupMessages.CopyBreakpointsAction_0, view); 
-        Assert.isNotNull(clipboard);
-        this.clipboard = clipboard;
-        setToolTipText(BreakpointGroupMessages.CopyBreakpointsAction_1);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.COPY_BREAKPOINTS_ACTION);
-    }
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard a platform clipboard
-     * @param pasteAction a paste action
-     */
-    public CopyBreakpointsAction(BreakpointsView view, Clipboard clipboard, PasteBreakpointsAction pasteAction) {
-        this(view, 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() {
-        IStructuredSelection selection = getStructuredSelection();
-        Object[] objects = selection.toArray();
-        StringBuffer buffer = new StringBuffer();
-        ILabelProvider labelProvider = (ILabelProvider) ((StructuredViewer)getBreakpointsView().getViewer()).getLabelProvider();
-        for (int i = 0; i < objects.length; i++) {
-            Object object = objects[i];
-            if (i > 0) {
-                buffer.append("\n"); //$NON-NLS-1$
-            }
-            buffer.append(labelProvider.getText(object));
-        }
-        setClipboard(selection, buffer.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 selection the selection to copy to the clipboard
-     */
-    private void setClipboard(ISelection selection, String text) {
-        try {
-            LocalSelectionTransfer.getInstance().setSelection(selection);
-            LocalSelectionTransfer.getInstance().setSelectionSetTime(System.currentTimeMillis());
-            clipboard.setContents(new Object[] {selection, text}, new Transfer[] {LocalSelectionTransfer.getInstance(), TextTransfer.getInstance()});
-        } catch (SWTError e) {
-            if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD)
-                throw e;
-            if (MessageDialog.openQuestion(
-                    getBreakpointsView().getSite().getShell(), BreakpointGroupMessages.CopyBreakpointsAction_2, 
-                    BreakpointGroupMessages.CopyBreakpointsAction_3)) { 
-                setClipboard(selection, text);
-            }
-        }
-    }
-
-    /**
-     * Enables if one or more breakpoints are selected.
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        if (selection.isEmpty()) {
-            return false;
-        }
-        Iterator iterator = selection.iterator();
-        while (iterator.hasNext()) {
-            if (!(iterator.next() instanceof IBreakpoint)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/EditBreakpointGroupAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/EditBreakpointGroupAction.java
deleted file mode 100644
index d8225fc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/EditBreakpointGroupAction.java
+++ /dev/null
@@ -1,66 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.WorkingSetCategory;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
-
-/**
- * An action to edit a breakpoint working set.
- */
-public class EditBreakpointGroupAction extends AbstractBreakpointsViewAction {
-	
-	/**
-	 * The currently selected breakpoints
-	 */
-	private IWorkingSet fSet = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-        IWorkingSetEditWizard editWizard = PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetEditWizard(fSet);
-        WizardDialog dialog = new WizardDialog(DebugUIPlugin.getShell(), editWizard);
-        dialog.open();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection sel) {
-		IStructuredSelection selection= (IStructuredSelection) sel;
-        fSet = null;
-        if (selection.size() == 1) {
-            Object element = selection.getFirstElement();
-			if (element instanceof BreakpointContainer) {
-                BreakpointContainer container = (BreakpointContainer)element;
-                IAdaptable category = container.getCategory();
-                if (category instanceof WorkingSetCategory) {
-                    IWorkingSet set = ((WorkingSetCategory)category).getWorkingSet();
-                    action.setEnabled(true);
-                    fSet = set;
-                    return;
-                }
-			}
-		}
-		action.setEnabled(false);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsAction.java
deleted file mode 100644
index b6fd6cd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsAction.java
+++ /dev/null
@@ -1,62 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-
-/**
- * An action which sets the breakpoint factory on a breakpoint view,
- * effectively telling the view to group breakpoints according to
- * some criteria (as determined by the factory).
- */
-public class GroupBreakpointsAction extends Action {
-    
-    private IBreakpointOrganizer fOrganzier;
-    private BreakpointsView fView;
-
-    /**
-     * Creates a new action which will group breakpoints in the given
-     * breakpoint view using the given breakpoint container factory
-     * @param factory the factory that will be applied to the given view
-     *  when this action is run
-     * @param view the breakpoints view
-     */
-    public GroupBreakpointsAction(IBreakpointOrganizer organizer, BreakpointsView view) {
-        super("", IAction.AS_RADIO_BUTTON); //$NON-NLS-1$
-        fOrganzier= organizer;
-        fView= view;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        if (isChecked()) {
-            if (fOrganzier == null) {
-                fView.setBreakpointOrganizers(null);
-            } else {
-                fView.setBreakpointOrganizers(new IBreakpointOrganizer[]{fOrganzier});
-            }
-        }
-    }
-    
-    /**
-     * Returns this action's organizer.
-     * 
-     * @return breakpoint organizer
-     */
-    public IBreakpointOrganizer getOrganizer() {
-    	return fOrganzier;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByAction.java
deleted file mode 100644
index 4d3053c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByAction.java
+++ /dev/null
@@ -1,167 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointOrganizerManager;
-import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * 
- */
-public class GroupBreakpointsByAction extends AbstractBreakpointsViewAction implements IMenuCreator {
-
-	private IAction fAction= null;
-	
-	public GroupBreakpointsByAction() {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuCreator#dispose()
-     */
-    public void dispose() {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-     */
-    public Menu getMenu(Control parent) {
-        // Never called
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-     */
-    public Menu getMenu(Menu parent) {
-		Menu menu = new Menu(parent);
-		menu.addMenuListener(new MenuAdapter() {
-			public void menuShown(MenuEvent e) {
-				Menu m = (Menu)e.widget;
-				MenuItem[] items = m.getItems();
-				for (int i=0; i < items.length; i++) {
-					items[i].dispose();
-				}
-				fillMenu(m);
-			}
-		});		
-		return menu;
-    }
-    
-	/**
-	 * Fill pull down menu with the "group by" options
-	 */
-	private void fillMenu(Menu menu) {
-		// determine which item should be checked
-		IBreakpointOrganizer[] organizers = fView.getBreakpointOrganizers();
-		boolean none = false;
-		boolean advanced = false;
-		IBreakpointOrganizer organizer = null;
-		if (organizers == null || organizers.length == 0) {
-			none = true;
-		} else if (organizers.length > 1) {
-			advanced = true;
-		} else {
-			organizer = organizers[0];
-		}
-		
-        int accel = 1;
-        // Add hard-coded action for flat breakpoints list
-        IAction action = new GroupBreakpointsAction(null, fView);
-        addAccel(accel, action, BreakpointGroupMessages.GroupBreakpointsByAction_0); 
-        accel++;
-        action.setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_VIEW_BREAKPOINTS));
-        action.setChecked(none);
-        ActionContributionItem item= new ActionContributionItem(action);
-        item.fill(menu, -1);
-
-		// Add actions for each contributed orgranizer
-	    List actions = getActions(accel);
-        accel = accel + actions.size();
-        Iterator actionIter = actions.iterator();
-	    while (actionIter.hasNext()) {
-			GroupBreakpointsAction bpAction = (GroupBreakpointsAction) actionIter.next();
-			bpAction.setChecked(bpAction.getOrganizer().equals(organizer));
-			item= new ActionContributionItem(bpAction);
-			item.fill(menu, -1);
-	    }
-	                    
-        // advanced action
-        AdvancedGroupBreakpointsByAction advancedAction = new AdvancedGroupBreakpointsByAction(fView);
-        addAccel(accel, advancedAction,BreakpointGroupMessages.GroupBreakpointsByAction_1); 
-        advancedAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_HIERARCHICAL));
-        advancedAction.setChecked(advanced);
-		item= new ActionContributionItem(advancedAction);
-		item.fill(menu, -1);
-	}
-    
-    public List getActions(int accel) {
-        List actions= new ArrayList();
-        IBreakpointOrganizer[] organizers = BreakpointOrganizerManager.getDefault().getOrganizers();
-        for (int i = 0; i < organizers.length; i++) {
-        	IBreakpointOrganizer organizer = organizers[i];
-            IAction action = new GroupBreakpointsAction(organizer, fView);
-            addAccel(accel, action, organizer.getLabel());
-            accel++;
-            action.setImageDescriptor(organizer.getImageDescriptor());
-            actions.add(action);
-        }        
-        return actions;
-    }
-    
-    private void addAccel(int accel, IAction action, String label) {
-        StringBuffer actionLabel= new StringBuffer();
-        if (accel != 10) {
-            if (accel < 10) {
-                // add the numerical accelerators 1 through 9
-                actionLabel.append('&');
-            }
-            actionLabel.append(accel);
-        } else {
-            actionLabel.append("1&0"); //$NON-NLS-1$
-        }
-        accel++;
-        actionLabel.append(' ');
-        actionLabel.append(label);
-        action.setText(actionLabel.toString());        
-    }
-    
-    /* (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) {
-	    if (action != fAction) {
-	        action.setMenuCreator(this);
-	        fAction= action;
-	    }
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java
deleted file mode 100644
index a261c78..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java
+++ /dev/null
@@ -1,534 +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.debug.internal.ui.actions.breakpointGroups;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointOrganizerManager;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-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.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-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.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Dialog which presents available breakpoint groupings to
- * the user and allows them to specify which they'd like
- * to use and in what order they should be applied.
- */
-public class GroupBreakpointsByDialog extends TrayDialog {
-	
-	private BreakpointsView fView;
-	
-	// Table viewer that presents available containers
-	private TableViewer fAvailableViewer;
-	private AvailableOrganizersProvider fAvailableOrganizersProvider= new AvailableOrganizersProvider();
-	
-	// Tree viewer that presents selected containers
-	private TreeViewer fSelectedViewer;
-	private SelectedOrganizerProvider fSelectedOrganizersProvider= new SelectedOrganizerProvider();
-	
-	private List fResult= new ArrayList();
-
-	private Button fAddButton;
-	private Button fRemoveButton;
-	private Button fMoveUpButton;
-	private Button fMoveDownButton;
-	
-	/**
-	 * Selection listener that listens to selection from all buttons in this
-	 * dialog.
-	 */
-	private SelectionAdapter fSelectionListener= new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			Object source= e.getSource();
-			if (source == fAddButton) {
-				handleAddPressed();
-			} else if (source == fRemoveButton) {
-				handleRemovePressed();
-			} else if (source == fMoveUpButton) {
-				handleMoveUpPressed();
-			} else if (source == fMoveDownButton) {
-				handleMoveDownPressed();
-			}
-		}
-	};
-
-	protected GroupBreakpointsByDialog(BreakpointsView view) {
-		super(view.getSite().getShell());
-		fView= view;
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		ILabelProvider labelProvider= new BreakpointOrganzierLabelProvider();
-		
-		Composite parentComposite= (Composite) super.createDialogArea(parent);
-		parentComposite.setFont(parent.getFont());
-		Composite composite= new Composite(parentComposite, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-        composite.setLayout(layout);
-		GridData data= new GridData(GridData.FILL_BOTH);
-		data.heightHint= 400;
-		composite.setLayoutData(data);
-		composite.setFont(parent.getFont());
-		
-		Label label= new Label(composite, SWT.WRAP);
-		label.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_0); 
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 3;
-        label.setLayoutData(gridData);
-		
-		createAvailableViewer(composite, labelProvider);
-		createButtons(composite);
-		createSelectedViewer(composite, labelProvider);
-
-		initializeContent();
-		updateViewers();
-		Dialog.applyDialogFont(parentComposite);
-		return parentComposite;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control contents = super.createContents(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getDialogArea(), IDebugHelpContextIds.GROUP_BREAKPOINTS_DIALOG);
-		return contents;
-	}
-
-	/**
-	 * Divides the available breakpoint container factories into the
-	 * appropriate viewers ("available" or "selected").
-	 */
-	private void initializeContent() {
-		IBreakpointOrganizer[] organizers= BreakpointOrganizerManager.getDefault().getOrganizers();
-		for (int i = 0; i < organizers.length; i++) {
-			fAvailableOrganizersProvider.addAvailable(organizers[i]);
-		}
-		organizers = fView.getBreakpointOrganizers();
-        if (organizers != null) {
-    		for (int i = 0; i < organizers.length; i++) {
-                fSelectedOrganizersProvider.addSelected(organizers[i]);
-            }
-        }
-	}
-
-	/**
-	 * Creates and configured the viewer that shows the available (not currently selected)
-	 * breakpoint container factories.
-	 */
-	private void createAvailableViewer(Composite parent, ILabelProvider labelProvider) {		
-		Composite availableComposite= new Composite(parent, SWT.NONE);
-		availableComposite.setFont(parent.getFont());
-		GridLayout layout = new GridLayout();
-		layout.marginHeight=0;
-		layout.marginWidth=0;
-		availableComposite.setLayout(layout);
-		GridData gridData= new GridData(GridData.FILL_BOTH);
-		gridData.widthHint= 225;
-		availableComposite.setLayoutData(gridData);
-
-		Label label= new Label(availableComposite, SWT.WRAP);
-		label.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_1); 
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-        label.setLayoutData(gridData);
-		
-		fAvailableViewer= new TableViewer(availableComposite);
-		fAvailableViewer.setContentProvider(fAvailableOrganizersProvider);
-		fAvailableViewer.setLabelProvider(labelProvider);
-		fAvailableViewer.setInput(new Object());
-		Table table = fAvailableViewer.getTable();
-		table.setLayoutData(new GridData(GridData.FILL_BOTH));
-		table.setFont(parent.getFont());
-		fAvailableViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				handleAddPressed();
-			}
-		});
-		fAvailableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateAddButton();
-			}
-		});
-	}
-
-	/**
-	 * Creates and configures the viewer that shows the currently selected
-	 * breakpoint container factories.
-	 */
-	private void createSelectedViewer(Composite parent, ILabelProvider labelProvider) {
-		Composite selectedComposite= new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight=0;
-		layout.marginWidth=0;
-		layout.numColumns= 2;
-		selectedComposite.setLayout(layout);
-		GridData gridData= new GridData(GridData.FILL_BOTH);
-		gridData.widthHint= 225;
-		selectedComposite.setLayoutData(gridData);
-		selectedComposite.setFont(parent.getFont());
-		
-		Label label= new Label(selectedComposite, SWT.WRAP);
-		label.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_3); 
-		gridData = new GridData();
-		gridData.horizontalSpan = 2;
-        label.setLayoutData(gridData);
-		
-		fSelectedViewer= new TreeViewer(selectedComposite);
-		fSelectedViewer.setContentProvider(fSelectedOrganizersProvider);
-		fSelectedViewer.setLabelProvider(labelProvider);
-		fSelectedViewer.setInput(new Object());
-		Tree tree = fSelectedViewer.getTree();
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setFont(parent.getFont());
-		fSelectedViewer.addDoubleClickListener(new IDoubleClickListener() {
-            public void doubleClick(DoubleClickEvent event) {
-                handleRemovePressed();
-            }
-        });
-		fSelectedViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateSelectedButtons();
-			}
-		});
-	}
-	
-	public void createButtons(Composite parent) {
-		Composite buttonComposite= new Composite(parent, SWT.NONE);
-		buttonComposite.setLayout(new GridLayout());
-		buttonComposite.setLayoutData(new GridData());
-		buttonComposite.setFont(parent.getFont());
-		
-		fAddButton= SWTFactory.createPushButton(buttonComposite, BreakpointGroupMessages.GroupBreakpointsByDialog_2, null); 
-		fAddButton.addSelectionListener(fSelectionListener);
-		
-		fRemoveButton= SWTFactory.createPushButton(buttonComposite, BreakpointGroupMessages.GroupBreakpointsByDialog_4, null); 
-		fRemoveButton.addSelectionListener(fSelectionListener);
-		
-		fMoveUpButton= SWTFactory.createPushButton(buttonComposite, BreakpointGroupMessages.GroupBreakpointsByDialog_5, null); 
-		fMoveUpButton.addSelectionListener(fSelectionListener);
-		
-		fMoveDownButton= SWTFactory.createPushButton(buttonComposite, BreakpointGroupMessages.GroupBreakpointsByDialog_6, null); 
-		fMoveDownButton.addSelectionListener(fSelectionListener);
-	    
-	}
-
-	/**
-	 * Returns the organizers chosen by the user. The order
-	 * of the list is the order that the organizers should be displayed
-	 * in the breakpoints view.
-	 * @return the breakpoint organizers chosen by the user
-	 */
-	public IBreakpointOrganizer[] getOrganizers() {
-		return (IBreakpointOrganizer[]) fResult.toArray(new IBreakpointOrganizer[fResult.size()]);
-	}
-	
-	/**
-	 * When the user presses OK, convert the tree selection into a list.
-	 */
-	protected void okPressed() {
-		Object[] factories= fSelectedOrganizersProvider.getElements(null);
-		while (factories.length > 0) {
-			Object factory= factories[0];
-			fResult.add(factory);
-			factories= fSelectedOrganizersProvider.getChildren(factory);
-		}
-		super.okPressed();
-	}
-	
-	/**
-	 * Moves the selected item from the list of "available" factories
-	 * to the tree of "selected" factories.
-	 */
-	public void handleAddPressed() {
-		IStructuredSelection selection= (IStructuredSelection) fAvailableViewer.getSelection();
-		if (selection.size() < 1) {
-			return;
-		}
-		Iterator iter= selection.iterator();
-		while (iter.hasNext()) {
-			fSelectedOrganizersProvider.addSelected((IBreakpointOrganizer) iter.next());
-		}
-		updateViewers();
-	}
-	
-	/**
-	 * Moves the selected item from the tree of "selected" factories
-	 * to the list of "available" factories.
-	 */
-	public void handleRemovePressed() {
-		IStructuredSelection selection= (IStructuredSelection) fSelectedViewer.getSelection();
-		if (selection.size() < 1) {
-			return;
-		}
-		Iterator iter= selection.iterator();
-		while (iter.hasNext()) {
-			fAvailableOrganizersProvider.addAvailable((IBreakpointOrganizer) iter.next());
-		}
-		updateViewers();
-	}
-	
-	/**
-	 * Moves each selected item up in the tree of selected containers
-	 */
-	public void handleMoveUpPressed() {
-		IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
-		Iterator iter = selection.iterator();
-		while (iter.hasNext()) {
-			fSelectedOrganizersProvider.moveUp(iter.next());
-		}
-		updateViewers();
-	}
-	
-	/**
-	 * Moves each selected item down in the tree of selected containers
-	 */
-	public void handleMoveDownPressed() {
-		IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
-		Object[] elements= selection.toArray();
-		for (int i= elements.length - 1; i >= 0; i--) {
-			fSelectedOrganizersProvider.moveDown(elements[i]);
-		}
-		updateViewers();
-	}
-	
-	/**
-	 * Fully refreshes and updates all viewers and buttons.
-	 */
-	public void updateViewers() {
-		fAvailableViewer.refresh();
-		fSelectedViewer.refresh();
-		fSelectedViewer.expandAll();
-		updateAddButton();
-		updateSelectedButtons();
-	}
-	
-	/**
-	 * Updates all buttons associated with the tree of selected containers.
-	 */
-	public void updateSelectedButtons() {
-		updateRemoveButton();
-		updateMoveUpButton();
-		updateMoveDownButton();
-	}
-	
-	public void updateAddButton() {
-		IStructuredSelection selection = (IStructuredSelection) fAvailableViewer.getSelection();
-		fAddButton.setEnabled(selection.size() > 0);
-	}
-	
-	public void updateRemoveButton() {
-		IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
-		fRemoveButton.setEnabled(selection.size() > 0);
-	}
-	
-	public void updateMoveUpButton() {
-		boolean enabled= true;
-		IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
-		if (selection.size() == 0) {
-			enabled= false;
-		} else {
-			Object firstSelected= selection.getFirstElement();
-			Object parent= fSelectedOrganizersProvider.getParent(firstSelected);
-			if (!(parent instanceof IBreakpointOrganizer)) {
-				enabled= false;
-			}
-		}
-		fMoveUpButton.setEnabled(enabled);
-	}
-	
-	public void updateMoveDownButton() {
-		boolean enabled= true;
-		IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
-		if (selection.size() == 0) {
-			enabled= false;
-		} else {
-			Object lastSelected= selection.toList().get(selection.size() - 1);
-			Object[] children= fSelectedOrganizersProvider.getChildren(lastSelected);
-			if (children.length < 1) {
-				enabled= false;
-			}
-		}
-		fMoveDownButton.setEnabled(enabled);
-	}
-	
-	/**
-	 * Content provider that provides the list of breakpoint organaisers
-     * that are available but not currently selected.
-	 */
-	private class AvailableOrganizersProvider implements IStructuredContentProvider {
-		protected List availableOrganziers= new ArrayList();
-		
-		public void addAvailable(IBreakpointOrganizer organizer) {
-            availableOrganziers.add(organizer);
-			fSelectedOrganizersProvider.selectedOrganizers.remove(organizer);
-		}
-		
-		public Object[] getElements(Object inputElement) {
-			return availableOrganziers.toArray();
-		}
-		
-		public void dispose() {
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-	
-	/**
-	 * Content provider that returns the selected breakpoint organizers
-	 * as a tree. This tree shows the list of organzizers as they will
-	 * appear in the breakpoints view.
-	 */
-	private class SelectedOrganizerProvider implements ITreeContentProvider {
-		protected List selectedOrganizers= new ArrayList();
-		
-		public void addSelected(IBreakpointOrganizer organizer) {
-            selectedOrganizers.add(organizer);
-			fAvailableOrganizersProvider.availableOrganziers.remove(organizer);
-		}
-		
-		public void moveUp(Object object) {
-			int index = selectedOrganizers.indexOf(object);
-			if (index > 0) {
-                selectedOrganizers.remove(object);
-                selectedOrganizers.add(index - 1, object);
-			}
-		}
-		
-		public void moveDown(Object object) {
-			int index = selectedOrganizers.indexOf(object);
-			if (index < selectedOrganizers.size() - 1) {
-                selectedOrganizers.remove(object);
-                selectedOrganizers.add(index + 1, object);
-			}
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			// A factory's "child" is the next factory in the list
-			int index = selectedOrganizers.indexOf(parentElement);
-			if (index < selectedOrganizers.size() - 1) {
-				return new Object[] { selectedOrganizers.get(index + 1) };
-			}
-			return new Object[0];
-		}
-
-		public Object getParent(Object element) {
-			// A factory's "parent" is the factory before it
-			int index = selectedOrganizers.indexOf(element);
-			if (index <= 0 || selectedOrganizers.size() <= 1) {
-				return null;
-			}
-			return selectedOrganizers.get(index - 1);
-		}
-
-		public boolean hasChildren(Object element) {
-			// A factory has "children" if there are more
-			// factories after it.
-			int index = selectedOrganizers.indexOf(element);
-			return index != -1 && index < selectedOrganizers.size() - 1;
-		}
-
-		public Object[] getElements(Object inputElement) {
-			if (selectedOrganizers.size() > 0) {
-				return new Object[] { selectedOrganizers.get(0) };
-			}
-			return new Object[0];
-		}
-		public void dispose() {
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-	
-	/**
-	 * Label provider which provides text and images for breakpoint container factories
-	 */
-	private class BreakpointOrganzierLabelProvider extends LabelProvider {
-		private HashMap fImageCache= new HashMap();
-		
-		public String getText(Object element) {
-			if (element instanceof IBreakpointOrganizer) {
-				return ((IBreakpointOrganizer) element).getLabel();
-			}
-			return super.getText(element);
-		}
-		public Image getImage(Object element) {
-			if (element instanceof IBreakpointOrganizer) {
-				ImageDescriptor imageDescriptor = ((IBreakpointOrganizer) element).getImageDescriptor();
-				if (imageDescriptor != null) {
-					Image image = (Image) fImageCache.get(imageDescriptor);
-					if (image == null) {
-						image= imageDescriptor.createImage();
-						if (image != null) {
-							fImageCache.put(imageDescriptor, image);
-						}
-					}
-					return image;
-				}
-			}
-			return super.getImage(element);
-		}
-		public void dispose() {
-			Iterator imageIter = fImageCache.values().iterator();
-			while (imageIter.hasNext()) {
-				((Image) imageIter.next()).dispose();
-			}
-			super.dispose();
-		}
-	}
-	
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        shell.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_7); 
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/PasteBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/PasteBreakpointsAction.java
deleted file mode 100644
index dc260a9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/PasteBreakpointsAction.java
+++ /dev/null
@@ -1,87 +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.debug.internal.ui.actions.breakpointGroups;
-
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.internal.ui.views.breakpoints.OtherBreakpointCategory;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * 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
- */
-public class PasteBreakpointsAction extends BreakpointSelectionAction {
-    
-    /**
-     * Creates a new action.
-     *
-     * @param view the view of this action
-     */
-    public PasteBreakpointsAction(BreakpointsView view) {
-        super(BreakpointGroupMessages.PasteBreakpointsAction_0, view); 
-        setToolTipText(BreakpointGroupMessages.PasteBreakpointsAction_1);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.PASTE_BREAKPOINTS_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 Object getTarget() {
-        List selectedNonResources = getSelectedNonResources();
-        if (selectedNonResources.size() == 1) {
-            Object target = selectedNonResources.get(0);
-            if (target instanceof BreakpointContainer) {
-                return target;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Implementation of method defined on <code>IAction</code>.
-     */
-    public void run() {
-		if (getBreakpointsView().canPaste(getTarget(), LocalSelectionTransfer.getInstance().getSelection())) {
-			getBreakpointsView().performPaste(getTarget(), LocalSelectionTransfer.getInstance().getSelection());
-		}
-    }
-
-    /**
-     * Returns whether this action should be enabled based on the selection
-     * in the clipboard. Only updates when the breakpoints view has focus. 
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        // can't paste into "Others" (only move)
-        Object target = getTarget();
-        if (target instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) target;
-            if (container.getCategory() instanceof OtherBreakpointCategory) {
-                return false;
-            }
-			return true;
-        }
-		// don't access clipboard - causes Hang -see bug 84870
-		return false;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/RemoveFromWorkingSetAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/RemoveFromWorkingSetAction.java
deleted file mode 100644
index 9835ba0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/RemoveFromWorkingSetAction.java
+++ /dev/null
@@ -1,64 +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.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Item;
-
-/**
- * Removes a breakpoint from a breakpoint working set.
- */
-public class RemoveFromWorkingSetAction extends BreakpointSelectionAction {
-	
-    /**
-     * Constructs action to remove breakpoints from a category.
-     * 
-     * @param view
-     */
-    public RemoveFromWorkingSetAction(BreakpointsView view) {
-        super(BreakpointGroupMessages.RemoveFromWorkingSetAction_0, view); 
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        BreakpointsViewer viewer = (BreakpointsViewer) getBreakpointsView().getViewer();
-        Item[] items = viewer.getSelectedItems();
-        IBreakpoint breakpoint = null;
-        BreakpointContainer container = null;
-        for(int i = 0; i < items.length; i++) {
-        	if(items[i].getData() instanceof IBreakpoint) {
-        		breakpoint = (IBreakpoint) items[i].getData();
-        		container = viewer.getRemovableContainer(items[i]);
-        		if(container != null) {
-        			container.getOrganizer().removeBreakpoint(breakpoint, container.getCategory());
-        		}
-        	}
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        Object element = selection.getFirstElement();
-        if(element instanceof BreakpointContainer) {
-        	return ((BreakpointContainer) element).getCategory().equals(IDebugUIConstants.BREAKPOINT_WORKINGSET_ID);
-        }
-        return false;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java
deleted file mode 100644
index a5a3fb2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import java.util.ArrayList;
-
-import org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Dialog to allow the selection of working sets without all of the overhead of the
- * platform UI working set dialog
- * 
- * @since 3.3
- */
-public class SelectBreakpointWorkingsetDialog extends AbstractDebugCheckboxSelectionDialog {
-	
-	private static final String SETTINGS_ID = DebugUIPlugin.getUniqueIdentifier() + ".DELETE_ASSOCIATED_CONFIGS_DIALOG"; //$NON-NLS-1$
-	private IWorkingSet[] fWorkingSetList = null;
-	
-	/**
-	 * Constructor
-	 * @param parentShell the parent to open this dialog on
-	 */
-	protected SelectBreakpointWorkingsetDialog(Shell parentShell) {
-		super(parentShell);
-		fWorkingSetList = getBreakpointWorkingSets();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugCheckboxSelectionDialog#addViewerListeners(org.eclipse.jface.viewers.StructuredViewer)
-	 */
-	protected void addViewerListeners(StructuredViewer viewer) {
-		CheckboxTableViewer checkViewer = getCheckBoxTableViewer();
-		if (checkViewer != null){
-			checkViewer.addCheckStateListener(new ICheckStateListener(){
-				public void checkStateChanged(CheckStateChangedEvent event) {
-					getCheckBoxTableViewer().setCheckedElements(new Object[] {event.getElement()});
-					getButton(IDialogConstants.OK_ID).setEnabled(true);
-				}
-			});
-		}
-	}
-	
-	/**
-	 * Returns the current listing of breakpoint <code>IWorkingSet</code>s
-	 * @return an array of the current breakpoint <code>IWorkingSet</code>s
-	 */
-	private IWorkingSet[] getBreakpointWorkingSets() {
-		IWorkingSet[] ws = PlatformUI.getWorkbench().getWorkingSetManager().getAllWorkingSets();
-		ArrayList list = new ArrayList();
-		for(int i = 0; i < ws.length; i++) {
-			if(IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(ws[i].getId())) {
-				list.add(ws[i]);
-			}
-		}
-		return (IWorkingSet[]) list.toArray(new IWorkingSet[list.size()]);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-	 */
-	protected Object getViewerInput() {
-		return fWorkingSetList;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-	 */
-	protected String getDialogSettingsId() {
-		return SETTINGS_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SELECT_DEFAULT_WORKINGSET_DIALOG;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-	 */
-	protected String getViewerLabel() {
-		return BreakpointGroupMessages.SelectBreakpointWorkingsetDialog_0;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SetDefaultBreakpointGroupAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SetDefaultBreakpointGroupAction.java
deleted file mode 100644
index f30a8ce..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SetDefaultBreakpointGroupAction.java
+++ /dev/null
@@ -1,45 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointSetOrganizer;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IWorkingSet;
-
-/**
- * Action which prompts the user to set a default breakpoint group.
- */
-public class SetDefaultBreakpointGroupAction extends AbstractBreakpointsViewAction {
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-    	SelectBreakpointWorkingsetDialog sbwsd = new SelectBreakpointWorkingsetDialog(DebugUIPlugin.getShell());
-    	sbwsd.setTitle(BreakpointGroupMessages.SetDefaultBreakpointGroupAction_0);
-    	IWorkingSet workingSet = BreakpointSetOrganizer.getDefaultWorkingSet();
-    	if (workingSet != null){
-    		sbwsd.setInitialSelections(new Object[]{workingSet});
-    	}
-    	if(sbwsd.open() == Window.OK) {
-    		BreakpointSetOrganizer.setDefaultWorkingSet((IWorkingSet) sbwsd.getResult()[0]);
-    	}
-    }
-
-    /* (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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/ToggleDefaultGroupAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/ToggleDefaultGroupAction.java
deleted file mode 100644
index fd623b6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/ToggleDefaultGroupAction.java
+++ /dev/null
@@ -1,69 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointSetOrganizer;
-import org.eclipse.debug.internal.ui.views.breakpoints.WorkingSetCategory;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkingSet;
-
-/**
- * Toggles the default breakpoint group based on selection.
- */
-public class ToggleDefaultGroupAction extends AbstractBreakpointsViewAction {
-    
-    private IWorkingSet fSelectedSet;
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-        IWorkingSet defaultWorkingSet = BreakpointSetOrganizer.getDefaultWorkingSet();
-        IWorkingSet set = null;
-        if (!fSelectedSet.equals(defaultWorkingSet)) {
-            set = fSelectedSet;
-        }
-        BreakpointSetOrganizer.setDefaultWorkingSet(set);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-     */
-    public void selectionChanged(IAction action, ISelection sel) {
-        fSelectedSet = null;
-        if (sel instanceof IStructuredSelection) {
-            IStructuredSelection selection = (IStructuredSelection) sel;
-            if (selection.size() == 1) {
-	            Object firstElement = selection.getFirstElement();
-	            if (firstElement instanceof BreakpointContainer) {
-	                BreakpointContainer container = (BreakpointContainer) firstElement;
-	                if (container.getCategory() instanceof WorkingSetCategory) {
-	                    WorkingSetCategory category = (WorkingSetCategory)container.getCategory();
-	                    if (IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(category.getWorkingSet().getId())) {
-	                        IWorkingSet set = category.getWorkingSet();
-	                        action.setEnabled(true);
-	                        boolean isDefault = set == BreakpointSetOrganizer.getDefaultWorkingSet();
-	                        action.setChecked(isDefault);
-	                        fSelectedSet = set;
-	                        return;
-	                    }
-	                }
-	            }
-            }
-        }
-        action.setEnabled(false);
-        action.setChecked(false);
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/WorkingSetsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/WorkingSetsAction.java
deleted file mode 100644
index eeb5cac..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/WorkingSetsAction.java
+++ /dev/null
@@ -1,38 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpointGroups;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-
-/**
- * Allows the user to manage working sets.
- */
-public class WorkingSetsAction extends AbstractBreakpointsViewAction {
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-        IWorkingSetSelectionDialog selectionDialog = PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetSelectionDialog(DebugUIPlugin.getShell(), false);
-        selectionDialog.open();
-    }
-
-    /* (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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/AccessWatchpointToggleAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/AccessWatchpointToggleAction.java
deleted file mode 100644
index 64b98f9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/AccessWatchpointToggleAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IWatchpoint;
-
-/**
- * Toggles access attribute of a watchpoint.
- */
-public class AccessWatchpointToggleAction extends ModifyWatchpointAction {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.ModifyWatchpointAction#isEnabled(org.eclipse.debug.core.model.IWatchpoint)
-     */
-    protected boolean isEnabled(IWatchpoint watchpoint) {
-        return watchpoint.supportsAccess();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.ModifyWatchpointAction#toggleWatchpoint(org.eclipse.debug.core.model.IWatchpoint, boolean)
-     */
-    protected void toggleWatchpoint(IWatchpoint watchpoint, boolean b) throws CoreException {
-        watchpoint.setAccess(b);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.ModifyWatchpointAction#isChecked(org.eclipse.debug.core.model.IWatchpoint)
-     */
-    protected boolean isChecked(IWatchpoint watchpoint) {
-        try {
-            return watchpoint.isAccess();
-        } catch (CoreException e) {
-        }
-        return false;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsCollapseAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsCollapseAllAction.java
deleted file mode 100644
index 4d5f14f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsCollapseAllAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * 
- */
-public class BreakpointsCollapseAllAction implements IViewActionDelegate {
-	
-	private BreakpointsView fView;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView= (BreakpointsView) view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		fView.getCheckboxViewer().collapseAll();
-	}
-
-	/* (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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java
deleted file mode 100644
index e3c91aa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Action which fully expands the tree in the breakpoints view.
- */
-public class BreakpointsExpandAllAction implements IViewActionDelegate {
-	
-	private BreakpointsView fView;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView= (BreakpointsView) view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		fView.getCheckboxViewer().expandAll();
-	}
-
-	/* (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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/DeleteWorkingsetsMessageDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/DeleteWorkingsetsMessageDialog.java
deleted file mode 100644
index 90b1748..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/DeleteWorkingsetsMessageDialog.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-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.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;
-
-/**
- * Allows the user to specify if they want to delete the working set, all the breakpoints in the working
- * set or both
- * @since 3.2
- */
-public class DeleteWorkingsetsMessageDialog extends MessageDialog {
-
-	/**
-	 * to determine if we should delete the working set as well 
-	 */
-	private boolean fDeleteWorkingsets = false;
-	
-	/**
-	 * to determine if we should delete all the breakpoints in the set.
-	 * to maintain backward compatibility this is by default true 
-	 */
-	private boolean fDeleteBreakpoints = true;
-	
-	//widgets
-	private Button fDeleteWS;
-	private Button fDeleteBPS;
-	
-	// dialog settings
-	private final static String DIALOG_SETTINGS = "DeleteBreakpointsDialogSettings"; //$NON-NLS-1$
-	private static final String DELETE_BREAKPOINTS = "DeleteBreakpoints";	 //$NON-NLS-1$
-	private static final String DELETE_WORKINGSETS = "DeleteWorkingSets";	 //$NON-NLS-1$
-	
-	public DeleteWorkingsetsMessageDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
-		IDialogSettings section = getDialogSettings();
-		fDeleteBreakpoints = section.getBoolean(DELETE_BREAKPOINTS);
-		fDeleteWorkingsets = section.getBoolean(DELETE_WORKINGSETS);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createCustomArea(Composite parent) {
-		Composite comp = new Composite(parent, SWT.NONE);
-		comp.setLayout(new GridLayout());
-		Font font = parent.getFont();
-		fDeleteWS = new Button(comp, SWT.CHECK);
-		fDeleteWS.setText(ActionMessages.DeleteWorkingsetsMessageDialog_0);
-		fDeleteWS.setFont(font);
-		fDeleteWS.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				getButton(0).setEnabled(fDeleteWS.getSelection() || fDeleteBPS.getSelection());
-			}
-		});
-		
-		fDeleteBPS = new Button(comp, SWT.CHECK);
-		fDeleteBPS.setText(ActionMessages.DeleteWorkingsetsMessageDialog_1);
-		fDeleteBPS.setFont(font);
-		fDeleteBPS.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				getButton(0).setEnabled(fDeleteWS.getSelection() || fDeleteBPS.getSelection());
-			}
-		});
-		
-		fDeleteWS.setSelection(fDeleteWorkingsets);
-		fDeleteBPS.setSelection(fDeleteBreakpoints);
-		return comp;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.MessageDialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if(buttonId == OK) {
-			fDeleteBreakpoints = fDeleteBPS.getSelection();
-			fDeleteWorkingsets = fDeleteWS.getSelection();
-			IDialogSettings dialogSettings = getDialogSettings();
-			dialogSettings.put(DELETE_BREAKPOINTS, fDeleteBreakpoints);
-			dialogSettings.put(DELETE_WORKINGSETS, fDeleteWorkingsets);
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * return the checked value of the delete working set check box
-	 * @return the checked state of the delete working set check box
-	 */
-	public boolean deleteWorkingset() {
-		return fDeleteWorkingsets;
-	}
-	
-	/**
-	 * returns the checked state of the delete all breakpoints in working set check box 
-	 * @return the checked state of the delete all breakpoints... check box
-	 */
-	public boolean deleteAllBreakpoints() {
-		return fDeleteBreakpoints;
-	}
-
-	/**
-	 * Returns the dialog settings for this dialog.
-	 * 
-	 * @return dialog settings
-	 */
-	protected IDialogSettings getDialogSettings() {
-		DebugUIPlugin plugin = DebugUIPlugin.getDefault();
-		IDialogSettings workbenchSettings = plugin.getDialogSettings();
-		IDialogSettings section = workbenchSettings.getSection(DIALOG_SETTINGS);
-		if (section == null) {
-			section = workbenchSettings.addNewSection(DIALOG_SETTINGS);
-			section.put(DELETE_BREAKPOINTS, true);
-			section.put(DELETE_WORKINGSETS, false);
-		}
-		return section;
-	}
-	
-	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/DisableBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/DisableBreakpointsAction.java
deleted file mode 100644
index 0af9112..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/DisableBreakpointsAction.java
+++ /dev/null
@@ -1,22 +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.debug.internal.ui.actions.breakpoints;
-
-
-public class DisableBreakpointsAction extends EnableBreakpointsAction {
-	
-	/**
-	 * This action disables breakpoints.
-	 */
-	protected boolean isEnableAction() {
-		return false;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/EnableBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/EnableBreakpointsAction.java
deleted file mode 100644
index 35cd2a1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/EnableBreakpointsAction.java
+++ /dev/null
@@ -1,294 +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.debug.internal.ui.actions.breakpoints;
-
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarkerDelta;
-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.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-
-public class EnableBreakpointsAction implements IViewActionDelegate, IPartListener, IBreakpointsListener {
-	
-	private IViewPart fView;
-	private IAction fAction;
-	
-	public EnableBreakpointsAction() {
-	}
-		
-	protected IViewPart getView() {
-		return fView;
-	}
-
-	protected void setView(IViewPart view) {
-		fView = view;
-	}
-
-	/**
-	 * @see IViewActionDelegate#init(IViewPart)
-	 */
-	public void init(IViewPart view) {
-		setView(view);
-		DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
-		view.getViewSite().getPage().addPartListener(this);
-	}
-
-	protected void update() {
-		selectionChanged(getAction(), getView().getViewSite().getSelectionProvider().getSelection());
-	}
-	
-	/**
-	 * This action enables breakpoints.
-	 */
-	protected boolean isEnableAction() {
-		return true;
-	}
-	
-	/**
-	 * @see IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-		IStructuredSelection selection= getSelection();
-		final int size= selection.size();
-		if (size == 0) {
-			return;
-		}
-		
-		final Iterator itr= selection.iterator();
-		final MultiStatus ms= new MultiStatus(DebugUIPlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, ActionMessages.EnableBreakpointAction_Enable_breakpoint_s__failed_2, null); 
-		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) {
-				while (itr.hasNext()) {
-					Object element= itr.next();
-					try {
-						IBreakpoint[] breakpoints= null;
-						if (element instanceof IBreakpoint) {
-							breakpoints= new IBreakpoint[] { (IBreakpoint) element };
-						} else if (element instanceof BreakpointContainer) {
-							breakpoints= ((BreakpointContainer) element).getBreakpoints();
-						}
-						if (breakpoints != null) {
-							setEnabled(breakpoints);
-						}
-					} catch (CoreException e) {
-						ms.merge(e.getStatus());
-					}
-				}
-			}
-			public void setEnabled(IBreakpoint[] breakpoints) throws CoreException {
-				boolean enable= isEnableAction();
-				for (int i = 0; i < breakpoints.length; i++) {
-					breakpoints[i].setEnabled(enable);
-				}
-			}
-		};
-		
-		try {
-			ResourcesPlugin.getWorkspace().run(runnable, null, 0, new NullProgressMonitor());
-		} catch (CoreException e) {
-			// Exceptions are handled by runnable
-		}
-		
-		if (!ms.isOK()) {
-			IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-			if (window != null) {
-				DebugUIPlugin.errorDialog(window.getShell(), ActionMessages.EnableBreakpointAction_Enabling_breakpoints_3, ActionMessages.EnableBreakpointAction_Exceptions_occurred_enabling_the_breakpoint_s___4, ms); // 
-			} else {
-				DebugUIPlugin.log(ms);
-			}
-		}
-	}
-
-	private IStructuredSelection getSelection() {
-		return (IStructuredSelection)getView().getViewSite().getSelectionProvider().getSelection();
-	}
-
-	/* (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) {
-		setAction(action);
-		if (!(selection instanceof IStructuredSelection)) {
-			return;
-		}
-		IStructuredSelection sel= (IStructuredSelection)selection;
-		
-		Iterator itr= sel.iterator();
-		boolean allEnabled= true;
-		boolean allDisabled= true;
-		while (itr.hasNext()) {
-			Object selected= itr.next();
-			if (selected instanceof BreakpointContainer) {
-				IBreakpoint[] breakpoints = ((BreakpointContainer) selected).getBreakpoints();
-				for (int i = 0; i < breakpoints.length; i++) {
-					try {
-						if (breakpoints[i].isEnabled()) {
-							allDisabled= false;
-						} else {
-							allEnabled= false;
-						}
-					} catch (CoreException ce) {
-						handleException(ce);
-					}
-				}
-			} else if (selected instanceof IBreakpoint) {
-				IBreakpoint bp= (IBreakpoint)selected;
-				try {
-					if (bp.isEnabled()) {
-						allDisabled= false;
-					} else {
-						allEnabled= false;
-					}
-				} catch (CoreException ce) {
-					handleException(ce);
-				}
-			} else {
-				return;
-			}
-			
-		}
-			
-		if (isEnableAction()) {
-			action.setEnabled(!allEnabled);
-		} else {
-			action.setEnabled(!allDisabled);
-		}
-	}
-	
-	private void handleException(CoreException ce) {
-		IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window != null) {
-			DebugUIPlugin.errorDialog(window.getShell(), ActionMessages.EnableBreakpointAction_Enabling_breakpoints_3, ActionMessages.EnableBreakpointAction_Exceptions_occurred_enabling_the_breakpoint_s___4, ce); // 
-		} else {
-			DebugUIPlugin.log(ce);
-		}
-	}
-	
-
-	/**
-	 * Removes this action as a breakpoint and part listener.
-	 */
-	public void dispose() {
-		DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
-		getView().getViewSite().getPage().removePartListener(this);
-	}
-	
-	/**
-	 * @see IBreakpointsListener#breakpointsAdded(IBreakpoint[])
-	 */
-	public void breakpointsAdded(IBreakpoint[] breakpoints) {
-	}
-	
-	/**
-	 * @see IBreakpointsListener#breakpointsRemoved(IBreakpoint[], IMarkerDelta[])
-	 */
-	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {	
-		asynchUpdate();
-	}
-	
-	/**
-	 * @see IBreakpointsListener#breakpointsChanged(IBreakpoint[], IMarkerDelta[])
-	 */
-	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-		asynchUpdate();
-	}
-	
-	protected void asynchUpdate() {
-		if (getAction() == null) {
-			return;
-		}
-		IWorkbenchWindow window= getView().getViewSite().getPage().getWorkbenchWindow();
-		if (window == null) {
-			return;
-		}
-		Shell shell= window.getShell();
-		if (shell == null || shell.isDisposed()) {
-			return;
-		}
-		Runnable r= new Runnable() {
-			public void run() {
-				IWorkbenchWindow ww= getView().getViewSite().getPage().getWorkbenchWindow();
-				if (ww == null) {
-					return;
-				}
-				Shell s= ww.getShell();
-				if (s == null || s.isDisposed()) {
-					return;
-				}
-				update();
-			}
-		};
-		
-		shell.getDisplay().asyncExec(r);
-	}
-	
-	protected IAction getAction() {
-		return fAction;
-	}
-
-	protected void setAction(IAction action) {
-		fAction = action;
-	}
-	/**
-	 * @see IPartListener#partActivated(IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-	}
-
-	/**
-	 * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-	 */
-	public void partBroughtToTop(IWorkbenchPart part) {
-	}
-
-	/**
-	 * @see IPartListener#partClosed(IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-		if (part.equals(getView())) {
-			dispose();
-		}
-	}
-
-	/**
-	 * @see IPartListener#partDeactivated(IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-	}
-
-	/**
-	 * @see IPartListener#partOpened(IWorkbenchPart)
-	 */
-	public void partOpened(IWorkbenchPart part) {
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/LinkBreakpointsWithDebugViewAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/LinkBreakpointsWithDebugViewAction.java
deleted file mode 100644
index e7b5454..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/LinkBreakpointsWithDebugViewAction.java
+++ /dev/null
@@ -1,55 +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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * An action which toggles the "Link with Debug View" preference on a
- * breakpoints view.
- */
-public class LinkBreakpointsWithDebugViewAction implements IViewActionDelegate {
-	
-	private BreakpointsView fView;
-	private IAction fAction= null;
-	
-	public LinkBreakpointsWithDebugViewAction() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView= (BreakpointsView) view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		fView.setTrackSelection(action.isChecked());
-	}
-
-	/* (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) {
-		if (fAction == null) {
-			action.setChecked(fView.isTrackingSelection());
-			fAction= action;
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/Messages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/Messages.java
deleted file mode 100644
index ca68458..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/Messages.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.actions.breakpoints.Messages"; //$NON-NLS-1$
-	public static String RetargetMethodBreakpointAction_0;
-	public static String RetargetToggleBreakpointAction_0;
-	public static String RetargetToggleLineBreakpointAction_0;
-	public static String RetargetWatchpointAction_0;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/Messages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/Messages.properties
deleted file mode 100644
index 4d58ef1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/Messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-RetargetMethodBreakpointAction_0=The operation is unavailable on the current selection. Please place the cursor inside a method.
-RetargetToggleBreakpointAction_0=The operation is unavailable on the current selection. Please place the cursor in a valid location for a breakpoint.
-RetargetWatchpointAction_0=The operation is unavailable on the current selection. Please select or place the cursor on a field.
-RetargetToggleLineBreakpointAction_0=The operation is unavailable on the current selection. Please place the cursor on a valid line.
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ModificationWatchpointToggleAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ModificationWatchpointToggleAction.java
deleted file mode 100644
index 632590e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ModificationWatchpointToggleAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IWatchpoint;
-
-/**
- * Toggles access attribute of a watchpoint.
- */
-public class ModificationWatchpointToggleAction extends ModifyWatchpointAction {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.ModifyWatchpointAction#isEnabled(org.eclipse.debug.core.model.IWatchpoint)
-     */
-    protected boolean isEnabled(IWatchpoint watchpoint) {
-        return watchpoint.supportsModification();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.ModifyWatchpointAction#toggleWatchpoint(org.eclipse.debug.core.model.IWatchpoint, boolean)
-     */
-    protected void toggleWatchpoint(IWatchpoint watchpoint, boolean b) throws CoreException {
-        watchpoint.setModification(b);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.ModifyWatchpointAction#isChecked(org.eclipse.debug.core.model.IWatchpoint)
-     */
-    protected boolean isChecked(IWatchpoint watchpoint) {
-        try {
-            return watchpoint.isModification();
-        } catch (CoreException e) {
-        }
-        return false;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ModifyWatchpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ModifyWatchpointAction.java
deleted file mode 100644
index c7ea345..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ModifyWatchpointAction.java
+++ /dev/null
@@ -1,127 +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.debug.internal.ui.actions.breakpoints;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IWatchpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Action that modifies a watchpoint's access/modification attributes
- */
-public abstract class ModifyWatchpointAction implements IObjectActionDelegate, IActionDelegate2 {
-    
-    private IStructuredSelection fWatchpoints = null;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-        try {
-	        if (fWatchpoints != null) {
-	            Iterator iterator = fWatchpoints.iterator();
-	            while (iterator.hasNext()) {
-	                IWatchpoint watchpoint = (IWatchpoint)iterator.next();
-	                toggleWatchpoint(watchpoint, action.isChecked());
-	            }
-	        }
-        } catch (CoreException e) {
-            DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.ModifyWatchpointAction_0, ActionMessages.ModifyWatchpointAction_1, e.getStatus()); // 
-        }
-
-    }
-    
-    /**
-     * Toggles the watch point attribute to the given value.
-     * 
-     * @param watchpoint
-     * @param b on or off
-     */
-    protected abstract void toggleWatchpoint(IWatchpoint watchpoint, boolean b) throws CoreException;
-    
-    /* (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#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        if (selection instanceof IStructuredSelection) {
-            fWatchpoints = (IStructuredSelection) selection;
-            if (!selection.isEmpty()) {
-	            Iterator iterator = fWatchpoints.iterator();
-	            while (iterator.hasNext()) {
-	                Object next = iterator.next();
-	                if (next instanceof IWatchpoint) {
-	                    IWatchpoint watchpoint = (IWatchpoint) next;
-	                    action.setChecked(isChecked(watchpoint));
-	                    if (!isEnabled(watchpoint)) {
-	                        action.setEnabled(false);
-	                        return;
-	                    }
-	                }
-	            }
-	            action.setEnabled(true);
-	            return;
-            }
-        }
-        action.setEnabled(false);
-    }
-
-    /**
-     * Returns whether the action should be checke for the current selection
-     * 
-     * @param watchpoint selected watchpoint
-     * @return whether the action should be checke for the current selection
-     */
-    protected abstract boolean isChecked(IWatchpoint watchpoint);
-
-    /**
-     * Returns whether this action is enabled for the given watchpoint.
-     * 
-     * @param watchpoint
-     * @return whether this action is enabled for the given watchpoint
-     */
-    protected abstract boolean isEnabled(IWatchpoint watchpoint);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-     */
-    public void init(IAction action) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#dispose()
-     */
-    public void dispose() {
-        fWatchpoints = null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-     */
-    public void runWithEvent(IAction action, Event event) {
-        run(action);
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/OpenBreakpointMarkerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/OpenBreakpointMarkerAction.java
deleted file mode 100644
index b292f4c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/OpenBreakpointMarkerAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-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.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionProviderAction;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-public class OpenBreakpointMarkerAction extends SelectionProviderAction {
-
-	protected static DelegatingModelPresentation fgPresentation = new DelegatingModelPresentation();
-	private IBreakpoint breakpoint;
-	private IEditorInput input;
-	
-	public OpenBreakpointMarkerAction(ISelectionProvider selectionProvider) {
-		super(selectionProvider, ActionMessages.OpenBreakpointMarkerAction__Go_to_File_1); 
-		setToolTipText(ActionMessages.OpenBreakpointMarkerAction_Go_to_File_for_Breakpoint_2); 
-		setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.ide", "icons/full/elcl16/gotoobj_tsk.gif")); //$NON-NLS-1$ //$NON-NLS-2$
-		setDisabledImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.ide", "icons/full/dlcl16/gotoobj_tsk.gif")); //$NON-NLS-1$ //$NON-NLS-2$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-			this,
-			IDebugHelpContextIds.OPEN_BREAKPOINT_ACTION);
-		setEnabled(false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		IWorkbenchWindow dwindow= DebugUIPlugin.getActiveWorkbenchWindow();
-		if (dwindow == null) {
-			return;
-		}
-		IWorkbenchPage page= dwindow.getActivePage();
-		if (page == null) {
-			return;
-		}
-		
-		IStructuredSelection selection= getStructuredSelection();
-		if (selection.isEmpty()) {
-			setEnabled(false);
-			return;
-		}
-		
-		IEditorPart part= null;
-		if (input != null) {
-			String editorId = fgPresentation.getEditorId(input, breakpoint);
-            if (editorId != null) {
-    			try {
-    				part= page.openEditor(input, editorId);
-    			} catch (PartInitException e) {
-    				DebugUIPlugin.errorDialog(dwindow.getShell(), ActionMessages.OpenBreakpointMarkerAction_Go_to_Breakpoint_1, ActionMessages.OpenBreakpointMarkerAction_Exceptions_occurred_attempting_to_open_the_editor_for_the_breakpoint_resource_2, e); // 
-    			}
-            }
-		}
-		if (part != null) {
-			part.setFocus();
-			IDE.gotoMarker(part, breakpoint.getMarker());
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection sel) {
-		if (sel.size() == 1) {
-			Object element = sel.getFirstElement();
-			if (element instanceof IBreakpoint) {
-				breakpoint= (IBreakpoint) element;
-				input= fgPresentation.getEditorInput(breakpoint);
-				if (input != null) {
-					setEnabled(true);
-					return;
-				}
-			}
-		} else {
-			breakpoint = null;
-			input = null;
-		}
-		setEnabled(false);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveAllBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveAllBreakpointsAction.java
deleted file mode 100644
index dec17fb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveAllBreakpointsAction.java
+++ /dev/null
@@ -1,125 +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.debug.internal.ui.actions.breakpoints;
-
- 
-import org.eclipse.core.resources.IMarkerDelta;
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.AbstractRemoveAllActionDelegate;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Removes all breakpoints from the source (markers) and remove all
- * breakpoints from processes
- */
-public class RemoveAllBreakpointsAction extends AbstractRemoveAllActionDelegate implements IBreakpointsListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#isEnabled()
-	 */
-	protected boolean isEnabled() {
-		return DebugPlugin.getDefault().getBreakpointManager().hasBreakpoints();
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
-	 */
-	public void breakpointsAdded(IBreakpoint[] breakpoints) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-		if (getAction() != null) {
-			update();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#initialize()
-	 */
-	protected void initialize() {
-		DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		final IBreakpointManager breakpointManager= DebugPlugin.getDefault().getBreakpointManager();
-		final IBreakpoint[] breakpoints = breakpointManager.getBreakpoints();
-		if (breakpoints.length < 1) {
-			return;
-		}
-		IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window == null) {
-			return;
-		}
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-		boolean prompt = store.getBoolean(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_ALL_BREAKPOINTS);
-		boolean proceed = true;
-		if(prompt) {
-			MessageDialogWithToggle mdwt = MessageDialogWithToggle.openYesNoQuestion(window.getShell(), ActionMessages.RemoveAllBreakpointsAction_0, 
-					ActionMessages.RemoveAllBreakpointsAction_1, ActionMessages.RemoveAllBreakpointsAction_3, !prompt, null, null);
-			if(mdwt.getReturnCode() !=  IDialogConstants.YES_ID){
-				proceed = false;
-			}
-			else {
-				store.setValue(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_ALL_BREAKPOINTS, !mdwt.getToggleState());
-			}
-		}  
-		if (proceed) {
-            new Job(ActionMessages.RemoveAllBreakpointsAction_2) { 
-                protected IStatus run(IProgressMonitor monitor) {
-                    try {
-                        breakpointManager.removeBreakpoints(breakpoints, true);
-                    } catch (CoreException e) {
-                        DebugUIPlugin.log(e);
-                        return Status.CANCEL_STATUS;
-                    }
-                    return Status.OK_STATUS;
-                }
-            }.schedule();
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java
deleted file mode 100644
index b8ece86..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.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.debug.internal.ui.actions.breakpoints;
-
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.AbstractRemoveActionDelegate;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.internal.ui.views.breakpoints.WorkingSetCategory;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-
-public class RemoveBreakpointAction extends AbstractRemoveActionDelegate {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IStructuredSelection selection = getSelection();
-		if (selection.isEmpty()) {
-			return;
-		}
-		final Iterator itr= selection.iterator();
-		final CoreException[] exception= new CoreException[1];
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) {
-				ArrayList breakpointsToDelete = new ArrayList();
-				ArrayList groupsToDelete = new ArrayList();
-				boolean deleteAll = false;
-				boolean deleteContainer = false;
-				boolean prompted = false;
-				while (itr.hasNext()) {		
-					Object next= itr.next();
-					if (next instanceof IBreakpoint) {
-						breakpointsToDelete.add(next);
-					} else if (next instanceof BreakpointContainer) {
-						//the the container is a workingset, ask if they want to delete it as well
-						BreakpointContainer bpc = (BreakpointContainer) next;
-						if(bpc.getCategory() instanceof WorkingSetCategory) {
-							IWorkingSet set = ((WorkingSetCategory)bpc.getCategory()).getWorkingSet();
-							if(!prompted) {
-								prompted = true;
-								DeleteWorkingsetsMessageDialog dialog = new DeleteWorkingsetsMessageDialog(getView().getSite().getShell(),
-										ActionMessages.RemoveBreakpointAction_3,
-										null,
-										ActionMessages.RemoveBreakpointAction_4,
-										MessageDialog.QUESTION,
-										new String[] {ActionMessages.RemoveBreakpointAction_5, ActionMessages.RemoveBreakpointAction_6},
-										0);
-								if(dialog.open() == 0) {
-									deleteAll = dialog.deleteAllBreakpoints();
-									deleteContainer = dialog.deleteWorkingset();
-								}
-							}
-							if(deleteContainer) {
-								groupsToDelete.add(set);
-							}
-						}
-						else {
-							if(!prompted) {
-								IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-								prompted = store.getBoolean(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER);
-								if(prompted) {
-									MessageDialogWithToggle mdwt = MessageDialogWithToggle.openYesNoQuestion(getView().getSite().getShell(), ActionMessages.RemoveBreakpointAction_0, 
-											ActionMessages.RemoveBreakpointAction_1, ActionMessages.RemoveAllBreakpointsAction_3, !prompted, null, null);
-									if(mdwt.getReturnCode() == IDialogConstants.NO_ID) {
-										deleteAll = false;
-									}
-									else {
-										store.setValue(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, !mdwt.getToggleState());
-										deleteAll = true;
-									}
-								}
-								else {
-									deleteAll = !prompted;
-								}
-							}
-						}
-						if(deleteAll) {
-						    IBreakpoint[] breakpoints = bpc.getBreakpoints();
-						    for (int i = 0; i < breakpoints.length; i++) {
-                                breakpointsToDelete.add(breakpoints[i]);
-                            }
-						}
-					}
-				}
-				final IBreakpoint[] breakpoints = (IBreakpoint[]) breakpointsToDelete.toArray(new IBreakpoint[0]);
-				final IWorkingSet[] sets = (IWorkingSet[])groupsToDelete.toArray(new IWorkingSet[groupsToDelete.size()]);
-				if(breakpoints.length > 0) {
-					((BreakpointsView)getView()).preserveSelection(getSelection());
-				}
-				new Job(ActionMessages.RemoveBreakpointAction_2) { 
-                    protected IStatus run(IProgressMonitor pmonitor) {
-                        try {
-                            DebugPlugin.getDefault().getBreakpointManager().removeBreakpoints(breakpoints, true);
-                            for (int i = 0; i < sets.length; i++) {
-                            	PlatformUI.getWorkbench().getWorkingSetManager().removeWorkingSet(sets[i]);
-							}
-                            return Status.OK_STATUS;
-                        } catch (CoreException e) {
-                            DebugUIPlugin.log(e);
-                        }
-                        return Status.CANCEL_STATUS;
-                    }   
-                }.schedule();
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(runnable, null, 0, null);
-		} catch (CoreException ce) {
-			exception[0]= ce;
-		}
-		if (exception[0] != null) {
-			IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-			if (window != null) {
-				DebugUIPlugin.errorDialog(window.getShell(), ActionMessages.RemoveBreakpointAction_Removing_a_breakpoint_4,ActionMessages.RemoveBreakpointAction_Exceptions_occurred_attempting_to_remove_a_breakpoint__5 , exception[0]);  
-			} else {
-				DebugUIPlugin.log(exception[0]);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.AbstractSelectionActionDelegate#isEnabledFor(java.lang.Object)
-	 */
-	protected boolean isEnabledFor(Object element) {
-		if (element instanceof BreakpointContainer) {
-			if(((BreakpointContainer)element).getCategory() instanceof WorkingSetCategory) {
-				return true;
-			}
-			return ((BreakpointContainer)element).getChildren().length > 0;
-		}
-		return super.isEnabledFor(element);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetBreakpointAction.java
deleted file mode 100644
index ff7c2b5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetBreakpointAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.debug.internal.ui.actions.RetargetAction;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-
-
-/**
- * Retargettable breakpoint action.
- * 
- * @since 3.0
- */
-public abstract class RetargetBreakpointAction extends RetargetAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getAdapterClass()
-	 */
-	protected Class getAdapterClass() {
-		return IToggleBreakpointsTarget.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetMethodBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetMethodBreakpointAction.java
deleted file mode 100644
index 9c2e6ce..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetMethodBreakpointAction.java
+++ /dev/null
@@ -1,44 +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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Global retargettable toggle method breakpoint action.
- * 
- * @since 3.0
- */
-public class RetargetMethodBreakpointAction extends RetargetBreakpointAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException {
-		((IToggleBreakpointsTarget)target).toggleMethodBreakpoints(part, selection);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part) {
-		return ((IToggleBreakpointsTarget)target).canToggleMethodBreakpoints(part, selection);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getOperationUnavailableMessage()
-	 */
-	protected String getOperationUnavailableMessage() {
-		return Messages.RetargetMethodBreakpointAction_0;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetToggleBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetToggleBreakpointAction.java
deleted file mode 100644
index 201b1c8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetToggleBreakpointAction.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Global retargettable toggle breakpoint action.
- * 
- * @since 3.3
- */
-public class RetargetToggleBreakpointAction extends RetargetBreakpointAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException {
-		if (target instanceof IToggleBreakpointsTargetExtension) {
-			IToggleBreakpointsTargetExtension ext = (IToggleBreakpointsTargetExtension) target;
-			ext.toggleBreakpoints(part, selection);
-		} else {
-			((IToggleBreakpointsTarget)target).toggleLineBreakpoints(part, selection);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part) {
-		if (target instanceof IToggleBreakpointsTargetExtension) {
-			IToggleBreakpointsTargetExtension ext = (IToggleBreakpointsTargetExtension) target;
-			return ext.canToggleBreakpoints(part, selection);
-		} else {
-			return ((IToggleBreakpointsTarget)target).canToggleLineBreakpoints(part, selection);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getOperationUnavailableMessage()
-	 */
-	protected String getOperationUnavailableMessage() {
-		return Messages.RetargetToggleBreakpointAction_0;
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetToggleLineBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetToggleLineBreakpointAction.java
deleted file mode 100644
index a117419..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetToggleLineBreakpointAction.java
+++ /dev/null
@@ -1,44 +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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Global retargettable toggle line breakpoint action.
- * 
- * @since 3.0
- */
-public class RetargetToggleLineBreakpointAction extends RetargetBreakpointAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException {
-		((IToggleBreakpointsTarget)target).toggleLineBreakpoints(part, selection);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part) {
-		return ((IToggleBreakpointsTarget)target).canToggleLineBreakpoints(part, selection);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getOperationUnavailableMessage()
-	 */
-	protected String getOperationUnavailableMessage() {
-		return Messages.RetargetToggleLineBreakpointAction_0;
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetWatchpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetWatchpointAction.java
deleted file mode 100644
index 38466f4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RetargetWatchpointAction.java
+++ /dev/null
@@ -1,44 +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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Global retargettable toggle watchpoint action.
- * 
- * @since 3.0
- */
-public class RetargetWatchpointAction extends RetargetBreakpointAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#performAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected void performAction(Object target, ISelection selection, IWorkbenchPart part) throws CoreException {
-		((IToggleBreakpointsTarget)target).toggleWatchpoints(part, selection);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetBreakpointAction#canPerformAction(java.lang.Object, org.eclipse.jface.viewers.ISelection, org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean canPerformAction(Object target, ISelection selection, IWorkbenchPart part) {
-		return ((IToggleBreakpointsTarget)target).canToggleWatchpoints(part, selection);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.RetargetAction#getOperationUnavailableMessage()
-	 */
-	protected String getOperationUnavailableMessage() {
-		return Messages.RetargetWatchpointAction_0;
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RulerEnableDisableBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RulerEnableDisableBreakpointAction.java
deleted file mode 100644
index ff37aa4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RulerEnableDisableBreakpointAction.java
+++ /dev/null
@@ -1,67 +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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.actions.RulerBreakpointAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @since 3.2
- *
- */
-public class RulerEnableDisableBreakpointAction extends RulerBreakpointAction implements IUpdate {
-	
-	private IBreakpoint fBreakpoint;
-	
-	public RulerEnableDisableBreakpointAction(ITextEditor editor, IVerticalRulerInfo info) {
-		super(editor, info);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (fBreakpoint != null) {
-			try {
-				fBreakpoint.setEnabled(!fBreakpoint.isEnabled());
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(getEditor().getSite().getShell(), ActionMessages.RulerEnableDisableBreakpointAction_0, ActionMessages.RulerEnableDisableBreakpointAction_1, e.getStatus());
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		fBreakpoint = getBreakpoint();
-		setEnabled(fBreakpoint != null);
-		if (fBreakpoint != null) {
-			try {
-				if (fBreakpoint.isEnabled()) {
-					setText(ActionMessages.RulerEnableDisableBreakpointAction_2);
-				} else {
-					setText(ActionMessages.RulerEnableDisableBreakpointAction_3);
-				}
-			} catch (CoreException e) {
-			}
-		} else {
-			setText(ActionMessages.RulerEnableDisableBreakpointAction_2);
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/SelectAllBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/SelectAllBreakpointsAction.java
deleted file mode 100644
index 5f1e29f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/SelectAllBreakpointsAction.java
+++ /dev/null
@@ -1,87 +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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.actions.SelectAllAction;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-
-public class SelectAllBreakpointsAction extends SelectAllAction implements IBreakpointsListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#isEnabled()
-	 */
-	protected boolean isEnabled() {
-		return DebugPlugin.getDefault().getBreakpointManager().hasBreakpoints();
-	}
-
-	public void run(IAction action) {
-		if (!(getView() instanceof BreakpointsView)) {
-			return;
-		}
-		CheckboxTreeViewer viewer = ((BreakpointsView) getView()).getCheckboxViewer();
-		viewer.getTree().selectAll();
-		// ensure that the selection change callback is fired
-		viewer.setSelection(viewer.getSelection());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
-	 */
-	public void breakpointsAdded(IBreakpoint[] breakpoints) {
-		if (getAction() != null && !getAction().isEnabled()) {
-			update();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-		if (getAction() != null) {
-			update();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#initialize()
-	 */
-	protected void initialize() {
-		DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#dispose()
-	 */
-	public void dispose() {
-		DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.SelectAllAction#getActionId()
-	 */
-	protected String getActionId() {
-		return IDebugView.SELECT_ALL_ACTION;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ShowSupportedBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ShowSupportedBreakpointsAction.java
deleted file mode 100644
index 280986f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ShowSupportedBreakpointsAction.java
+++ /dev/null
@@ -1,228 +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.debug.internal.ui.actions.breakpoints;
-
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.actions.ToggleFilterAction;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * An view filter action that filters showing breakpoints based on whether
- * the IDebugTarget of the selected debug element in the launch view supports
- * the breakpoints.
- * 
- * @see org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(IBreakpoint)
- * 
- */
-public class ShowSupportedBreakpointsAction extends ToggleFilterAction implements ISelectionListener {
-
-	/**
-	 * The view associated with this action
-	 */
-	private BreakpointsView fView;
-	
-	/**
-	 * The list of identifiers for the current state
-	 */
-	private List fDebugTargets= new ArrayList(2);
-	
-	/**
-	 * A viewer filter that selects breakpoints that have
-	 * the same model identifier as the selected debug element
-	 */
-	class BreakpointFilter extends ViewerFilter {
-		
-		/**
-		 * @see ViewerFilter#select(Viewer, Object, Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof BreakpointContainer) {
-				// Breakpoint containers are visible if any of their children are visible.
-				IBreakpoint[] breakpoints = ((BreakpointContainer) element).getBreakpoints();
-				for (int i = 0; i < breakpoints.length; i++) {
-					if (select(viewer, element, breakpoints[i])) {
-						return true;
-					}
-				}
-				return false;
-			}
-			IBreakpoint breakpoint= (IBreakpoint)element;
-			if (fDebugTargets.isEmpty()) {
-				return true;
-			}
-			Iterator iterator= fDebugTargets.iterator();
-			while (iterator.hasNext()) {
-				IDebugTarget target = (IDebugTarget) iterator.next();
-				if (target.supportsBreakpoint(breakpoint)) {
-					return true;
-				}
-				
-			}
-			return false;
-		}
-
-	}
-
-	public ShowSupportedBreakpointsAction(StructuredViewer viewer, IViewPart view) {
-		super();
-		setText(ActionMessages.ShowSupportedBreakpointsAction_Show_For_Selected); 
-		setToolTipText(ActionMessages.ShowSupportedBreakpointsAction_tooltip); 
-		setViewerFilter(new BreakpointFilter());
-		setViewer(viewer);
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET));
-		setChecked(false);
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ShowSupportedBreakpointsAction"); //$NON-NLS-1$
-		
-		setView(view);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-			this,
-			IDebugHelpContextIds.SHOW_BREAKPOINTS_FOR_MODEL_ACTION);
-		
-	}
-
-	
-		
-	public void dispose() {
-		if (isChecked()) {
-			getView().getSite().getPage().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-		}
-	}
-	
-	/**
-	 * @see ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss= (IStructuredSelection)selection;
-			List debugTargets= getDebugTargets(ss);
-			if (!isChecked()) {
-				fDebugTargets= debugTargets;
-				return;
-			}
-			if (debugTargets.isEmpty()) {
-				 if(fDebugTargets.isEmpty()) {
-					return;
-				 } 
-				 reapplyFilters(debugTargets);
-				 return;
-			}
-			if (fDebugTargets.isEmpty()) {
-				reapplyFilters(debugTargets);
-				return;
-			}
-			
-			if (debugTargets.size() == fDebugTargets.size()) {
-				List copy= new ArrayList(debugTargets.size());
-				Iterator iter= fDebugTargets.iterator();
-				while (iter.hasNext()) {
-					IDebugTarget target = (IDebugTarget) iter.next();
-					Iterator newDebugTargets= debugTargets.iterator();
-					while (newDebugTargets.hasNext()) {
-						IDebugTarget newTarget= (IDebugTarget)newDebugTargets.next();
-						copy.add(newTarget);
-						if (target.equals(newTarget)) {
-							newDebugTargets.remove();
-						}
-					}
-				}
-				//check for real change
-				if (debugTargets.isEmpty()) {
-					return;
-				}
-				reapplyFilters(copy);
-			} 
-		}
-	}
-
-	
-	/**
-	 * Selection has changed in the debug view
-	 * need to reapply the filters.
-	 */
-	protected void reapplyFilters(List debugTargets) {
-		fDebugTargets= debugTargets;		
-		getViewer().refresh();
-	}
-	
-	protected IViewPart getView() {
-		return fView;
-	}
-
-	protected void setView(IViewPart view) {
-		fView = (BreakpointsView) view;
-	}
-	
-	protected List getDebugTargets(IStructuredSelection ss) {
-		List debugTargets= new ArrayList(2);
-		Iterator i= ss.iterator();
-		while (i.hasNext()) {
-			Object next= i.next();
-			if (next instanceof IDebugElement) {
-				debugTargets.add(((IDebugElement)next).getDebugTarget());
-			} else if (next instanceof ILaunch) {
-				IDebugTarget[] targets= ((ILaunch)next).getDebugTargets();
-				for (int j = 0; j < targets.length; j++) {
-					debugTargets.add(targets[j]);
-				}
-			} else if (next instanceof IProcess) {
-				IDebugTarget target= (IDebugTarget)((IProcess)next).getAdapter(IDebugTarget.class);
-				if (target != null) {
-					debugTargets.add(target);
-				}
-			}	
-		}
-		return debugTargets;
-	}
-	
-	/**
-	 * Adds or removes the viewer filter depending
-	 * on the value of the parameter.
-	 */
-	protected void valueChanged(boolean on) {
-		if (getViewer().getControl().isDisposed()) {
-			return;
-		}
-		if (on) {
-			getView().getSite().getPage().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-			ISelection selection= getView().getSite().getPage().getSelection(IDebugUIConstants.ID_DEBUG_VIEW);
-			selectionChanged(null, selection);
-		} else {
-			getView().getSite().getPage().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-		}
-		super.valueChanged(on);
-		fView.getViewer().refresh();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/SkipAllBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/SkipAllBreakpointsAction.java
deleted file mode 100644
index 1dca688..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/SkipAllBreakpointsAction.java
+++ /dev/null
@@ -1,132 +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.debug.internal.ui.actions.breakpoints;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointManagerListener;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * An action which toggles the breakpoint manager's enablement.
- * This causes debug targets which honor the manager's enablement
- * to skip (not suspend for) all breakpoints. 
- * 
- * This class also implements the window action delegate for the action presented as
- * part of the "Breakpoints" group for the "Run" menu.
- */
-public class SkipAllBreakpointsAction extends Action implements IWorkbenchWindowActionDelegate, IBreakpointManagerListener {
-	
-	//The real action if this is an action delegate
-	private IAction fAction;
-	
-	public SkipAllBreakpointsAction() {
-		super(ActionMessages.SkipAllBreakpointsAction_0); 
-		setToolTipText(ActionMessages.SkipAllBreakpointsAction_0); 
-		setDescription(ActionMessages.SkipAllBreakpointsAction_2); 
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_SKIP_BREAKPOINTS));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.SKIP_ALL_BREAKPOINT_ACTION);
-		updateActionCheckedState();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run(){
-		final IBreakpointManager manager = getBreakpointManager();
-        IRunnableWithProgress runnable = new IRunnableWithProgress() {
-            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-                if(!monitor.isCanceled()) {
-                	manager.setEnabled(!manager.isEnabled());
-                } 
-            }
-        };
-        
-        try {
-            DebugUIPlugin.getDefault().getWorkbench().getProgressService().busyCursorWhile(runnable);
-        } 
-        catch (InvocationTargetException e) {}
-        catch (InterruptedException e) {}
-	}
-	
-	/**
-	 * Updates the action's checked state to be opposite the enabled
-	 * state of the breakpoint manager.
-	 */
-	public void updateActionCheckedState() {
-		if (fAction != null) {
-			fAction.setChecked(!getBreakpointManager().isEnabled());
-		} else {
-			setChecked(!getBreakpointManager().isEnabled());
-		}
-	}
-	
-	/**
-	 * Returns the global breakpoint manager.
-	 * 
-	 * @return the global breakpoint manager
-	 */
-	public static IBreakpointManager getBreakpointManager() {
-		return DebugPlugin.getDefault().getBreakpointManager();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		getBreakpointManager().removeBreakpointManagerListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		updateActionCheckedState();
-		getBreakpointManager().addBreakpointManagerListener(this);
-	}
-	
-	/* (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) {
-		fAction = action;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManagerListener#breakpointManagerEnablementChanged(boolean)
-	 */
-	public void breakpointManagerEnablementChanged(boolean enabled) {
-		if (fAction != null) {
-			fAction.setChecked(!enabled);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ToggleBreakpointObjectActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ToggleBreakpointObjectActionDelegate.java
deleted file mode 100644
index 2b37e86..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/ToggleBreakpointObjectActionDelegate.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.debug.internal.ui.actions.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * A toggle breakpoint action that can be contributed to an object. The action
- * will perform a toggle breakpoint operation for a selected object.
- * 
- * <p>Clients may subclass this class.</p>
- * 
- * @since 3.0
- */
-public abstract class ToggleBreakpointObjectActionDelegate implements IObjectActionDelegate, IActionDelegate2 {
-	
-	private IWorkbenchPart fPart;
-	private IStructuredSelection fSelection;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		fPart = targetPart;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IAdaptable adaptable = (IAdaptable) fSelection.getFirstElement();
-		IToggleBreakpointsTarget target = (IToggleBreakpointsTarget) adaptable.getAdapter(IToggleBreakpointsTarget.class);
-		if (target == null) {
-			IAdapterManager adapterManager = Platform.getAdapterManager();
-			target = (IToggleBreakpointsTarget) adapterManager.loadAdapter(adaptable, IToggleBreakpointsTarget.class.getName());
-		}
-		if (target != null) {
-			try {
-				performAction(target, fPart, fSelection);
-			} catch (CoreException e) {
-				DebugPlugin.log(e);
-			}
-		}
-	}
-	
-	/**
-	 * Performs the operation specific to this action.
-	 *  
-	 * @param target adapter to toggle breakpoints
-	 * @param part the active part
-	 * @param selection the seleciton in the active part
-	 * @exception CoreException if an exception occurrs
-	 */
-	protected abstract void performAction(IToggleBreakpointsTarget target, IWorkbenchPart part, ISelection selection) throws CoreException;
-	
-	/* (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) {
-		boolean enabled = false;
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			this.fSelection = ss;
-			if (!ss.isEmpty()) {
-				Object object = ss.getFirstElement();
-				if (object instanceof IAdaptable) {
-					IAdaptable adaptable = (IAdaptable) object;
-					IToggleBreakpointsTarget target = (IToggleBreakpointsTarget) adaptable.getAdapter(IToggleBreakpointsTarget.class);
-					if (target == null) {
-						IAdapterManager adapterManager = Platform.getAdapterManager();
-						enabled = adapterManager.hasAdapter(adaptable, IToggleBreakpointsTarget.class.getName());
-					} else {
-						enabled = true;
-					}
-				}
-			}
-		}
-		action.setEnabled(enabled);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		fSelection = null;
-		fPart = null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/AddWatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/AddWatchExpressionAction.java
deleted file mode 100644
index a2d8ba7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/AddWatchExpressionAction.java
+++ /dev/null
@@ -1,55 +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.debug.internal.ui.actions.expressions;
-
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Open a watch expression dialog and add the created watch expression to the
- * expression view.
- */
-public class AddWatchExpressionAction extends WatchExpressionAction implements IViewActionDelegate {
-
-	/**
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// create a watch expression
-		IWatchExpression watchExpression= DebugPlugin.getDefault().getExpressionManager().newWatchExpression(""); //$NON-NLS-1$
-		// open the watch expression dialog
-		if (new WatchExpressionDialog(DebugUIPlugin.getShell(), watchExpression, false).open() == Window.OK) {
-			// if OK is selected, add the expression to the expression view and try to evaluate the expression.
-			DebugPlugin.getDefault().getExpressionManager().addExpression(watchExpression);
-			watchExpression.setExpressionContext(getContext());
-		}
-	}
-
-	/**
-	 * @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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/ConvertToWatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/ConvertToWatchExpressionAction.java
deleted file mode 100644
index bfa6c94..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/ConvertToWatchExpressionAction.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.debug.internal.ui.actions.expressions;
-
-
-import java.util.Iterator;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Convert one or more expressions to the equivalent watch expressions.
- * Refresh and re-evaluate the expressions if possible.
- */
-public class ConvertToWatchExpressionAction extends WatchExpressionAction {
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IStructuredSelection selection= getCurrentSelection();
-		IExpressionManager expressionManager= DebugPlugin.getDefault().getExpressionManager();
-		for (Iterator iter= selection.iterator(); iter.hasNext();) {
-			IExpression expression= (IExpression) iter.next();
-			// create the new watch expression
-			IWatchExpression watchExpression= expressionManager.newWatchExpression(expression.getExpressionText());
-			expressionManager.removeExpression(expression);
-			expressionManager.addExpression(watchExpression);
-			// refresh and re-evaluate
-			watchExpression.setExpressionContext(getContext());
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/DisableWatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/DisableWatchExpressionAction.java
deleted file mode 100644
index 0f0a291..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/DisableWatchExpressionAction.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.debug.internal.ui.actions.expressions;
-
-
-/**
- * 
- */
-public class DisableWatchExpressionAction extends EnableWatchExpressionAction {
-	
-	public DisableWatchExpressionAction() {
-		fEnable= false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/EditWatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/EditWatchExpressionAction.java
deleted file mode 100644
index 715c6db..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/EditWatchExpressionAction.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.expressions;
-
-
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Open the watch expression dialog for the select watch expression.
- * Re-evaluate and refresh the watch expression is necessary.
- */
-public class EditWatchExpressionAction extends WatchExpressionAction {
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IWatchExpression watchExpression= (IWatchExpression)getCurrentSelection().getFirstElement();
-		// display the watch expression dialog for the currently selected watch expression
-		new WatchExpressionDialog(DebugUIPlugin.getShell(), watchExpression, true).open();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/EnableWatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/EnableWatchExpressionAction.java
deleted file mode 100644
index d71ea69..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/EnableWatchExpressionAction.java
+++ /dev/null
@@ -1,87 +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.debug.internal.ui.actions.expressions;
-
-import java.util.Iterator;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IWatchExpression;
-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;
-
-/**
- * 
- */
-public class EnableWatchExpressionAction implements IObjectActionDelegate {
-
-	private ISelection fSelection;
-	protected boolean fEnable= true;
-
-	/**
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (fSelection instanceof IStructuredSelection) {
-			Iterator iter= ((IStructuredSelection) fSelection).iterator();
-			IWatchExpression expression;
-			while (iter.hasNext()) {
-				expression= ((IWatchExpression) iter.next()); 
-				expression.setEnabled(fEnable);
-				fireWatchExpressionChanged(expression);
-			}
-		} else if (fSelection instanceof IWatchExpression) {
-			IWatchExpression expression= ((IWatchExpression) fSelection);
-			expression.setEnabled(fEnable);
-			fireWatchExpressionChanged(expression);
-		}
-	}
-
-	/**
-	 * @param expression
-	 */
-	private void fireWatchExpressionChanged(IWatchExpression expression) {
-		DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {new DebugEvent(expression, DebugEvent.CHANGE)});
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		fSelection= selection;
-		if (fSelection instanceof IStructuredSelection) {
-			boolean enabled= false;
-			Iterator iter= ((IStructuredSelection) selection).iterator();
-			while (iter.hasNext()) {
-				IWatchExpression expression = (IWatchExpression) iter.next();
-				if (expression.isEnabled() != fEnable) {
-					enabled= true;
-					break;
-				}
-			}
-			action.setEnabled(enabled);
-		} else if (fSelection instanceof IWatchExpression) {
-			action.setEnabled(((IWatchExpression) fSelection).isEnabled() != fEnable);
-		} else {
-			action.setEnabled(false);
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/ReevaluateWatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/ReevaluateWatchExpressionAction.java
deleted file mode 100644
index 3f2ac4a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/ReevaluateWatchExpressionAction.java
+++ /dev/null
@@ -1,54 +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.debug.internal.ui.actions.expressions;
-
-
-import java.util.Iterator;
-
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * Ask to re-evaluate one or more watch expressions in the context of the
- * currently selected thread.
- */
-public class ReevaluateWatchExpressionAction extends WatchExpressionAction {
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IDebugElement context = getContext();
-		for (Iterator iter= getCurrentSelection().iterator(); iter.hasNext();) {
-			IWatchExpression expression= (IWatchExpression) iter.next();
-			expression.setExpressionContext(context);
-			if (!expression.isEnabled()) {
-				// Force a reevaluation
-				expression.evaluate();
-			}
-		}
-	}
-	
-	/**
-	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		IDebugElement debugElement = getContext();
-		if (debugElement == null) {
-			action.setEnabled(false);
-		} else {
-			action.setEnabled(true);
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/RemoveAllExpressionsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/RemoveAllExpressionsAction.java
deleted file mode 100644
index 505a2ec..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/RemoveAllExpressionsAction.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.debug.internal.ui.actions.expressions;
-
- 
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.IExpressionsListener;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.AbstractRemoveAllActionDelegate;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Removes all expressions from the expressions view.
- */
-public class RemoveAllExpressionsAction extends AbstractRemoveAllActionDelegate implements IExpressionsListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window != null) {
-			boolean proceed = MessageDialog.openQuestion(window.getShell(), ActionMessages.RemoveAllExpressionsAction_0, ActionMessages.RemoveAllExpressionsAction_1);  
-			if (proceed) {
-				IExpressionManager manager = DebugPlugin.getDefault().getExpressionManager();
-				IExpression[] expressions= manager.getExpressions();
-				manager.removeExpressions(expressions);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#isEnabled()
-	 */
-	protected boolean isEnabled() {
-		return DebugPlugin.getDefault().getExpressionManager().hasExpressions();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#initialize()
-	 */
-	protected void initialize() {
-		DebugPlugin.getDefault().getExpressionManager().addExpressionListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#dispose()
-	 */
-	public void dispose() {
-		DebugPlugin.getDefault().getExpressionManager().removeExpressionListener(this);
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsAdded(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsAdded(IExpression[] expressions) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsRemoved(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsRemoved(IExpression[] expressions) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsChanged(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsChanged(IExpression[] expressions) {}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/RemoveExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/RemoveExpressionAction.java
deleted file mode 100644
index 4382ccb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/RemoveExpressionAction.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.debug.internal.ui.actions.expressions;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.internal.ui.actions.AbstractRemoveActionDelegate;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-public class RemoveExpressionAction extends AbstractRemoveActionDelegate {
-	
-	protected IExpression[] getExpressions() {
-		TreeSelection selection = (TreeSelection) getSelection();
-		TreePath[] paths = selection.getPaths();
-		List expressions = new ArrayList();
-		for (int i = paths.length-1; i >=0; i--) {
-			TreePath path = paths[i];
-			Object segment = path.getFirstSegment();
-			if (segment instanceof IExpression) {
-				expressions.add(segment);
-			}
-		}
-		return (IExpression[]) expressions.toArray(new IExpression[expressions.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		WorkbenchJob job = new WorkbenchJob("remove expression") { //$NON-NLS-1$
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				IExpressionManager expManager = DebugPlugin.getDefault().getExpressionManager();
-				IExpression[] exp = getExpressions();
-				if (exp != null) {
-					expManager.removeExpressions(exp);
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		schedule(job);
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/SelectAllExpressionsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/SelectAllExpressionsAction.java
deleted file mode 100644
index 2e9da1b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/SelectAllExpressionsAction.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.debug.internal.ui.actions.expressions;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionsListener;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.internal.ui.actions.SelectAllAction;
-import org.eclipse.debug.ui.IDebugView;
-
-public class SelectAllExpressionsAction extends SelectAllAction implements IExpressionsListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#isEnabled()
-	 */
-	protected boolean isEnabled() {
-		return DebugPlugin.getDefault().getExpressionManager().hasExpressions();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.SelectAllAction#getActionId()
-	 */
-	protected String getActionId() {
-		return IDebugView.SELECT_ALL_ACTION + ".Variables"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.AbstractRemoveAllActionDelegate#initialize()
-	 */
-	protected void initialize() {
-		DebugPlugin.getDefault().getExpressionManager().addExpressionListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsAdded(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsAdded(IExpression[] expressions) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsRemoved(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsRemoved(IExpression[] expressions) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsChanged(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsChanged(IExpression[] expressions) {		
-	}
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.actions.AbstractRemoveAllActionDelegate#dispose()
-     */
-    public void dispose() {
-        super.dispose();
-        DebugPlugin.getDefault().getExpressionManager().removeExpressionListener(this);
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchAction.java
deleted file mode 100644
index b04c830..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchAction.java
+++ /dev/null
@@ -1,155 +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.debug.internal.ui.actions.expressions;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.views.variables.IndexedVariablePartition;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapter;
-import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapterExtension;
-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.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * 
- */
-public class WatchAction implements IObjectActionDelegate {
-
-	private IStructuredSelection fSelection;
-
-	/**
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (fSelection == null) {
-			return;
-		}
-		Iterator iter = fSelection.iterator();
-		while (iter.hasNext()) {
-			IVariable variable = (IVariable) iter.next();
-			createExpression(variable);
-		}
-	}
-
-	private void showExpressionsView() {
-		IWorkbenchPage page = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IViewPart part = page.findView(IDebugUIConstants.ID_EXPRESSION_VIEW);
-		if (part == null) {
-			try {
-				page.showView(IDebugUIConstants.ID_EXPRESSION_VIEW);
-			} catch (PartInitException e) {
-			}
-		} else {
-			page.bringToTop(part);
-		}
-
-	}
-
-	private void createExpression(IVariable variable) {
-		IWatchExpression expression;
-		IWatchExpressionFactoryAdapter factory = getFactory(variable);
-		try {
-			String exp = variable.getName();
-			if (factory != null) {
-				exp = factory.createWatchExpression(variable);
-			}
-			expression = DebugPlugin.getDefault().getExpressionManager().newWatchExpression(exp);
-		} catch (CoreException e) {
-			DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.WatchAction_0, ActionMessages.WatchAction_1, e); // 
-			return;
-		}
-		DebugPlugin.getDefault().getExpressionManager().addExpression(expression);
-		IAdaptable object = DebugUITools.getDebugContext();
-		IDebugElement context = null;
-		if (object instanceof IDebugElement) {
-			context = (IDebugElement) object;
-		} else if (object instanceof ILaunch) {
-			context = ((ILaunch) object).getDebugTarget();
-		}
-		expression.setExpressionContext(context);
-		showExpressionsView();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-        fSelection = null;
-        int enabled = 0;
-        int size = -1;
-        if (selection instanceof IStructuredSelection) {
-            fSelection = (IStructuredSelection) selection;
-            size = fSelection.size();
-            IExpressionManager manager = DebugPlugin.getDefault().getExpressionManager();
-            Iterator iterator = fSelection.iterator();
-            while (iterator.hasNext()) {
-                IVariable variable = (IVariable) iterator.next();
-                if (variable instanceof IndexedVariablePartition) {
-                	break;
-                } else if (manager.hasWatchExpressionDelegate(variable.getModelIdentifier()) && isFactoryEnabled(variable)) {
-                    enabled++;
-                } else {
-                    break;
-                }
-            }
-        }
-        action.setEnabled(enabled == size);
-	}
-
-	/**
-	 * Returns whether the factory adapter for the given variable is currently enabled.
-	 * 
-	 * @param variable
-	 * @return whether the factory is enabled
-	 */
-	private boolean isFactoryEnabled(IVariable variable) {
-		IWatchExpressionFactoryAdapter factory = getFactory(variable);
-		if (factory instanceof IWatchExpressionFactoryAdapterExtension) {
-			IWatchExpressionFactoryAdapterExtension ext = (IWatchExpressionFactoryAdapterExtension) factory;
-			return ext.canCreateWatchExpression(variable);
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the factory adapter for the given variable or <code>null</code> if none.
-	 * 
-	 * @param variable
-	 * @return factory or <code>null</code>
-	 */
-	private IWatchExpressionFactoryAdapter getFactory(IVariable variable) {
-		return (IWatchExpressionFactoryAdapter) variable.getAdapter(IWatchExpressionFactoryAdapter.class);		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionAction.java
deleted file mode 100644
index 20bf6dc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionAction.java
+++ /dev/null
@@ -1,107 +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.debug.internal.ui.actions.expressions;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Generic abstract class for the actions associated to the java watch
- * expressions.
- */
-public abstract class WatchExpressionAction implements IObjectActionDelegate, IActionDelegate2 {
-	IWorkbenchPart fPart = null;
-	/**
-	 * Finds the currently selected context in the UI.
-	 */
-	protected IDebugElement getContext() {
-		IAdaptable object = DebugUITools.getDebugContext();
-		IDebugElement context = null;
-		if (object instanceof IDebugElement) {
-			context = (IDebugElement) object;
-		} else if (object instanceof ILaunch) {
-			context = ((ILaunch) object).getDebugTarget();
-		}
-		return context;
-	}
-	/**
-	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		fPart = targetPart;
-	}
-
-	/**
-		* @see IActionDelegate#selectionChanged(IAction, ISelection)
-		*/
-	public void selectionChanged(IAction action, ISelection sel) {
-	}
-
-	protected IStructuredSelection getCurrentSelection() {
-		IWorkbenchPage page = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage();
-		if (page != null) {
-			ISelection selection = page.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				return (IStructuredSelection) selection;
-			}
-		}
-		return null;
-	}
-
-	/**
-		* Displays the given error message in the status line.
-		* 
-		* @param message
-		*/
-	protected void showErrorMessage(String message) {
-		if (fPart instanceof IViewPart) {
-			IViewSite viewSite = ((IViewPart) fPart).getViewSite();
-			IStatusLineManager manager = viewSite.getActionBars().getStatusLineManager();
-			manager.setErrorMessage(message);
-			Display.getCurrent().beep();
-		}
-	}
-
-	/* (non-Javadoc)
-		* @see org.eclipse.ui.IActionDelegate2#dispose()
-		*/
-	public void dispose() {
-		fPart = null;
-	}
-
-	/* (non-Javadoc)
-		* @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-		*/
-	public void init(IAction action) {
-	}
-
-	/* (non-Javadoc)
-		* @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-		*/
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java
deleted file mode 100644
index 723c5a7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.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.debug.internal.ui.actions.expressions;
-
-
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.actions.StatusInfo;
-import org.eclipse.jface.dialogs.StatusDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-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.Shell;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Dialog for edit watch expression.
- */
-public class WatchExpressionDialog extends StatusDialog {
-
-	/**
-	 * The detail formatter to edit.
-	 */
-	private IWatchExpression fWatchExpression;
-	
-	// widgets
-	private SourceViewer fSnippetViewer;
-	private Button fCheckBox;
-
-	public WatchExpressionDialog(Shell parent, IWatchExpression watchExpression, boolean editDialog) {
-		super(parent);
-		fWatchExpression= watchExpression;
-		setShellStyle(getShellStyle() | SWT.MAX | SWT.RESIZE);
-		String helpContextId = null;
-		if (editDialog) {
-			setTitle(ActionMessages.WatchExpressionDialog_0); 
-			helpContextId = IDebugHelpContextIds.EDIT_WATCH_EXPRESSION_DIALOG;
-		} else {
-			setTitle(ActionMessages.WatchExpressionDialog_1); 
-			helpContextId = IDebugHelpContextIds.ADD_WATCH_EXPRESSION_DIALOG;
-		}
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, helpContextId);
-	}
-
-	/**
-	 * Create the dialog area.
-	 *
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Font font = parent.getFont();
-		
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		GridData gd= new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		// snippet label
-		Label label= new Label(container, SWT.NONE);
-		label.setText(ActionMessages.WatchExpressionDialog_2); 
-		gd= new GridData(GridData.BEGINNING);
-		label.setLayoutData(gd);
-		label.setFont(font);
-		
-		fSnippetViewer= new SourceViewer(container, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-		fSnippetViewer.setInput(this);
-		
-		IDocument document= new Document();
-		fSnippetViewer.configure(new SourceViewerConfiguration());
-		fSnippetViewer.setEditable(true);
-		fSnippetViewer.setDocument(document);
-		document.addDocumentListener(new IDocumentListener() {
-			public void documentAboutToBeChanged(DocumentEvent event) {
-			}
-			public void documentChanged(DocumentEvent event) {
-				checkValues();
-			}
-		});
-
-		fSnippetViewer.getTextWidget().setFont(JFaceResources.getTextFont());
-
-		Control control= fSnippetViewer.getControl();
-		gd= new GridData(GridData.FILL_BOTH);
-		gd.heightHint= convertHeightInCharsToPixels(10);
-		gd.widthHint= convertWidthInCharsToPixels(80);
-		control.setLayoutData(gd);
-		fSnippetViewer.getDocument().set(fWatchExpression.getExpressionText());
-
-		// enable checkbox
-		fCheckBox= new Button(container, SWT.CHECK | SWT.LEFT);
-		fCheckBox.setText(ActionMessages.WatchExpressionDialog_3); 
-		fCheckBox.setSelection(fWatchExpression.isEnabled());
-		fCheckBox.setFont(font);
-
-		applyDialogFont(container);
-		fSnippetViewer.getControl().setFocus();
-		return container;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		fWatchExpression.setEnabled(fCheckBox.getSelection());
-		fWatchExpression.setExpressionText(fSnippetViewer.getDocument().get());
-		super.okPressed();
-	}
-	
-	/**
-	 * Check the field values and display a message in the status if needed.
-	 */
-	private void checkValues() {
-		StatusInfo status= new StatusInfo();
-		if (fSnippetViewer.getDocument().get().trim().length() == 0) {
-			status.setError(ActionMessages.WatchExpressionDialog_4); 
-		}
-		updateStatus(status);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java
deleted file mode 100644
index 2b5adc3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.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.debug.internal.ui.actions.variables;
-
- 
-import com.ibm.icu.text.MessageFormat;
-import java.util.Iterator;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValueModification;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.VariableValueEditorManager;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.views.variables.VariablesView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.actions.IVariableValueEditor;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionProviderAction;
-
-/**
- * Action for changing the value of primitives and <code>String</code> variables.
- * This action will attempt to delegate the editing operation to a registered
- * variable value editor, if any is provided for the variable's debug model.
- * @see org.eclipse.debug.ui.actions.VariableValueEditorManager
- */
-public class ChangeVariableValueAction extends SelectionProviderAction {
-    
-	protected IVariable fVariable;
-    private VariablesView fView;
-    private boolean fEditing= false;
-	
-    /**
-     * Creates a new ChangeVariableValueAction for the given variables view
-     * @param view the variables view in which this action will appear
-     */
-	public ChangeVariableValueAction(VariablesView view) {
-		super(view.getViewer(), ActionMessages.ChangeVariableValue_title); 
-		setDescription(ActionMessages.ChangeVariableValue_toolTipText); 
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_CHANGE_VARIABLE_VALUE));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_CHANGE_VARIABLE_VALUE));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_CHANGE_VARIABLE_VALUE));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-			this,
-			IDebugHelpContextIds.CHANGE_VALUE_ACTION);
-		fView= view;
-	}
-	
-	/**
-	 * Edit the variable value with an in-line text editor.  
-	 */
-	protected void doActionPerformed(final IVariable variable) {
-	    Shell shell = fView.getViewSite().getShell();
-		// If a previous edit is still in progress, don't start another		
-	    if (fEditing) {
-	        return;
-	    }
-	    fEditing= true;
-		fVariable = variable;
-	    if (!delegateEdit(shell)) {
-	        doDefaultEdit(shell);
-	    }
-		fEditing= false;
-	}
-	
-	/**
-	 * Attempts to edit the variable by delegating to anyone who's
-	 * contributed a variable value editor via extension. Returns
-	 * <code>true</code> if a delegate handled the edit, <code>false</code>
-	 * if the variable still needs to be edited.
-	 * 
-     * @param shell a shell for prompting the user
-     * @return whether or not a delegate attempted to edit the variable
-     */
-    private boolean delegateEdit(Shell shell) {
-        String modelIdentifier = fVariable.getModelIdentifier();
-        IVariableValueEditor editor= VariableValueEditorManager.getDefault().getVariableValueEditor(modelIdentifier);
-        if (editor != null) {
-            return editor.editVariable(fVariable, shell);
-        }
-        return false;
-    }
-
-    /**
-     * Edits the variable using the default variable editor
-     * @param shell a shell for prompting the user
-     */
-    protected void doDefaultEdit(Shell shell) {
-	    String name= ""; //$NON-NLS-1$
-		String value= ""; //$NON-NLS-1$
-		try {
-			name= fVariable.getName();
-			value= fVariable.getValue().getValueString();
-		} catch (DebugException exception) {
-			DebugUIPlugin.errorDialog(shell, ActionMessages.ChangeVariableValue_errorDialogTitle,ActionMessages.ChangeVariableValue_errorDialogMessage, exception);	// 
-			return;
-		}
-		ChangeVariableValueInputDialog inputDialog= new ChangeVariableValueInputDialog(shell, ActionMessages.ChangeVariableValue_1, MessageFormat.format(ActionMessages.ChangeVariableValue_2, new String[] {name}), value, new IInputValidator() { // 
-			/**
-			 * Returns an error string if the input is invalid
-			 */
-			public String isValid(String input) {
-				try {
-					if (fVariable.verifyValue(input)) {
-						return null; // null means valid
-					}
-				} catch (DebugException exception) {
-					return ActionMessages.ChangeVariableValue_3; 
-				}
-				return ActionMessages.ChangeVariableValue_4; 
-			}
-		});
-		
-		inputDialog.open();
-		String newValue= inputDialog.getValue();
-		if (newValue != null) {
-			// null value means cancel was pressed
-			try {
-				fVariable.setValue(newValue);
-				getSelectionProvider().setSelection(new StructuredSelection(fVariable));
-			} catch (DebugException de) {
-				DebugUIPlugin.errorDialog(shell, ActionMessages.ChangeVariableValue_errorDialogTitle,ActionMessages.ChangeVariableValue_errorDialogMessage, de);	// 
-			}
-		}
-	}
-		
-	/**
-	 * Updates the enabled state of this action based
-	 * on the selection
-	 */
-	protected void update(IStructuredSelection sel) {
-		Iterator iter= sel.iterator();
-		if (iter.hasNext()) {
-			Object object= iter.next();
-			if (object instanceof IValueModification) {
-				IValueModification varMod= (IValueModification)object;
-				if (!varMod.supportsValueModification()) {
-					setEnabled(false);
-					return;
-				}
-				setEnabled(!iter.hasNext());
-				return;
-			}
-		}
-		setEnabled(false);
-	}
-
-	/**
-	 * @see IAction#run()
-	 */
-	public void run() {
-		Iterator iterator= getStructuredSelection().iterator();
-		doActionPerformed((IVariable)iterator.next());
-	}
-	
-	/**
-	 * @see SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection sel) {
-		update(sel);
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java
deleted file mode 100644
index e8bba87..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.variables;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A simple input dialog for soliciting an input string
- * from the user.
- * <p>
- * This concete dialog class can be instantiated as is, 
- * or further subclassed as required.
- * </p>
- */
-public class ChangeVariableValueInputDialog extends TrayDialog {
-	
-	
-	/**
-	 * The title of the dialog.
-	 */
-	private String title;
-	
-	/**
-	 * The message to display, or <code>null</code> if none.
-	 */
-	private String message;
-	
-	/**
-	 * The input value; the empty string by default.
-	 */
-	private String value= "";//$NON-NLS-1$
-	
-	/**
-	 * The input validator, or <code>null</code> if none.
-	 */
-	private IInputValidator validator;
-	
-	/**
-	 * Ok button widget.
-	 */
-	private Button okButton;
-	
-	/**
-	 * Input text widget.
-	 */
-	private Text text;
-	
-	/**
-	 * Error message label widget.
-	 */
-	private Label errorMessageLabel;
-	/**
-	 * Creates an input dialog with OK and Cancel buttons.
-	 * Note that the dialog will have no visual representation (no widgets)
-	 * until it is told to open.
-	 * <p>
-	 * Note that the <code>open</code> method blocks for input dialogs.
-	 * </p>
-	 *
-	 * @param parentShell the parent shell
-	 * @param dialogTitle the dialog title, or <code>null</code> if none
-	 * @param dialogMessage the dialog message, or <code>null</code> if none
-	 * @param initialValue the initial input value, or <code>null</code> if none
-	 *  (equivalent to the empty string)
-	 * @param validator an input validator, or <code>null</code> if none
-	 */
-	public ChangeVariableValueInputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue, IInputValidator validator) {
-		super(parentShell);
-		this.title = dialogTitle;
-		message = dialogMessage;
-		if (initialValue == null)
-			value = "";//$NON-NLS-1$
-		else
-			value = initialValue;
-		this.validator = validator;
-		
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.OK_ID) {
-			value= text.getText();
-		} else {
-			value= null;
-		}
-		super.buttonPressed(buttonId);
-	}
-	/* (non-Javadoc)
-	 * Method declared in Window.
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (title != null)
-			shell.setText(title);
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Cancel buttons by default
-		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-		
-		//do this here because setting the text will set enablement on the ok button
-		text.setFocus();
-		if (value != null) {
-			text.setText(value);
-			text.selectAll();
-		}
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Font font = parent.getFont();
-		// create composite
-		Composite composite = (Composite)super.createDialogArea(parent);
-		
-		// create message
-		if (message != null) {
-			Label label = new Label(composite, SWT.WRAP);
-			label.setText(message);
-			GridData data = new GridData(
-					GridData.GRAB_HORIZONTAL |
-					GridData.HORIZONTAL_ALIGN_FILL |
-					GridData.VERTICAL_ALIGN_CENTER);
-			data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-			label.setLayoutData(data);
-			label.setFont(font);
-		}
-		
-		text= new Text(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL| SWT.H_SCROLL);
-		
-		GridData gridData= new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL);
-		gridData.heightHint = 50;
-		gridData.widthHint = 100;
-		text.setLayoutData(gridData);
-		text.setFont(font);
-		text.addModifyListener(
-				new ModifyListener() {
-					public void modifyText(ModifyEvent e) {
-						if (okButton.isEnabled()) {
-							return;
-						}
-						errorMessageLabel.setText(""); //$NON-NLS-1$
-						errorMessageLabel.getParent().update();
-						okButton.setEnabled(true);
-					}
-				}
-		);
-		
-		errorMessageLabel = new Label(composite, SWT.NONE);
-		errorMessageLabel.setLayoutData(new GridData(
-				GridData.GRAB_HORIZONTAL |
-				GridData.HORIZONTAL_ALIGN_FILL));
-		errorMessageLabel.setFont(font);
-		return composite;
-	}
-	/**
-	 * Returns the error message label.
-	 *
-	 * @return the error message label
-	 */
-	protected Label getErrorMessageLabel() {
-		return errorMessageLabel;
-	}
-	/**
-	 * Returns the ok button.
-	 *
-	 * @return the ok button
-	 */
-	protected Button getOkButton() {
-		return okButton;
-	}
-	/**
-	 * Returns the text area.
-	 *
-	 * @return the text area
-	 */
-	protected Text getText() {
-		return text;
-	}
-	/**
-	 * Returns the validator.
-	 *
-	 * @return the validator
-	 */
-	protected IInputValidator getValidator() {
-		return validator;
-	}
-	/**
-	 * Returns the string typed into this input dialog.
-	 *
-	 * @return the input string
-	 */
-	public String getValue() {
-		return value;
-	}
-	/**
-	 * Validates the input.
-	 * <p>
-	 * The default implementation of this framework method
-	 * delegates the request to the supplied input validator object;
-	 * if it finds the input invalid, the error message is displayed
-	 * in the dialog's message line.
-	 * This hook method is called whenever the text changes in the
-	 * input field.
-	 * </p>
-	 */
-	protected void validateInput() {
-		
-		String errorMessage = null;
-		
-		if (validator != null) {
-			errorMessage = validator.isValid(text.getText());
-		}
-		
-		// Bug 16256: important not to treat "" (blank error) the same as null (no error)
-		errorMessageLabel.setText(errorMessage == null ? "" : errorMessage); //$NON-NLS-1$
-		okButton.setEnabled(errorMessage == null);
-		
-		errorMessageLabel.getParent().update();
-	}
-	protected void okPressed() {
-		validateInput();
-		if (okButton.isEnabled()) {
-			super.okPressed();
-		}
-	}
-	
-	/**
-	 * Returns the name of the section that this dialog stores its settings in
-	 * 
-	 * @return String
-	 */
-	protected String getDialogSettingsSectionName() {
-		return IDebugUIConstants.PLUGIN_ID + ".CHANGE_VARIABLE_VALUE_DIALOG_SECTION"; //$NON-NLS-1$
-	}
-	
-	 /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
-     */
-    protected IDialogSettings getDialogBoundsSettings() {
-    	 IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-         IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
-         if (section == null) {
-             section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
-         return section;
-    }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#handleShellCloseEvent()
-	 */
-	protected void handleShellCloseEvent() {
-		value= null;
-		super.handleShellCloseEvent();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/SelectAllVariablesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/SelectAllVariablesAction.java
deleted file mode 100644
index dc228a6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/SelectAllVariablesAction.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.debug.internal.ui.actions.variables;
-
-import org.eclipse.debug.internal.ui.actions.SelectAllAction;
-import org.eclipse.debug.ui.IDebugView;
-
-public class SelectAllVariablesAction extends SelectAllAction {
-
-	
-	protected String getActionId() {
-		return IDebugView.SELECT_ALL_ACTION + ".Variables"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#initialize()
-	 */
-	protected void initialize() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.selection.AbstractRemoveAllActionDelegate#isEnabled()
-	 */
-	protected boolean isEnabled() {
-		// TODO: only enable when stuff present
-		return true;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ShowTypesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ShowTypesAction.java
deleted file mode 100644
index a8cdbc1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ShowTypesAction.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.debug.internal.ui.actions.variables;
-
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * An action that toggles the state of a viewer to
- * show/hide type names of variables.
- * Only viewers that use a <code>VariableLabelProvider</code> to render its
- * elements are effected.
- */
-public class ShowTypesAction extends Action {
-
-	private IDebugView fView;
-
-	public ShowTypesAction(IDebugView view) {
-		super(ActionMessages.ShowTypesAction_Show__Type_Names_1, IAction.AS_CHECK_BOX); 
-		setView(view);
-		setToolTipText(ActionMessages.ShowTypesAction_Show_Type_Names); 
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_TYPE_NAMES));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TYPE_NAMES));
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TYPE_NAMES));
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ShowTypesAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.SHOW_TYPES_ACTION);
-	}
-
-	/**
-	 * @see Action#run()
-	 */
-	public void run() {
-		valueChanged(isChecked());
-	}
-
-	private void valueChanged(boolean on) {
-		if (getView().getViewer().getControl().isDisposed()) {
-			return;
-		}
-		
-		IDebugModelPresentation debugLabelProvider= (IDebugModelPresentation)getView().getAdapter(IDebugModelPresentation.class);
-		if (debugLabelProvider != null) {
-			debugLabelProvider.setAttribute(IDebugModelPresentation.DISPLAY_VARIABLE_TYPE_NAMES, (on ? Boolean.TRUE : Boolean.FALSE));			
-			BusyIndicator.showWhile(getView().getViewer().getControl().getDisplay(), new Runnable() {
-				public void run() {
-					getView().getViewer().refresh();					
-				}
-			});
-		}
-	}
-	
-	protected IDebugView getView() {
-		return fView;
-	}
-
-	protected void setView(IDebugView view) {
-		fView = view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		if (enabled) {
-			setToolTipText(ActionMessages.ShowTypesAction_Show_Type_Names);
-		} else {
-			setToolTipText(ActionMessages.ShowTypesAction_0);
-		}
-	}
-	
-	
-}
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ToggleDetailPaneAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ToggleDetailPaneAction.java
deleted file mode 100644
index c717cae..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ToggleDetailPaneAction.java
+++ /dev/null
@@ -1,92 +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.debug.internal.ui.actions.variables;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.variables.VariablesView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Action that controls the appearance of the details pane in debug views such
- * as the VariablesView and the ExpressionsView.  Instances of this class can be
- * created to show the detail pane underneath the main tree, to the right of the
- * main tree, or not shown at all.
- * 
- * @since 3.0
- */
-public class ToggleDetailPaneAction extends Action {
-
-	private VariablesView fVariablesView;
-	
-	private String fOrientation;
-
-	public ToggleDetailPaneAction(VariablesView view, String orientation, String hiddenLabel) {
-		super("", AS_RADIO_BUTTON); //$NON-NLS-1$
-		setVariablesView(view);
-		setOrientation(orientation);
-				
-		if (orientation == IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_UNDERNEATH) {
-			setText(ActionMessages.ToggleDetailPaneAction_1);  
-			setToolTipText(ActionMessages.ToggleDetailPaneAction_2);  
-			setDescription(ActionMessages.ToggleDetailPaneAction_3);  
-			setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_UNDER));
-			setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_UNDER));
-			setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DETAIL_PANE_UNDER));
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.VERTICAL_DETAIL_PANE_LAYOUT_ACTION);
-		} else if (orientation == IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_RIGHT) {
-			setText(ActionMessages.ToggleDetailPaneAction_4);  
-			setToolTipText(ActionMessages.ToggleDetailPaneAction_5);  
-			setDescription(ActionMessages.ToggleDetailPaneAction_6);  
-			setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_RIGHT));
-			setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_RIGHT));
-			setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DETAIL_PANE_RIGHT));
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.HORIZONTAL_DETAIL_PANE_LAYOUT_ACTION);
-		} else {
-			setText(hiddenLabel);
-			setToolTipText(ActionMessages.ToggleDetailPaneAction_8);  
-			setDescription(ActionMessages.ToggleDetailPaneAction_9);  
-			setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_HIDE));
-			setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_HIDE));
-			setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DETAIL_PANE_HIDE));
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.DETAIL_PANE_HIDDEN_LAYOUT_ACTION);
-		} 		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		getVariablesView().setDetailPaneOrientation(getOrientation()); 
-	}
-	
-	private VariablesView getVariablesView() {
-		return fVariablesView;
-	}
-
-	private void setVariablesView(VariablesView variablesView) {
-		fVariablesView = variablesView;
-	}
-
-	private void setOrientation(String orientation) {
-		fOrientation = orientation;
-	}
-
-	public String getOrientation() {
-		return fOrientation;
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneAssignValueAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneAssignValueAction.java
deleted file mode 100644
index db82aec..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneAssignValueAction.java
+++ /dev/null
@@ -1,151 +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.debug.internal.ui.actions.variables.details;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValueModification;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.VariableValueEditorManager;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.actions.StatusInfo;
-import org.eclipse.debug.ui.actions.IVariableValueEditor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Action which assigns a value to a variable from the detail pane
- * of the variables view.
- */
-public class DetailPaneAssignValueAction extends Action{
-
-    private IHandlerActivation fHandlerActivation;
-	private IViewSite fViewSite;
-	private ITextViewer fTextViewer;
-	private IStructuredSelection fCurrentSelection;
-	
-	/**
-	 * Attempts to evaluate the given string expression and assign the resulting value to the
-	 * specified variable.  Displays error dialogs to the user if a problem is encountered.
-	 * 
-	 * @see DetailPaneAssignValueAction
-	 * @see org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier
-	 * 
-	 * @param shell the shell to use to open dialogs
-	 * @param variable the variable that is getting a new value
-	 * @param newValueExpression the expression to evaluate and set as the new value
-	 * @since 3.3.0 
-	 */
-	public static void assignValue(Shell shell, IVariable variable, String newValueExpression){
-		String modelIdentifier = variable.getModelIdentifier();
-		IVariableValueEditor editor = VariableValueEditorManager.getDefault().getVariableValueEditor(modelIdentifier);
-		if (editor != null) {
-		    if (editor.saveVariable(variable, newValueExpression, shell)) {
-		        // If we successfully delegate to an editor which performs the save,
-		        // don't do any more work.
-		        return;
-		    }
-		}
-		
-		try {
-		    // If we failed to delegate to anyone, perform the default assignment.
-			if (variable.verifyValue(newValueExpression)) {
-				variable.setValue(newValueExpression);
-			} else {
-			    if (shell != null) {
-			        DebugUIPlugin.errorDialog(shell, ActionMessages.DetailPaneAssignValueAction_2, MessageFormat.format(ActionMessages.DetailPaneAssignValueAction_3, new String[] {newValueExpression, variable.getName()}), new StatusInfo(IStatus.ERROR, ActionMessages.DetailPaneAssignValueAction_4));  //  
-			    }
-			}
-		} catch (DebugException e) {
-            MessageDialog.openError(shell, ActionMessages.DetailPaneAssignValueAction_0, e.getStatus().getMessage());
-		}
-	}
-	
-	public DetailPaneAssignValueAction(ITextViewer textViewer, IViewSite viewSite) {
-		super(ActionMessages.DetailPaneAssignValueAction_1);
-		
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.DETAIL_PANE_ASSIGN_VALUE_ACTION);
-
-		fTextViewer = textViewer;
-		fViewSite = viewSite;
-		
-		setEnabled(false);
-        IHandlerService service = (IHandlerService) fViewSite.getService(IHandlerService.class);
-        ActionHandler handler = new ActionHandler(this);
-        fHandlerActivation = service.activateHandler(getActionDefinitionId(), handler);
-	}
-		
-	public void dispose() {
-        IHandlerService service = (IHandlerService) fViewSite.getService(IHandlerService.class);
-        service.deactivateHandler(fHandlerActivation);
-    }
-
-	public void updateCurrentVariable(IStructuredSelection selection) {
-		boolean enabled = false;
-		if ((selection.size() == 1) && (selection.getFirstElement() instanceof IValueModification)) {
-			IValueModification valMod = (IValueModification) selection.getFirstElement();
-			if (valMod.supportsValueModification()) {
-				fCurrentSelection = selection;
-				enabled = true;
-			}
-		} 
-		setEnabled(enabled);		
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		IVariable variable = (IVariable) fCurrentSelection.getFirstElement();
-		
-		Point selection = fTextViewer.getSelectedRange();
-		String value = null;
-		if (selection.y == 0) {
-			value = fTextViewer.getDocument().get();
-		} else {
-			try {
-				value = fTextViewer.getDocument().get(selection.x, selection.y);
-			} catch (BadLocationException e1) {
-			}
-		}
-		IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-		Shell activeShell= null;
-		if (window != null) {
-			activeShell= window.getShell();
-		}
-		
-		assignValue(activeShell, variable, value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
-	 */
-	public String getActionDefinitionId() {		
-		return IWorkbenchActionDefinitionIds.SAVE;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthAction.java
deleted file mode 100644
index 032958b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthAction.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.debug.internal.ui.actions.variables.details;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Opens a dialog so that the user can enter the maximum length in characters that
- * the detail pane should display.
- * 
- * @see DetailPaneMaxLengthDialog
- * @since 3.0
- */
-public class DetailPaneMaxLengthAction extends Action {
-	
-	private Shell fDialogShell;
-	
-	public DetailPaneMaxLengthAction(Shell dialogShell){
-		super(ActionMessages.DetailPaneMaxLengthAction_0);
-		fDialogShell = dialogShell;
-		
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.DETAIL_PANE_MAX_LENGTH_ACTION);
-		
-	}
-	
-	public void run() {
-		DetailPaneMaxLengthDialog dialog = new DetailPaneMaxLengthDialog(fDialogShell);
-		dialog.open();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java
deleted file mode 100644
index 83c034e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.actions.variables.details;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.views.variables.VariablesViewMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.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;
-
-/**
- * Provides a dialog for changing the maximum length allowed in the detail pane
- * 
- * @since 3.0
- */
-public class DetailPaneMaxLengthDialog extends TrayDialog {
-
-	private static final String SETTINGS_ID = DebugUIPlugin.getUniqueIdentifier() + ".MAX_DETAILS_LENGTH_DIALOG"; //$NON-NLS-1$
-	
-	private Text fTextWidget;
-	private Text fErrorTextWidget;
-	private String fErrorMessage;
-	private String fValue;
-	private IInputValidator fValidator;
-	
-	/**
-	 * Constructs a new dialog on the given shell.
-	 * 
-	 * @param parent shell
-	 */
-	public DetailPaneMaxLengthDialog(Shell parent) {
-		super(parent);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fValue = Integer.toString(DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH));
-		fValidator = new IInputValidator() {
-					public String isValid(String newText) {
-						try {
-							int num = Integer.parseInt(newText);
-							if (num < 0) {
-								return VariablesViewMessages.DetailPaneMaxLengthDialog_2;
-							}
-						} catch (NumberFormatException e) {
-							return VariablesViewMessages.DetailPaneMaxLengthDialog_3;
-						}
-						return null;
-					}
-				
-				};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getDialogBoundsSettings()
-	 */
-	protected IDialogSettings getDialogBoundsSettings() {
-		IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-		IDialogSettings section = settings.getSection(SETTINGS_ID);
-		if (section == null) {
-			section = settings.addNewSection(SETTINGS_ID);
-		} 
-		return section;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		getShell().setText(VariablesViewMessages.DetailPaneMaxLengthDialog_0);
-		Control contents = super.createContents(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getDialogArea(), IDebugHelpContextIds.DETAIL_PANE_MAX_LENGTH_ACTION);
-		return contents;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-        Composite composite = (Composite) super.createDialogArea(parent);
-        Label label = new Label(composite, SWT.WRAP);
-        label.setText(VariablesViewMessages.DetailPaneMaxLengthDialog_1);
-        GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
-        data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-        label.setLayoutData(data);
-        label.setFont(parent.getFont());
-        fTextWidget = new Text(composite, SWT.SINGLE | SWT.BORDER);
-        fTextWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
-        fTextWidget.setText(fValue);
-        fTextWidget.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                validateInput();
-                fValue = fTextWidget.getText();
-            }
-        });
-        fErrorTextWidget = new Text(composite, SWT.READ_ONLY);
-        fErrorTextWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        fErrorTextWidget.setBackground(fErrorTextWidget.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-        setErrorMessage(fErrorMessage);
-        applyDialogFont(composite);
-        return composite;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		String text = getValue();
-		try {
-			DebugUIPlugin.getDefault().getPreferenceStore().setValue(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH, Integer.parseInt(text));
-		} 
-		catch (NumberFormatException e) {
-			DebugUIPlugin.log(e);
-		}
-		super.okPressed();
-	}
-	
-	/**
-     * Returns the string typed into this input dialog.
-     * 
-     * @return the input string
-     * @since 3.3
-     */
-    public String getValue() {
-        return fValue;
-    }
-	
-    /**
-     * Validates the current input
-     * @since 3.3
-     */
-    private void validateInput() {
-        String errorMessage = null;
-        if (fValidator != null) {
-            errorMessage = fValidator.isValid(fTextWidget.getText());
-        }
-        setErrorMessage(errorMessage);
-    }
-    
-    /**
-     * Sets the current error message or none if null
-     * @param errorMessage
-     * @since 3.3
-     */
-    public void setErrorMessage(String errorMessage) {
-    	fErrorMessage = errorMessage;
-    	if (fErrorTextWidget != null && !fErrorTextWidget.isDisposed()) {
-    		fErrorTextWidget.setText(errorMessage == null ? "" : errorMessage); //$NON-NLS-1$
-    		fErrorTextWidget.getParent().update();
-    		// Access the ok button by id, in case clients have overridden button creation.
-    		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=113643
-    		Control button = getButton(IDialogConstants.OK_ID);
-    		if (button != null) {
-    			button.setEnabled(errorMessage == null);
-    		}
-    	}
-    }	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneWordWrapAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneWordWrapAction.java
deleted file mode 100644
index 107ca98..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneWordWrapAction.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.debug.internal.ui.actions.variables.details;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * An check box action that allows the word wrap property to be set, determining if the detail pane
- * should wrap text.
- */
-public class DetailPaneWordWrapAction extends Action {
-
-	ITextViewer fTextViewer;
-	
-	public DetailPaneWordWrapAction(ITextViewer textViewer) {
-		super(ActionMessages.DetailPaneWordWrapAction_0,IAction.AS_CHECK_BOX);
-        
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.DETAIL_PANE_WORD_WRAP_ACTION);
-		
-		fTextViewer = textViewer;
-		setEnabled(true);
-		
-		boolean prefSetting = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP);
-		fTextViewer.getTextWidget().setWordWrap(prefSetting);
-		setChecked(prefSetting);
-		
-
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		fTextViewer.getTextWidget().setWordWrap(isChecked());
-		DebugUIPlugin.getDefault().getPreferenceStore().setValue(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP,isChecked());
-		DebugUIPlugin.getDefault().savePluginPreferences();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/AbstractRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/AbstractRequestMonitor.java
deleted file mode 100644
index 2364d56..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/AbstractRequestMonitor.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.debug.internal.ui.commands.actions;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-
-/**
- * Common function for request monitors
- * 
- * @since 3.3
- *
- */
-public abstract class AbstractRequestMonitor implements IStatusMonitor {
-	
-	private IStatus fStatus;
-	private boolean fCancelled = false;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IStatusMonitor#setStatus(org.eclipse.core.runtime.IStatus)
-	 */
-	public void setStatus(IStatus status) {
-		fStatus = status;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#beginTask(java.lang.String, int)
-	 */
-	public void beginTask(String name, int totalWork) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#internalWorked(double)
-	 */
-	public void internalWorked(double work) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
-	 */
-	public boolean isCanceled() {
-		return fCancelled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
-	 */
-	public void setCanceled(boolean value) {
-		fCancelled = value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(java.lang.String)
-	 */
-	public void setTaskName(String name) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#subTask(java.lang.String)
-	 */
-	public void subTask(String name) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#worked(int)
-	 */
-	public void worked(int work) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IStatusMonitor#getStatus()
-	 */
-	public IStatus getStatus() {
-		return fStatus;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ActionsUpdater.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ActionsUpdater.java
deleted file mode 100644
index 0867805..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ActionsUpdater.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.debug.internal.ui.commands.actions;
-
-import org.eclipse.jface.action.IAction;
-
-/**
- * Collects votes from handler update requests.
- * 
- * @since 3.3
- *
- */
-public class ActionsUpdater {
-	
-	private IAction[] fActions;
-	private int fNumVoters;
-	private int fNumOfVotes = 0;
-	private boolean fDone = false;
-	private boolean fEnabled = true;
-	
-	public ActionsUpdater(IAction[] actions, int numVoters) {
-		fActions = actions;
-		fNumVoters = numVoters;
-	}
-
-	public synchronized void setEnabled(boolean result) {
-		fNumOfVotes++;
-		if (fEnabled) {
-			fEnabled = result;
-		}
-		done();
-	}
-
-	private synchronized void done() {
-		if (!fDone) {
-			if (!fEnabled || fNumOfVotes == fNumVoters) {
-				fDone = true;
-				for (int i = 0; i < fActions.length; i++) {
-					fActions[i].setEnabled(fEnabled);
-				}
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandAction.java
deleted file mode 100644
index 7d95291..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandAction.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Abstract base class for actions performing debug commands
- *
- * @since 3.3
- */
-public abstract class DebugCommandAction extends Action implements IDebugContextListener {
-
-	/**
-	 * The window this action is working for.
-	 */
-    private IWorkbenchWindow fWindow;
-    
-    /**
-     * The part this action is working for, or <code>null</code> if global to
-     * a window.
-     */
-    private IWorkbenchPart fPart;
-    
-    /**
-     * Command service.
-     */
-    private DebugCommandService fUpdateService;
-    
-    /**
-     * Delegate this action is working for or <code>null</code> if none.
-     */
-    private DebugCommandActionDelegate fDelegate;
-
-    /**
-     * Constructor
-     */
-    public DebugCommandAction() {
-        super();
-        String helpContextId = getHelpContextId();
-        if (helpContextId != null)
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this, helpContextId);
-        setEnabled(false);
-    }
-
-	/**
-     * Set the current delegate
-     * @param delegate
-     */
-    public void setDelegate(DebugCommandActionDelegate delegate) {
-        fDelegate = delegate;
-    }
-
-    /**
-     * Executes this action on the given target object
-     * 
-     * @param target the target to perform the action on
-     */
-    protected boolean execute(Object[] targets) {
-    	return fUpdateService.executeCommand(getCommandType(), targets, getCommandParticipant(targets));
-    }
-    
-    /**
-     * Creates and returns the command participant or <code>null</code>.
-     * 
-     * @return command participant to use on command completion
-     */
-    protected ICommandParticipant getCommandParticipant(Object[] targets) {
-    	return null;
-    }
-    
-    /**
-     * Returns the command type this action executes.
-     * 
-     * @return command class.
-     */
-    abstract protected Class getCommandType();  
-
-    /**
-     * @see org.eclipse.debug.ui.contexts.IDebugContextListener#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent)
-     */
-    public void debugContextChanged(DebugContextEvent event) {
-    	fUpdateService.postUpdateCommand(getCommandType(), this);
-	}
-
-    /**
-     * @see org.eclipse.jface.action.Action#setEnabled(boolean)
-     */
-    public void setEnabled(boolean enabled) {
-        super.setEnabled(enabled);
-        if (fDelegate != null) {
-            fDelegate.setEnabled(enabled);
-        }
-    }
-
-    /**
-     * Initializes this action for a specific part.
-     * 
-     * @param part workbench part
-     */
-    public void init(IWorkbenchPart part) {
-        fPart = part;
-        fWindow = part.getSite().getWorkbenchWindow();
-        fUpdateService = DebugCommandService.getService(fWindow);
-        IDebugContextService service = getDebugContextService();
-		String partId = part.getSite().getId();
-		service.addDebugContextListener(this, partId);
-        ISelection activeContext = service.getActiveContext(partId);
-        if (activeContext != null) {
-        	fUpdateService.updateCommand(getCommandType(), this);
-        } else {
-        	setEnabled(getInitialEnablement());
-        }
-    }
-    
-    /**
-     * Initializes the context action
-     * @param window the window
-     */
-    public void init(IWorkbenchWindow window) {
-        fWindow = window;
-        fUpdateService = DebugCommandService.getService(fWindow);
-        IDebugContextService contextService = getDebugContextService();
-		contextService.addDebugContextListener(this);
-        ISelection activeContext = contextService.getActiveContext();
-        if (activeContext != null) {
-        	fUpdateService.updateCommand(getCommandType(), this);
-        } else {
-        	setEnabled(getInitialEnablement());
-        }
-    }
-    
-    /**
-     * Returns whether this action should be enabled when initialized
-     * and there is no active debug context.
-     * 
-     * @return false, by default
-     */
-    protected boolean getInitialEnablement() {
-    	return false;
-    }
-
-    /**
-     * Returns the most recent selection
-     * 
-     * @return structured selection
-     */
-    protected ISelection getContext() {
-		if (fPart != null) {
-			getDebugContextService().getActiveContext(fPart.getSite().getId());
-    	}
-        return getDebugContextService().getActiveContext();
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run() {
-        ISelection selection = getContext();
-        if (selection instanceof IStructuredSelection && isEnabled()) {
-            IStructuredSelection ss = (IStructuredSelection) selection;
-            boolean enabled = execute(ss.toArray());
-            // disable the action according to the command
-            setEnabled(enabled);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event)
-     */
-    public void runWithEvent(Event event) {
-        run();
-    }
-
-    /**
-     * Clean up when removing
-     */
-    public void dispose() {
-        IDebugContextService service = getDebugContextService();
-        if (fPart != null) {
-        	service.removeDebugContextListener(this, fPart.getSite().getId());
-        } else {
-            service.removeDebugContextListener(this);
-        }
-        fWindow = null;
-        fPart = null;
-    }
-    
-    /**
-     * Returns the context service this action linked to.
-     * @return
-     */
-    protected IDebugContextService getDebugContextService() {
-    	return DebugUITools.getDebugContextManager().getContextService(fWindow);
-    }
-
-    /**
-     * @return The help context id for this action
-     */ 
-    public abstract String getHelpContextId();
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#getId()
-     */
-    public abstract String getId();
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#getText()
-     */
-    public abstract String getText();
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#getToolTipText()
-     */
-    public abstract String getToolTipText();
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
-     */
-    public abstract ImageDescriptor getDisabledImageDescriptor();
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#getHoverImageDescriptor()
-     */
-    public abstract ImageDescriptor getHoverImageDescriptor();
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#getImageDescriptor()
-     */
-    public abstract ImageDescriptor getImageDescriptor();
-    
-    /**
-     * Returns the delegate associated with this action or <code>null</code>
-     * if none.
-     * 
-     * @return delegate or <code>null</code>
-     */
-    protected DebugCommandActionDelegate getDelegate() {
-    	return fDelegate;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandActionDelegate.java
deleted file mode 100644
index 0d83a79..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandActionDelegate.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * Abstract base class for debug action delegates performing debug commands.
- * 
- * @since 3.3
- */
-public abstract class DebugCommandActionDelegate implements IWorkbenchWindowActionDelegate, IActionDelegate2 {
-
-	/**
-     *The real action for this delegate 
-	 */
-	private DebugCommandAction fDebugAction;
-    
-    /**
-     * The underlying action for this delegate
-     */
-    private IAction fWindowAction;
-    
-    /**
-     * Whether this action has been initialized before it has been run
-     * (ensures enablement state is up to date when lazily instantiated)
-     */
-    private boolean fInitialized = false;
-
-	public DebugCommandActionDelegate() {
-	}
-
-	/*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-        fDebugAction.dispose();
-
-	}
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-     */
-    public void init(IAction action) {
-        fWindowAction = action;
-    }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-     */
-    public void init(IWorkbenchWindow window) {
-        fDebugAction.init(window);
-	}
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-	public void run(IAction action) {
-		synchronized (this) {
-			if (!fInitialized) {
-				try {
-					wait();
-				} catch (InterruptedException e) {
-				}
-			}			
-		}
-        fDebugAction.run();
-	}
-
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-     */
-	public void runWithEvent(IAction action, Event event) {
-        run(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 s) {
-		// do nothing
-	}
-
-	protected DebugCommandAction getAction() {
-		return fDebugAction;
-	}
-    
-    protected void setAction(DebugCommandAction action) {
-        fDebugAction = action;
-        action.setDelegate(this);
-    }
-
-    public void setEnabled(boolean enabled) {
-    	synchronized (this) {
-	    	if (!fInitialized) {
-	    		fInitialized = true;
-	    		notifyAll();
-	    	}
-    	}
-        fWindowAction.setEnabled(enabled);
-    }
-    
-    public void setChecked(boolean checked) {
-    	fWindowAction.setChecked(checked);
-    }
-    
-    protected IAction getWindowAction()
-    {
-    	return fWindowAction;
-    }
-    
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandService.java
deleted file mode 100644
index 7613e37..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DebugCommandService.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.commands.IDebugCommandHandler;
-import org.eclipse.debug.internal.core.commands.CommandAdapterFactory;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Updates commands for a window. Coalesces update requests by command type.
- * 
- * @since 3.3
- */
-public class DebugCommandService implements IDebugContextListener {
-	
-	/**
-	 * Maps command types to actions to update
-	 */
-	private Map fCommandUpdates = new HashMap();
-	
-	/**
-	 * Window this service is for.
-	 */
-	private IWorkbenchWindow fWindow = null;
-	
-	/**
-	 * The context service for this command service.
-	 */
-	private IDebugContextService fContextService = null;
-	
-	/**
-	 * Service per window
-	 */
-	private static Map fgServices = new HashMap();
-		
-	/**
-	 * Returns the service for a window.
-	 * 
-	 * @param window
-	 * @return service
-	 */
-	public synchronized static DebugCommandService getService(IWorkbenchWindow window) {
-		DebugCommandService service = (DebugCommandService) fgServices.get(window);
-		if (service == null) {
-			service = new DebugCommandService(window);
-			fgServices.put(window, service);
-		}
-		return service;
-	}
-	
-	public DebugCommandService(IWorkbenchWindow window) {
-		fWindow = window;
-		fContextService = DebugUITools.getDebugContextManager().getContextService(window);
-		fContextService.addPostDebugContextListener(this);
-		PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {
-		
-			public void windowOpened(IWorkbenchWindow w) {
-			}
-		
-			public void windowDeactivated(IWorkbenchWindow w) {
-			}
-		
-			public void windowClosed(IWorkbenchWindow w) {
-				if (fWindow == w) {
-					dispose();
-				}
-			}
-		
-			public void windowActivated(IWorkbenchWindow w) {
-			}
-		
-		});
-	}
-	
-	private void dispose() {
-		fContextService.removeDebugContextListener(this);
-		fgServices.remove(fWindow);
-		fCommandUpdates.clear();
-		fWindow = null;
-	}
-	
-	/**
-	 * Updates the given command type after the next context change.
-	 * 
-	 * @param commandType
-	 * @param monitor
-	 */
-	public void postUpdateCommand(Class commandType, Action action) {
-		synchronized (fCommandUpdates) {
-			List actions = (List) fCommandUpdates.get(commandType);
-			if (actions == null) {
-				actions = new ArrayList();
-				fCommandUpdates.put(commandType, actions);
-			}
-			actions.add(action);					
-		}
-	}
-	
-	/**
-	 * Updates the given command type based on the active context.
-	 * 
-	 * @param commandType
-	 * @param requestMonitor
-	 */
-	public void updateCommand(Class commandType, IAction action) {
-		ISelection context = fContextService.getActiveContext();
-		if (context instanceof IStructuredSelection && !context.isEmpty()) {
-			Object[] elements = ((IStructuredSelection)context).toArray();
-			updateCommand(commandType, elements, new IAction[]{action});
-		} else {
-			action.setEnabled(false);
-		}
-	}	
-	
-	private void postUpdate(ISelection context) {
-		Map commands = null;
-		synchronized (fCommandUpdates) {
-			commands = fCommandUpdates;
-			fCommandUpdates = new HashMap(commands.size());
-		}
-		if (context instanceof IStructuredSelection && !context.isEmpty()) {
-			Object[] elements = ((IStructuredSelection)context).toArray();
-			Iterator iterator = commands.entrySet().iterator();
-			while (iterator.hasNext()) {
-				Entry entry = (Entry) iterator.next();
-				Class commandType = (Class)entry.getKey();
-				List actions = (List) entry.getValue();
-				updateCommand(commandType, elements, (IAction[]) actions.toArray(new IAction[actions.size()]));
-			}
-		} else {
-			Iterator iterator = commands.values().iterator();
-			while (iterator.hasNext()) {
-				List actionList = (List) iterator.next();
-				Iterator actions = actionList.iterator();
-				while (actions.hasNext()) {
-					((IAction)actions.next()).setEnabled(false);
-				}
-			}
-		}
-		commands.clear();		
-	}
-	
-	/**
-	 * Updates the given command type for the specified elements.
-	 * 
-	 * @param commandType command class to update
-	 * @param elements elements to update for
-	 * @param monitor status monitor
-	 */
-	private void updateCommand(Class handlerType, Object[] elements, IAction[] actions) {
-		if (elements.length == 1) {
-			// usual case - one element
-			Object element = elements[0];
-			IDebugCommandHandler handler = getHandler(element, handlerType);
-			if (handler != null) {
-				UpdateActionsRequest request = new UpdateActionsRequest(elements, actions);
-				handler.canExecute(request);
-				return;
-			}
-		} else {
-			Map map = collate(elements, handlerType);
-			if (map != null) {
-				ActionsUpdater updater = new ActionsUpdater(actions, map.size());
-				Iterator entries = map.entrySet().iterator();
-				while (entries.hasNext()) {
-					Entry entry = (Entry) entries.next();
-					IDebugCommandHandler handler = (IDebugCommandHandler) entry.getKey();
-					List list = (List) entry.getValue();
-					UpdateHandlerRequest request = new UpdateHandlerRequest(list.toArray(), updater);
-					handler.canExecute(request);
-				}
-				return;
-			}
-		}
-		// ABORT - no command processors
-		for (int i = 0; i < actions.length; i++) {
-			actions[i].setEnabled(false);
-		}
-	}
-	
-	/**
-	 * Updates the given command type for the specified elements.
-	 * 
-	 * @param commandType command class to update
-	 * @param elements elements to update for
-	 * @param monitor status monitor
-	 */
-	public boolean executeCommand(Class handlerType, Object[] elements, ICommandParticipant participant) {
-		if (elements.length == 1) {
-			// usual case - one element
-			Object element = elements[0];
-			IDebugCommandHandler handler = getHandler(element, handlerType);
-			if (handler != null) {
-				ExecuteActionRequest request = new ExecuteActionRequest(elements);
-				request.setCommandParticipant(participant);
-				return handler.execute(request);
-			}
-		} else {
-			Map map = collate(elements, handlerType);
-			if (map != null) {
-				boolean enabled = true;
-				Iterator entries = map.entrySet().iterator();
-				while (entries.hasNext()) {
-					Entry entry = (Entry) entries.next();
-					IDebugCommandHandler handler = (IDebugCommandHandler) entry.getKey();
-					List list = (List) entry.getValue();
-					ExecuteActionRequest request = new ExecuteActionRequest(list.toArray());
-					request.setCommandParticipant(participant);
-					// specifically use & so handler is executed
-					enabled = enabled & handler.execute(request);
-				}
-				return enabled;
-			}
-		}
-		// ABORT - no command processors
-		return false;
-	}	
-
-	public void debugContextChanged(DebugContextEvent event) {
-		postUpdate(event.getContext());
-	}	
-	
-	/**
-	 * Returns a map of command handlers to associated elements, or <code>null</code> if 
-	 * one is missing.
-	 * 
-	 * @param elements
-	 * @return map of command handlers to associated elements or <code>null</code>
-	 */
-	private Map collate(Object[] elements, Class handlerType) {
-		Map map = new HashMap();
- 		for (int i = 0; i < elements.length; i++) {
- 			Object element = elements[i];
- 			IDebugCommandHandler handler = getHandler(element, handlerType);
-			if (handler == null) {
-				return null;
-			} else {
-				List list = (List) map.get(handler);
-				if (list == null) {
-					list = new ArrayList();
-					map.put(handler, list);
-	 				}
-				list.add(element);
-	 			}
-	 		}
-		return map;
-	}
-	
-	private IDebugCommandHandler getHandler(Object element, Class handlerType) {
-		IDebugCommandHandler handler = null;
-		if (handlerType.isInstance(element)) {
-			handler = (IDebugCommandHandler)element;
-		} else if (element instanceof IAdaptable) {
-			handler = (IDebugCommandHandler)((IAdaptable)element).getAdapter(handlerType);
-			if (handler == null && !(element instanceof PlatformObject)) {
-        		// for objects that don't properly subclass PlatformObject to inherit default
-	        	// adapters, just delegate to the adapter factory
-    	    	handler = (IDebugCommandHandler) new CommandAdapterFactory().getAdapter(element, handlerType);
-        	}
-		}
-		return handler;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DisconnectCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DisconnectCommandAction.java
deleted file mode 100644
index 3cd5109..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DisconnectCommandAction.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IDisconnectHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-/**
- * Disconnect action.
- * 
- * @since 3.3
- */
-public class DisconnectCommandAction extends DebugCommandAction{
-
-    public String getText() {
-        return ActionMessages.DisconnectAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.disconnect_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.disconnect"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.DisconnectAction_3;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DISCONNECT);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DISCONNECT);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DISCONNECT);
-    }
-
-	protected Class getCommandType() {
-		return IDisconnectHandler.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DropToFrameCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DropToFrameCommandAction.java
deleted file mode 100644
index 6cccb37..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/DropToFrameCommandAction.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.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IDropToFrameHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Drop to frame action.
- * 
- * @since 3.3
- */
-public class DropToFrameCommandAction extends DebugCommandAction {
-
-    public String getText() {
-        return ActionMessages.DropToFrameAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.drop_to_frame_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.dropToFrame"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.DropToFrameAction_3;
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DROP_TO_FRAME);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DROP_TO_FRAME);
-    }
-
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return null;
-	}
-
-	protected Class getCommandType() {
-		return IDropToFrameHandler.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ExecuteActionRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ExecuteActionRequest.java
deleted file mode 100644
index b47715b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ExecuteActionRequest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.internal.core.commands.DebugCommandRequest;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-/**
- * Plain status collector for actions. Has no result.
- * 
- * @since 3.3
- * 
- */
-public class ExecuteActionRequest extends DebugCommandRequest {
-	
-	private ICommandParticipant fParticipant = null;
-	
-	public ExecuteActionRequest(Object[] elements) {
-		super(elements);
-	}
-
-    public void done() {
-    	if (fParticipant != null) {
-			fParticipant.requestDone(this);
-			fParticipant = null;
-		}
-        final IStatus status = getStatus();
-        if (status != null) {
-            switch (status.getSeverity()) {
-            case IStatus.ERROR:
-                DebugUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
-                    public void run() {
-                        MessageDialog.openError(DebugUIPlugin.getShell(), DebugUIMessages.DebugUITools_Error_1, status.getMessage());
-                    }
-                });
-                break;
-            case IStatus.WARNING:
-                DebugUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
-                    public void run() {
-                        MessageDialog.openWarning(DebugUIPlugin.getShell(), DebugUIMessages.DebugUITools_Error_1, status.getMessage());
-                    }
-                });
-                break;
-            case IStatus.INFO:
-                DebugUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
-                    public void run() {
-                        MessageDialog.openInformation(DebugUIPlugin.getShell(), DebugUIMessages.DebugUITools_Error_1, status.getMessage());
-                    }
-                });
-                break;
-            }
-        }
-    }
-    
-	public void setCommandParticipant(ICommandParticipant participant) {
-		fParticipant = participant;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ICommandParticipant.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ICommandParticipant.java
deleted file mode 100644
index c5daa2f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ICommandParticipant.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.IRequest;
-
-/**
- * Adds function to a command on completion.
- *
- * @since 3.3
- */
-public interface ICommandParticipant {
-	
-	public void requestDone(IRequest request);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ResumeCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ResumeCommandAction.java
deleted file mode 100644
index f14c7f0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ResumeCommandAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IResumeHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Resume action.
- * 
- * @since 3.3
- */
-public class ResumeCommandAction extends DebugCommandAction{
-	
-	public ResumeCommandAction() {
-		setActionDefinitionId("org.eclipse.debug.ui.commands.Resume"); //$NON-NLS-1$
-	}
-
-    public String getText() {
-        return ActionMessages.ResumeAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.resume_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.resume"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.ResumeAction_3;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_RESUME);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_RESUME);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_RESUME);
-    }
-
-	protected Class getCommandType() {
-		return IResumeHandler.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ResumeCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ResumeCommandActionDelegate.java
deleted file mode 100644
index 77a6cb6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ResumeCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-/**
- * Resume action delegate.
- * 
- * @since 3.3
- */
-public class ResumeCommandActionDelegate extends DebugCommandActionDelegate {
-
-    public ResumeCommandActionDelegate() {
-        super();
-        setAction(new ResumeCommandAction());
-    }
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepIntoCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepIntoCommandAction.java
deleted file mode 100644
index d38a918..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepIntoCommandAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IStepIntoHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Step into action
- * 
- * @since 3.3
- */
-public class StepIntoCommandAction extends DebugCommandAction {
-	
-	public StepIntoCommandAction() {
-		setActionDefinitionId("org.eclipse.debug.ui.commands.StepInto"); //$NON-NLS-1$
-	}
-
-    public String getText() {
-        return ActionMessages.StepIntoAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.step_into_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.stepInto"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.StepIntoAction_3;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEP_INTO);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_INTO);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_INTO);
-    }
-
-	protected Class getCommandType() {
-		return IStepIntoHandler.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepIntoCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepIntoCommandActionDelegate.java
deleted file mode 100644
index 0364de6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepIntoCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-/**
- * Step into action delegate.
- * 
- * @since 3.3
- */
-public class StepIntoCommandActionDelegate extends DebugCommandActionDelegate {
-
-    public StepIntoCommandActionDelegate() {
-        super();
-        setAction(new StepIntoCommandAction());
-    }
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepOverCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepOverCommandAction.java
deleted file mode 100644
index ffc4ecf..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepOverCommandAction.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IStepOverHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Step over action.
- * 
- * @since 3.3
- */
-public class StepOverCommandAction extends DebugCommandAction {
-	
-	public StepOverCommandAction() {
-		setActionDefinitionId("org.eclipse.debug.ui.commands.StepOver"); //$NON-NLS-1$
-	}
- 
-    public String getText() {
-        return ActionMessages.StepOverAction_0;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEP_OVER);
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.step_over_action_context"; //$NON-NLS-1$
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_OVER);
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.stepOver"; //$NON-NLS-1$
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_OVER);
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.StepOverAction_3;
-    }
- 
-	protected Class getCommandType() {
-		return IStepOverHandler.class;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepOverCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepOverCommandActionDelegate.java
deleted file mode 100644
index 71a2040..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepOverCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-/**
- * Step over action delegate.
- * 
- * @since 3.3
- */
-public class StepOverCommandActionDelegate extends DebugCommandActionDelegate {
-
-    public StepOverCommandActionDelegate() {
-        super();
-        setAction(new StepOverCommandAction());
-    }
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepReturnCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepReturnCommandAction.java
deleted file mode 100644
index 872f0a8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepReturnCommandAction.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IStepReturnHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Step return action.
- * 
- * @since 3.3
- */
-public class StepReturnCommandAction extends DebugCommandAction {
-    
-	
-	public StepReturnCommandAction() {
-		setActionDefinitionId("org.eclipse.debug.ui.commands.StepReturn"); //$NON-NLS-1$	
-	}
-	
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEP_RETURN);
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.step_return_action_context"; //$NON-NLS-1$
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_RETURN);
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.stepReturn"; //$NON-NLS-1$
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEP_RETURN);
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.StepReturnAction_2;
-    }
-
-    public String getText() {
-        return ActionMessages.StepReturnAction_3;
-    }
-
-	protected Class getCommandType() {
-		return IStepReturnHandler.class;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepReturnCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepReturnCommandActionDelegate.java
deleted file mode 100644
index 2f78cce..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/StepReturnCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-/**
- * Step return action delegate.
- * 
- * @since 3.3
- */
-public class StepReturnCommandActionDelegate extends DebugCommandActionDelegate {
-
-    public StepReturnCommandActionDelegate() {
-        super();
-        setAction(new StepReturnCommandAction());
-    }
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/SuspendCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/SuspendCommandAction.java
deleted file mode 100644
index ef3deec..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/SuspendCommandAction.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.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.ISuspendHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Suspend action.
- * 
- * @since 3.3
- */
-public class SuspendCommandAction extends DebugCommandAction {
-
-
-    public String getText() {
-        return ActionMessages.SuspendAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.suspend_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.suspend"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.SuspendAction_3;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_SUSPEND);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_SUSPEND);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_SUSPEND);
-    }
-
-	protected Class getCommandType() {
-		return ISuspendHandler.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/SuspendCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/SuspendCommandActionDelegate.java
deleted file mode 100644
index 9747cdc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/SuspendCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-/**
- * Suspend action delegate.
- * 
- * @since 3.3
- */
-public class SuspendCommandActionDelegate extends DebugCommandActionDelegate {
-
-    public SuspendCommandActionDelegate() {
-        super();
-        setAction(new SuspendCommandAction());
-    }
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAllAction.java
deleted file mode 100644
index 2fb6078..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAllAction.java
+++ /dev/null
@@ -1,123 +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.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Terminates all launches.
- * 
- * @since 3.3
- */
-public class TerminateAllAction extends DebugCommandAction implements ILaunchesListener2 {
-		
-	protected ISelection getContext() {
-		return new StructuredSelection(getLaunchManager().getLaunches());
-	}
-	
-	public void contextActivated(ISelection context, IWorkbenchPart part) {
-		// DO NOTHING
-	}
-
-	public void contextChanged(ISelection context, IWorkbenchPart part) {
-		// DO NOTHING
-	}
-	
-	public void dispose() {
-		getLaunchManager().removeLaunchListener(this);
-		super.dispose();
-	}
-
-	public void init(IWorkbenchPart part) {
-		super.init(part);
-		ILaunchManager launchManager = getLaunchManager();
-		launchManager.addLaunchListener(this);
-		// heuristic... rather than updating all the time, just assume there's
-		// something that's not terminated.
-		setEnabled(launchManager.getLaunches().length > 0);
-	}
-
-	private ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-
-	public String getHelpContextId() {
-		return "org.eclipse.debug.ui.terminate_all_action_context"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return "org.eclipse.debug.ui.debugview.popupMenu.terminateAll"; //$NON-NLS-1$
-	}
-
-	public String getText() {
-		return ActionMessages.TerminateAllAction_2;
-	}
-
-	public String getToolTipText() {
-		return ActionMessages.TerminateAllAction_3;
-	}
-
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugPluginImages
-				.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_ALL);
-	}
-
-	public ImageDescriptor getHoverImageDescriptor() {
-		return DebugPluginImages
-				.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_ALL);
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		return DebugPluginImages
-				.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_ALL);
-	}
-
-	protected Class getCommandType() {
-		return ITerminateHandler.class;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-		setEnabled(true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {
-		setEnabled(getLaunchManager().getLaunches().length > 0);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAndRelaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAndRelaunchAction.java
deleted file mode 100644
index 0a525eb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAndRelaunchAction.java
+++ /dev/null
@@ -1,125 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.actions.RelaunchActionDelegate;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Action which terminates a launch and then re-launches it.
- */
-public class TerminateAndRelaunchAction extends DebugCommandAction {
-	
-	class Particiapnt implements ICommandParticipant {
-		
-		private Object[] fTargets;
-
-		public Particiapnt(Object[] targets) {
-			fTargets = targets;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.commands.actions.ICommandParticipant#requestDone(org.eclipse.debug.core.commands.IRequest)
-		 */
-		public void requestDone(IRequest request) {
-			if (request.getStatus() == null || request.getStatus().isOK()) {
-				DebugUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
-		            public void run() {
-		                // Must be run in the UI thread since the launch can require
-		                // prompting to proceed
-		            	for (int i = 0; i < fTargets.length; i++) {
-		            		ILaunch launch = RelaunchActionDelegate.getLaunch(fTargets[i]);
-		            		RelaunchActionDelegate.relaunch(launch.getLaunchConfiguration(), launch.getLaunchMode());
-						}
-		            }
-		        });	
-			}
-		}
-		
-	}
-
-	protected ICommandParticipant getCommandParticipant(Object[] targets) {
-		return new Particiapnt(targets);
-	}
-
-	protected Class getCommandType() {
-		return ITerminateHandler.class;
-	}
-
-	public void debugContextChanged(DebugContextEvent event) {
-		ISelection context = event.getContext();
-		if (context instanceof IStructuredSelection) {
-			Object[] elements = ((IStructuredSelection)context).toArray();
-			for (int i = 0; i < elements.length; i++) {
-				if (!canRelaunch(elements[i])) {
-					setEnabled(false);
-					return;
-				}
-			} 
-		}
-		super.debugContextChanged(event);
-	}
-
-    protected boolean canRelaunch(Object element) {
-    	ILaunch launch = RelaunchActionDelegate.getLaunch(element);
-    	if (launch != null) {
-    		ILaunchConfiguration configuration = launch.getLaunchConfiguration();
-    		if (configuration != null) {
-    			return LaunchConfigurationManager.isVisible(configuration);
-    		}
-    	}
-		return false; 
-    }
-
-    public String getActionDefinitionId() {
-        return ActionMessages.TerminateAndRelaunchAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.terminate_and_relaunch_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.popupMenu.TerminateAndRelaunch"; //$NON-NLS-1$
-    }
-
-    public String getText() {
-        return ActionMessages.TerminateAndRelaunchAction_3;
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.TerminateAndRelaunchAction_4;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_AND_RELAUNCH);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_RELAUNCH);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_RELAUNCH);
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAndRemoveAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAndRemoveAction.java
deleted file mode 100644
index c722848..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateAndRemoveAction.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Terminate and remove action.
- * 
- * @since 3.3
- */
-public class TerminateAndRemoveAction extends DebugCommandAction {
-
-    
-    class TerminateAndRemoveParticipant implements ICommandParticipant {
-        private Object[] fElements;
-        
-        TerminateAndRemoveParticipant(Object[] elements) {
-            fElements = elements;
-        }
-        
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.commands.actions.ICommandParticipant#requestDone(org.eclipse.debug.core.commands.IRequest)
-		 */
-		public void requestDone(IRequest request) {
-			IStatus status = request.getStatus();
-			if(status == null || status.isOK()) {
-				for (int i = 0; i < fElements.length; i++) {
-					Object element = fElements[i];
-	                ILaunch launch= null;
-	                if (element instanceof ILaunch) {
-	                    launch= (ILaunch) element;
-	                } else if (element instanceof IDebugElement) {
-	                    launch= ((IDebugElement) element).getLaunch();
-	                } else if (element instanceof IProcess) {
-	                    launch= ((IProcess) element).getLaunch();
-	                }   
-	                if (launch != null)
-	                    DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);					
-				}
-            }
-		}
-        
-    }
-
-    public String getText() {
-        return ActionMessages.TerminateAndRemoveAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.terminate_and_remove_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.popupMenu.terminateAndRemove"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.TerminateAndRemoveAction_3;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_AND_REMOVE);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_REMOVE);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_REMOVE);
-    }
-
-    protected Class getCommandType() {
-		return ITerminateHandler.class;
-	}
-
-	protected ICommandParticipant getCommandParticipant(Object[] targets) {
-		return new TerminateAndRemoveParticipant(targets);
-	}
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateCommandAction.java
deleted file mode 100644
index d1a5070..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateCommandAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.ITerminateHandler;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Terminate action.
- * 
- * @since 3.3
- */
-public class TerminateCommandAction extends DebugCommandAction {
-	
-	public TerminateCommandAction() {
-		setActionDefinitionId("org.eclipse.debug.ui.commands.Terminate"); //$NON-NLS-1$
-	}
-
-    public String getText() {
-        return ActionMessages.TerminateAction_0;
-    }
-
-    public String getHelpContextId() {
-        return "org.eclipse.debug.ui.terminate_action_context"; //$NON-NLS-1$
-    }
-
-    public String getId() {
-        return "org.eclipse.debug.ui.debugview.toolbar.terminate"; //$NON-NLS-1$
-    }
-
-    public String getToolTipText() {
-        return ActionMessages.TerminateAction_3;
-    }
-
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE);
-    }
-
-    public ImageDescriptor getHoverImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_TERMINATE);
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_TERMINATE);
-    }
-
-	protected Class getCommandType() {
-		return ITerminateHandler.class;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateCommandActionDelegate.java
deleted file mode 100644
index a401b22..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/TerminateCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-/**
- * Terminate action delegate.
- * 
- * @since 3.3
- */
-public class TerminateCommandActionDelegate extends DebugCommandActionDelegate {
-
-    public TerminateCommandActionDelegate() {
-        super();
-        setAction(new TerminateCommandAction());
-    }
-
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ToggleStepFiltersAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ToggleStepFiltersAction.java
deleted file mode 100644
index fc33a34..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ToggleStepFiltersAction.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.commands.IStepFiltersHandler;
-import org.eclipse.debug.internal.core.StepFilterManager;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * This class provides the action for toggling step filters on or off for the debug view
- */
-public class ToggleStepFiltersAction extends DebugCommandAction implements IPropertyChangeListener {
-	
-	private boolean fInitialized = !DebugUITools.isUseStepFilters();
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getDisabledImageDescriptor()
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TOGGLE_STEP_FILTERS);
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getHelpContextId()
-	 */
-	public String getHelpContextId() {
-		return "org.eclipse.debug.ui.step_with_filters_action_context"; //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getHoverImageDescriptor()
-	 */
-	public ImageDescriptor getHoverImageDescriptor() {
-		return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TOGGLE_STEP_FILTERS);
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getId()
-	 */
-	public String getId() {
-		return "org.eclipse.debug.ui.actions.ToggleStepFilters"; //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TOGGLE_STEP_FILTERS);
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getText()
-	 */
-	public String getText() {
-		return ActionMessages.ToggleStepFiltersAction_1;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getToolTipText()
-	 */
-	public String getToolTipText() {		
-		return ActionMessages.ToggleStepFiltersAction_0;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getInitialEnablement()
-	 */
-	protected boolean getInitialEnablement() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#getCommandType()
-	 */
-	protected Class getCommandType() {
-		return IStepFiltersHandler.class;
-	}
-
-    /**
-     * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#run()
-     */
-    public void run() {
-    	// ignore initial call to run from abstract debug view
-    	// that runs the action to initialize it's state when
-    	// the workbench persisted the action as "on"
-    	if (fInitialized) {
-    		DebugUITools.setUseStepFilters(!DebugUITools.isUseStepFilters());
-    	} else {
-    		fInitialized = true;
-    	}
-    }
-	
-    /**
-     * @see org.eclipse.jface.action.Action#getStyle()
-     */
-    public int getStyle() {
-    	return AS_CHECK_BOX;
-    }
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		ISelection context = event.getContext();
-		if (context.isEmpty()) {
-			setEnabled(true);
-		} else {
-			super.debugContextChanged(event);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#init(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void init(IWorkbenchPart part) {
-		super.init(part);
-		initState();
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		super.init(window);
-		initState();
-	}
-    
-    /**
-     * Initializes the state, by adding this action as a property listener 
-     */
-    protected void initState() {
-    	DebugPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(this);
-    }
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		DebugPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Preferences$IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().equals(StepFilterManager.PREF_USE_STEP_FILTERS)) {
-			boolean checked = DebugUITools.isUseStepFilters();
-			setChecked(checked);
-			DebugCommandActionDelegate delegate = getDelegate();
-			if (delegate != null) {
-				delegate.setChecked(checked);
-			}
-		}		
-	}
-    
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ToggleStepFiltersCommandActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ToggleStepFiltersCommandActionDelegate.java
deleted file mode 100644
index deee97a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/ToggleStepFiltersCommandActionDelegate.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.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Toggle step filters action delegate.
- * 
- * @since 3.3
- */
-public class ToggleStepFiltersCommandActionDelegate extends DebugCommandActionDelegate {
-
-    /** 
-     * Constructor
-     */
-    public ToggleStepFiltersCommandActionDelegate() {
-        super();
-        setAction(new ToggleStepFiltersAction());
-    }
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.commands.actions.DebugCommandActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		super.init(window);
-		setChecked(DebugUITools.isUseStepFilters());
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/UpdateActionsRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/UpdateActionsRequest.java
deleted file mode 100644
index 0745358..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/UpdateActionsRequest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IEnabledStateRequest;
-import org.eclipse.debug.internal.core.commands.DebugCommandRequest;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Boolean collector that collects boolean results from a number of voters.
- * Request is cancelled when one voter votes false.
- * 
- * @since 3.3
- *
- */
-public class UpdateActionsRequest extends DebugCommandRequest implements IEnabledStateRequest {
-	
-	private IAction[] fActions;
-	private boolean fEnabled = false;
-	
-	public UpdateActionsRequest(Object[] elements, IAction[] actions) {
-		super(elements);
-		fActions = actions;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.provisional.IBooleanRequestMonitor#setResult(boolean)
-	 */
-	public synchronized void setEnabled(boolean result) {
-		fEnabled = result;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
-	 */
-	public synchronized void done() {
-		for (int i = 0; i < fActions.length; i++) {
-			fActions[i].setEnabled(fEnabled);
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/UpdateHandlerRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/UpdateHandlerRequest.java
deleted file mode 100644
index a0069ca..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/commands/actions/UpdateHandlerRequest.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.debug.internal.ui.commands.actions;
-
-import org.eclipse.debug.core.commands.IEnabledStateRequest;
-import org.eclipse.debug.internal.core.commands.DebugCommandRequest;
-
-/**
- * Collects whether a handler is enabled for a set of elements and
- * reports its vote to an action updater collecting results from
- * other handlers.
- * 
- * @since 3.3
- *
- */
-public class UpdateHandlerRequest extends DebugCommandRequest implements IEnabledStateRequest {
-	
-	private boolean fEnabled = false;
-	private ActionsUpdater fUpdater;
-	
-	public UpdateHandlerRequest(Object[] elements, ActionsUpdater updater) {
-		super(elements);
-		fUpdater = updater;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.provisional.IBooleanRequestMonitor#setResult(boolean)
-	 */
-	public synchronized void setEnabled(boolean result) {
-		fEnabled = result;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
-	 */
-	public synchronized void done() {
-		fUpdater.setEnabled(fEnabled);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextMessages.java
deleted file mode 100644
index 2b69dfd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextMessages.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.debug.internal.ui.contextlaunching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS'd messages for context launching artifacts
- * @since 3.3
- * CONTEXTLAUNCHING
- */
-public class ContextMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.contextlaunching.ContextMessages"; //$NON-NLS-1$
-	public static String ContextRunner_0;
-	public static String ContextRunner_1;
-	public static String ContextRunner_13;
-	public static String ContextRunner_14;
-	public static String ContextRunner_15;
-	public static String ContextRunner_16;
-	public static String ContextRunner_2;
-	public static String ContextRunner_3;
-	public static String ContextRunner_7;
-	public static String LaunchingResourceManager_0;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, ContextMessages.class);
-	}
-
-	private ContextMessages() {
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextMessages.properties
deleted file mode 100644
index 89a4f97..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextMessages.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-ContextRunner_0=Unable To Launch
-ContextRunner_7=The selection cannot be launched, and there are no recent launches.
-ContextRunner_2=The selection does not support {0} mode.
-ContextRunner_3=Launch configuration ''{0}'' does not support {1} mode.
-ContextRunner_13=The resource ''{0}'' is not accessible for launching
-ContextRunner_14=As...
-ContextRunner_15=...
-
-#The possible values of {0} is the name of the resource that is the current context i.e. Main.java  
-ContextRunner_16={0}
-ContextRunner_1={0} Not Supported
-
-#The possible values for {0} are the names of the launch configurations in the current workspace
-LaunchingResourceManager_0={0} (already running)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextRunner.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextRunner.java
deleted file mode 100644
index b668039..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/ContextRunner.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.contextlaunching;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationSelectionDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutSelectionDialog;
-import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Static runner for context launching to provide the base capability of context 
- * launching to more than one form of action (drop down, toolbar, view, etc)
- * 
- * @see org.eclipse.debug.ui.actions.AbstractLaunchHistoryAction
- * @see org.eclipse.debug.ui.actions.LaunchShortcutsAction
- * @see org.eclipse.debug.ui.actions.ContextualLaunchAction
- * @see org.eclipse.debug.internal.ui.preferences.ContextLaunchingPreferencePage
- * 
- *  @since 3.3
- *  CONTEXTLAUNCHING
- */
-public final class ContextRunner {
-	
-	/**
-	 * The singleton instance of the context runner
-	 */
-	private static ContextRunner fgInstance = null;
-	
-	/**
-	 * Returns the singleton instance of <code>ContextRunner</code>
-	 * @return the singleton instance of <code>ContextRunner</code>
-	 */
-	public static ContextRunner getDefault() {
-		if(fgInstance == null) {
-			fgInstance = new ContextRunner();
-		}
-		return fgInstance;
-	}
-	
-	/**
-	 * Performs the context launching given the object context and the mode to launch in.
-	 * @param group 
-	 */
-	public void launch(ILaunchGroup group) {
-		IResource resource = SelectedResourceManager.getDefault().getSelectedResource();
-		//1. resolve resource
-		if(resource != null) {
-			selectAndLaunch(resource, group);
-			return;
-		}
-		//2. launch last if no resource
-		if(!launchLast(group)) {
-			//3. might be empty workspace try to get shortcuts
-			List shortcuts = getLaunchShortcutsForEmptySelection();
-			if(!shortcuts.isEmpty()) {
-				showShortcutSelectionDialog(resource, shortcuts, group.getMode());
-			}
-			else {
-				MessageDialog.openInformation(DebugUIPlugin.getShell(), ContextMessages.ContextRunner_0, ContextMessages.ContextRunner_7);
-			}
-		}
-	}
-	
-	/**
-	 * This method launches the last configuration that was launched, if any.
-	 * @param group the launch group to launch with
-	 * @return true if there was a last launch and it was launched, false otherwise
-	 */
-	protected boolean launchLast(ILaunchGroup group) {
-		ILaunchConfiguration config = null;
-		if(group != null) {
-			config = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(group.getIdentifier());
-		}
-		if(config != null) {
-			launch(config, group.getMode());
-			return true;
-		}
-		return false;
-	}
-	
-	/**
-	 * Creates a listing of the launch shortcut extensions that are applicable to the underlying resource
-	 * @param resource the underlying resource
-	 * @return a listing of applicable launch shortcuts or an empty list, never <code>null</code>
-	 */
-	public List getLaunchShortcutsForEmptySelection() {
-		List list = new ArrayList(); 
-		List sc = getLaunchConfigurationManager().getLaunchShortcuts();
-		List ctxt = new ArrayList();
-		IEvaluationContext context = new EvaluationContext(null, ctxt);
-		context.addVariable("selection", ctxt); //$NON-NLS-1$
-		LaunchShortcutExtension ext = null;
-		for(Iterator iter = sc.iterator(); iter.hasNext();) {
-			ext = (LaunchShortcutExtension) iter.next();
-			try {
-				if(ext.evalEnablementExpression(context, ext.getContextualLaunchEnablementExpression()) && !WorkbenchActivityHelper.filterItem(ext)) {
-					if(!list.contains(ext)) {
-						list.add(ext);
-					}
-				}
-			}
-			catch(CoreException ce) {/*do nothing*/}
-		}
-		return list;
-	}
-	
-	/**
-	 * Prompts the user to select a way of launching the current resource, where a 'way'
-	 * is defined as a launch shortcut.
-	 * 
-	 * @param resource
-	 * @param group
-	 */
-	protected void selectAndLaunch(IResource resource, ILaunchGroup group) {
-		if(group == null) {
-			return;
-		}
-		ILaunchConfiguration config = getLaunchConfigurationManager().isSharedConfig(resource);
-		if(config != null) {
-			launch(config, group.getMode());
-			return;
-		}
-		List configs = getLaunchConfigurationManager().getApplicableLaunchConfigurations(resource);
-		configs = getConfigsApplicableToMode(configs, group.getMode());
-		int csize = configs.size();
-		if(csize == 1) {
-			launch((ILaunchConfiguration) configs.get(0), group.getMode());
-			return;
-		}
-		if(csize < 1) {
-			List exts = getLaunchConfigurationManager().getLaunchShortcuts(resource);
-			List modeSpecificExts = getLaunchConfigurationManager().getShortcutsSupportingMode(exts, group.getMode());
-			int esize = modeSpecificExts.size();
-			if(esize == 1) {
-				LaunchShortcutExtension ext = (LaunchShortcutExtension) modeSpecificExts.get(0);
-				ext.launch(new StructuredSelection(resource), group.getMode());
-				return;
-			}
-			if(esize > 1) {
-				showShortcutSelectionDialog(resource, modeSpecificExts, group.getMode());
-				return;
-			}
-			if(esize < 1) {
-				if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE)) {
-					if(!launchLast(group)) {
-						MessageDialog.openInformation(DebugUIPlugin.getShell(), ContextMessages.ContextRunner_0, ContextMessages.ContextRunner_7);
-					}
-					return;
-				}
-				if (exts.size() > 0) {
-					// there are shortcuts, but not applicable to the selected mode
-					ILaunchMode launchMode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(group.getMode());
-					if (launchMode == null) {
-						DebugUIPlugin.logErrorMessage("Unsupported launch mode: " + group.getMode()); //$NON-NLS-1$
-					} else {
-						String label = launchMode.getLabel();
-						String modeLabel = DebugUIPlugin.removeAccelerators(label);
-						MessageDialog.openInformation(DebugUIPlugin.getShell(), MessageFormat.format(ContextMessages.ContextRunner_1, new String[]{modeLabel}),
-								MessageFormat.format(ContextMessages.ContextRunner_2, new String[]{modeLabel.toLowerCase()}));
-					}
-				} else {
-					IProject project = resource.getProject();
-					if(project != null && !project.equals(resource)) {
-						selectAndLaunch(project, group);
-					}
-					else {
-						String msg = ContextMessages.ContextRunner_7;
-						if(!resource.isAccessible()) {
-							msg = MessageFormat.format(ContextMessages.ContextRunner_13, new String[] {resource.getName()});
-						}
-						MessageDialog.openInformation(DebugUIPlugin.getShell(), ContextMessages.ContextRunner_0, msg);
-					}
-				}
-			}
-		}
-		else if(csize > 1){
-			config = getLaunchConfigurationManager().getMRUConfiguration(configs, group, resource);
-			if(config != null) {
-				launch(config, group.getMode());
-			} else {
-				showConfigurationSelectionDialog(configs, group.getMode());
-			}
-		}
-	}
-	
-	/**
-	 * Validates the given launch mode and launches.
-	 * 
-	 * @param configuration configuration to launch
-	 * @param mode launch mode identifier
-	 */
-	private void launch(ILaunchConfiguration configuration, String mode) {
-		if (validateMode(configuration, mode)) {
-			DebugUITools.launch(configuration, mode);
-		}
-	}
-	
-	/**
-	 * Validates the given launch mode is supported, and returns whether to continue with
-	 * the launch.
-	 * 
-	 * @param configuration launch configuration
-	 * @param mode launch mode
-	 * @return whether the mode is supported
-	 */
-	private boolean validateMode(ILaunchConfiguration configuration, String mode) {
-		try {
-			// if this is a multi-mode launch, allow the launch dialog to be opened
-			// to resolve a valid mode, if needed.
-			if (configuration.getModes().isEmpty()) {
-				if (!configuration.supportsMode(mode)) {
-					ILaunchMode launchMode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(mode);
-					if (launchMode == null) {
-						DebugUIPlugin.logErrorMessage("Unsupported launch mode: " + mode); //$NON-NLS-1$
-					} else {
-						String label = launchMode.getLabel();
-						String modeLabel = DebugUIPlugin.removeAccelerators(label);
-						MessageDialog.openInformation(DebugUIPlugin.getShell(), MessageFormat.format(ContextMessages.ContextRunner_1, new String[]{modeLabel}),
-								MessageFormat.format(ContextMessages.ContextRunner_3, new String[]{configuration.getName(), modeLabel.toLowerCase()}));
-					}
-					return false;
-				}
-			}
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e.getStatus());
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Presents the user with a dialog to pick the launch configuration to launch
-	 * and launches that configuration.
-	 * 
-	 * @param configurations the listing of applicable configurations to present
-	 * @param mode the mode
-	 */
-	protected void showConfigurationSelectionDialog(List configurations, String mode) {
-		LaunchConfigurationSelectionDialog lsd = new LaunchConfigurationSelectionDialog(DebugUIPlugin.getShell(), configurations);
-		if(lsd.open() == IDialogConstants.OK_ID) {
-			ILaunchConfiguration config = (ILaunchConfiguration) lsd.getResult()[0];
-			launch(config, mode);
-		}
-	}
-	
-	/**
-	 * Presents a selection dialog to the user to pick a launch shortcut and
-	 * launch using that shortcut.
-	 * 
-	 * @param resource the resource context
-	 * @param mode the mode
-	 */
-	protected void showShortcutSelectionDialog(IResource resource, List shortcuts, String mode) {
-		LaunchShortcutSelectionDialog dialog = new LaunchShortcutSelectionDialog(shortcuts, resource, mode);
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			if(result.length > 0) {
-				LaunchShortcutExtension method = (LaunchShortcutExtension) result[0];
-				if(method != null) {
-					method.launch((resource == null ? new StructuredSelection() : new StructuredSelection(resource)), mode);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Returns the launch configuration manager
-	 * @return the launch configuration manager
-	 */
-	protected LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}
-	
-	/**
-	 * Filters the given list of launch configurations that apply to the specified mode
-	 * @param configs the list of configs to filter
-	 * @param mode the mode we want to filter against
-	 * @return the listing of launch configurations that support the specified mode
-	 */
-	private List getConfigsApplicableToMode(List configs, String mode) {
-		ArrayList applicable = new ArrayList(configs);
-		ListIterator iterator = applicable.listIterator();
-		while (iterator.hasNext()) {
-			ILaunchConfiguration config = (ILaunchConfiguration) iterator.next();
-			try {
-				Set modes = config.getModes();
-				modes.add(mode);
-				if (!config.getType().supportsModeCombination(modes)) {
-					iterator.remove();
-				}
-			} 
-			catch (CoreException e) {}
-		}
-		return applicable;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java
deleted file mode 100644
index c006656..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contextlaunching/LaunchingResourceManager.java
+++ /dev/null
@@ -1,511 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.contextlaunching;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.ILaunchHistoryChangedListener;
-import org.eclipse.debug.internal.ui.ILaunchLabelChangedListener;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.action.CoolBarManager;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ToolBarContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackAdapter;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchWindow;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This manager is used to calculate the labels for the current resource or for the current 
- * state of the launch history, depending on the enabled status of contextual launching. More specifically
- * if contextual launching is enabled the calculated labels are for the current resource, otherwise 
- * the calculated labels are for the current state of the launch history.
- * 
- * Any actions interested in being notified of launch label updates need to register with this manager, and implement
- * the <code>ILaunchLabelChangedListener</code> interface.
- * 
- * @see ILaunchLabelChangedListener
- * @see org.eclipse.debug.ui.actions.AbstractLaunchHistoryAction
- * 
- * @since 3.3
- */
-public class LaunchingResourceManager implements IPropertyChangeListener, IWindowListener, ISelectionListener, ILaunchHistoryChangedListener, ILaunchesListener2 {
-	
-	/**
-	 *The set of label update listeners
-	 */
-	private ListenerList fLabelListeners = new ListenerList(); 
-	
-	/**
-	 * The map of ToolBars that have mouse tracker listeners associated with them:
-	 * stored as Map<IWorkbenchWindow, ToolBar>
-	 */
-	private HashMap fToolbars = new HashMap();
-	
-	/**
-	 * the map of current labels
-	 */
-	private HashMap fCurrentLabels = new HashMap();
-	
-	/**
-	 * The selection has changed and we need to update the labels
-	 */
-	private boolean fUpdateLabel = true;
-	
-	/**
-	 * Set of windows that have been opened and that we have registered selection listeners with
-	 */
-	private HashSet fWindows = new HashSet();
-	
-	/**
-	 * Cache of IResource -> ILaunchConfiguration[] used during a tooltip update job. 
-	 * The cache is cleared after each tooltip update job is complete.
-	 */
-	private HashMap fConfigCache = new HashMap();
-	
-	/**
-	 * Cache of IResource -> LaunchShortcutExtension used during a tooltip update job.
-	 * The cache is cleared after each tooltip update job is complete.
-	 */
-	private HashMap fExtCache = new HashMap();
-	
-	/**
-	 * Constant denoting the empty string;
-	 */
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	
-	/**
-	 * Provides a mouse tracker listener for the launching main toolbar 
-	 */
-	private MouseTrackAdapter fMouseListener = new MouseTrackAdapter() {
-		public void mouseEnter(MouseEvent e) {
-			if(fUpdateLabel) {
-				fUpdateLabel = false;
-				fCurrentLabels.clear();
-				Job job = new Job("Compute launch button tooltip") { //$NON-NLS-1$
-					protected IStatus run(IProgressMonitor monitor) {
-						computeLabels();
-						fConfigCache.clear();
-						fExtCache.clear();
-						return Status.OK_STATUS;
-					}
-				};
-				job.setSystem(true);
-				job.schedule();
-			}
-		}
-	};
-	
-	/**
-	 * Returns if context launching is enabled
-	 * @return if context launching is enabled
-	 */
-	public static boolean isContextLaunchEnabled() {
-		return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH);
-	}
-	
-	/**
-	 * Allows an <code>AbstractLaunchHistoryAction</code> to register with this manager to be notified
-	 * of a context (<code>IResource</code>) change and have its updateToolTip(..) method called back to.
-	 * @param action the action to add
-	 * @param group the launch group
-	 * @return true if the <code>AbstractLaunchHistoryAction</code> was added as a listener, false otherwise
-	 */
-	public void addLaunchLabelUpdateListener(ILaunchLabelChangedListener listener) {
-		fLabelListeners.add(listener);
-	}
-	
-	/**
-	 * Removes the specified <code>AbstractLaunchHistoryAction</code> from the listing of registered 
-	 * listeners
-	 * @param action the action to remove
-	 * @param group the launch group
-	 * @return true if the action was removed from the listing of <code>AbstractLaunchHistoryAction</code> listeners,
-	 * false otherwise
-	 */
-	public void removeLaunchLabelChangedListener(ILaunchLabelChangedListener listener) {
-		fLabelListeners.remove(listener);
-	}
-	
-	/**
-	 * Returns the current resource label to be displayed.
-	 * 
-	 * @param group the launch group to get the label for
-	 * @return the current resource label;
-	 */
-	public String getLaunchLabel(ILaunchGroup group) {
-		return (String) fCurrentLabels.get(group);
-	}
-	
-	/**
-	 * Returns if the parent project should be checked automatically
-	 * @return true if the parent project should checked automatically, false otherwise
-	 */
-	protected boolean shouldCheckParent() {
-		return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_LAUNCH_PARENT_PROJECT);
-	}
-	
-	/**
-	 * Returns if the the last launch configuration should be launched if the selected resource is not launchable and context launching is enabled
-	 * @return true if the last launched should be launched, false otherwise
-	 */
-	protected boolean shouldLaunchLast() {
-		return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE);
-	}
-	
-	/**
-	 * Computes the current listing of labels for the given <code>IResource</code> context change or the 
-	 * current launch history changed event
-	 */
-	protected void computeLabels() {
-		ILaunchGroup group = null;
-		ILaunchConfiguration config = null;
-		String label = null;
-		Object[] listeners = fLabelListeners.getListeners();
-		for(int i = 0; i < listeners.length; i++) {
-			group = ((ILaunchLabelChangedListener)listeners[i]).getLaunchGroup();
-			if(group != null) {
-				if(isContextLaunchEnabled() && !group.getIdentifier().equals("org.eclipse.ui.externaltools.launchGroup")) { //$NON-NLS-1$
-					label = getResourceLabel(SelectedResourceManager.getDefault().getSelectedResource(), group);
-				}
-				else {
-					config = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(group.getIdentifier());
-					if(config != null) {
-						label = appendLaunched(config);
-					}
-				}
-				fCurrentLabels.put(group, label);
-				label = null;
-			}
-		}
-		notifyLabelChanged();
-	}
-	
-	/**
-	 * Notifies all registered listeners that the known labels have changed
-	 */
-	protected void notifyLabelChanged() {
-		Object[] listeners = fLabelListeners.getListeners();
-		for(int i = 0; i < listeners.length; i++) {
-			((ILaunchLabelChangedListener)listeners[i]).labelChanged();
-		}
-	}
-	
-	/**
-	 * Appends the text '(already running)' to the tooltip label if there is a launch currently
-	 * running (not terminated) with the same backing launch configuration as the one specified
-	 * @param config
-	 * @return the appended string for the tooltip label or the configuration name (default)
-	 */
-	private String appendLaunched(ILaunchConfiguration config) {
-		ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-		boolean launched = false;
-		ILaunchConfiguration tmp = null;
-		for(int i = 0; i < launches.length; i++) {
-			tmp = launches[i].getLaunchConfiguration();
-			if(tmp != null) {
-				if(!launches[i].isTerminated() && tmp.equals(config)) {
-					launched = true;
-					break;
-				}
-			}
-		}
-		if(launched) {
-			return MessageFormat.format(ContextMessages.LaunchingResourceManager_0, new String[] {config.getName()});
-		}
-		return config.getName();
-	}
-	
-	/**
-	 * Returns the label for the last launched configuration or and empty string if there was no last launch.
-	 * @param group
-	 * @return the name of the last launched configuration, altered with '(running)' if needed, or the empty
-	 * string if there is no last launch.
-	 */
-	protected String getlastLaunchedLabel(ILaunchGroup group) {
-		ILaunchConfiguration config = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(group.getIdentifier());
-		if(config != null) {
-			return appendLaunched(config);
-		}
-		return EMPTY_STRING;
-	}
-	
-	/**
-	 * Returns the label for the specified resource or the empty string, never <code>null</code>
-	 * @param resource
-	 * @param group
-	 * @return the label for the resource or the empty string, never <code>null</code>
-	 */
-	protected String getResourceLabel(IResource resource, ILaunchGroup group) {
-		if(resource == null) {
-			//no resource try last launch like the runner does
-			if(group != null) {
-				String label = getlastLaunchedLabel(group);
-				if(!EMPTY_STRING.equals(label)) {
-					return label;
-				}
-			}
-			//otherwise try to determine if there is a way to launch it
-			List shortcuts = ContextRunner.getDefault().getLaunchShortcutsForEmptySelection();
-			if(!shortcuts.isEmpty()) {
-				return ContextMessages.ContextRunner_14;
-			}
-			else {
-				return EMPTY_STRING;
-			}
-		}
-		LaunchConfigurationManager lcm = DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-		//see if the context is a shared configuration
-		ILaunchConfiguration config = lcm.isSharedConfig(resource);
-		if(config != null) {
-			return appendLaunched(config);
-		}
-		List configs = (List) fConfigCache.get(resource);
-		if(configs == null) {
-			configs = lcm.getApplicableLaunchConfigurations(resource);
-			fConfigCache.put(resource, configs);
-		}
-		int csize = configs.size();
-		if(csize == 1) {
-			return appendLaunched((ILaunchConfiguration)configs.get(0));
-		}
-		else if(csize > 1) {
-			config = lcm.getMRUConfiguration(configs, group, resource);
-			if(config != null) {
-				return appendLaunched(config);
-			}
-			else {
-				return ContextMessages.ContextRunner_14;
-			}
-		}
-		else {
-			List exts = (List) fExtCache.get(resource);
-			if(exts == null) {
-				exts = lcm.getLaunchShortcuts(resource);
-				fExtCache.put(resource, exts);
-			}
-			int esize = exts.size();
-			if(esize == 0) {
-				if(shouldCheckParent()) {
-					IProject project = resource.getProject();
-					if(project != null && !project.equals(resource)) {
-						return getResourceLabel(project, group);
-					}
-				}
-				else if(shouldLaunchLast()) {
-					return getlastLaunchedLabel(group);
-				}
-				else {
-					return ContextMessages.ContextRunner_15;
-				}
-			}
-			if(esize == 1) {
-				return resource.getName();
-			}
-			else {
-				return ContextMessages.ContextRunner_14;
-			}
-		}
-	}
-	
-	/**
-	 * Starts up the manager
-	 */
-	public void startup() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		if(workbench != null) {
-			workbench.addWindowListener(this);
-		}
-		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-		DebugUIPlugin.getDefault().getLaunchConfigurationManager().addLaunchHistoryListener(this);
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-	}
-
-	/**
-	 * Shutdown and clean up the manager
-	 */
-	public void shutdown() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		if(workbench != null) {
-			workbench.removeWindowListener(this);
-		}
-		DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		DebugUIPlugin.getDefault().getLaunchConfigurationManager().removeLaunchHistoryListener(this);
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-		IWorkbenchWindow window = null;
-		ToolBar bar = null;
-		for(Iterator iter = fToolbars.keySet().iterator(); iter.hasNext();) {
-			window = (IWorkbenchWindow) iter.next();
-			bar = (ToolBar) fToolbars.get(window);
-			if(bar != null && !bar.isDisposed()) {
-				bar.removeMouseTrackListener(fMouseListener);
-			}
-		}
-		for(Iterator iter = fWindows.iterator(); iter.hasNext();) {
-			((IWorkbenchWindow)iter.next()).getSelectionService().removeSelectionListener(this);
-		}
-		fWindows.clear();
-		fToolbars.clear();
-		fLabelListeners.clear();
-		fCurrentLabels.clear();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowActivated(IWorkbenchWindow window) {
-		if(!fToolbars.containsKey(window)) {
-			addMouseListener(window);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowClosed(IWorkbenchWindow window) {
-		ToolBar bar = (ToolBar) fToolbars.remove(window);
-		if(bar != null && !bar.isDisposed()) {
-			bar.removeMouseTrackListener(fMouseListener);
-		}
-		if(fWindows.remove(window)) {
-			window.getSelectionService().removeSelectionListener(this);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowDeactivated(IWorkbenchWindow window) {}
-
-	/**
-	 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowOpened(IWorkbenchWindow window) {
-		if(fWindows.add(window)) {
-			window.getSelectionService().addSelectionListener(this);
-		}
-	}
-	
-	/**
-	 * Adds a mouse listener to the launch toolbar 
-	 * 
-	 * @param window
-	 */
-	private void addMouseListener(IWorkbenchWindow window) {
-		CoolBarManager cmgr = ((WorkbenchWindow)window).getCoolBarManager();
-		if(cmgr != null) {
-			IContributionItem item = cmgr.find("org.eclipse.debug.ui.launchActionSet"); //$NON-NLS-1$
-			if(item instanceof ToolBarContributionItem) {
-				ToolBarManager tmgr = (ToolBarManager) ((ToolBarContributionItem)item).getToolBarManager();
-				ToolBar bar = tmgr.getControl();
-				if(bar != null && !bar.isDisposed()) {
-					bar.addMouseTrackListener(fMouseListener);
-					fToolbars.put(window, bar);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if(event.getProperty().equals(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH) ||
-				event.getProperty().equals(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE)) {
-			if(isContextLaunchEnabled()) {
-				windowActivated(DebugUIPlugin.getActiveWorkbenchWindow());
-			}
-			fUpdateLabel = true;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if(isContextLaunchEnabled()) {
-			fUpdateLabel = true;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.ILaunchHistoryChangedListener#launchHistoryChanged()
-	 */
-	public void launchHistoryChanged() {
-		//this always must be set to true, because as the history is loaded these events are fired, and we need to
-		//update on workspace load.
-		fUpdateLabel = true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-		fUpdateLabel = true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-		fUpdateLabel = true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {
-		//we want to ensure that even if a launch is removed from the debug view 
-		//when it is not terminated we update the label just in case.
-		//bug 195232
-		for(int i = 0; i < launches.length; i++) {
-			if(!launches[i].isTerminated()) {
-				fUpdateLabel = true;
-				return;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugContextManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugContextManager.java
deleted file mode 100644
index 17b602b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugContextManager.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.debug.internal.ui.contexts;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.debug.internal.ui.views.ViewContextManager;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextManager;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @since 3.2
- */
-public class DebugContextManager implements IDebugContextManager {
-	
-	private static DebugContextManager fgDefault;
-	private Map fServices = new HashMap();
-	private ListenerList fGlobalListeners = new ListenerList();
-	
-	private class WindowListener implements IWindowListener {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
-		 */
-		public void windowActivated(IWorkbenchWindow window) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
-		 */
-		public void windowDeactivated(IWorkbenchWindow window) {			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
-		 */
-		public void windowClosed(IWorkbenchWindow window) {
-			DebugWindowContextService service = (DebugWindowContextService) fServices.remove(window);
-			if (service != null) {
-				service.dispose();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
-		 */
-		public void windowOpened(IWorkbenchWindow window) {
-		}
-		
-	}
-	
-	private DebugContextManager() {
-		PlatformUI.getWorkbench().addWindowListener(new WindowListener());
-	}
-	
-	public static IDebugContextManager getDefault() {
-		if (fgDefault == null) {
-			fgDefault = new DebugContextManager();
-			// create the model context bindigg manager at the same time
-			DebugModelContextBindingManager.getDefault();
-			// create view manager
-			ViewContextManager.getDefault();			
-		}
-		return fgDefault;
-	}
-	
-	protected DebugWindowContextService createService(IWorkbenchWindow window) {
-		DebugWindowContextService service = (DebugWindowContextService) fServices.get(window);
-		if (service == null) {
-			service = new DebugWindowContextService(window);
-			fServices.put(window, service);
-			// register global listeners
-			Object[] listeners = fGlobalListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				IDebugContextListener listener = (IDebugContextListener) listeners[i];
-				service.addDebugContextListener(listener);
-			}
-		}
-		return service;
-	}
-	
-	protected IDebugContextService getService(IWorkbenchWindow window) {
-		return (DebugWindowContextService) fServices.get(window);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.IDebugContextManager#addDebugContextListener(org.eclipse.debug.internal.ui.contexts.IDebugContextListener)
-	 */
-	public void addDebugContextListener(IDebugContextListener listener) {
-		fGlobalListeners.add(listener);
-		DebugWindowContextService[] services = getServices();
-		for (int i = 0; i < services.length; i++) {
-			DebugWindowContextService service = services[i];
-			service.addDebugContextListener(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.IDebugContextManager#removeDebugContextListener(org.eclipse.debug.internal.ui.contexts.IDebugContextListener)
-	 */
-	public void removeDebugContextListener(IDebugContextListener listener) {
-		fGlobalListeners.remove(listener);
-		DebugWindowContextService[] services = getServices();
-		for (int i = 0; i < services.length; i++) {
-			DebugWindowContextService service = services[i];
-			service.removeDebugContextListener(listener);
-		}
-	}
-	
-	/**
-	 * Returns the existing context services.
-	 * 
-	 * @return existing context services
-	 */
-	private DebugWindowContextService[] getServices() {
-		Collection sevices = fServices.values();
-		return (DebugWindowContextService[]) sevices.toArray(new DebugWindowContextService[sevices.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextManager#getContextService(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public IDebugContextService getContextService(IWorkbenchWindow window) {
-		return createService(window);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugModelContextBindingManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugModelContextBindingManager.java
deleted file mode 100644
index 9383bc5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugModelContextBindingManager.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Pawel Piech - Bug 154598: DebugModelContextBindingManager does not use IAdaptable.getAdapter() to retrieve IDebugModelProvider adapter
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.contexts;
-
-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 java.util.regex.Pattern;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugModelProvider;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.ActivityManagerEvent;
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IActivityManagerListener;
-import org.eclipse.ui.activities.IActivityPatternBinding;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-
-/**
- * Manages <code>debugModelContextBindings</code> extensions.
- * <p>
- * As debug contexts are activated, associated <code>org.eclipse.ui.contexts</code>
- * are activated. When a debug session (launch) terminates, the associated contexts
- * are disabled. Debug model activation also triggers assocaited activities.
- * </p>
- * @since 3.2
- */
-public class DebugModelContextBindingManager implements IDebugContextListener, ILaunchesListener2, IActivityManagerListener {
-	
-	/**
-	 * Map of debug model identifier to associated contexts as defined
-	 * by <code>debugModelContextBindings</code> extensions.
-	 */
-	private Map fModelToContextIds = new HashMap();
-	
-	/**
-	 * Map of launch objects to enabled model ids
-	 */
-	private Map fLaunchToModelIds = new HashMap();
-	
-	/**
-	 * Map of launch objects to context activations
-	 */
-	private Map fLanuchToContextActivations = new HashMap();
-	
-	/**
-	 * A list of activity pattern bindings for debug models. 
-	 */
-	private List fModelPatternBindings = new ArrayList();
-	
-	/**
-	 * Map of debug model ids to assocaited activity ids.
-	 */
-	private Map fModelToActivities = new HashMap();
-	
-	/**
-	 * A set of debug model ids for which activities have been enabled.
-	 * Cleared when enabled activities change.
-	 */
-	private Set fModelsEnabledForActivities = new HashSet();
-	
-	// extension point
-	public static final String ID_DEBUG_MODEL_CONTEXT_BINDINGS= "debugModelContextBindings"; //$NON-NLS-1$
-	
-	// extension point attributes
-	public static final String ATTR_CONTEXT_ID= "contextId"; //$NON-NLS-1$
-	public static final String ATTR_DEBUG_MODEL_ID= "debugModelId"; //$NON-NLS-1$
-	
-	// base debug context
-	public static final String DEBUG_CONTEXT= "org.eclipse.debug.ui.debugging"; //$NON-NLS-1$
-	
-	// suffix for debug activities triggered by debug model context binding activation
-	private static final String DEBUG_MODEL_ACTIVITY_SUFFIX = "/debugModel"; //$NON-NLS-1$
-	
-	// singleton manager
-	private static DebugModelContextBindingManager fgManager;
-	
-	private static IContextService fgContextService = (IContextService) PlatformUI.getWorkbench().getAdapter(IContextService.class);
-	
-	public static DebugModelContextBindingManager getDefault() {
-		if (fgManager == null) {
-			fgManager = new DebugModelContextBindingManager();
-		}
-		return fgManager;
-	}
-	
-	private DebugModelContextBindingManager() {
-		loadDebugModelContextBindings();
-		loadDebugModelActivityExtensions();
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-		DebugUITools.getDebugContextManager().addDebugContextListener(this);
-		IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench().getActivitySupport();
-		activitySupport.getActivityManager().addActivityManagerListener(this);
-	}
-	
-	/**
-	 * Loads the extensions which map debug model identifiers
-	 * to context ids.
-	 */
-	private void loadDebugModelContextBindings() {
-		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), ID_DEBUG_MODEL_CONTEXT_BINDINGS);
-		IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
-		for (int i = 0; i < configurationElements.length; i++) {
-			IConfigurationElement element = configurationElements[i];
-			String modelIdentifier = element.getAttribute(ATTR_DEBUG_MODEL_ID);
-			String contextId = element.getAttribute(ATTR_CONTEXT_ID);
-			if (modelIdentifier != null && contextId != null) {
-				List contextIds = (List) fModelToContextIds.get(modelIdentifier);
-				if (contextIds == null) {
-					contextIds = new ArrayList();
-					fModelToContextIds.put(modelIdentifier, contextIds);
-				}
-				contextIds.add(contextId);
-			}
-		}
-	}	
-	
-	/**
-	 * Loads the extensions which map debug model patterns
-	 * to activity ids. This information is used to activate the
-	 * appropriate activities when a debug element is selected.
-	 */
-	private void loadDebugModelActivityExtensions() {
-		IActivityManager activityManager = PlatformUI.getWorkbench().getActivitySupport().getActivityManager();
-		Set activityIds = activityManager.getDefinedActivityIds();
-		Iterator activityIterator = activityIds.iterator();
-		while (activityIterator.hasNext()) {
-			String activityId= (String) activityIterator.next();
-			IActivity activity = activityManager.getActivity(activityId);
-			if (activity != null) {
-				Set patternBindings = activity.getActivityPatternBindings();
-				Iterator patternIterator= patternBindings.iterator();
-				while (patternIterator.hasNext()) {
-					IActivityPatternBinding patternBinding= (IActivityPatternBinding) patternIterator.next();
-					String pattern = patternBinding.getPattern().pattern();
-					if (pattern.endsWith(DEBUG_MODEL_ACTIVITY_SUFFIX)) {
-						fModelPatternBindings.add(patternBinding);
-					}
-				}
-			}
-		}
-	}	
-
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			ISelection selection = event.getContext();
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection) selection;
-				Iterator iterator = ss.iterator();
-				while (iterator.hasNext()) {
-					activated(iterator.next()); 
-				}
-			}
-		}
-	}
-	
-	/**
-	 * The specified object has been activated. Activate contexts and activities as
-	 * required for the object.
-	 * 
-	 * @param object object that has been activated
-	 */
-	private void activated(Object object) {
-		String[] modelIds = getDebugModelIds(object);
-		if (modelIds == null) {
-			return;
-		}
-		ILaunch launch = getLaunch(object);
-		if (launch == null) {
-			return;
-		}
-		Set alreadyEnabled = (Set) fLaunchToModelIds.get(launch);
-		if (alreadyEnabled == null) {
-			alreadyEnabled = new HashSet();
-			fLaunchToModelIds.put(launch, alreadyEnabled);
-		}
-		for (int i = 0; i < modelIds.length; i++) {
-			String id = modelIds[i];
-			if (!alreadyEnabled.contains(id)) {
-				alreadyEnabled.add(id);
-				activateModel(id, launch);
-			}
-		}
-		enableActivitiesFor(modelIds);
-	}
-	
-	/**
-	 * Activates the given model identifier for the specified launch. This activates
-	 * associated contexts and all parent contexts for the model.
-	 * 
-	 * @param modelId model to be enabled
-	 * @param launch the launch the model is being enabled for
-	 */
-	private void activateModel(String modelId, ILaunch launch) {
-		List contextIds = (List) fModelToContextIds.get(modelId);
-		if (contextIds == null) {
-			// if there are no contexts for a model, the base debug context should 
-			// be activated (i.e. a debug model with no org.eclipse.ui.contexts and
-			// associated org.eclipse.debug.ui.modelContextBindings)
-			contextIds = new ArrayList();
-			contextIds.add(DEBUG_CONTEXT);
-			fModelToContextIds.put(modelId, contextIds);
-		}
-		Iterator iterator = contextIds.iterator();
-		while (iterator.hasNext()) {
-			activateContext((String) iterator.next(), launch);
-		}
-	}
-	
-	/**
-	 * Activates the given context and all its parent contexts.
-	 * 
-	 * @param contextId
-	 * @param launch
-	 */
-	private void activateContext(String contextId, ILaunch launch) {
-		while (contextId != null) {
-			Context context = fgContextService.getContext(contextId);
-			IContextActivation activation = fgContextService.activateContext(contextId);
-			addActivation(launch, activation);
-			try {
-				if (contextId.equals(DEBUG_CONTEXT)) {
-					// don't enable windows contexts and higher
-					break;
-				}
-				contextId = context.getParentId();
-			} catch (NotDefinedException e) {
-				contextId = null;
-				DebugUIPlugin.log(e);
-			}
-		}
-	}
-	
-	/**
-	 * Notes the activation for a context and launch so we can de-activate later.
-	 * 
-	 * @param launch
-	 * @param activation
-	 */
-	private void addActivation(ILaunch launch, IContextActivation activation) {
-		List activations = (List) fLanuchToContextActivations.get(launch);
-		if (activations == null) {
-			activations = new ArrayList();
-			fLanuchToContextActivations.put(launch, activations);
-		}
-		activations.add(activation);
-	}
-
-	/**
-	 * Returns the debug model identifiers associated with the given object or <code>null</code>
-	 * if none.
-	 * 
-	 * @param object 
-	 * @return debug model identifiers associated with the given object or <code>null</code>
-	 */
-	private String[] getDebugModelIds(Object object) {
-		if (object instanceof IAdaptable) {
-            IDebugModelProvider modelProvider= (IDebugModelProvider)((IAdaptable)object).getAdapter(IDebugModelProvider.class);
-			if (modelProvider != null) {
-				String[] modelIds= modelProvider.getModelIdentifiers();
-				if (modelIds != null) {
-					return modelIds;
-				}
-			}
-		}
-		if (object instanceof IStackFrame) {
-			return new String[] { ((IStackFrame) object).getModelIdentifier() };
-		}
-		return null;
-	}	
-	
-	/**
-	 * Returns the ILaunch associated with the given object or
-	 * <code>null</code> if none.
-	 * 
-	 * @param object object for which launch is required
-	 * @return the ILaunch associated with the given object or <code>null</code>
-	 */
-	public static ILaunch getLaunch(Object object) {
-		ILaunch launch = null;
-		if (object instanceof IAdaptable) {
-			launch = (ILaunch) ((IAdaptable)object).getAdapter(ILaunch.class);
-		}
-		if (launch == null && object instanceof IDebugElement) {
-			launch = ((IDebugElement) object).getLaunch();
-		}
-		return launch;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-		// disable activated contexts
-		for (int i = 0; i < launches.length; i++) {
-			ILaunch launch = launches[i];
-			final List activations = (List) fLanuchToContextActivations.remove(launch);
-			fLaunchToModelIds.remove(launch);
-			if (activations != null) {
-				Runnable r = new Runnable() {
-					public void run() {
-						Iterator iterator = activations.iterator();
-						while (iterator.hasNext()) {
-							IContextActivation activation = (IContextActivation) iterator.next();
-							activation.getContextService().deactivateContext(activation);
-						}
-					}
-				};
-				DebugUIPlugin.getStandardDisplay().asyncExec(r);
-			}
-			
-		}
-		// TODO: Terminated notification
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {
-	}	
-	
-	/**
-	 * Returns the workbench contexts associated with a debug context
-	 * 
-	 * @param target debug context
-	 * @return associated workbench contexts
-	 */
-	public List getWorkbenchContextsForDebugContext(Object target) {
-		List workbenchContexts = new ArrayList();
-		String[] modelIds = getDebugModelIds(target);
-		if (modelIds != null) {
-			for (int i = 0; i < modelIds.length; i++) {
-				String modelId = modelIds[i];
-				List contextIds = (List) fModelToContextIds.get(modelId);
-				if (contextIds != null) {
-					Iterator contextIterator = contextIds.iterator();
-					while (contextIterator.hasNext()) {
-						String contextId = (String) contextIterator.next();
-						if (!workbenchContexts.contains(contextId)) {
-							workbenchContexts.add(contextId);
-						}
-					}
-				}
-			}
-		}
-		return workbenchContexts;
-	}	
-	
-	/**
-	 * Enables activities in the workbench associated with the given debug 
-	 * model ids that have been activated.
-	 * 
-	 * @param debug model ids for which to enable activities
-	 */
-	private void enableActivitiesFor(String[] modelIds) {
-		Set activities = null;
-		for (int i = 0; i < modelIds.length; i++) {
-			String id = modelIds[i];
-			if (!fModelsEnabledForActivities.contains(id)) {
-				Set ids= (Set) fModelToActivities.get(id);
-				if (ids == null) {
-					// first time the model has been seen, perform pattern matching
-					ids = new HashSet();
-					fModelToActivities.put(id, ids);
-					Iterator bindings = fModelPatternBindings.iterator();
-					while (bindings.hasNext()) {
-						IActivityPatternBinding binding = (IActivityPatternBinding) bindings.next();
-						String regex = binding.getPattern().pattern();
-						regex = regex.substring(0, regex.length() - DEBUG_MODEL_ACTIVITY_SUFFIX.length());
-						if (Pattern.matches(regex, id)) {
-							ids.add(binding.getActivityId());
-						}
-					}
-				}
-				if (!ids.isEmpty()) {
-					if (activities == null) {
-						activities = new HashSet();
-					}
-					activities.addAll(ids);
-				}
-				fModelsEnabledForActivities.add(id);
-			}
-		}
-		if (activities != null) {
-			IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench().getActivitySupport();
-			Set enabledActivityIds = activitySupport.getActivityManager().getEnabledActivityIds();
-			if (!enabledActivityIds.containsAll(activities)) {
-				enabledActivityIds = new HashSet(enabledActivityIds);
-				enabledActivityIds.addAll(activities);
-				activitySupport.setEnabledActivityIds(activities);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.activities.IActivityManagerListener#activityManagerChanged(org.eclipse.ui.activities.ActivityManagerEvent)
-	 */
-	public void activityManagerChanged(ActivityManagerEvent activityManagerEvent) {
-		if (activityManagerEvent.haveEnabledActivityIdsChanged()) {
-			fModelsEnabledForActivities.clear();
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugWindowContextService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugWindowContextService.java
deleted file mode 100644
index 7749c22..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/DebugWindowContextService.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.contexts;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextProvider;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Context service for a specific window.
- * 
- * @since 3.2
- */
-public class DebugWindowContextService implements IDebugContextService, IPartListener2, IDebugContextListener {
-	
-	private Map fListenersByPartId = new HashMap();
-	private Map fProvidersByPartId = new HashMap();
-	private Map fPostListenersByPartId = new HashMap();
-	
-	private IWorkbenchWindow fWindow;
-	private List fProviders = new ArrayList();
-
-	public DebugWindowContextService(IWorkbenchWindow window) {
-		fWindow = window;
-		fWindow.getPartService().addPartListener(this);
-	}
-	
-	public void dispose() {
-		fWindow.getPartService().removePartListener(this);
-		fWindow = null;
-	}
-	
-	public synchronized void addDebugContextProvider(IDebugContextProvider provider) {
-		IWorkbenchPart part = provider.getPart();
-		String id = null;
-		if (part != null) {
-			id = part.getSite().getId();
-		}
-		fProvidersByPartId.put(id, provider);
-		fProviders.add(provider);
-		IWorkbenchPart active = null;
-		IWorkbenchPage activePage = fWindow.getActivePage();
-		if (activePage != null) {
-			active = activePage.getActivePart();
-		}
-		if (fProviders.size() == 1 && (part == null || part.equals(active))) {
-			notify(provider);
-		}
-		provider.addDebugContextListener(this);
-	}
-	
-	public synchronized void removeDebugContextProvider(IDebugContextProvider provider) {
-		int index = fProviders.indexOf(provider);
-		if (index >= 0) {
-			IWorkbenchPart part = provider.getPart();
-			String id = null;
-			if (part != null) {
-				id = part.getSite().getId();
-			}
-			fProvidersByPartId.remove(id);
-			fProviders.remove(index);
-			if (index == 0) {
-				IDebugContextProvider activeProvider = getActiveProvider();
-				if (activeProvider != null) {
-					notify(activeProvider);
-				} else {
-					notify(new DebugContextEvent(provider, new StructuredSelection(), DebugContextEvent.ACTIVATED));
-				}
-			}
-		}
-		provider.removeDebugContextListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextService#addDebugContextListener(org.eclipse.debug.ui.contexts.IDebugContextListener)
-	 */
-	public void addDebugContextListener(IDebugContextListener listener) {
-		addDebugContextListener(listener, null);
-	}
-	
-	public void addPostDebugContextListener(IDebugContextListener listener, String partId) {
-		ListenerList list = (ListenerList) fPostListenersByPartId.get(partId);
-		if (list == null) {
-			list = new ListenerList();
-			fPostListenersByPartId.put(partId, list);
-		}
-		list.add(listener);	
-	}
-
-	public void addPostDebugContextListener(IDebugContextListener listener) {
-		addPostDebugContextListener(listener, null);
-	}
-	
-	public void removePostDebugContextListener(IDebugContextListener listener, String partId) {
-		ListenerList list = (ListenerList) fPostListenersByPartId.get(partId);
-		if (list != null) {
-			list.remove(listener);
-		}
-	}
-
-	public void removePostDebugContextListener(IDebugContextListener listener) {
-		removePostDebugContextListener(listener, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextService#removeDebugContextListener(org.eclipse.debug.ui.contexts.IDebugContextListener)
-	 */
-	public void removeDebugContextListener(IDebugContextListener listener) {
-		removeDebugContextListener(listener, null);
-	}
-	
-	/**
-	 * Notifies listeners of the context in the specified provider.
-	 * 
-	 * @param provdier context provider
-	 */
-	protected void notify(IDebugContextProvider provdier) {
-		ISelection activeContext = provdier.getActiveContext();
-		if (activeContext == null) {
-			activeContext = new StructuredSelection();
-		}
-		notify(new DebugContextEvent(provdier, activeContext, DebugContextEvent.ACTIVATED));
-	}
-	
-	protected void notify(DebugContextEvent event) {
-		notify(event, getListeners(null));
-		IWorkbenchPart part = event.getDebugContextProvider().getPart();
-		if (part != null) {
-			notify(event, getListeners(part));
-		}
-		notify(event, getPostListeners(null));
-		if (part != null) {
-			notify(event, getPostListeners(part));
-		}
-	}
-	
-	protected void notify(final DebugContextEvent event, ListenerList list) {
-		if (list != null) {
-			Object[] listeners = list.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IDebugContextListener listener = (IDebugContextListener) listeners[i];
-				SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {
-						listener.debugContextChanged(event);
-					}
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-				});
-			}
-		}
-	}
-	
-	protected ListenerList getListeners(IWorkbenchPart part) {
-		String id = null;
-		if (part != null) {
-			id = part.getSite().getId();
-		}
-		return (ListenerList) fListenersByPartId.get(id);
-	}
-	
-	protected ListenerList getPostListeners(IWorkbenchPart part) {
-		String id = null;
-		if (part != null) {
-			id = part.getSite().getId();
-		}
-		return (ListenerList) fPostListenersByPartId.get(id);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextService#addDebugContextListener(org.eclipse.debug.ui.contexts.IDebugContextListener, java.lang.String)
-	 */
-	public synchronized void addDebugContextListener(IDebugContextListener listener, String partId) {
-		ListenerList list = (ListenerList) fListenersByPartId.get(partId);
-		if (list == null) {
-			list = new ListenerList();
-			fListenersByPartId.put(partId, list);
-		}
-		list.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextService#removeDebugContextListener(org.eclipse.debug.ui.contexts.IDebugContextListener, java.lang.String)
-	 */
-	public void removeDebugContextListener(IDebugContextListener listener, String partId) {
-		ListenerList list = (ListenerList) fListenersByPartId.get(partId);
-		if (list != null) {
-			list.remove(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextService#getActiveContext(java.lang.String)
-	 */
-	public ISelection getActiveContext(String partId) {
-		IDebugContextProvider provider = (IDebugContextProvider) fProvidersByPartId.get(partId);
-		if (provider != null) {
-			return provider.getActiveContext();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextService#getActiveContext()
-	 */
-	public ISelection getActiveContext() {
-		IDebugContextProvider activeProvider = getActiveProvider();
-		if (activeProvider != null) {
-			return activeProvider.getActiveContext();
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the active provider or <code>null</code>
-	 * 
-	 * @return active provider or <code>null</code>
-	 */
-	protected IDebugContextProvider getActiveProvider() {
-		if (!fProviders.isEmpty()) {
-			return (IDebugContextProvider)fProviders.get(0);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partActivated(IWorkbenchPartReference partRef) {
-		IDebugContextProvider provider = (IDebugContextProvider) fProvidersByPartId.get(partRef.getId());
-		if (provider != null) {
-			int index = fProviders.indexOf(provider);
-			if (index > 0) {
-				fProviders.remove(index);
-				fProviders.add(0, provider);
-				notify(provider);
-			}
-		}
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partBroughtToTop(IWorkbenchPartReference partRef) {		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public synchronized void partClosed(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partDeactivated(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partOpened(IWorkbenchPartReference partRef) {		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partHidden(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partVisible(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partInputChanged(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextEventListener#contextEvent(org.eclipse.debug.internal.ui.contexts.provisional.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if (!fProviders.isEmpty()) {
-			IDebugContextProvider provider = (IDebugContextProvider) fProviders.get(0);
-			if (provider == event.getDebugContextProvider()) {
-				notify(event);
-			}
-		}	
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/LaunchSuspendTrigger.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/LaunchSuspendTrigger.java
deleted file mode 100644
index 08dd151..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/LaunchSuspendTrigger.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.contexts;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.contexts.ISuspendTrigger;
-import org.eclipse.debug.ui.contexts.ISuspendTriggerListener;
-
-/**
- * @since 3.2
- */
-public class LaunchSuspendTrigger implements ISuspendTrigger, IDebugEventSetListener {
-
-	private ListenerList fListeners = new ListenerList();
-	private SuspendTriggerAdapterFactory fFactory = null;
-	private ILaunch fLaunch = null;
-	
-	public LaunchSuspendTrigger(ILaunch launch, SuspendTriggerAdapterFactory factory) {
-		fFactory = factory;
-		fLaunch = launch;
-		DebugPlugin.getDefault().addDebugEventListener(this);
-	}
-	
-	public ILaunch getLaunch() {
-		return fLaunch;
-	}
-	
-	protected void dispose() {
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-		fListeners = null;
-		fFactory.dispose(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.ISuspendTrigger#addSuspendTriggerListener(org.eclipse.debug.ui.contexts.ISuspendTriggerListener)
-	 */
-	public void addSuspendTriggerListener(ISuspendTriggerListener listener) {
-        if (fListeners != null) {
-            fListeners.add(listener);
-        }
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.ISuspendTrigger#removeSuspendTriggerListener(org.eclipse.debug.ui.contexts.ISuspendTriggerListener)
-	 */
-	public void removeSuspendTriggerListener(ISuspendTriggerListener listener) { 
-        if (fListeners != null) {
-            fListeners.remove(listener);
-        }
-        if (fListeners.size() == 0) {
-        	dispose();
-        }
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		// open the debugger if this is a suspend event and the debug view is not yet open
-		// and the preferences are set to switch
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
-			if (event.getKind() == DebugEvent.SUSPEND && !event.isEvaluation() && event.getDetail() != DebugEvent.STEP_END) {
-//				 Don't switch perspective for evaluations or stepping
-				Object source = event.getSource();
-				if (source instanceof IAdaptable) {
-					IAdaptable adaptable = (IAdaptable) source;
-					ILaunch launch = (ILaunch) adaptable.getAdapter(ILaunch.class);
-					if (fLaunch.equals(launch)) {
-						// only notify for this launch
-						notifySuspend(event);						
-					}
-				}
-
-			}
-		}
-	}
-
-	/**
-	 * @param event
-	 */
-	private void notifySuspend(DebugEvent event) {
-		Object source = event.getSource();
-		if (source instanceof IDebugElement) {
-			final ILaunch launch = ((IDebugElement)source).getLaunch();
-			Object context = null;
-			if (source instanceof IThread) {
-				try {
-					context = ((IThread)source).getTopStackFrame();
-				} catch (DebugException e) {
-				}
-			} else if (source instanceof IDebugTarget) {
-				context = source;
-			}
-			final Object temp = context;
-            ListenerList list = fListeners;
-            if (list != null) {
-                Object[] listeners = list.getListeners();
-        		for (int i = 0; i < listeners.length; i++) {
-        			final ISuspendTriggerListener listener = (ISuspendTriggerListener) listeners[i];
-        			SafeRunner.run(new ISafeRunnable() {
-        				public void run() throws Exception {
-        					listener.suspended(launch, temp);
-        				}
-        			
-        				public void handleException(Throwable exception) {
-        					DebugUIPlugin.log(exception);
-        				}
-        			
-        			}); 			
-        		}
-            }
-
-		}
-		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/SuspendTriggerAdapterFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/SuspendTriggerAdapterFactory.java
deleted file mode 100644
index 27c0268..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/contexts/SuspendTriggerAdapterFactory.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.debug.internal.ui.contexts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.ui.contexts.ISuspendTrigger;
-
-/**
- * @since 3.2
- */
-public class SuspendTriggerAdapterFactory implements IAdapterFactory {
-	
-	private Map fSuspendTriggers = new HashMap(); 
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public synchronized Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adapterType.equals(ISuspendTrigger.class)) {
-			if (adaptableObject instanceof ILaunch) {
-				Object trigger = fSuspendTriggers.get(adaptableObject);
-				if (trigger == null) {
-					trigger = new LaunchSuspendTrigger((ILaunch) adaptableObject, this);
-					fSuspendTriggers.put(adaptableObject, trigger);
-				}
-				return trigger;
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[]{ISuspendTrigger.class};
-	}
-	
-	public synchronized void dispose(LaunchSuspendTrigger trigger) {
-		fSuspendTriggers.remove(trigger.getLaunch());
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AsynchronousDebugLabelAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AsynchronousDebugLabelAdapter.java
deleted file mode 100644
index 7f84fba..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AsynchronousDebugLabelAdapter.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.LazyModelPresentation;
-import org.eclipse.debug.internal.ui.viewers.PartPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousLabelAdapter;
-import org.eclipse.debug.internal.ui.viewers.provisional.ILabelRequestMonitor;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementHelper;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Asynchronous label adapter for debug elements.
- * 
- * @since 3.2
- */
-public class AsynchronousDebugLabelAdapter extends AsynchronousLabelAdapter {
-	      
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousLabelAdapter#computeLabels(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext, org.eclipse.debug.ui.viewers.ILabelRequestMonitor)
-	 */
-	protected void computeLabels(Object element, IPresentationContext context, ILabelRequestMonitor monitor) {
-    	DelegatingModelPresentation presentation = DebugElementHelper.getPresentation();
-    	// Honor view specific settings in a debug view by copying model presentation settings
-    	// into the debug element helper's presentation before we get the label. This allows
-    	// for qualified name and type name settings to remain in tact.
-    	if (context instanceof PartPresentationContext) {
-    		PartPresentationContext ppc = (PartPresentationContext) context;
-	    	if (element instanceof IDebugElement && ppc.getPart() instanceof IDebugView) {
-	    		IWorkbenchPart part = ppc.getPart();
-	    		if (part instanceof IDebugView) {
-	    			IDebugModelPresentation pres = ((IDebugView)part).getPresentation(((IDebugElement)element).getModelIdentifier());
-	    			Map settings = null;
-		    		synchronized (presentation) {
-		    			if (pres instanceof DelegatingModelPresentation) {
-		    				settings = ((DelegatingModelPresentation)pres).getAttributes();
-		    			} else if (pres instanceof LazyModelPresentation) {
-		    				settings = ((LazyModelPresentation)pres).getAttributes();
-		    			}
-		    			if (settings != null) {
-				    		Iterator iterator = settings.entrySet().iterator();
-				    		while (iterator.hasNext()) {
-				    			Map.Entry entry = (Entry) iterator.next();
-				    			presentation.setAttribute((String) entry.getKey(), entry.getValue());
-				    		}
-				        	super.computeLabels(element, context, monitor);
-				        	return;
-		    			}
-		    		}
-		    	}
-			}
-    	}
-    	super.computeLabels(element, context, monitor);
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousLabelAdapter#getLabels(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	protected String[] getLabels(Object element, IPresentationContext context) throws CoreException {
-		return new String[] {DebugElementHelper.getLabel(element)};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousLabelAdapter#getImageDescriptors(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	protected ImageDescriptor[] getImageDescriptors(Object element, IPresentationContext context) throws CoreException {
-		return new ImageDescriptor[] {DebugElementHelper.getImageDescriptor(element)};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousLabelAdapter#getFontDatas(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	protected FontData[] getFontDatas(Object element, IPresentationContext context) throws CoreException {
-		FontData[] datas = new FontData[getNumElements(context)];
-		Arrays.fill(datas, DebugElementHelper.getFont(element));
-		return datas;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousLabelAdapter#getForegrounds(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	protected RGB[] getForegrounds(Object element, IPresentationContext context) throws CoreException {
-		RGB[] rgbs = new RGB[getNumElements(context)];
-		Arrays.fill(rgbs, DebugElementHelper.getForeground(element));
-		return rgbs;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousLabelAdapter#getBackgrounds(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	protected RGB[] getBackgrounds(Object element, IPresentationContext context) throws CoreException {
-		RGB[] rgbs = new RGB[getNumElements(context)];
-		Arrays.fill(rgbs, DebugElementHelper.getBackground(element));
-		return rgbs;
-	}
-	
-	/**
-	 * Returns the number of columns in the given presentation context, or 1
-	 * if there are no columns.
-	 * 
-	 * @param context presentation context
-	 * @return number of columns or 1 if none
-	 */
-	protected int getNumElements(IPresentationContext context) {
-		String[] columns = context.getColumns();
-		if (columns == null) {
-			return 1;
-		} 
-		return columns.length;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultVariableCellModifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultVariableCellModifier.java
deleted file mode 100644
index 346efdc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultVariableCellModifier.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.debug.internal.ui.elements.adapters;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DefaultLabelProvider;
-import org.eclipse.debug.internal.ui.actions.variables.details.DetailPaneAssignValueAction;
-import org.eclipse.jface.viewers.ICellModifier;
-
-/**
- * @since 3.2
- *
- */
-public class DefaultVariableCellModifier implements ICellModifier {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-	 */
-	public boolean canModify(Object element, String property) {
-		if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
-			if (element instanceof IVariable) {
-				return ((IVariable) element).supportsValueModification();
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-	 */
-	public Object getValue(Object element, String property) {
-		if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
-			if (element instanceof IVariable) {
-				IVariable variable = (IVariable) element;
-				try {
-					return DefaultLabelProvider.escapeSpecialChars(variable.getValue().getValueString());
-				} catch (DebugException e) {
-					DebugUIPlugin.log(e);
-				}
-			}
-		}
-		return null;
-	}
-
-	/* (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) {
-		Object oldValue = getValue(element, property);
-        if (!value.equals(oldValue)) {
-        	if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
-				if (element instanceof IVariable) {
-					if (value instanceof String) {
-						// The value column displays special characters escaped, so encode the string with any special characters escaped properly
-						String valueExpression = DefaultLabelProvider.encodeEsacpedChars((String)value);
-						IVariable variable = (IVariable) element;
-						DetailPaneAssignValueAction.assignValue(DebugUIPlugin.getShell(), variable, valueExpression);						
-					}
-				}
-	        }
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java
deleted file mode 100644
index 9dbd331..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockContentAdapter.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.internal.ui.views.memory.renderings.MemorySegment;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingContentDescriptor;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-
-public class MemoryBlockContentAdapter extends AsynchronousContentAdapter {
-
-	// Cache to allow the content provider to comppute change information
-	// Cache is taken by copying the lineCache after a suspend event
-	// or change event from the the memory block.
-	protected Hashtable contentCache;
-	
-	public MemoryBlockContentAdapter()
-	{
-		contentCache = new Hashtable();
-	}
-
-	protected Object[] getChildren(Object parent, IPresentationContext context)
-			throws CoreException {
-		
-		if (!(parent instanceof IMemoryBlock))
-			return new Object[0];
-		
-		if (!(context instanceof MemoryViewPresentationContext))
-			return new Object[0];
-		
-		MemoryViewPresentationContext memoryViewContext = (MemoryViewPresentationContext)context; 
-		IMemoryRendering rendering = memoryViewContext.getRendering();
-		
-		if (!(rendering instanceof AbstractAsyncTableRendering))
-			return new Object[0];
-			
-		try 
-		{
-			return getMemoryFromMemoryBlock(memoryViewContext);
-		} catch (DebugException e) {
-			throw e;
-		}			
-
-	}
-
-	protected boolean hasChildren(Object element, IPresentationContext context)
-			throws CoreException {
-		
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			if (((MemoryViewPresentationContext)context).getRendering() != null)
-				return true;
-		}
-		
-		return false;
-	}
-
-	protected boolean supportsPartId(String id) {
-		return true;
-	}
-	
-	
-	private Object[] getMemoryFromMemoryBlock(MemoryViewPresentationContext context) throws DebugException {
-		IMemoryBlock memoryBlock = context.getRendering().getMemoryBlock();
-		if (memoryBlock instanceof IMemoryBlockExtension)
-		{
-			return loadContentForExtendedMemoryBlock(context);
-		}
-
-		return loadContentForSimpleMemoryBlock(context);
-		
-	}
-
-	/**
-	 * @throws DebugException
-	 */
-	public Object[] loadContentForSimpleMemoryBlock(MemoryViewPresentationContext context) throws DebugException {
-		AbstractAsyncTableRendering rendering = getTableRendering(context);
-		if (rendering != null)
-		{
-			IMemoryBlock memoryBlock = rendering.getMemoryBlock();
-			long startAddress = memoryBlock.getStartAddress();
-			BigInteger address = BigInteger.valueOf(startAddress);
-			long length = memoryBlock.getLength();
-			long numLines = length / rendering.getBytesPerLine();
-			return getMemoryToFitTable(address, numLines,  context);
-		}
-		return EMPTY;
-	}
-
-	/**
-	 * @throws DebugException
-	 */
-	public Object[] loadContentForExtendedMemoryBlock(MemoryViewPresentationContext context) throws DebugException {
-		
-		AbstractAsyncTableRendering rendering = getTableRendering(context);
-		if (rendering != null)
-		{
-			TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)rendering.getAdapter(TableRenderingContentDescriptor.class);
-			
-			if (descriptor == null)
-				return new Object[0];
-			
-			if (descriptor.getNumLines() <= 0)
-				return new Object[0];
-			
-			// calculate top buffered address
-			BigInteger loadAddress = descriptor.getLoadAddress();
-			if (loadAddress == null)
-			{
-				loadAddress = new BigInteger("0"); //$NON-NLS-1$
-			}
-			
-			BigInteger mbStart = descriptor.getStartAddress();
-			BigInteger mbEnd = descriptor.getEndAddress();
-			
-			// check that the load address is within range
-			if (loadAddress.compareTo(mbStart) < 0 || loadAddress.compareTo(mbEnd) > 0)
-			{
-				// default load address to memory block base address
-				loadAddress = ((IMemoryBlockExtension)descriptor.getMemoryBlock()).getBigBaseAddress();
-				descriptor.setLoadAddress(loadAddress);
-			}
-			
-			// if address is still out of range, throw an exception
-			if (loadAddress.compareTo(mbStart) < 0 || loadAddress.compareTo(mbEnd) > 0)
-			{
-				throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_0 + loadAddress.toString(16), null));
-			}
-			
-			int addressableUnitsPerLine = rendering.getAddressableUnitPerLine();
-			BigInteger bufferStart = loadAddress.subtract(BigInteger.valueOf(descriptor.getPreBuffer()*addressableUnitsPerLine));
-			BigInteger bufferEnd = loadAddress.add(BigInteger.valueOf(descriptor.getPostBuffer()*addressableUnitsPerLine));
-			bufferEnd = bufferEnd.add(BigInteger.valueOf(descriptor.getNumLines()*addressableUnitsPerLine));
-			
-			// TODO:  should rely on input to tell us what to load
-			// instead of having the content adapter override the setting
-			if (descriptor.isDynamicLoad())
-			{
-				if (bufferStart.compareTo(mbStart) < 0)
-					bufferStart = mbStart;
-				
-				if (bufferEnd.compareTo(mbEnd) > 0)
-				{
-					bufferEnd = mbEnd;
-					
-					int numLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue();
-					if (numLines < descriptor.getNumLines())
-					{
-						// re-calculate buffer start since we may not have enough lines to popoulate the view
-						bufferStart = bufferEnd.subtract(BigInteger.valueOf(descriptor.getNumLines()*addressableUnitsPerLine));
-						bufferStart = bufferStart.subtract(BigInteger.valueOf(descriptor.getPreBuffer()*addressableUnitsPerLine));
-					}
-				}
-				
-				// buffer end must be greater than buffer start
-				if (bufferEnd.compareTo(bufferStart) <= 0)
-					throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_1, null));
-				
-				int numLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue()+1;		
-				// get stoarage to fit the memory view tab size
-				return getMemoryToFitTable(bufferStart, numLines,context);
-			}
-			else
-			{
-				if (bufferStart.compareTo(mbStart) < 0)
-					bufferStart = mbStart;
-				
-				if (bufferEnd.compareTo(mbEnd) > 0)
-				{
-					bufferStart = mbEnd.subtract(BigInteger.valueOf((descriptor.getNumLines()-1)*addressableUnitsPerLine));
-				}
-				
-				// buffer end must be greater than buffer start
-				if (bufferEnd.compareTo(bufferStart) <= 0)
-					throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_2, null));
-				
-				int numLines = descriptor.getNumLines();	
-				// get stoarage to fit the memory view tab size
-				return getMemoryToFitTable(bufferStart, numLines,  context);
-			}
-		}
-		return EMPTY;
-	}
-	
-	/**
-	 * Get memory to fit table
-	 * @param startingAddress
-	 * @param numberOfLines
-	 * @param updateDelta
-	 * @throws DebugException
-	 */
-	public Object[]  getMemoryToFitTable(BigInteger startAddress, long numberOfLines, MemoryViewPresentationContext context) throws DebugException
-	{
-		AbstractAsyncTableRendering tableRendering = getTableRendering(context);	
-		if (tableRendering == null)
-		{
-			DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));
-			throw e;
-		}
-		
-		TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)tableRendering.getAdapter(TableRenderingContentDescriptor.class);
-		if(descriptor == null)
-			return new Object[0];
-		
-		// do not ask for memory from memory block if the debug target
-		// is already terminated
-		IDebugTarget target = descriptor.getMemoryBlock().getDebugTarget();
-		
-		if (target.isDisconnected() || target.isTerminated())
-			return new Object[0];
-		
-		boolean error = false;
-		DebugException dbgEvt = null;
-		
-		String adjustedAddress = startAddress.toString(16);
-
-		// align to the closest boundary based on addressable size per line
-		if (descriptor.isAlignAddressToBoundary() &&  descriptor.getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			startAddress = MemoryViewUtil.alignToBoundary(startAddress, tableRendering.getAddressableUnitPerLine());
-		}
-
-		IMemoryBlockExtension extMemoryBlock = null;
-		MemoryByte[] memoryBuffer = null;
-		
-		long reqNumBytes = 0;
-		try
-		{
-			
-			if (descriptor.getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				reqNumBytes = tableRendering.getBytesPerLine() * numberOfLines;
-				// get memory from memory block
-				extMemoryBlock = (IMemoryBlockExtension) descriptor.getMemoryBlock();
-				
-				long reqNumberOfUnits = tableRendering.getAddressableUnitPerLine() * numberOfLines;
-						
-				memoryBuffer =	extMemoryBlock.getBytesFromAddress(startAddress,	reqNumberOfUnits);
-		
-				if(memoryBuffer == null)
-				{
-					DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));
-					throw e;
-				}
-			}
-			else 
-			{				
-				// get memory from memory block
-				byte[] memory = descriptor.getMemoryBlock().getBytes();
-				
-				if (memory == null)
-				{
-					DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));	
-					throw e;					
-				}
-				
-				int prefillNumBytes = 0;
-				
-				// number of bytes need to prefill
-				if (!startAddress.toString(16).endsWith("0")) //$NON-NLS-1$
-				{
-					adjustedAddress = startAddress.toString(16).substring(0, adjustedAddress.length() - 1);
-					adjustedAddress += "0"; //$NON-NLS-1$
-					BigInteger adjustedStart = new BigInteger(adjustedAddress, 16);
-					prefillNumBytes = startAddress.subtract(adjustedStart).intValue();
-					startAddress = adjustedStart;
-				}
-				reqNumBytes = descriptor.getMemoryBlock().getLength() + prefillNumBytes;
-				
-				// figure out number of dummy bytes to append
-				while (reqNumBytes % tableRendering.getBytesPerLine() != 0)
-				{
-					reqNumBytes ++;
-				}
-				
-				numberOfLines = reqNumBytes / tableRendering.getBytesPerLine();
-				
-				// create memory byte for IMemoryBlock
-				memoryBuffer = new MemoryByte[(int)reqNumBytes];
-				
-				// prefill buffer to ensure double-word alignment
-				for (int i=0; i<prefillNumBytes; i++)
-				{
-					MemoryByte tmp = new MemoryByte();
-					tmp.setValue((byte)0);
-					tmp.setWritable(false);
-					tmp.setReadable(false);
-					tmp.setEndianessKnown(false);
-					memoryBuffer[i] = tmp;
-				}
-				
-				// fill buffer with memory returned by debug adapter
-				int j = prefillNumBytes; 							// counter for memoryBuffer
-				for (int i=0; i<memory.length; i++)
-				{
-					MemoryByte tmp = new MemoryByte();
-					tmp.setValue(memory[i]);
-					tmp.setReadable(true);
-					tmp.setWritable(true);
-					tmp.setEndianessKnown(false);
-					memoryBuffer[j] = tmp;
-					j++;
-				}
-				
-				// append to buffer to fill up the entire line
-				for (int i=j; i<memoryBuffer.length; i++)
-				{
-					MemoryByte tmp = new MemoryByte();
-					tmp.setValue((byte)0);
-					tmp.setWritable(false);
-					tmp.setReadable(false);
-					tmp.setEndianessKnown(false);
-					memoryBuffer[i] = tmp;
-				}
-			}
-		}
-		catch (DebugException e)
-		{
-			memoryBuffer = makeDummyContent(numberOfLines, tableRendering.getBytesPerLine());
-			
-			// finish creating the content provider before throwing an event
-			error = true; 
-			dbgEvt = e;
-		}
-		catch (Throwable e)
-		{
-			// catch all errors from this process just to be safe
-			memoryBuffer = makeDummyContent(numberOfLines, tableRendering.getBytesPerLine());
-			
-			// finish creating the content provider before throwing an event
-			error = true; 
-			dbgEvt = new DebugException(DebugUIPlugin.newErrorStatus(e.getMessage(), e));
-		}
-		
-		// if debug adapter did not return enough memory, create dummy memory
-		if (memoryBuffer.length < reqNumBytes)
-		{
-			ArrayList newBuffer = new ArrayList();
-			
-			for (int i=0; i<memoryBuffer.length; i++)
-			{
-				newBuffer.add(memoryBuffer[i]);
-			}
-			
-			for (int i=memoryBuffer.length; i<reqNumBytes; i++)
-			{
-				MemoryByte mb = new MemoryByte();
-				mb.setReadable(false);
-				mb.setWritable(false);
-				mb.setEndianessKnown(false);
-				newBuffer.add(mb);
-			}
-			
-			memoryBuffer = (MemoryByte[])newBuffer.toArray(new MemoryByte[newBuffer.size()]);
-			
-		}
-
-		boolean manageDelta = true;
-		
-		// If change information is not managed by the memory block
-		// The view tab will manage it and calculate delta information
-		// for its content cache.
-		if (descriptor.getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			manageDelta = !((IMemoryBlockExtension)descriptor.getMemoryBlock()).supportsChangeManagement();
-		}
-			
-		if (error){
-			throw dbgEvt;
-		}
-		
-		// put memory information into MemoryViewLine
-		return organizeLines(numberOfLines, memoryBuffer, startAddress, manageDelta, context);
-		
-
-	}
-
-	private Object[] organizeLines(long numberOfLines,  MemoryByte[] memoryBuffer, BigInteger address, boolean manageDelta, MemoryViewPresentationContext context) 
-	{
-		Vector lineCache = new Vector();
-		IMemoryRendering rendering = context.getRendering();
-		if (!(rendering instanceof AbstractAsyncTableRendering))
-			return lineCache.toArray();
-		
-		AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)rendering;
-		int addressableUnit = tableRendering.getBytesPerLine()/tableRendering.getAddressableSize();
-		
-		for (int i = 0; i < numberOfLines; i++)
-		{   
-			int bytesPerLine = tableRendering.getBytesPerLine();
-			MemoryByte[] memory = new MemoryByte[bytesPerLine];
-			
-			// counter for memory, starts from 0 to number of bytes per line
-			int k = 0;
-			// j is the counter for memArray, memory returned by debug adapter
-			for (int j = i * bytesPerLine;
-				j < i * bytesPerLine + bytesPerLine;
-				j++)
-			{
-				
-				byte changeFlag = memoryBuffer[j].getFlags();
-				if (manageDelta)
-				{
-					// turn off both change and known bits to make sure that
-					// the change bits returned by debug adapters do not take
-					// any effect
-					
-					changeFlag |= MemoryByte.HISTORY_KNOWN;
-					changeFlag ^= MemoryByte.HISTORY_KNOWN;
-					
-					changeFlag |= MemoryByte.CHANGED;
-					changeFlag ^= MemoryByte.CHANGED;
-				}
-				
-				MemoryByte newByteObj = new MemoryByte(memoryBuffer[j].getValue(), changeFlag);
-				memory[k] =  newByteObj;
-				k++;
-			}
-			
-			MemorySegment newLine = new MemorySegment(address, memory, addressableUnit);
-			lineCache.add(newLine);
-			address = address.add(BigInteger.valueOf(addressableUnit));
-		}
-		return lineCache.toArray();
-	}
-	
-	/**
-	 * @param numberOfLines
-	 * @return an array of dummy MemoryByte
-	 */
-	private MemoryByte[] makeDummyContent(long numberOfLines, int bytesPerLine) {
-		MemoryByte[] memoryBuffer;
-		// make up dummy memory, needed for recovery in case the debug adapter
-		// is capable of retrieving memory again
-
-		int numBytes = (int)(bytesPerLine * numberOfLines);
-		memoryBuffer = new MemoryByte[numBytes];
-		
-		for (int i=0; i<memoryBuffer.length; i++){
-			memoryBuffer[i] = new MemoryByte();
-			memoryBuffer[i].setValue((byte)0);
-			memoryBuffer[i].setWritable(false);
-			memoryBuffer[i].setReadable(false);
-			memoryBuffer[i].setEndianessKnown(false);
-		}
-		return memoryBuffer;
-	}
-	
-	protected AbstractAsyncTableRendering getTableRendering(MemoryViewPresentationContext context)
-	{
-		IMemoryRendering memRendering = context.getRendering();
-		if (memRendering != null && memRendering instanceof AbstractAsyncTableRendering)
-		{
-			return (AbstractAsyncTableRendering)memRendering;
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockLabelAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockLabelAdapter.java
deleted file mode 100644
index 6e9c3c1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryBlockLabelAdapter.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.debug.internal.ui.elements.adapters;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-public class MemoryBlockLabelAdapter extends AsynchronousDebugLabelAdapter {
-	
-	protected ImageDescriptor[] getImageDescriptors(Object element, IPresentationContext context) throws CoreException {
-		if (element instanceof IMemoryBlock)
-			return new ImageDescriptor[]{DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_OBJS_VARIABLE)};
-		
-		return new ImageDescriptor[0];
-	}
-
-	/**
-	 * @param memoryBlockLabel
-	 * @return
-	 */
-	private String getLabel(IMemoryBlock memoryBlock) {
-		
-		String memoryBlockLabel = " "; //$NON-NLS-1$
-		if (memoryBlock instanceof IMemoryBlockExtension)
-		{
-			// simply return the expression without the address
-			// do not want to keep track of changes in the address
-			if (((IMemoryBlockExtension)memoryBlock).getExpression() != null)
-			{
-				memoryBlockLabel += ((IMemoryBlockExtension)memoryBlock).getExpression();
-			}
-		}
-		else
-		{
-			long address = memoryBlock.getStartAddress();
-			memoryBlockLabel = Long.toHexString(address);
-		}
-		return memoryBlockLabel;
-	}
-
-	protected String[] getLabels(Object element, IPresentationContext context) throws CoreException {
-		if (element instanceof IMemoryBlock)
-			return new String[]{getLabel((IMemoryBlock)element)};
-		return super.getLabels(element, context);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryRetrievalContentAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryRetrievalContentAdapter.java
deleted file mode 100644
index eb96392..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemoryRetrievalContentAdapter.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.debug.internal.ui.elements.adapters;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-public class MemoryRetrievalContentAdapter extends AsynchronousContentAdapter{
-
-	protected Object[] getChildren(Object parent, IPresentationContext context) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-        {
-			if (parent instanceof IMemoryBlockRetrieval)
-			{
-        		return DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks((IMemoryBlockRetrieval)parent);
-			}
-        }
-		return EMPTY;
-	}
-
-	protected boolean hasChildren(Object element, IPresentationContext context) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-        {
-			if (element instanceof IMemoryBlockRetrieval)
-			{
-				if (((IMemoryBlockRetrieval)element).supportsStorageRetrieval())
-        			return DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks((IMemoryBlockRetrieval)element).length > 0;
-			}
-        }
-        return false;
-	}
-
-	protected boolean supportsPartId(String id) {
-		return id.equals(IDebugUIConstants.ID_MEMORY_VIEW);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemorySegmentLabelAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemorySegmentLabelAdapter.java
deleted file mode 100644
index 5420361..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/MemorySegmentLabelAdapter.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousLabelAdapter;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementHelper;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AbstractBaseTableRendering;
-import org.eclipse.debug.internal.ui.views.memory.renderings.MemorySegment;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingContentDescriptor;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.IMemoryBlockTablePresentation;
-import org.eclipse.debug.ui.memory.MemoryRenderingElement;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-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.graphics.RGB;
-
-public class MemorySegmentLabelAdapter extends AsynchronousLabelAdapter {
-
-	protected String[] getLabels(Object element, IPresentationContext context)
-			throws CoreException {
-		
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext tableRenderingContext = (MemoryViewPresentationContext)context;
-			if (tableRenderingContext.getRendering() != null && tableRenderingContext.getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)tableRenderingContext.getRendering();
-				TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)tableRendering.getAdapter(TableRenderingContentDescriptor.class);
-				if (descriptor != null)
-				{
-					String addressStr = getColumnText(element, 0, tableRendering, descriptor);
-					int numColumns = tableRendering.getAddressableUnitPerLine() / tableRendering.getAddressableUnitPerColumn();
-					
-					String[] labels = new String[numColumns+2];
-					labels[0] = addressStr;
-					
-					for (int i=0; i<=numColumns; i++)
-					{
-						labels[i+1] = getColumnText(element, i+1, tableRendering, (TableRenderingContentDescriptor)tableRendering.getAdapter(TableRenderingContentDescriptor.class));
-					}
-					
-					labels[labels.length - 1 ] = ""; //$NON-NLS-1$
-					return labels;
-				}
-			}
-		}
-		return new String[0];
-	}
-	
-	private String getColumnText(Object element, int columnIndex, AbstractAsyncTableRendering tableRendering, TableRenderingContentDescriptor descriptor) {
-		String columnLabel = null;
-
-		if (columnIndex == 0)
-		{
-			IMemoryBlockTablePresentation presentation = (IMemoryBlockTablePresentation)tableRendering.getMemoryBlock().getAdapter(IMemoryBlockTablePresentation.class);
-			if (presentation != null)
-			{
-				String rowLabel = presentation.getRowLabel(tableRendering.getMemoryBlock(), ((MemorySegment)element).getAddress());
-				if (rowLabel != null)
-					return rowLabel;
-			}
-			
-			columnLabel = ((MemorySegment)element).getAddress().toString(16).toUpperCase();
-			
-			int addressSize = descriptor.getAddressSize();
-			int prefillLength = addressSize * 2 - columnLabel.length();
-			StringBuffer buf = new StringBuffer();
-			if (prefillLength > 0)
-			{
-				for (int i=0; i<prefillLength; i++)
-				{
-					buf.append("0"); //$NON-NLS-1$
-				}
-			}
-			buf.append(columnLabel);
-			return buf.toString();
-			
-		}
-		else if (columnIndex > (tableRendering.getBytesPerLine()/tableRendering.getBytesPerColumn()))
-		{
-			columnLabel = " "; //$NON-NLS-1$
-		}
-		else
-		{	
-			if (element instanceof MemorySegment)
-			{
-				MemorySegment segment = (MemorySegment)element;
-				if (segment.getBytes().length != tableRendering.getBytesPerLine())
-					return ""; //$NON-NLS-1$
-			}
-			
-			ILabelProvider labelProvider = (ILabelProvider)tableRendering.getAdapter(ILabelProvider.class);
-			if (labelProvider != null && columnIndex > 0)
-			{
-				MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex, tableRendering);
-				if (renderingElement != null) {
-					String label = labelProvider.getText(renderingElement);
-					if (label != null)
-						return label;
-				}			
-			}
-			
-			int start = (columnIndex-1)*tableRendering.getBytesPerColumn();
-			MemoryByte[] bytes = ((MemorySegment)element).getBytes(start, tableRendering.getBytesPerColumn());
-			BigInteger address = ((MemorySegment)element).getAddress();
-			address = address.add(BigInteger.valueOf(start)); 
-			
-			columnLabel = tableRendering.getString(tableRendering.getRenderingId(), address, bytes);
-		}
-		return columnLabel;
-	}
-
-	protected ImageDescriptor[] getImageDescriptors(Object element,
-			IPresentationContext context) throws CoreException {
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext tableRenderingContext = (MemoryViewPresentationContext)context;
-			if (tableRenderingContext.getRendering() != null && tableRenderingContext.getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)tableRenderingContext.getRendering();
-				int numColumns = tableRendering.getAddressableUnitPerLine() / tableRendering.getAddressableUnitPerColumn();
-				
-				ImageDescriptor[] images = new ImageDescriptor[numColumns+2];
-				
-				for (int i=0; i<=numColumns; i++)
-				{
-					images[i] = getColumnImageDescriptor(element, i, tableRendering);
-				}
-				
-				images[images.length - 1 ] = null;
-				return images;
-			}
-		}
-		return new ImageDescriptor[0];
-	}
-	
-	private ImageDescriptor getColumnImageDescriptor(Object element, int columnIndex, AbstractAsyncTableRendering tableRendering)
-	{
-		if (columnIndex == 0)
-			return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
-		
-		if (element instanceof MemorySegment)
-		{
-			MemorySegment segment = (MemorySegment)element;
-			if (segment.getBytes().length != tableRendering.getBytesPerLine())
-				return null;
-			
-			ILabelProvider labelProvider = (ILabelProvider)tableRendering.getAdapter(ILabelProvider.class);
-			if (labelProvider != null && columnIndex > 0)
-			{
-				MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex, tableRendering);
-				if (renderingElement != null) {
-					Image image = labelProvider.getImage(renderingElement);
-					if (image != null)
-					{
-						return DebugElementHelper.getImageDescriptor(image);
-					}
-				}			
-			}
-			
-			int start = (columnIndex-1)*tableRendering.getBytesPerColumn();
-
-			MemoryByte[] bytes = ((MemorySegment)element).getBytes(start, tableRendering.getBytesPerColumn());
-			boolean allKnown = true;
-			boolean unchanged = true;
-			for (int i=0; i<bytes.length; i++)
-			{
-				if (!bytes[i].isHistoryKnown())
-					allKnown = false;
-				
-				if (bytes[i].isChanged())
-					unchanged = false;
-			}
-			
-			if (allKnown)
-			{
-				// mark changed elements with changed icon
-				if (!unchanged)
-					return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_OBJECT_MEMORY_CHANGED);
-				
-			}
-		}
-		return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);
-	}
-
-	protected FontData[] getFontDatas(Object element,
-			IPresentationContext context) throws CoreException {
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext tableRenderingContext = (MemoryViewPresentationContext)context;
-			if (tableRenderingContext.getRendering() != null && tableRenderingContext.getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)tableRenderingContext.getRendering();
-				int numColumns = tableRendering.getAddressableUnitPerLine() / tableRendering.getAddressableUnitPerColumn();
-				
-				FontData[] fontData = new FontData[numColumns+2];
-
-				for (int i=0; i<fontData.length-1; i++)
-				{
-					fontData[i] = getColumnFontData(element, i, tableRendering);
-				}
-				return fontData;
-			}
-		}
-		
-		return new FontData[0];
-	}
-	
-	private FontData getColumnFontData(Object element, int columnIndex, AbstractAsyncTableRendering tableRendering) 
-	{
-		if (element instanceof MemorySegment)
-		{	
-			MemorySegment segment = (MemorySegment)element;
-			if (segment.getBytes().length != tableRendering.getBytesPerLine())
-				return null;
-			
-			IFontProvider fontProvider = (IFontProvider)tableRendering.getAdapter(IFontProvider.class);
-			if (fontProvider != null && columnIndex > 0)
-			{
-				MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex, tableRendering);
-				if (renderingElement != null) {
-					Font font = fontProvider.getFont(renderingElement);
-					if (font != null)
-						return font.getFontData()[0];
-				}			
-			}
-		}
-		return null;
-	}
-
-	protected RGB[] getForegrounds(Object element, IPresentationContext context)
-			throws CoreException {
-		
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext tableRenderingContext = (MemoryViewPresentationContext)context;
-			if (tableRenderingContext.getRendering() != null && tableRenderingContext.getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)tableRenderingContext.getRendering();
-				int numColumns = tableRendering.getAddressableUnitPerLine() / tableRendering.getAddressableUnitPerColumn();
-				
-				RGB[] colors = new RGB[numColumns+2];
-
-				for (int i=0; i<colors.length-1; i++)
-				{
-					colors[i] = getColumnForeground(element, i, tableRendering);
-				}
-				
-				colors[colors.length-1] = null;
-				
-				return colors;
-			}
-		}
-
-		return new RGB[0];
-	}
-	
-	private RGB getColumnBackground(Object element, int columnIndex, AbstractAsyncTableRendering tableRendering)
-	{
-		if (columnIndex == 0)
-			return null;
-		
-		if (element instanceof MemorySegment)
-		{	
-			MemorySegment segment = (MemorySegment)element;
-			if (segment.getBytes().length != tableRendering.getBytesPerLine())
-				return null;
-			
-			IColorProvider colorProvider = (IColorProvider)tableRendering.getAdapter(IColorProvider.class);
-			if (colorProvider != null && columnIndex > 0)
-			{
-				MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex, tableRendering);
-				if (renderingElement != null) {
-					Color color = colorProvider.getBackground(renderingElement);
-					if (color != null)
-						return color.getRGB();
-				}			
-			}
-		}
-		return null;
-	}
-	
-	private RGB getColumnForeground(Object element, int columnIndex, AbstractAsyncTableRendering tableRendering)
-	{
-		if (columnIndex == 0)
-			return null;
-		
-		if (element instanceof MemorySegment)
-		{	
-			MemorySegment segment = (MemorySegment)element;
-			if (segment.getBytes().length != tableRendering.getBytesPerLine())
-				return null;
-			
-			IColorProvider colorProvider = (IColorProvider)tableRendering.getAdapter(IColorProvider.class);
-			if (colorProvider != null && columnIndex > 0)
-			{
-				MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex, tableRendering);
-				if (renderingElement != null) {
-					Color color = colorProvider.getForeground(renderingElement);
-					if (color != null)
-						return color.getRGB();
-				}			
-			}
-			
-			int start = (columnIndex-1)*tableRendering.getBytesPerColumn();
-			MemoryByte[] bytes = segment.getBytes(start, tableRendering.getBytesPerColumn());
-			boolean allKnown = true;
-			boolean unchanged = true;
-			for (int i=0; i<bytes.length; i++)
-			{
-				if (!bytes[i].isHistoryKnown())
-					allKnown = false;
-				
-				if (bytes[i].isChanged())
-					unchanged = false;
-			}
-			
-			if (allKnown)
-			{
-				// mark changed elements in changed color
-				if (!unchanged)
-					return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR).getRGB();				
-				
-				return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR).getRGB();
-			}
-			
-			return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR).getRGB();
-			
-		}
-		return null;
-	}
-
-	protected RGB[] getBackgrounds(Object element, IPresentationContext context)
-			throws CoreException {
-		
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext tableRenderingContext = (MemoryViewPresentationContext)context;
-			if (tableRenderingContext.getRendering() != null && tableRenderingContext.getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				AbstractAsyncTableRendering tableRendering = (AbstractAsyncTableRendering)tableRenderingContext.getRendering();
-				int numColumns = tableRendering.getAddressableUnitPerLine() / tableRendering.getAddressableUnitPerColumn();
-				
-				RGB[] colors = new RGB[numColumns+2];
-
-				for (int i=0; i<colors.length-1; i++)
-				{
-					colors[i] = getColumnBackground(element, i, tableRendering);
-				}
-				
-				colors[colors.length-1] = null;
-				
-				return colors;
-			}
-		}
-
-		return new RGB[0];
-	}
-	
-	/**
-	 * Returns a memory rendering element corresponding to the given element
-	 * or <code>null</code> if none.
-	 *  
-	 * @param element element to be rendered
-	 * @param columnIndex column index at which to render
-	 * @return memory rendering element or <code>null</code>
-	 */
-	private MemoryRenderingElement getMemoryRenderingElement(Object element, int columnIndex, AbstractBaseTableRendering rendering) {
-		if (element instanceof MemorySegment) {
-			MemorySegment line = (MemorySegment) element;
-			BigInteger address = line.getAddress();
-			int offset = (columnIndex - 1) * rendering.getBytesPerColumn();
-			if (offset < rendering.getBytesPerLine() && (offset + rendering.getBytesPerColumn()) <= rendering.getBytesPerLine()) {
-				return getMemoryRenderingElement(line, address, offset, rendering);
-			}
-		}
-		return null;
-	}
-	
-	private MemoryRenderingElement getMemoryRenderingElement(MemorySegment line, BigInteger lineAddress, int offset, AbstractBaseTableRendering rendering) {
-		BigInteger cellAddress = lineAddress.add(BigInteger.valueOf(offset));
-		MemoryByte[] bytes = line.getBytes(offset, rendering.getBytesPerColumn());
-		// make a copy to ensure that the memory bytes are not overwritten
-		// by clients
-		MemoryByte[] copy = new MemoryByte[bytes.length];
-		System.arraycopy(bytes, 0, copy, 0, bytes.length);
-		MemoryRenderingElement renderingElement = new MemoryRenderingElement(
-				rendering, cellAddress, copy);
-		return renderingElement;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.java
deleted file mode 100644
index cb62fcd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @since 3.2
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.elements.adapters.Messages"; //$NON-NLS-1$
-
-	private Messages() {
-	}
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	public static String VariableColumnPresentation_0;
-
-	public static String VariableColumnPresentation_1;
-
-	public static String VariableColumnPresentation_2;
-
-	public static String VariableColumnPresentation_3;
-
-	public static String VariableColumnPresentation_4;
-
-	public static String VariableColumnPresentation_5;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.properties
deleted file mode 100644
index 6c853bb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/Messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-VariableColumnPresentation_0=Declared Type
-VariableColumnPresentation_1=Name
-VariableColumnPresentation_2=Value
-VariableColumnPresentation_3=Actual Type
-VariableColumnPresentation_4=Error
-VariableColumnPresentation_5=Exception occurred modifying value
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/StackFrameSourceDisplayAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/StackFrameSourceDisplayAdapter.java
deleted file mode 100644
index 917f2b5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/StackFrameSourceDisplayAdapter.java
+++ /dev/null
@@ -1,234 +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.debug.internal.ui.elements.adapters;
-
-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.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.InstructionPointerManager;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupResult;
-import org.eclipse.debug.internal.ui.views.launch.DecorationManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
-import org.eclipse.debug.ui.sourcelookup.ISourceLookupResult;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * @since 3.2
- */
-public class StackFrameSourceDisplayAdapter implements ISourceDisplay {
-
-	private IStackFrame fPrevFrame;
-	private SourceLookupResult fPrevResult;
-	
-	/**
-	 * Constructs singleton source display adapter for stack frames.
-	 */
-	public StackFrameSourceDisplayAdapter() {
-		DebugPlugin.getDefault().addDebugEventListener(new IDebugEventSetListener() {
-			public void handleDebugEvents(DebugEvent[] events) {
-				for (int i = 0; i < events.length; i++) {
-					final DebugEvent event = events[i];
-					switch (event.getKind()) {
-						case DebugEvent.TERMINATE:
-							clearCachedModel(event.getSource());
-							// fall through
-						case DebugEvent.RESUME:
-							if (!event.isEvaluation()) {
-								Job uijob = new UIJob("clear source selection"){ //$NON-NLS-1$
-									public IStatus runInUIThread(
-											IProgressMonitor monitor) {
-										clearSourceSelection(event.getSource());
-										return Status.OK_STATUS;
-									}
-									
-								};
-								uijob.setSystem(true);
-								uijob.schedule();
-							}
-							break;
-						case DebugEvent.CHANGE:
-							if (event.getSource() instanceof IStackFrame) {
-								if (event.getDetail() == DebugEvent.CONTENT) {
-									// force source lookup if a stack frame fires a content change event
-									clearCachedModel(event.getSource());
-								}
-							}
-							break;
-					}
-				}
-			}
-		});
-	}
-	
-	
-	private SourceLookupJob fSourceLookupJob = new SourceLookupJob();
-	/**
-	 * A job to perform source lookup on the currently selected stack frame.
-	 */
-	class SourceLookupJob extends Job {
-		
-		private IStackFrame fTarget;
-		private ISourceLocator fLocator;
-		private IWorkbenchPage fPage;
-
-		/**
-		 * Constructs a new source lookup job.
-		 */
-		public SourceLookupJob() {
-			super("Debug Source Lookup");  //$NON-NLS-1$
-			setPriority(Job.INTERACTIVE);
-			setSystem(true);	
-		}
-		
-		public void setLookupInfo(IStackFrame frame, ISourceLocator locator, IWorkbenchPage page) {
-			fTarget = frame;
-			fLocator = locator;
-			fPage = page;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		protected IStatus run(IProgressMonitor monitor) {
-			if (!monitor.isCanceled()) {
-				IStackFrame lookupFrame = fTarget;
-				ISourceLocator lookupLocator = fLocator;
-				
-				if (lookupFrame != null && lookupLocator != null && !lookupFrame.isTerminated()) {
-					ISourceLookupResult result = null;
-					result = DebugUITools.lookupSource(lookupFrame, lookupLocator);
-					synchronized (StackFrameSourceDisplayAdapter.this) {
-						fPrevResult = (SourceLookupResult)result;
-						fPrevFrame = lookupFrame;
-					}
-					if (!monitor.isCanceled() && fPage != null && !lookupFrame.isTerminated()) {
-						fSourceDisplayJob.setDisplayInfo(result, fPage);
-						fSourceDisplayJob.schedule();
-					}
-				}
-				setLookupInfo(null, null, null);
-			}
-			return Status.OK_STATUS;
-		}
-		
-	}
-	
-	private SourceDisplayJob fSourceDisplayJob = new SourceDisplayJob();
-	class SourceDisplayJob extends UIJob {
-		
-		private ISourceLookupResult fResult;
-		private IWorkbenchPage fPage;
-
-		public SourceDisplayJob() {
-			super("Debug Source Display");  //$NON-NLS-1$
-			setSystem(true);
-			setPriority(Job.INTERACTIVE);
-		}
-		
-		/**
-		 * Constructs a new source display job
-		 */
-		public synchronized void setDisplayInfo(ISourceLookupResult result, IWorkbenchPage page) {
-			fResult = result;
-			fPage = page;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			ISourceLookupResult result = null;
-			IWorkbenchPage page = null;
-			synchronized (this) {
-				result = fResult;
-				page = fPage;
-				setDisplayInfo(null, null);
-			}
-			if (!monitor.isCanceled() && result != null && page != null) {
-				DebugUITools.displaySource(result, page);
-				// termination may have occurred while displaying source
-				if (monitor.isCanceled()) {
-					Object artifact = result.getArtifact();
-					if (artifact instanceof IStackFrame) {
-						clearSourceSelection(((IStackFrame)artifact).getThread());
-					}
-				}
-			}
-			
-			return Status.OK_STATUS;
-		}
-		
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.ISourceDisplayAdapter#displaySource(java.lang.Object, org.eclipse.ui.IWorkbenchPage, boolean)
-	 */
-	public synchronized void displaySource(Object context, IWorkbenchPage page, boolean force) {
-		IStackFrame frame = (IStackFrame)context;
-		if (!force && frame.equals(fPrevFrame)) {
-			fPrevResult.updateArtifact(context);
-			fSourceDisplayJob.setDisplayInfo(fPrevResult, page);
-			fSourceDisplayJob.schedule();
-		} else {
-			fSourceLookupJob.setLookupInfo(frame, frame.getLaunch().getSourceLocator(), page);
-			fSourceLookupJob.schedule();
-		}
-	}
-	
-	/**
-	 * Clears any source decorations associated with the given thread or
-	 * debug target.
-	 * 
-	 * @param source thread or debug target
-	 */
-	private void clearSourceSelection(Object source) {		
-		if (source instanceof IThread) {
-			IThread thread = (IThread)source;
-			DecorationManager.removeDecorations(thread);
-			InstructionPointerManager.getDefault().removeAnnotations(thread);
-		} else if (source instanceof IDebugTarget) {
-			IDebugTarget target = (IDebugTarget)source;
-			DecorationManager.removeDecorations(target);
-			InstructionPointerManager.getDefault().removeAnnotations(target);
-		}
-	}	
-	
-	/**
-	 * Clear any cached results associated with the given object.
-	 * 
-	 * @param source
-	 */
-	private synchronized void clearCachedModel(Object source) {
-		if (fPrevFrame != null) {
-			IDebugTarget target = null;
-			if (source instanceof IDebugElement) {
-				target = ((IDebugElement)source).getDebugTarget();
-			}
-			if (fPrevFrame.getDebugTarget().equals(target)) {
-				fPrevFrame = null;
-				fPrevResult = null;
-				fSourceDisplayJob.cancel();
-			}
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/VariableColumnFactoryAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/VariableColumnFactoryAdapter.java
deleted file mode 100644
index c756501..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/VariableColumnFactoryAdapter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Factory for default variable column presentation.
- * 
- * @since 3.2
- */
-public class VariableColumnFactoryAdapter implements IColumnPresentationFactory {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresenetationFactoryAdapter#createColumnPresentation(org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext, java.lang.Object)
-	 */
-	public IColumnPresentation createColumnPresentation(IPresentationContext context, Object element) {
-		String id = context.getId();
-		if (IDebugUIConstants.ID_VARIABLE_VIEW.equals(id) || IDebugUIConstants.ID_REGISTER_VIEW.equals(id)) {
-			if (element instanceof IStackFrame) {
-				return new VariableColumnPresentation();
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresenetationFactoryAdapter#getColumnPresentationId(org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext, java.lang.Object)
-	 */
-	public String getColumnPresentationId(IPresentationContext context, Object element) {
-		String id = context.getId();
-		if (IDebugUIConstants.ID_VARIABLE_VIEW.equals(id) || IDebugUIConstants.ID_REGISTER_VIEW.equals(id)) {
-			if (element instanceof IStackFrame) {
-				return VariableColumnPresentation.DEFAULT_VARIABLE_COLUMN_PRESENTATION;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/VariableColumnPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/VariableColumnPresentation.java
deleted file mode 100644
index 961e340..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/VariableColumnPresentation.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.elements.adapters;
-
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractColumnPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Columns for Java variables.
- * 
- * @since 3.2
- */
-public class VariableColumnPresentation extends AbstractColumnPresentation {
-	
-	/**
-	 * Constant identifier for the default variable column presentation.
-	 */
-	public final static String DEFAULT_VARIABLE_COLUMN_PRESENTATION = IDebugUIConstants.PLUGIN_ID + ".VARIALBE_COLUMN_PRESENTATION";  //$NON-NLS-1$
-	
-	/**
-	 * Default column identifiers
-	 */
-	public final static String COLUMN_VARIABLE_NAME = DEFAULT_VARIABLE_COLUMN_PRESENTATION + ".COL_VAR_NAME"; //$NON-NLS-1$
-	public final static String COLUMN_VARIABLE_TYPE = DEFAULT_VARIABLE_COLUMN_PRESENTATION + ".COL_VAR_TYPE"; //$NON-NLS-1$
-	public final static String COLUMN_VARIABLE_VALUE = DEFAULT_VARIABLE_COLUMN_PRESENTATION + ".COL_VAR_VALUE"; //$NON-NLS-1$
-	public final static String COLUMN_VALUE_TYPE = DEFAULT_VARIABLE_COLUMN_PRESENTATION + ".COL_VALUE_TYPE"; //$NON-NLS-1$
-	
-	private static final String[] ALL_COLUMNS = new String[]{COLUMN_VARIABLE_NAME, COLUMN_VARIABLE_TYPE, COLUMN_VARIABLE_VALUE, COLUMN_VALUE_TYPE};
-	private static final String[] INITIAL_COLUMNS = new String[]{COLUMN_VARIABLE_NAME, COLUMN_VARIABLE_VALUE}; 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#getColumns()
-	 */
-	public String[] getAvailableColumns() {
-		return ALL_COLUMNS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#getHeader(java.lang.String)
-	 */
-	public String getHeader(String id) {
-		if (COLUMN_VARIABLE_TYPE.equals(id)) {
-			return Messages.VariableColumnPresentation_0;
-		}
-		if (COLUMN_VARIABLE_NAME.equals(id)) {
-			return Messages.VariableColumnPresentation_1;
-		}
-		if (COLUMN_VARIABLE_VALUE.equals(id)) {
-			return Messages.VariableColumnPresentation_2;
-		}
-		if (COLUMN_VALUE_TYPE.equals(id)) {
-			return Messages.VariableColumnPresentation_3;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#getId()
-	 */
-	public String getId() {
-		return DEFAULT_VARIABLE_COLUMN_PRESENTATION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#getInitialColumns()
-	 */
-	public String[] getInitialColumns() {
-		return INITIAL_COLUMNS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#isOptional()
-	 */
-	public boolean isOptional() {
-		return true;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/BreakpointImportExport.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/BreakpointImportExport.properties
deleted file mode 100644
index 83adbbc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/BreakpointImportExport.properties
+++ /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
-###############################################################################
-WizardImportBreakpoints_0=Import Breakpoints
-WizardImportBreakpointsPage_0=Import Breakpoints
-WizardImportBreakpointsPage_1=File does not exist: {0}
-WizardImportBreakpointsPage_2=Import breakpoints from local file system.
-WizardImportBreakpointsPage_3=&Automatically update existing breakpoints
-WizardImportBreakpointsPage_4=F&rom file:
-WizardImportBreakpointsPage_5=Automatically create breakpoint &working sets
-WizardImportBreakpointsPage_6=Please specify a file to import.
-WizardExportBreakpoints_0=Export Breakpoints
-WizardExportBreakpointsPage_0=Please specify a destination file.
-WizardExportBreakpointsPage_1=Select one or more breakpoints to export.
-WizardBreakpointsPage_0=Breakpoint Files
-WizardBreakpointsPage_1=&Select All
-WizardBreakpointsPage_2=&Deselect All
-WizardBreakpointsPage_3=org.eclipse.debug.ui.BreakpointView
-WizardBreakpointsPage_4=Export breakpoints to the local file system.
-WizardBreakpointsPage_5=Options
-WizardBreakpointsPage_6=&Overwrite existing file without warning
-WizardBreakpointsPage_7=&To file:
-WizardBreakpointsPage_8=Brows&e...
-WizardBreakpointsPage_12=Overwrite?
-ImportExportOperations_0=Do you want to overwrite: {0} ?
-ImportExportOperations_1=Overwrite Breakpoint?
-ImportExportOperations_2=Overwrite {0}, {1}?
-ImportExportOperations_3=Overwrite all without prompt.
-ImportOperation_0=Importing Breakpoints
-ExportOperation_0=Exporting Breakpoints
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java
deleted file mode 100644
index 3d5f737..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java
+++ /dev/null
@@ -1,327 +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.debug.internal.ui.importexport.breakpoints;
-
-import java.util.ArrayList;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsContentProvider;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsLabelProvider;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsComparator;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer;
-import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IViewPart;
-
-/**
- * This class creates a simplified debug view that can be used in wizards etc., to emulate the current debug view
- * 
- * @see WizardExportBreakpointsPage
- * @see WizardImportBreakpointsPage
- *
- * @since 3.2
- */
-public class EmbeddedBreakpointsViewer {
-
-	//widgets
-	private IStructuredSelection fSelection = null;
-	private BreakpointsView fView = null;
-	private BreakpointsContentProvider fProvider = null;
-	private Tree fTree = null;
-	private BreakpointsViewer fViewer = null;
-	private ICheckStateListener fCheckListener = new ICheckStateListener() {
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			updateCheckedState(event.getElement(), event.getChecked());
-		}
-	};
-	
-	//constants
-	private static final int HEIGHT_HINT = 150;
-	
-	/**
-	 * This constructor uses the selection from the debug view to initialize its selection
-	 * 
-	 * <p>
-	 * Neither parent nor input can be null
-	 * </p>
-	 * 
-	 * @param parent the parent to add this composite to
-	 * @param input the input to the viewer
-	 */
-	public EmbeddedBreakpointsViewer(Composite parent, Object input) {
-		Assert.isNotNull(parent);
-		Assert.isNotNull(input);
-		createControl(parent, input, null);
-	}
-	
-	/**
-	 * This constructor allows a specific selction to be used in stead of the default
-	 * 
-	 * @param parent the parent composite to add this one to
-	 * @param input the input to the viewer
-	 * @param selection the selection to set on the viewer
-	 */
-	public EmbeddedBreakpointsViewer(Composite parent, Object input, IStructuredSelection selection) {
-		Assert.isNotNull(parent);
-		Assert.isNotNull(input);
-		createControl(parent, input, selection);
-	}
-	
-	/**
-	 * Creates the control initialized to the current view, selection, and organization of the breakpoints view
-	 * @param parent the parent composite to add this one to.
-	 * 
-	 * @param parent the parent composite to add this one to
-	 * @param input the input for the viewer
-	 * @param selection the selection for the viewer to be initialized to. If null the selection from the breakpoints view is used
-	 */
-	private void createControl(Composite parent, Object input, IStructuredSelection selection) {
-		fSelection = selection;
-		if(fSelection == null) {
-			IViewPart fViewpart = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-			if(fViewpart != null) {
-				fSelection = (IStructuredSelection)fViewpart.getViewSite().getSelectionProvider().getSelection();
-			}
-			else {
-				fSelection = new StructuredSelection();
-			}
-		}
-		Font font = parent.getFont();
-		Composite composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, true));
-		GridData grid = new GridData(GridData.FILL_BOTH);
-		grid.heightHint = HEIGHT_HINT;
-		composite.setLayoutData(grid);
-		composite.setFont(font);
-		
-		// create the treeview
-		fTree = new Tree(composite, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK);
-		fProvider = new BreakpointsContentProvider();
-		fView = ((BreakpointsView)DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW));
-		fTree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		fViewer = new BreakpointsViewer(fTree);
-		//fix for bug #109008
-		IBaseLabelProvider labelProvider = null;
-		if (fView == null) {
-			labelProvider = new BreakpointsLabelProvider();
-		} else {
-			labelProvider = fView.getCheckboxViewer().getLabelProvider();
-		}
-		fViewer.setComparator(new BreakpointsComparator());
-		fViewer.setLabelProvider(labelProvider);
-		fViewer.addCheckStateListener(fCheckListener);
-		IBreakpointOrganizer[] orgs = null;
-		if(fView != null) {
-			 orgs = fView.getBreakpointOrganizers();
-		}
-		fViewer.setContentProvider(fProvider);
-		fViewer.setInput(input);
-		fProvider.setOrganizers(orgs);
-		initViewerState();
-	}
-	
-	/**
-	 * Performs the initialization of the viewer from a selection
-	 */
-	private void initViewerState() {
-		Object[] items = fSelection.toArray();
-		fViewer.setGrayedElements(new Object[] {});
-		fViewer.setCheckedElements(new Object[] {});
-		ArrayList list = new ArrayList();
-		for(int i = 0; i < items.length; i++) {
-			Object item = items[i];
-			if(item instanceof IBreakpoint) {
-				list.add(item);
-			}
-			else if (item instanceof BreakpointContainer) {
-				getBreakpointsFromContainers((BreakpointContainer)item, list);
-			}
-		}
-		for(int i = 0; i < list.size(); i++) {
-			updateCheckedState(list.get(i), true);
-		}
-	}
-	
-	/**
-	 * FInds the breakpoints of a given container
-	 * @param container the container to get breakpoints from
-	 * @param list the list of breakpoints to update state for
-	 */
-	private void getBreakpointsFromContainers(BreakpointContainer container, ArrayList list) {
-		Object[] elements = container.getChildren();
-		for(int i = 0; i < elements.length; i++) {
-			if(elements[i] instanceof IBreakpoint) {
-				list.add(elements[i]);
-			}
-			else {
-				getBreakpointsFromContainers((BreakpointContainer)elements[i], list);
-			}
-		}
-	}
-	
-	/**
-	 * Returns the selection from the viewer with no duplicates
-	 * @return the selection from the viewer with no duplicates
-	 */
-	public IStructuredSelection getCheckedElements() {
-		Object[] list = fViewer.getCheckedElements();
-		Vector selected = new Vector();
-		for(int i = 0; i < list.length; i++) {
-			if(!selected.contains(list[i])) {
-				selected.addElement(list[i]);
-			}
-		}
-		return new StructuredSelection(selected);
-	}
-	
-	/**
-	 * Allows access to the viewer
-	 * @return the viewer
-	 */
-	public BreakpointsViewer getViewer() {
-		return fViewer;
-	}
-   
-	/**
-	 * finds all occurrences of a widget to update
-	 * @param element the element to search for when finding occurrences
-	 * @return a list of widget occurrences to update or an empty list
-	 */
-    private Widget[] searchItems(Object element) {
-        ArrayList list = new ArrayList();
-        TreeItem[] items = fTree.getItems();
-        for (int i = 0; i < items.length; i++) {
-        	findAllOccurrences(items[i], element, list);
-        }
-        return (Widget[]) list.toArray(new Widget[0]);
-    }
-    
-    /**
-     * performs the actual search for items in the tree
-     * @param list the list to add matches to
-     * @param item the item in the tree
-     * @param element the element to compare
-     */
-    private void findAllOccurrences(TreeItem item, Object element, ArrayList list) {
-        if (element.equals(item.getData())) {
-                list.add(item);
-        }
-        TreeItem[] items = item.getItems();
-        for (int i = 0; i < items.length; i++) {
-        	findAllOccurrences(items[i], element, list);
-        }
-    }
-    
-	 /**
-     * Update the checked state of the given element and all of its children.
-     * 
-     * @param obj the object that has been changed
-     * @param enable the checked status of the obj
-     */
-    private void updateCheckedState(Object obj, boolean enable) {
-	        if (obj instanceof IBreakpoint) {
-	        	Widget[] list = searchItems(obj);
-	        	TreeItem item = null;
-	        	for(int i = 0; i < list.length; i++) {
-		        	item = (TreeItem)list[i];
-		            item.setChecked(enable);
-		            refreshParents(item);
-	        	}
-	        }
-	        else if (obj instanceof BreakpointContainer) {
-	        	ArrayList bps = new ArrayList();
-	        	getBreakpointsFromContainers((BreakpointContainer)obj, bps);
-	        	for(int j = 0; j < bps.size(); j++) {
-	        		updateCheckedState(bps.get(j), enable);
-	        	}
-	        }
-     }
-
-    /**
-     * refreshes the grayed/checked state of the parents of item
-     * @param item the item to refresh parents of
-     */
-    private void refreshParents(TreeItem item) {
-    	TreeItem parent = item.getParentItem();
-    	while (parent != null) {
-    		int checked = getNumberChildrenChecked(parent);
-        	if(checked == 0) {
-        		parent.setGrayed(false);
-            	parent.setChecked(false);
-        	}
-        	else if(checked == parent.getItemCount()) {
-        		if(getNumberChildrenGrayed(parent) > 0) {
-        			parent.setGrayed(true);
-        		}
-        		else {
-        			parent.setGrayed(false);
-        		}
-         		parent.setChecked(true);
-        	}
-        	else {
-        		parent.setGrayed(true);
-            	parent.setChecked(true);
-        	}
-    		parent = parent.getParentItem();
-    	}
-    }
-    
-    /**
-     * Gets the number of grayed children for this parent
-     * @param parent the parent to inspect
-     * @return treu is any one or more children is grayed, false otherwise
-     */
-    private int getNumberChildrenGrayed(TreeItem parent) {
-    	TreeItem[] children = parent.getItems();
-    	int count = 0;
-    	for(int i = 0; i < children.length; i++) {
-    		if(children[i].getGrayed()) {
-    			count++;
-    		}
-    	}
-    	return count;
-    }
-    
-    /**
-     * Checks to see if all of the children under an given parent are checked or not
-     * @param children the children to check
-     * @return true if all children are checked, false otherwise
-     */
-    private int getNumberChildrenChecked(TreeItem parent) {
-    	TreeItem[] children = parent.getItems();
-    	int count = 0;
-    	for(int i = 0; i < children.length; i++) {
-    		if(children[i].getChecked()) {
-    			count++;
-    		}
-    	}
-    	return count;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ExportBreakpoints.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ExportBreakpoints.java
deleted file mode 100644
index 0ca8478..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ExportBreakpoints.java
+++ /dev/null
@@ -1,65 +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.debug.internal.ui.importexport.breakpoints;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.IViewPart;
-
-/**
- * <p>
- * This class provides the aciton event for both the context menu in breakpoints view
- * and the drop down menu inn the breakpoints view.
- * </p> 
- * <p>
- *  The action simply calls the wizard to export breakpoints.
- *  </p>
- *  @see WizardExportBreakpoints
- *  @see WizardExportBreakpointsPage
- *  
- *  @since 3.2
- */
-public class ExportBreakpoints extends AbstractDebugActionDelegate { 
-
-	/**
-	 * This method actually performs the execution of the action event
-	 * 
-	 * @param action IAction the action
-	 */
-	public void run(IAction action) {
-		IViewPart fViewpart = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-		WizardExportBreakpoints wiz = new WizardExportBreakpoints();
-		wiz.init(DebugUIPlugin.getDefault().getWorkbench(), (IStructuredSelection)fViewpart.getViewSite().getSelectionProvider().getSelection());
-		WizardDialog wizdialog = new WizardDialog(DebugUIPlugin.getShell(), wiz);
-		wizdialog.setBlockOnOpen(true);
-		wizdialog.open();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate#update(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	protected void update(IAction action, ISelection s) {
-		getAction().setEnabled(DebugPlugin.getDefault().getBreakpointManager().hasBreakpoints());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate#doAction(java.lang.Object)
-	 */
-	protected void doAction(Object element) throws DebugException {}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/IImportExportConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/IImportExportConstants.java
deleted file mode 100644
index d5bccfd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/IImportExportConstants.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.debug.internal.ui.importexport.breakpoints;
-
-/**
- *
- * XML tag constants for importing and exporting breakpoints
- */
-public interface IImportExportConstants {
-
-	/**
-	 * <p>
-	 * The name for the top level node in the XMLMemento for storing/restoring breakpoint information.</br>
-	 * 
-	 * General formulation of the XMLMemento is as follows:</br>
-	 * 
-	 * breakpoints := (breakpoint)*</br>
-	 * 
-	 * breakpoint := resource</br>
-	 * 
-	 * resource := (marker)+</br>
-	 * 
-	 * marker := (attribs)+</br>
-	 * </p>	
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 * 
-	 */
-	public static final String IE_NODE_BREAKPOINTS = "breakpoints"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the node type for each of the imported or exported breakpoints
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_BREAKPOINT = "breakpoint"; //$NON-NLS-1$
-	
-	/**
-	 * The ID for the classname node for exporting breakpoints from the wizards.
-	 * This ID is searchable from the listing of XMLMementos gathered from the BreakPointManager.
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 * @see XMLMemento->getChild(String)
-	 */
-	public static final String IE_NODE_CLASSNAME = "classname"; //$NON-NLS-1$
-	
-	/**
-	 * <p>
-	 * The generalized ID for each of the values stored in a markers' attribute map.
-	 * Since a marker can have any number of attributes and or values, we use a 
-	 * (name, value) paring in the XMLmemento to store them, without having a dependence upon what the attribute
-	 * is or what type it is.
-	 * </p>
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_VALUE = "value"; //$NON-NLS-1$
-	
-	/**
-	 * Each breakpoint has an associated resource, which is described with this element
-	 * name
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_RESOURCE = "resource"; //$NON-NLS-1$
-	
-	/**
-	 * To validate the resource when filtering importable breakpoints we need to know its path.
-	 * This is the the name of XMLMemento node that stores that path.
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_PATH = "path"; //$NON-NLS-1$
-	
-	/**
-	 * To filter the type of path searched for within the workspace to allow for the filtering of 
-	 * breakpoints for import, we need to know the type to filter for.
-	 * 
-	 * This is the name of the XMLMemento node that stores the type of the resource
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_TYPE = "type"; //$NON-NLS-1$
-	
-	/**
-	 * The name for the marker node in the corresponding XMLMemento
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_MARKER = "marker"; //$NON-NLS-1$
-	
-	/**
-	 * The name for a marker attribute node in the corresponding XMLMemento
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_ATTRIB = "attrib"; //$NON-NLS-1$
-	
-	/**
-	 * The generalized name for the "name" node used in marker attribute nodes.
-	 * This is the other ID in the (name, value) pairing used to describe attributes
-	 * of markers.
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_NODE_NAME = "name"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the enabled attribute, which is part of the breakpoint node information
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_BP_ENABLED = "enabled"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the registered attribute, which is part of the breakpoint node information
-	 * 
-	 * @see WizardExportBreakpointsPage
-	 * @see WizardImportBreakpointsPage
-	 */
-	public static final String IE_BP_REGISTERED = "registered"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the persistant attribute for breakpoint information
-	 */
-	public static final String IE_BP_PERSISTANT = "persistant"; //$NON-NLS-1$
-	
-	/**
-	 * The default file extension for breakpoint export files
-	 */
-	public static final String EXTENSION = "bkpt";  //$NON-NLS-1$
-	
-	/**
-	 * the charstart attribute from a marker
-	 */
-	public static final String CHARSTART = "charStart"; //$NON-NLS-1$
-	
-	/**
-	 * the name of the workingsets node
-	 */
-	public static final String IE_NODE_WORKINGSETS = "workingsets";  //$NON-NLS-1$
-	
-	/**
-	 * The name of the workingset node
-	 */
-	public static final String IE_NODE_WORKINGSET = "workingset"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the id attribute, reusable for a general attribute called id
-	 */
-	public static final String IE_NODE_ID = "id"; //$NON-NLS-1$
-	
-	/**
-	 * The delimiter for the listing of working sets that a marker belongs to
-	 */
-	public static final String DELIMITER = "<;#>"; //$NON-NLS-1$
-}//end interface
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ImportBreakpoints.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ImportBreakpoints.java
deleted file mode 100644
index 604a347..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ImportBreakpoints.java
+++ /dev/null
@@ -1,59 +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.debug.internal.ui.importexport.breakpoints;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.wizard.WizardDialog;
-
-/**
- * This class provides the aciton event for both the context menu in breakpoints view
- * and the drop down menu in the breakpoints view. 
- * <p>
- * The action simply calls the wizard to import breakpoints.
- * </p>
- *  
- *  @see WizardImportBreakpoints
- *  @see WizardImportBreakpointsPage
- *  
- *  @since 3.2
- */
-public class ImportBreakpoints extends AbstractDebugActionDelegate {
-	
-	/**
-	 * Opens import wizard
-	 * 
-	 * @param action IAction the action
-	 */
-	public void run(IAction action) {
-		WizardImportBreakpoints wiz = new WizardImportBreakpoints();
-		wiz.init(DebugUIPlugin.getDefault().getWorkbench(), null);
-		WizardDialog wizdialog = new WizardDialog(DebugUIPlugin.getShell(), wiz);
-		wizdialog.setBlockOnOpen(true);
-		wizdialog.open();
-	}//end run
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate#doAction(java.lang.Object)
-	 */
-	protected void doAction(Object element) throws DebugException {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate#update(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	protected void update(IAction action, ISelection s) {
-		getAction().setEnabled(true);
-	}//end update
-}//end class
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ImportExportMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ImportExportMessages.java
deleted file mode 100644
index 1eee03e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/ImportExportMessages.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.importexport.breakpoints;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ImportExportMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.importexport.breakpoints.BreakpointImportExport"; //$NON-NLS-1$
-
-	private ImportExportMessages() {
-	}
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, ImportExportMessages.class);
-	}
-
-	public static String WizardImportBreakpoints_0;
-	public static String WizardExportBreakpoints_0;
-	public static String WizardBreakpointsPage_0;
-	public static String WizardBreakpointsPage_1;
-	public static String WizardBreakpointsPage_2;
-	public static String WizardBreakpointsPage_3;
-	public static String WizardBreakpointsPage_4;
-	public static String WizardBreakpointsPage_5;
-	public static String WizardBreakpointsPage_6;
-	public static String WizardBreakpointsPage_7;
-	public static String WizardBreakpointsPage_8;
-	public static String WizardBreakpointsPage_12;
-	public static String ImportExportOperations_0;
-	public static String ImportExportOperations_1;
-	public static String ImportExportOperations_2;
-	public static String ImportExportOperations_3;
-	public static String ImportOperation_0;
-	public static String WizardImportBreakpointsPage_0;
-	public static String WizardImportBreakpointsPage_1;
-	public static String WizardImportBreakpointsPage_2;
-	public static String WizardImportBreakpointsPage_3;
-	public static String WizardImportBreakpointsPage_4;
-	public static String ExportOperation_0;
-	public static String WizardImportBreakpointsPage_5;
-	public static String WizardExportBreakpointsPage_0;
-	public static String WizardExportBreakpointsPage_1;
-	public static String WizardImportBreakpointsPage_6;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpoints.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpoints.java
deleted file mode 100644
index 882cab6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpoints.java
+++ /dev/null
@@ -1,105 +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.debug.internal.ui.importexport.breakpoints;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * <p>
- * This class provides a wizard for exporting breakpoints.
- * It serves dual purpose, in that it is used by the platform import/export wizard,
- * but it can also be used as a standalone wizard.
- * </p>
- * <p>
- * Example:
- * </p>
- * <pre>
- * IWizard wiz = new WizardExportBreakpoints();
- * wiz.init(workbench, selection);
- * WizardDialog wizdialog = new WizardDialog(shell, wiz);
- * wizdialog.open();
- * </pre>
- * 
- * This class uses <code>WizardExportBreakpointsPage</code>
- * 
- * @since 3.2
- *
- */
-public class WizardExportBreakpoints extends Wizard implements IExportWizard {
-
-	/*
-	 * The main page
-	 */
-	private WizardExportBreakpointsPage fMainPage = null;
-	
-	/**
-	 * The existing selection
-	 */
-	private IStructuredSelection fSelection = null;
-	
-	/**
-	 * Identifier for dialog settings section for the export wizard. 
-	 */
-	private static final String EXPORT_DIALOG_SETTINGS = "BreakpointExportSettings"; //$NON-NLS-1$
-	
-	/**
-	 * This is the default constructor
-	 */
-	public WizardExportBreakpoints() {
-		super();
-		DebugUIPlugin plugin = DebugUIPlugin.getDefault();
-		IDialogSettings workbenchSettings = plugin.getDialogSettings();
-		IDialogSettings section = workbenchSettings.getSection(EXPORT_DIALOG_SETTINGS);
-		if (section == null)
-			section = workbenchSettings.addNewSection(EXPORT_DIALOG_SETTINGS);
-		setDialogSettings(section);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		super.addPages();
-		fMainPage = new WizardExportBreakpointsPage(ImportExportMessages.WizardExportBreakpoints_0, fSelection); 
-		addPage(fMainPage);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		fMainPage = null;
-		fSelection = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		return fMainPage.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) {
-		fSelection = selection;
-		setWindowTitle(ImportExportMessages.WizardExportBreakpoints_0);
-        setNeedsProgressMonitor(true);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java
deleted file mode 100644
index 1ce2264..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.importexport.breakpoints;
-
-import java.lang.reflect.InvocationTargetException;
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.actions.ExportBreakpointsOperation;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.FileDialog;
-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.swt.widgets.Widget;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * <p>
- * This class provides an internal implementation of a WizardPage, which is used
- * in the Export Breakpoints wizard.
- * </p>
- * <p>
- * The implementation presents the breakpoints to the user as they are shown in
- * their current breakpoint view.
- * </p>
- * <p>
- * Possible extensions would include:
- * <ul>
- * <li> Able to change the views as in the breakpoints view itself
- * <li> Able to reorder groups from within the wizard - easier in the viewer itself though
- * </ul>
- * </p>
- * This class is used by <code>WizardExportBreakpoints</code>
- * 
- * @since 3.2
- */
-public class WizardExportBreakpointsPage extends WizardPage implements Listener {
-
-	// widgets
-	private Button fOverwriteExistingFilesCheckbox = null;
-	private Text fDestinationNameField = null;
-	private Button fDestinationBrowseButton = null;
-	private IPath fPath = null;
-	private EmbeddedBreakpointsViewer fTView = null;
-	private IStructuredSelection fSelection = null;
-	private Button fSelectAll = null;
-	private Button fDeselectAll = null;
-
-	//state constants
-	private static final String OVERWRITE_ALL_STATE = "overwrite"; //$NON-NLS-1$
-	private static final String DESTINATION_FILE_NAME = "filename"; //$NON-NLS-1$
-	
-	/**
-	 * This is the default constructor. It accepts the name for the tab as a
-	 * parameter and an existing selection
-	 * 
-	 * @param pageName the name of the page
-	 */
-	public WizardExportBreakpointsPage(String pageName, IStructuredSelection selection) {
-		super(pageName, ImportExportMessages.WizardExportBreakpoints_0, null);
-		fSelection = selection;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		Widget source = event.widget;
-		if (source == fDestinationBrowseButton) {
-			handleDestinationBrowseButtonPressed();
-		}
-		else if (source == fDestinationNameField) {
-			handlePathTextModifiedEvent();
-		}
-		else if(source == fSelectAll) {
-			handleSelectAllPressed();
-		}
-		else if(source == fDeselectAll) {
-			handleDeselectAllPressed();
-		}
-	}
-	
-	/**
-	 * Handles the select all button pressed
-	 *
-	 */
-	private void handleSelectAllPressed() {
-		BreakpointsViewer viewer = fTView.getViewer();
-		viewer.getTree().selectAll();
-		viewer.setCheckedElements(((IStructuredSelection)viewer.getSelection()).toArray());
-		viewer.setGrayedElements(new Object[] {});
-		viewer.getTree().deselectAll();
-		setPageComplete(detectPageComplete());
-	}
-	
-	/**
-	 * Handles the deselect all button pressed
-	 *
-	 */
-	private void handleDeselectAllPressed() {
-		BreakpointsViewer viewer = fTView.getViewer();
-		viewer.setCheckedElements(new Object[] {});
-		viewer.setGrayedElements(new Object[] {});
-		setPageComplete(detectPageComplete());
-	}
-	
-	/**
-	 * This method handles the modified event fomr the path combobox.
-	 */
-	protected void handlePathTextModifiedEvent() {
-		setPageComplete(detectPageComplete());
-	}
-
-	/**
-	 * Open the SaveAsDialog so the user can save the listing of selected breakpoints
-	 */
-	protected void handleDestinationBrowseButtonPressed() {
-		FileDialog dialog = new FileDialog(getContainer().getShell(), SWT.SAVE);
-		dialog.setFilterExtensions(new String[]{"*."+IImportExportConstants.EXTENSION});  //$NON-NLS-1$
-		dialog.setText(ImportExportMessages.WizardExportBreakpoints_0);
-		String file = dialog.open();
-		if(file != null) {
-			fPath = new Path(file);
-			if (fPath != null) {
-				setErrorMessage(null);
-				if(fPath.getFileExtension() == null) {
-					fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION);  
-				}
-				else if(!fPath.getFileExtension().equals(IImportExportConstants.EXTENSION)) { 
-					fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION); 
-				}
-				fDestinationNameField.setText(fPath.toString());
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	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));
-
-		fTView = new EmbeddedBreakpointsViewer(composite, DebugPlugin.getDefault().getBreakpointManager(), fSelection);
-		fTView.getViewer().addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				setPageComplete(detectPageComplete());
-			}
-		});
-		fTView.getViewer().setSelection(fSelection);
-		//ensure we can see the beginning check-boxes etc. (bug 180971)
-		//this will not work in Windows Vista as there is no way to over-ride the default viewer item showing policy
-		//by setting the horizontal bar selection index. I.e. the following line of code is ignored in Vista
-		fTView.getViewer().getTree().getHorizontalBar().setSelection(0);
-		createButtonsGroup(composite);
-		createDestinationGroup(composite);
-		createOptionsGroup(composite);
-		setControl(composite); 
-		setPageComplete(detectPageComplete());
-		restoreWidgetState();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.EXPORT_BREAKPOINTS_WIZARD_PAGE);
-		
-		Dialog.applyDialogFont(parent);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
-	 */
-	public Image getImage() {
-		return DebugUITools.getImage(IInternalDebugUIConstants.IMG_WIZBAN_EXPORT_BREAKPOINTS);
-	}
-
-	/**
-     * Creates the buttons for selecting all or none of the elements.
-     *
-     * @param parent the parent control
-     */
-    private void createButtonsGroup(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-        composite.setFont(parent.getFont());
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        layout.makeColumnsEqualWidth = true;
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
-        fSelectAll = SWTFactory.createPushButton(composite, ImportExportMessages.WizardBreakpointsPage_1, null); 
-        fSelectAll.addListener(SWT.Selection, this);
-		fDeselectAll = SWTFactory.createPushButton(composite, ImportExportMessages.WizardBreakpointsPage_2, null);
-		fDeselectAll.addListener(SWT.Selection, this);
-    }
-	
-	/**
-	 * This method is used to determine if the page can be "finished".
-	 * 
-	 * To be determined "finishable" there must be a save path and there must be
-	 * a selection in the tree.
-	 * 
-	 * @return if the prerequesites of the wizard are met to allow the wizard to complete.
-	 */
-	private boolean detectPageComplete() {
-		boolean emptyFile = fDestinationNameField.getText().trim().equals(""); //$NON-NLS-1$
-		if (emptyFile) {
-			setMessage(ImportExportMessages.WizardExportBreakpointsPage_0, IMessageProvider.NONE);
-			return false;
-		}
-		int size = fTView.getCheckedElements().size();
-		if (size == 0) {
-			setMessage(ImportExportMessages.WizardExportBreakpointsPage_1, IMessageProvider.ERROR);
-			return false;
-		}
-		setMessage(ImportExportMessages.WizardBreakpointsPage_4);
-		return true;
-	}
-
-	/**
-	 * Create the Options specification widgets.
-	 * 
-	 * @param parent the parent to add this 
-	 */
-	protected void createOptionsGroup(Composite parent) {
-		Font font = parent.getFont();
-		// 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(ImportExportMessages.WizardBreakpointsPage_5);
-		OptionsGroup.setFont(parent.getFont());
-		fOverwriteExistingFilesCheckbox = new Button(OptionsGroup, SWT.CHECK | SWT.LEFT);
-		fOverwriteExistingFilesCheckbox.setText(ImportExportMessages.WizardBreakpointsPage_6);
-		fOverwriteExistingFilesCheckbox.setFont(font);
-	}
-
-	/**
-	 * 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(ImportExportMessages.WizardBreakpointsPage_7);
-		destinationLabel.setFont(font);
-		fDestinationNameField = new Text(destinationSelectionGroup, SWT.BORDER);
-		fDestinationNameField.addListener(SWT.Modify, this);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
-		fDestinationNameField.setLayoutData(data);
-		fDestinationNameField.setFont(font);
-		fDestinationBrowseButton = new Button(destinationSelectionGroup, SWT.PUSH);
-		fDestinationBrowseButton.setText(ImportExportMessages.WizardBreakpointsPage_8);
-		fDestinationBrowseButton.addListener(SWT.Selection, this);
-		fDestinationBrowseButton.setFont(font);
-		setButtonLayoutData(fDestinationBrowseButton);
-	}
-
-	/**
-	 * Save the state of the widgets select, for successive invocations of the wizard
-	 */
-	private void saveWidgetState() {
-		IDialogSettings settings = getDialogSettings();
-		if(settings != null) {
-			settings.put(OVERWRITE_ALL_STATE, fOverwriteExistingFilesCheckbox.getSelection());
-			settings.put(DESTINATION_FILE_NAME, fDestinationNameField.getText().trim());
-		}
-	}
-	
-	/**
-	 * Restores the state of the wizard from previous invocations
-	 */
-	private void restoreWidgetState() {
-		IDialogSettings settings = getDialogSettings();
-		if(settings != null) {
-			fOverwriteExistingFilesCheckbox.setSelection(Boolean.valueOf(settings.get(OVERWRITE_ALL_STATE)).booleanValue());
-			String filename = settings.get(DESTINATION_FILE_NAME);
-			if (filename != null) {
-				fDestinationNameField.setText(filename);
-			}
-		}
-	}
-	
-	/**
-	 * The Finish button is clicked on the main wizard
-	 * dialog to export the breakpoints, we write them out with all persistnat
-	 * information to a simple XML file via the use of XMLMemento.
-	 * 
-	 * @return if the save operation was successful or not
-	 */
-	public boolean finish() {
-		try {
-			//name typed in without using selection box
-			if(fPath == null) {
-				fPath = new Path(fDestinationNameField.getText().trim());
-				if(fPath.getFileExtension() == null) {
-					fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION);  
-				}
-				else if(!fPath.getFileExtension().equals(IImportExportConstants.EXTENSION)) { 
-					fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION); 
-				}
-			}
-			saveWidgetState();
-			if(fPath.toFile().exists() && !fOverwriteExistingFilesCheckbox.getSelection()) {
-				if (!MessageDialog.openQuestion(null, ImportExportMessages.WizardBreakpointsPage_12, MessageFormat.format(ImportExportMessages.ImportExportOperations_0, new String[] {fPath.toPortableString()}))) {
-					return false;
-				}
-			}
-			// collect breakpoints
-			Object[] elements = fTView.getCheckedElements().toArray();
-			List breakpoints = new ArrayList();
-			for (int i = 0; i < elements.length; i++) {
-				Object object = elements[i];
-				if (object instanceof IBreakpoint) {
-					breakpoints.add(object);
-				}
-			}
-			getContainer().run(true, true, new ExportBreakpointsOperation((IBreakpoint[]) breakpoints.toArray(new IBreakpoint[breakpoints.size()]), fPath.toOSString()));
-		}
-		catch (InterruptedException e) {
-			DebugPlugin.log(e);
-			return false;
-		}
-		catch (InvocationTargetException e) {
-			DebugPlugin.log(e);
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpoints.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpoints.java
deleted file mode 100644
index ae00a53..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpoints.java
+++ /dev/null
@@ -1,98 +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.debug.internal.ui.importexport.breakpoints;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-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;
-
-/**
- * <p>
- * Wizard for Importing breakpoints.
- * It serves a dual purpose, in that it is used by the platform import/export wizard,
- * but it can also be used as a standalone wizard.
- * </p>
- * <p>
- * Example:
- * </p>
- * <pre>
- * IWizard wiz = new WizardImportBreakpoints();
- * wiz.init(workbench, selection);
- * WizardDialog wizdialog = new WizardDialog(shell, wiz);
- * wizdialog.open();
- * </pre>
- * 
- * This class uses <code>WizardImportBreakpointsPage</code>
- * 
- * @since 3.2
- *
- */
-public class WizardImportBreakpoints extends Wizard implements IImportWizard {
-
-	/*
-	 * The main page
-	 */
-	private WizardImportBreakpointsPage fMainPage = null;
-	
-	/**
-	 * Identifier for dialog settings section for the import wizard. 
-	 */
-	private static final String IMPORT_DIALOG_SETTINGS = "BreakpointImportSettings"; //$NON-NLS-1$
-	
-	/**
-	 * This is the default constructor
-	 */
-	public WizardImportBreakpoints() {
-		super();
-		DebugUIPlugin plugin = DebugUIPlugin.getDefault();
-		IDialogSettings workbenchSettings = plugin.getDialogSettings();
-		IDialogSettings section = workbenchSettings.getSection(IMPORT_DIALOG_SETTINGS);
-		if (section == null)
-			section = workbenchSettings.addNewSection(IMPORT_DIALOG_SETTINGS);
-		setDialogSettings(section);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		super.addPages();
-		fMainPage = new WizardImportBreakpointsPage(ImportExportMessages.WizardImportBreakpoints_0);
-		addPage(fMainPage);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		fMainPage = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		return fMainPage.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) {
-		setWindowTitle(ImportExportMessages.WizardImportBreakpoints_0);
-        setNeedsProgressMonitor(true);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsPage.java
deleted file mode 100644
index 974a6b2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsPage.java
+++ /dev/null
@@ -1,243 +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.debug.internal.ui.importexport.breakpoints;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.actions.ImportBreakpointsOperation;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.FileDialog;
-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.swt.widgets.Widget;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The import breakpoints wizard page.
- * 
- * This class is used in <code>WizardImportBreakpoints</code>.
- * 
- * @since 3.2
- */
-public class WizardImportBreakpointsPage extends WizardPage implements Listener {
-	
-	//widgets
-	private Button fAutoRemoveDuplicates = null;
-	private Button fAutoCreateWorkingSets = null;
-	private Text fFileNameField = null;
-	private Button fBrowseForFileButton = null;
-	
-//	state constants
-	private static final String REMOVE_DUPS = "overwrite"; //$NON-NLS-1$
-	private static final String CREATE_WORKING_SETS = "createws"; //$NON-NLS-1$
-	private static final String SOURCE_FILE_NAME = "filename"; //$NON-NLS-1$
-	
-	/**
-	 * This is the default constructor. It accepts the name for the tab as a
-	 * parameter
-	 * 
-	 * @param pageName the name of the page
-	 */
-	public WizardImportBreakpointsPage(String pageName) {
-		super(pageName, ImportExportMessages.WizardImportBreakpointsPage_0, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		Widget source = event.widget;
-		if(source == fBrowseForFileButton) {
-			handleBrowseForFileButtonPressed();
-		}
-		setPageComplete(detectPageComplete());
-	}
-
-	/**
-	 * This method handles the fBrowseForFileButton being pressed.
-	 */
-	protected void handleBrowseForFileButtonPressed() {
-		FileDialog dialog = new FileDialog(getContainer().getShell(), SWT.OPEN);
-		dialog.setFilterExtensions(new String[]{"*."+IImportExportConstants.EXTENSION});  //$NON-NLS-1$
-		String file = dialog.open();
-		if(file != null) {
-			fFileNameField.setText(file);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	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());
-		createDestinationGroup(composite);
-		createOptionsGroup(composite);
-		setControl(composite);
-		restoreWidgetState();
-		setPageComplete(detectPageComplete());
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.IMPORT_BREAKPOINTS_WIZARD_PAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
-	 */
-	public Image getImage() {
-		return DebugUITools.getImage(IInternalDebugUIConstants.IMG_WIZBAN_IMPORT_BREAKPOINTS);
-	}
-	
-	/**
-	 * This method is used to determine if the page can be "finished".
-	 * To be determined "finishable" there must be an import path.
-	 * 
-	 * @return if the prerequesites of the wizard are met to allow the wizard to complete.
-	 */
-	private boolean detectPageComplete() {
-		String fileName = fFileNameField.getText().trim();
-		if (fileName.equals("")) {//$NON-NLS-1$
-			setMessage(ImportExportMessages.WizardImportBreakpointsPage_6);
-			return false;
-		}
-		File file = new File(fileName);
-		if (!file.exists() || file.isDirectory()) {
-			setMessage(MessageFormat.format(ImportExportMessages.WizardImportBreakpointsPage_1, new String[]{fileName}), ERROR);
-			return false;
-		}
-		
-		setMessage(ImportExportMessages.WizardImportBreakpointsPage_2); 
-		return true;
-	}
-
-	/**
-	 * Create the options specification widgets.
-	 * 
-	 * @param parent the parent composite to add this one to
-	 */
-	protected void createOptionsGroup(Composite parent) {
-		Font font = parent.getFont();
-		// 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(ImportExportMessages.WizardBreakpointsPage_5);
-		optionsGroup.setFont(parent.getFont());
-		fAutoRemoveDuplicates = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
-		fAutoRemoveDuplicates.setText(ImportExportMessages.WizardImportBreakpointsPage_3);
-		fAutoRemoveDuplicates.setFont(font);
-		fAutoCreateWorkingSets = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
-		fAutoCreateWorkingSets.setText(ImportExportMessages.WizardImportBreakpointsPage_5);
-		fAutoCreateWorkingSets.setFont(font);
-	}
-	
-	/**
-	 * Create the export destination specification widgets
-	 * 
-	 * @param parent the parent composite to add this one to
-	 */
-	protected void createDestinationGroup(Composite parent) {
-		Font font = parent.getFont();
-		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(ImportExportMessages.WizardImportBreakpointsPage_4);
-		destinationLabel.setFont(font);
-
-		// file name entry field
-		fFileNameField = new Text(destinationSelectionGroup, SWT.BORDER);
-		fFileNameField.addListener(SWT.Modify, this);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
-		fFileNameField.setLayoutData(data);
-		fFileNameField.setFont(font);
-
-		// destination browse button
-		fBrowseForFileButton = SWTFactory.createPushButton(destinationSelectionGroup, ImportExportMessages.WizardBreakpointsPage_8, null);
-		fBrowseForFileButton.addListener(SWT.Selection, this);
-	}
-	
-	/**
-	 * Save the state of the widgets select, for successive invocations of the wizard
-	 */
-	private void saveWidgetState() {
-		IDialogSettings settings = getDialogSettings();
-		if(settings != null) {
-			settings.put(REMOVE_DUPS, fAutoRemoveDuplicates.getSelection());
-			settings.put(CREATE_WORKING_SETS, fAutoCreateWorkingSets.getSelection());
-			settings.put(SOURCE_FILE_NAME, fFileNameField.getText().trim());
-		}
-	}
-	
-	/**
-	 * Restores the state of the wizard from previous invocations
-	 */
-	private void restoreWidgetState() {
-		IDialogSettings settings = getDialogSettings();
-		if(settings != null) {
-			fAutoRemoveDuplicates.setSelection(Boolean.valueOf(settings.get(REMOVE_DUPS)).booleanValue());
-			fAutoCreateWorkingSets.setSelection(Boolean.valueOf(settings.get(CREATE_WORKING_SETS)).booleanValue());
-			String fileName = settings.get(SOURCE_FILE_NAME);
-			if (fileName != null) {
-				fFileNameField.setText(fileName);
-			}
-		}
-	}
-	
-	/**
-	 * <p>
-	 * This method is called when the Finish button is click on the main wizard
-	 * dialog To import the breakpoints, we read then from the tree
-	 * and add them into the BreakpointManager
-	 * </p>
-	 * @return if the import operation was successful or not
-	 */
-	public boolean finish() {	
-		try {
-			saveWidgetState();
-			getContainer().run(true, true, new ImportBreakpointsOperation(fFileNameField.getText().trim(), fAutoRemoveDuplicates.getSelection(), fAutoCreateWorkingSets.getSelection()));
-		}
-		catch (InterruptedException e) {
-			DebugPlugin.log(e);
-			return false;
-		}
-		catch (InvocationTargetException e) {
-			DebugPlugin.log(e);
-			return false;
-		}
-		return true;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/AbstractLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/AbstractLaunchConfigurationAction.java
deleted file mode 100644
index 2d0606f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/AbstractLaunchConfigurationAction.java
+++ /dev/null
@@ -1,142 +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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * Common function/behavior for launch configuration view actions
- */
-public abstract class AbstractLaunchConfigurationAction extends SelectionListenerAction {
-	
-	/** 
-	 * The mode this action was created in (run, debug, ...)
-	 */
-	private String fMode;
-	
-	/**
-	 * Allows a requestor to abort this action.
-	 */
-	public interface IConfirmationRequestor {
-		/**
-		 * Returns whether this action should proceed. Confirmation is requested
-		 * when an action is run.
-		 * 
-		 * @return whether this action should proceed
-		 */
-		public boolean getConfirmation();
-	}
-	
-	/**
-	 * This action's confirmation requestor or <code>null</code> if none
-	 */
-	private IConfirmationRequestor fConfirmationRequestor;
-	
-	/**
-	 * The viewer this action is working on
-	 */
-	private Viewer fViewer;
-
-	/**
-	 * Constructor for AbstractLaunchConfigurationAction.
-	 * @param text
-	 */
-	public AbstractLaunchConfigurationAction(String text, Viewer viewer, String mode) {
-		super(text);
-		fViewer = viewer;
-		fViewer.addSelectionChangedListener(this);
-		fMode = mode;
-	}
-
-	/**
-	 * Returns the shell this action is contained in.
-	 * 
-	 * @return the shell this action is contained in
-	 */
-	protected Shell getShell() {
-		return getViewer().getControl().getShell();
-	}
-	
-	/**
-	 * Returns the viewer this action is working on
-	 * 
-	 * @return the viewer this action is working on
-	 */
-	protected Viewer getViewer() {
-		return fViewer;
-	}
-	
-	/**
-	 * Performs this action once confirmation has been aquired. Subclasses
-	 * should override this method.
-	 */
-	protected abstract void performAction();
-	
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public final void run() {
-		if (fConfirmationRequestor != null) {
-			if (!fConfirmationRequestor.getConfirmation()) {
-				return;
-			}
-		}
-		Runnable r = new Runnable() {
-			/**
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				performAction();
-			}
-		};
-		BusyIndicator.showWhile(getShell().getDisplay(), r);
-	}
-	
-	/**
-	 * Sets this action's confirmation requestor.
-	 * 
-	 * @param confirmationRequestor
-	 */
-	public void setConfirmationRequestor(IConfirmationRequestor confirmationRequestor) {
-		fConfirmationRequestor = confirmationRequestor;
-	}
-	
-	/**
-	 * Disposes this action
-	 */
-	public void dispose() {
-		fViewer.removeSelectionChangedListener(this);
-	}
-	
-	/**
-	 * Show an error dialog on the given exception.
-	 * 
-	 * @param exception
-	 */
-	protected void errorDialog(CoreException exception) {
-		ErrorDialog.openError(getShell(), null, null, exception.getStatus());
-	}
-
-	/**
-	 * Return this action's mode.
-	 * 
-	 * @return launch mode
-	 */
-	protected String getMode() {
-		return fMode;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/ClosedProjectFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/ClosedProjectFilter.java
deleted file mode 100644
index d36c2e4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/ClosedProjectFilter.java
+++ /dev/null
@@ -1,67 +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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * 
- * This implementation is used to filter closed projects from the launch configuration dialog.
- * It is (de)activated via the <code>IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED</code> preference, and is 
- * provided to fix bug 19521.
- * 
- * @since 3.2
- *
- */
-public class ClosedProjectFilter extends ViewerFilter {
-
-	/**
-	 * Constructor
-	 */
-	public ClosedProjectFilter() {
-		super();
-	}
-
-	/* (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 parent, Object element) {
-		//always let through types, we only care about configs
-		if(element instanceof ILaunchConfigurationType) {
-			return true;
-		}
-		if(element instanceof ILaunchConfiguration) {
-			try {
-				ILaunchConfiguration config = (ILaunchConfiguration)element;
-				IResource[] resources = config.getMappedResources();
-				//if it has no mapping, it might not have migration delegate, so let it pass
-				if(resources == null) {
-					return true;
-				}
-				for(int i = 0; i < resources.length; i++) {
-					IProject project= resources[i].getProject();
-					//we don't want overlap with the deleted projects filter, so we need to allow projects that don't exist through
-					if(project != null && (project.isOpen() || !project.exists())) {
-						return true;
-					}
-				}
-			} 
-			catch (CoreException e) {}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CollapseAllLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CollapseAllLaunchConfigurationAction.java
deleted file mode 100644
index a8ab1d7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CollapseAllLaunchConfigurationAction.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * Provides a collapse all button for the launch configuration viewer toolbar
- * @since 3.2
- */
-public class CollapseAllLaunchConfigurationAction extends Action {
-
-	/**
-	 * Action identifier for IDebugView#getAction(String)
-	 */
-	public static final String ID_COLLAPSEALL_ACTION = DebugUIPlugin.getUniqueIdentifier() + ".ID_COLLAPSEALL_ACTION"; //$NON-NLS-1$
-	
-	/**
-	 * the viewer to perform the collapse all on 
-	 */
-	private TreeViewer fViewer = null;
-	
-	/**
-	 * Constructor
-	 * @param viewer the viewer to perform the collapse all on
-	 */
-	public CollapseAllLaunchConfigurationAction(TreeViewer viewer) {
-		fViewer = viewer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_COLLAPSE_ALL);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getText()
-	 */
-	public String getText() {
-		return LaunchConfigurationsMessages.CollapseAllLaunchConfigurationAction_0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return LaunchConfigurationsMessages.CollapseAllLaunchConfigurationAction_1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_COLLAPSE_ALL);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		fViewer.collapseAll();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDescription()
-	 */
-	public String getDescription() {
-		return LaunchConfigurationsMessages.CollapseAllLaunchConfigurationAction_2;
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CompileErrorProjectPromptStatusHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CompileErrorProjectPromptStatusHandler.java
deleted file mode 100644
index 3c1d9a9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CompileErrorProjectPromptStatusHandler.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.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Shell;
-
-import com.ibm.icu.text.MessageFormat;
-
-
-public class CompileErrorProjectPromptStatusHandler implements IStatusHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		ILaunchConfiguration config = null;
-		List projects = new ArrayList();
-		
-		if (source instanceof List) {
-			List args = (List) source;
-			Iterator iterator = args.iterator();
-			while (iterator.hasNext()) {
-				Object arg = iterator.next();
-				if (arg instanceof ILaunchConfiguration) {
-					config = (ILaunchConfiguration) arg;
-					if (DebugUITools.isPrivate(config)) {
-						return Boolean.TRUE;
-					}
-				} else if (arg instanceof IProject) {
-					projects.add(arg);
-				}
-			}
-		}	
-		Shell shell = DebugUIPlugin.getShell();
-		StringBuffer projectList = new StringBuffer();
-		//we need to limit this
-		int size = Math.min(20, projects.size());
-		for (int i = 0; i < size; i++) {
-			if (i > 0) {
-				projectList.append(", "); //$NON-NLS-1$
-			}
-			projectList.append(((IProject)projects.get(i)).getName());
-		}
-		String projectMessage = null;
-		if(projects.size() > 20) {
-			projectMessage = MessageFormat.format(LaunchConfigurationsMessages.CompileErrorProjectPromptStatusHandler_0, new Object[]{projectList.toString()});
-		} else{
-			projectMessage = projectList.toString();
-		}
-		String title =  LaunchConfigurationsMessages.CompileErrorPromptStatusHandler_0; 
-		String message = MessageFormat.format(LaunchConfigurationsMessages.CompileErrorPromptStatusHandler_2, new String[]{projectMessage}); 
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore(); 
-		
-		String pref = store.getString(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR);
-		if (pref != null) {
-			if (pref.equals(MessageDialogWithToggle.ALWAYS)) {
-				return Boolean.TRUE;
-			}
-		}
-		MessageDialogWithToggle dialog = new MessageDialogWithToggle(shell, 
-				title, 
-				null, 
-				message, 
-				MessageDialog.QUESTION,
-				new String[] {IDialogConstants.PROCEED_LABEL, IDialogConstants.CANCEL_LABEL}, 
-				0,
-				LaunchConfigurationsMessages.CompileErrorProjectPromptStatusHandler_1,
-				false);
-        int open = dialog.open();
-		if (open == IDialogConstants.PROCEED_ID) {
-        	if(dialog.getToggleState()) {
-        		store.setValue(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR, MessageDialogWithToggle.ALWAYS);
-        	}
-            return Boolean.TRUE;
-        } 
-        else {
-            return Boolean.FALSE;
-        }
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CompileErrorPromptStatusHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CompileErrorPromptStatusHandler.java
deleted file mode 100644
index 3408121..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CompileErrorPromptStatusHandler.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Shell;
-
-
-public class CompileErrorPromptStatusHandler implements IStatusHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		if (source instanceof ILaunchConfiguration) {
-			ILaunchConfiguration config = (ILaunchConfiguration)source;
-			if (DebugUITools.isPrivate(config)) {
-				return Boolean.TRUE;
-			}
-		}
-		
-		Shell shell = DebugUIPlugin.getShell();
-		String title = LaunchConfigurationsMessages.CompileErrorPromptStatusHandler_0; 
-		String message = LaunchConfigurationsMessages.CompileErrorPromptStatusHandler_1; 
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore(); 
-		
-		String pref = store.getString(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR);
-		if (pref != null) {
-			if (pref.equals(MessageDialogWithToggle.ALWAYS)) {
-				return Boolean.TRUE;
-			}
-		}
-
-		MessageDialogWithToggle dialog = new MessageDialogWithToggle(shell, title, null, message, MessageDialog.WARNING,
-				new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1, null, false);
-		dialog.setPrefKey(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR);
-		dialog.setPrefStore(store);
-		dialog.open();
-		
-		int returnValue = dialog.getReturnCode();
-		if (returnValue == IDialogConstants.YES_ID) {
-			return Boolean.TRUE;
-		}
-		return Boolean.FALSE;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CreateLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CreateLaunchConfigurationAction.java
deleted file mode 100644
index b13ca8d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/CreateLaunchConfigurationAction.java
+++ /dev/null
@@ -1,115 +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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Creates a new launch configuration based on the selection.
- */
-public class CreateLaunchConfigurationAction extends AbstractLaunchConfigurationAction {
-
-	/**
-	 * Action identifier for IDebugView#getAction(String)
-	 */
-	public static final String ID_CREATE_ACTION = DebugUIPlugin.getUniqueIdentifier() + ".ID_CREATE_ACTION"; //$NON-NLS-1$
-	
-	/**
-	 * Constructs an action to create a launch configuration 
-	 */
-	public CreateLaunchConfigurationAction(Viewer viewer, String mode) {
-		super(LaunchConfigurationsMessages.CreateLaunchConfigurationAction_Ne_w_1, viewer, mode); 
-	}
-
-	/**
-	 * @see AbstractLaunchConfigurationAction#performAction()
-	 */
-	protected void performAction() {
-		Object object = getStructuredSelection().getFirstElement();
-		//double click with Ctrl key mask results in empty selection: bug 156087
-		//do no work if the selection is null
-		if(object != null) {
-			ILaunchConfigurationType type= null;
-			// Construct a new config of the selected type
-			if (object instanceof ILaunchConfiguration) {
-				ILaunchConfiguration config= (ILaunchConfiguration) object;
-				try {
-					type = config.getType();
-				} catch (CoreException e) {
-					errorDialog(e);
-					return;
-				}
-			} else {
-				type = (ILaunchConfigurationType) object;
-			}
-			try {
-				ILaunchConfigurationWorkingCopy wc = type.newInstance(null, DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(LaunchConfigurationsMessages.CreateLaunchConfigurationAction_New_configuration_2)); 
-				ILaunchConfigurationTabGroup tabGroup = LaunchConfigurationPresentationManager.getDefault().getTabGroup(wc, getMode());
-				// this only works because this action is only present when the dialog is open
-				ILaunchConfigurationDialog dialog = LaunchConfigurationsDialog.getCurrentlyVisibleLaunchConfigurationDialog();
-				tabGroup.createTabs(dialog, dialog.getMode());
-				ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
-				for (int i = 0; i < tabs.length; i++) {
-					tabs[i].setLaunchConfigurationDialog(dialog);
-				}
-				tabGroup.setDefaults(wc);
-				tabGroup.dispose();
-				wc.doSave();
-			} catch (CoreException e) {
-				errorDialog(e);
-				return;
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		return selection.size() == 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_NEW_CONFIG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_NEW_CONFIG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return LaunchConfigurationsMessages.LaunchConfigurationsDialog_0;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DebugModePromptStatusHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DebugModePromptStatusHandler.java
deleted file mode 100644
index b56132a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DebugModePromptStatusHandler.java
+++ /dev/null
@@ -1,73 +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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Shell;
-
-
-public class DebugModePromptStatusHandler implements IStatusHandler {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		if (source instanceof ILaunchConfiguration) {
-			ILaunchConfiguration config = (ILaunchConfiguration)source;
-			if (DebugUITools.isPrivate(config)) {
-				return Boolean.FALSE;
-			}	
-		}
-		
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-        ILaunchConfiguration configuration = (ILaunchConfiguration)source;
-        String pref = store.getString(IInternalDebugUIConstants.PREF_RELAUNCH_IN_DEBUG_MODE); 
-        if (pref != null) {
-            if (pref.equals(MessageDialogWithToggle.NEVER)) {
-                return Boolean.FALSE;
-            } else if (pref.equals(MessageDialogWithToggle.ALWAYS)) { 
-                relaunchInDebugMode(configuration);
-                return Boolean.TRUE;
-            }
-        }
-        
-		Shell activeShell = DebugUIPlugin.getShell();
-		String title = LaunchConfigurationsMessages.DebugModePromptStatusHandler_0; 
-		String message = LaunchConfigurationsMessages.DebugModePromptStatusHandler_1; 
-		
-		MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoCancelQuestion(activeShell, title, message, null, false, store, IInternalDebugUIConstants.PREF_RELAUNCH_IN_DEBUG_MODE); 
-		int buttonId = dialog.getReturnCode();
-		if (buttonId == IDialogConstants.YES_ID) { 
-			relaunchInDebugMode(configuration);
-			return Boolean.TRUE; // stops launch
-		} else if (buttonId == IDialogConstants.NO_ID) {
-			return Boolean.FALSE; // continue launch
-		} else { //CANCEL 
-			return Boolean.TRUE; // stops the launch
-		}
-	}
-	/**
-	 * @param configuration
-	 */
-	private void relaunchInDebugMode(ILaunchConfiguration configuration) {
-		DebugUITools.launch(configuration, ILaunchManager.DEBUG_MODE);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DeleteLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DeleteLaunchConfigurationAction.java
deleted file mode 100644
index 7738c16..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DeleteLaunchConfigurationAction.java
+++ /dev/null
@@ -1,114 +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.debug.internal.ui.launchConfigurations;
-
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Deletes the selected launch configuration(s).
- */
-public class DeleteLaunchConfigurationAction extends AbstractLaunchConfigurationAction {
-
-	/**
-	 * Action identifier for IDebugView#getAction(String)
-	 */
-	public static final String ID_DELETE_ACTION = DebugUIPlugin.getUniqueIdentifier() + ".ID_DELETE_ACTION"; //$NON-NLS-1$
-	
-	/**
-	 * Constructs an action to delete launch configuration(s) 
-	 */
-	public DeleteLaunchConfigurationAction(Viewer viewer, String mode) {
-		super(LaunchConfigurationsMessages.DeleteLaunchConfigurationAction_Dele_te_1, viewer, mode); 
-	}
-
-	/**
-	 * Determines if the action can delete the select launch configuration(s) or not
-	 * @return true if the selected launch configuration(s) can be deleted or not
-	 * @since 3.3
-	 */
-	protected boolean shouldDelete() {
-		IStructuredSelection selection = getStructuredSelection();
-		// Make the user confirm the deletion
-		String dialogMessage = selection.size() > 1 ? LaunchConfigurationsMessages.LaunchConfigurationDialog_Do_you_wish_to_delete_the_selected_launch_configurations__1 : LaunchConfigurationsMessages.LaunchConfigurationDialog_Do_you_wish_to_delete_the_selected_launch_configuration__2; // 
-		return MessageDialog.openQuestion(getShell(), LaunchConfigurationsMessages.LaunchConfigurationDialog_Confirm_Launch_Configuration_Deletion_3, dialogMessage); 
-	}
-	
-	/**
-	 * @see AbstractLaunchConfigurationAction#performAction()
-	 */
-	protected void performAction() {
-		if(!shouldDelete()) {
-			return;
-		}
-		IStructuredSelection selection = getStructuredSelection();
-
-		getViewer().getControl().setRedraw(false);
-		Iterator iterator = selection.iterator();
-		while (iterator.hasNext()) {
-			ILaunchConfiguration configuration = (ILaunchConfiguration)iterator.next();
-			try {
-				configuration.delete();
-			} catch (CoreException e) {
-				errorDialog(e);
-			}
-		}
-		getViewer().getControl().setRedraw(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		if (selection.isEmpty()) {
-			return false;
-		}
-		Iterator items = selection.iterator();
-		while (items.hasNext()) {
-			if (!(items.next() instanceof ILaunchConfiguration)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DELETE_CONFIG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DELETE_CONFIG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return LaunchConfigurationsMessages.LaunchConfigurationsDialog_1;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DeletedProjectFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DeletedProjectFilter.java
deleted file mode 100644
index fb68746..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DeletedProjectFilter.java
+++ /dev/null
@@ -1,65 +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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * 
- * Provides implementation to filter unavailable projects form the launch configuration dialog.
- * It is (de) activated via the <code>IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED</code> preference.
- * 
- * @since 3.2
- *
- */
-public class DeletedProjectFilter extends ViewerFilter {
-
-	/**
-	 * Constructor
-	 */
-	public DeletedProjectFilter() {
-		super();
-	}
-
-	/* (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) {
-		//always let through types, we only care about configs
-		if (element instanceof ILaunchConfigurationType) {
-			return true;
-		}
-		if(element instanceof ILaunchConfiguration) {
-			try {
-				ILaunchConfiguration config = (ILaunchConfiguration)element;
-				IResource[] resources = config.getMappedResources();
-				if(resources == null) {
-					return true;
-				}
-				for(int i = 0; i < resources.length; i++) {
-					IProject project= resources[i].getProject();
-					if(project != null && project.exists()) {
-						return true;
-					}
-				}
-			}
-			catch(CoreException e) {}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DuplicateLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DuplicateLaunchConfigurationAction.java
deleted file mode 100644
index 825ed3c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DuplicateLaunchConfigurationAction.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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Duplicates the selected launch configuration.
- */
-public class DuplicateLaunchConfigurationAction extends AbstractLaunchConfigurationAction {
-	
-	/**
-	 * Action identifier for IDebugView#getAction(String)
-	 */
-	public static final String ID_DUPLICATE_ACTION = DebugUIPlugin.getUniqueIdentifier() + ".ID_DUPLICATE_ACTION"; //$NON-NLS-1$
-
-	/**
-	 * Constructs an action to duplicate a launch configuration 
-	 */
-	public DuplicateLaunchConfigurationAction(Viewer viewer, String mode) {
-		super(LaunchConfigurationsMessages.DuplicateLaunchConfigurationAction__Duplicate_1, viewer, mode); 
-	}
-
-	/**
-	 * @see AbstractLaunchConfigurationAction#performAction()
-	 */
-	protected void performAction() {
-		ILaunchConfiguration original = (ILaunchConfiguration)getStructuredSelection().getFirstElement();
-		String newName = DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(original.getName());
-		try {
-			ILaunchConfigurationWorkingCopy newWorkingCopy = original.copy(newName);
-			newWorkingCopy.doSave();
-		} catch (CoreException e) {
-			errorDialog(e);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		return selection.size() == 1 && selection.getFirstElement() instanceof ILaunchConfiguration;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DUPLICATE_CONFIG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DUPLICATE_CONFIG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return LaunchConfigurationsMessages.LaunchConfigurationsDialog_5;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DuplicateLaunchDelegatesStatusHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DuplicateLaunchDelegatesStatusHandler.java
deleted file mode 100644
index a599a91..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/DuplicateLaunchDelegatesStatusHandler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.HashSet;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a mechanism to prompt users in the UI thread from debug.core in the case where
- * duplicate launch delegates have been detected and a preferred delegate needs to be selected.
- * 
- * As this handler is used once a launch has been started, and only prompts in the event that the launch <i>can</i>
- * continue with further input, it must be a blocking operation.
- * 
- * @since 3.3
- */
-public class DuplicateLaunchDelegatesStatusHandler implements IStatusHandler {
-	
-	/**
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		if(source instanceof Object[]) {
-			Object[] infos = (Object[]) source;
-			if(infos.length == 2) {
-				ILaunchConfiguration config = (ILaunchConfiguration) infos[0];
-				String mode = (String) infos[1];
-				Shell shell = DebugUIPlugin.getShell();
-				HashSet modes = new HashSet();
-				modes.add(mode);
-				modes.addAll(config.getModes());
-				SelectLaunchersDialog sldd = new SelectLaunchersDialog(shell,
-						config.getType().getDelegates(modes),
-						config.getWorkingCopy(),
-						mode);
-				if(sldd.open() != IDialogConstants.OK_ID) {
-					return Status.CANCEL_STATUS;
-				}
-				//check that the delegate has been set
-				ILaunchDelegate delegate = config.getPreferredDelegate(modes);
-				if(delegate == null) {
-					delegate = config.getType().getPreferredDelegate(modes);
-				}
-				return (delegate == null ? Status.CANCEL_STATUS : Status.OK_STATUS);
-			}
-		}
-		return Status.CANCEL_STATUS;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/EnvironmentVariable.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/EnvironmentVariable.java
deleted file mode 100644
index c93c3ae..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/EnvironmentVariable.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 Keith Seitz and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Keith Seitz (keiths@redhat.com) - initial implementation
- *     IBM Corporation - integration and code cleanup
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-/**
- * A key/value set whose data is passed into Runtime.exec(...)
- */
-public class EnvironmentVariable
-{
-	// The name of the environment variable
-	private String name;
-	
-	// The value of the environment variable
-	private String value;
-	
-	public EnvironmentVariable(String name, String value)
-	{
-		this.name = name;
-		this.value = value;
-	}
-
-	/**
-	 * Returns this variable's name, which serves as the key in the key/value
-	 * pair this variable represents
-	 * 
-	 * @return this variable's name
-	 */
-	public String getName()
-	{
-		return name;
-	}
-	
-	/**
-	 * Returns this variables value.
-	 * 
-	 * @return this variable's value
-	 */
-	public String getValue()
-	{
-		return value;
-	}
-		
-	/**
-	 * Sets this variable's value
-	 * @param value
-	 */
-	public void setValue(String value)
-	{
-		this.value = value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getName();
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		boolean equal = false;
-		if (obj instanceof EnvironmentVariable) {
-			EnvironmentVariable var = (EnvironmentVariable)obj;
-			equal = var.getName().equals(name);
-		}
-		return equal;		
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return name.hashCode();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java
deleted file mode 100644
index 1aac3da..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java
+++ /dev/null
@@ -1,519 +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.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-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.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 com.ibm.icu.text.MessageFormat;
-
-/**
- * Dialog for organizing favorite launch configurations
- */
-public class FavoritesDialog extends TrayDialog {
-	
-	/**
-	 * Table of favorite launch configurations
-	 */
-	private TableViewer fFavoritesTable;	
-
-	// history being organized
-	private LaunchHistory fHistory;
-	
-	// favorites collection under edit
-	private List fFavorites;
-
-	// buttons
-	protected Button fAddFavoriteButton;
-	protected Button fRemoveFavoritesButton;
-	protected Button fMoveUpButton;
-	protected Button fMoveDownButton;
-
-	// button action handler
-	/**
-	 * Listener that delegates when a button is pressed
-	 */
-	private SelectionAdapter fButtonListener= new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			Button button = (Button) e.widget;
-			if (button == fAddFavoriteButton) {
-				handleAddConfigButtonSelected();
-			} else if (button == fRemoveFavoritesButton) {
-				removeSelectedFavorites();
-			} else if (button == fMoveUpButton) {
-				handleMoveUpButtonSelected();
-			} else if (button == fMoveDownButton) {
-				handleMoveDownButtonSelected();
-			}
-		}
-	};	
-	
-	/**
-	 * Listener that delegates when the selection changes in a table
-	 */
-	private ISelectionChangedListener fSelectionChangedListener= new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			handleFavoriteSelectionChanged();
-		}
-	};	
-	
-	/**
-	 * Listener that delegates when a key is pressed in a table
-	 */
-	private KeyListener fKeyListener= new KeyAdapter() {
-		public void keyPressed(KeyEvent event) {
-			if (event.character == SWT.DEL && event.stateMask == 0) {
-				removeSelectedFavorites(); 
-			}
-		}
-	};
-	
-	/**
-	 * Content provider for favorites table
-	 */
-	protected class FavoritesContentProvider implements IStructuredContentProvider {
-		
-		/**
-		 * @see IStructuredContentProvider#getElements(Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			ILaunchConfiguration[] favorites= (ILaunchConfiguration[]) getFavorites().toArray(new ILaunchConfiguration[0]);
-			return LaunchConfigurationManager.filterConfigs(favorites);
-		}
-
-		/**
-		 * @see IContentProvider#dispose()
-		 */
-		public void dispose() {
-		}
-
-		/**
-		 * @see IContentProvider#inputChanged(Viewer, Object, Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-	
-	/**
-	 * Constructs a favorites dialog.
-	 * 
-	 * @param parentShell shell to open the dialog on
-	 * @param history launch history to edit
-	 */
-	public FavoritesDialog(Shell parentShell, LaunchHistory history) {
-		super(parentShell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fHistory = history;
-	}
-
-	/**
-	 * The 'add config' button has been pressed
-	 */
-	protected void handleAddConfigButtonSelected() {
-		SelectFavoritesDialog sfd = new SelectFavoritesDialog(fFavoritesTable.getControl().getShell(), getLaunchHistory(), getFavorites());
-		sfd.open();
-		Object[] selection = sfd.getResult();
-		if (selection != null) {
-			for (int i = 0; i < selection.length; i++) {
-				getFavorites().add(selection[i]);
-			}
-			updateStatus();
-		}
-	}	
-	
-	/**
-	 * The 'remove favorites' button has been pressed
-	 */
-	protected void removeSelectedFavorites() {
-		IStructuredSelection sel = (IStructuredSelection)getFavoritesTable().getSelection();
-		Iterator iter = sel.iterator();
-		while (iter.hasNext()) {
-			Object config = iter.next();
-			getFavorites().remove(config);
-		}
-		getFavoritesTable().refresh();		
-	}	
-	
-	/**
-	 * The 'move up' button has been pressed
-	 */
-	protected void handleMoveUpButtonSelected() {
-		handleMove(-1);
-	}	
-	
-	/**
-	 * The 'move down' button has been pressed
-	 */
-	protected void handleMoveDownButtonSelected() {
-		handleMove(1);
-	}	
-	
-	protected void handleMove(int direction) {
-		IStructuredSelection sel = (IStructuredSelection)getFavoritesTable().getSelection();
-		List selList= sel.toList();
-		Object[] movedFavs= new Object[getFavorites().size()];
-		int i;
-		for (Iterator favs = selList.iterator(); favs.hasNext();) {
-			Object config = favs.next();
-			i= getFavorites().indexOf(config);
-			movedFavs[i + direction]= config;
-		}
-		
-		getFavorites().removeAll(selList);
-			
-		for (int j = 0; j < movedFavs.length; j++) {
-			Object config = movedFavs[j];
-			if (config != null) {
-				getFavorites().add(j, config);		
-			}
-		}
-		
-		getFavoritesTable().refresh();	
-		handleFavoriteSelectionChanged();	
-	}
-	
-	/**
-	 * Returns the table of favorite launch configurations.
-	 * 
-	 * @return table viewer
-	 */
-	protected TableViewer getFavoritesTable() {
-		return fFavoritesTable;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		getShell().setText(MessageFormat.format(LaunchConfigurationsMessages.FavoritesDialog_1, new String[]{getModeLabel()})); 
-		createFavoritesArea(composite);
-		return composite;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control contents = super.createContents(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getDialogArea(), IDebugHelpContextIds.ORGANIZE_FAVORITES_DIALOG);
-		return contents;
-	}
-
-	/**
-	 * Returns a label to use for launch mode with accelerators removed.
-	 * 
-     * @return label to use for launch mode with accelerators removed
-     */
-    private String getModeLabel() {
-        return DebugUIPlugin.removeAccelerators(fHistory.getLaunchGroup().getLabel());
-    }
-
-    protected void createFavoritesArea(Composite parent) {
-		Composite topComp = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.numColumns = 2;
-		topComp.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		topComp.setLayoutData(gd);
-		topComp.setFont(parent.getFont());
-	
-		// Create "favorite config" area
-		createLabel(topComp, LaunchConfigurationsMessages.FavoritesDialog_2); 
-		fFavoritesTable = createTable(topComp, new FavoritesContentProvider());
-		Composite buttonComp = createButtonComposite(topComp);
-		fAddFavoriteButton = createPushButton(buttonComp,LaunchConfigurationsMessages.FavoritesDialog_3); 
-		fAddFavoriteButton.setEnabled(true);
-		fRemoveFavoritesButton = createPushButton(buttonComp, LaunchConfigurationsMessages.FavoritesDialog_4); 
-		fMoveUpButton = createPushButton(buttonComp, LaunchConfigurationsMessages.FavoritesDialog_5); 
-		fMoveDownButton = createPushButton(buttonComp, LaunchConfigurationsMessages.FavoritesDialog_6);  
-	}
-	
-	/**
-	 * Creates a fully configured table with the given content provider
-	 */
-	private TableViewer createTable(Composite parent, IContentProvider contentProvider) {
-		TableViewer tableViewer= new TableViewer(parent, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
-		tableViewer.setLabelProvider(DebugUITools.newDebugModelPresentation());
-		tableViewer.setContentProvider(contentProvider);
-		tableViewer.setInput(DebugUIPlugin.getDefault());
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.widthHint = 100;
-		gd.heightHint = 100;
-		tableViewer.getTable().setLayoutData(gd);
-		tableViewer.getTable().setFont(parent.getFont());
-		tableViewer.addSelectionChangedListener(fSelectionChangedListener);
-		tableViewer.getControl().addKeyListener(fKeyListener);
-		return tableViewer; 
-	}	
-	
-	/**
-	 * Creates and returns a fully configured push button in the given paren with the given label.
-	 */
-	private Button createPushButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.PUSH);
-		button.setText(label);
-		button.setFont(parent.getFont());
-		setButtonLayoutData(button);
-		button.addSelectionListener(fButtonListener);
-		button.setEnabled(false);
-		return button;
-	}
-	
-	/**
-	 * Creates a fully configured composite to add buttons to.
-	 */
-	private Composite createButtonComposite(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		composite.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.numColumns = 1;
-		composite.setLayout(layout);
-		composite.setFont(parent.getFont());
-		return composite;
-	}
-	
-	/**
-	 * Creates a fully configured label with the given text
-	 */
-	private Label createLabel(Composite parent, String labelText) {
-		Label label = new Label(parent, SWT.LEFT);
-		label.setText(labelText);
-		GridData gd = new GridData();
-		gd.horizontalSpan = 2;
-		label.setLayoutData(gd);
-		label.setFont(parent.getFont());
-		return label;
-	}	
-	
-	/**
-	 * Returns the current list of favorites.
-	 */
-	protected List getFavorites() {
-		if (fFavorites == null) {
-			ILaunchConfiguration[] favs = getInitialFavorites();
-			fFavorites = new ArrayList(favs.length);
-			addAll(favs, fFavorites);
-		}
-		return fFavorites;
-	}	
-	
-	protected LaunchHistory getLaunchHistory() {
-		return fHistory;
-	}	
-	
-	/**
-	 * Returns the initial content for the favorites list
-	 */
-	protected ILaunchConfiguration[] getInitialFavorites() {
-		return getLaunchHistory().getFavorites();
-	}	
-	
-	/**
-	 * Returns the mode of this page - run or debug.
-	 */
-	protected String getMode() {
-		return getLaunchHistory().getLaunchGroup().getMode();
-	}
-			
-	/**
-	 * Copies the array into the list
-	 */
-	protected void addAll(Object[] array, List list) {
-		for (int i = 0; i < array.length; i++) {
-			list.add(array[i]);
-		}
-	}
-	
-	/**
-	 * Refresh all tables and buttons
-	 */
-	protected void updateStatus() {
-		getFavoritesTable().refresh();
-		handleFavoriteSelectionChanged();				
-	}	
-
-	/**
-	 * The selection in the favorites list has changed
-	 */
-	protected void handleFavoriteSelectionChanged() {
-		IStructuredSelection selection = (IStructuredSelection)getFavoritesTable().getSelection();
-		List favs = getFavorites();
-		boolean notEmpty = !selection.isEmpty();
-		Iterator elements= selection.iterator();
-		boolean first= false;
-		boolean last= false;
-		int lastFav= favs.size() - 1;
-		while (elements.hasNext()) {
-			Object element = elements.next();
-			if(!first && favs.indexOf(element) == 0) {
-				first= true;
-			}
-			if (!last && favs.indexOf(element) == lastFav) {
-				last= true;
-			}
-		}
-		
-		fRemoveFavoritesButton.setEnabled(notEmpty);
-		fMoveUpButton.setEnabled(notEmpty && !first);
-		fMoveDownButton.setEnabled(notEmpty && !last);
-	}
-	
-	/**
-	 * Method performOK. Uses scheduled Job format.
-	 * @since 3.2
-	 */
-	public void saveFavorites() {
-		
-		final Job job = new Job(LaunchConfigurationsMessages.FavoritesDialog_8) {
-			protected IStatus run(IProgressMonitor monitor) {
-				ILaunchConfiguration[] initial = getInitialFavorites();
-				List current = getFavorites();
-				String groupId = getLaunchHistory().getLaunchGroup().getIdentifier();
-				
-				int taskSize = Math.abs(initial.length-current.size());//get task size
-				monitor.beginTask(LaunchConfigurationsMessages.FavoritesDialog_8, taskSize);//and set it
-				
-				// removed favorites
-				for (int i = 0; i < initial.length; i++) {
-					ILaunchConfiguration configuration = initial[i];
-					if (!current.contains(configuration)) {
-						// remove fav attributes
-						try {
-							ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
-							workingCopy.setAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, (String)null);
-							workingCopy.setAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, (String)null);
-							List groups = workingCopy.getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, (List)null);
-							if (groups != null) {
-								groups.remove(groupId);
-								if (groups.isEmpty()) {
-									groups = null;	
-								}
-								workingCopy.setAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, groups);
-							}
-							workingCopy.doSave();
-						} catch (CoreException e) {
-							DebugUIPlugin.log(e);
-							return Status.CANCEL_STATUS;
-						} 
-					}
-					monitor.worked(1);
-				}
-				
-				// update added favorites
-				Iterator favs = current.iterator();
-				while (favs.hasNext()) {
-					ILaunchConfiguration configuration = (ILaunchConfiguration)favs.next();
-					try {
-						List groups = configuration.getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, (List)null);
-						if (groups == null) {
-							groups = new ArrayList();
-						}
-						if (!groups.contains(groupId)) {
-							groups.add(groupId);
-							ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
-							workingCopy.setAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, groups);
-							workingCopy.doSave();
-						}
-					} catch (CoreException e) {
-						DebugUIPlugin.log(e);
-						return Status.CANCEL_STATUS;
-					}
-					monitor.worked(1);
-				}
-				 
-				fHistory.setFavorites(getArray(current));
-				monitor.done();
-				return Status.OK_STATUS;
-			}			
-		};
-		job.setPriority(Job.LONG);
-		PlatformUI.getWorkbench().getProgressService().showInDialog(getParentShell(), job);
-		job.schedule();
-			
-	}	
-	
-	protected ILaunchConfiguration[] getArray(List list) {
-		return (ILaunchConfiguration[])list.toArray(new ILaunchConfiguration[list.size()]);
-	} 
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		saveFavorites();
-		super.okPressed();
-	}
-	
-	 /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
-     */
-    protected IDialogSettings getDialogBoundsSettings() {
-    	 IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-         IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
-         if (section == null) {
-             section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
-         return section;
-    }
-	
-	/**
-	 * Returns the name of the section that this dialog stores its settings in
-	 * 
-	 * @return String
-	 */
-	private String getDialogSettingsSectionName() {
-		return "FAVORITES_DIALOG_SECTION"; //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FilterDropDownMenuCreator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FilterDropDownMenuCreator.java
deleted file mode 100644
index 5073920..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FilterDropDownMenuCreator.java
+++ /dev/null
@@ -1,143 +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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * Creates the drop down menu for the filtering button in the launch configuration dialog
- * @since 3.2
- */
-public class FilterDropDownMenuCreator implements IMenuCreator {
-
-	/**
-	 * Provides wrapper action for filtering actions on the launch configuration dialog
-	 * @since 3.2
-	 */
-	class FilterAction extends Action {
-		
-		/** The preference store. */
-		private IPreferenceStore fStore = null;
-
-		/** The preference key for the value in the store. */
-		private String fKey = null;
-		
-		/**
-		 * Constructor for check style menu items
-		 * @param store the pref store
-		 * @param name the name of the action
-		 * @param key the pref key it is tied to
-		 */
-		public FilterAction(Menu menu, IPreferenceStore store, String name, String key) {
-			super(name, IAction.AS_CHECK_BOX);
-			fStore = store;
-			fKey = key;
-			setChecked(fStore.getBoolean(fKey));
-			fillIntoMenu(menu, this);
-		}
-		
-		/**
-		 * Constructor for flyout menu style actions
-		 * @param menu the parent menu
-		 * @param name the text of the action
-		 * @param creator the menu creator for this action
-		 */
-		public FilterAction(Menu menu, String name, IMenuCreator creator) {
-			super(name, IAction.AS_DROP_DOWN_MENU);
-			setMenuCreator(creator);
-			fillIntoMenu(menu, this);
-		}
-		
-		/**
-		 * fills the new action into the specified menu
-		 * @param menu the parent menu
-		 * @param action the new aciton to fill in to the parent
-		 */
-		private void fillIntoMenu(Menu menu, IAction action) {
-			ActionContributionItem item = new ActionContributionItem(action);
-			item.fill(menu, -1);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			if(fStore != null) {
-				fStore.setValue(fKey, isChecked());
-			}
-		}
-	}
-	
-	/**
-	 * the menu created via this class
-	 */
-	private Menu fCreatedMenu = null;
-
-	/**
-	 * gets the DebugUIPlugin preference store
-	 * @return the pref store
-	 */
-	private IPreferenceStore getDebugPrefStore() {
-		return DebugUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		fCreatedMenu = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		if(fCreatedMenu != null) {
-			fCreatedMenu.dispose();
-		}
-		//create the menu & items
-		fCreatedMenu = new Menu(parent);
-		new FilterAction(fCreatedMenu, getDebugPrefStore(), LaunchConfigurationsMessages.FilterDropDownMenuCreator_0, IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED);
-		new FilterAction(fCreatedMenu, getDebugPrefStore(), LaunchConfigurationsMessages.FilterDropDownMenuCreator_1, IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED);
-		new FilterAction(fCreatedMenu, getDebugPrefStore(), LaunchConfigurationsMessages.FilterDropDownMenuCreator_2, IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES);
-		new FilterAction(fCreatedMenu, getDebugPrefStore(), LaunchConfigurationsMessages.FilterDropDownMenuCreator_4, IInternalDebugUIConstants.PREF_FILTER_WORKING_SETS);
-		
-		//add separator
-		new MenuItem(fCreatedMenu, SWT.SEPARATOR);
-	
-		//add pref action
-		IAction action = new Action(LaunchConfigurationsMessages.FilterDropDownMenuCreator_3) {
-			public void run() {
-				SWTFactory.showPreferencePage("org.eclipse.debug.ui.LaunchConfigurations"); //$NON-NLS-1$
-			}
-		};
-		new ActionContributionItem(action).fill(fCreatedMenu, -1);
-		return fCreatedMenu;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		return fCreatedMenu;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FilterLaunchConfigurationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FilterLaunchConfigurationAction.java
deleted file mode 100644
index e6fd293..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FilterLaunchConfigurationAction.java
+++ /dev/null
@@ -1,91 +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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * provides the implementation of the filtering action for the launch configuration view within the 
- * Launch Configuration Dialog
- * @since 3.2
- */
-public class FilterLaunchConfigurationAction extends Action {
-
-	/**
-	 * Action identifier for IDebugView#getAction(String)
-	 */
-	public static final String ID_FILTER_ACTION = DebugUIPlugin.getUniqueIdentifier() + ".ID_FILTER_ACTION"; //$NON-NLS-1$
-	
-	/**
-	 * the menu for this drop down style action
-	 */
-	private FilterDropDownMenuCreator fMenuCreator;
-	
-	/**
-	 * Constructor
-	 * @param text the text for the action
-	 * @param viewer the viewer the action acts upon
-	 * @param mode the mode
-	 */
-	public FilterLaunchConfigurationAction() {
-		super(LaunchConfigurationsMessages.FilterLaunchConfigurationAction_0, IAction.AS_DROP_DOWN_MENU);
-		fMenuCreator = new FilterDropDownMenuCreator();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		SWTFactory.showPreferencePage("org.eclipse.debug.ui.LaunchConfigurations"); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDescription()
-	 */
-	public String getDescription() {
-		return LaunchConfigurationsMessages.LaunchConfigurationsDialog_4;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_FILTER_CONFIGS);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_FILTER_CONFIGS);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getMenuCreator()
-	 */
-	public IMenuCreator getMenuCreator() {
-		return fMenuCreator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return LaunchConfigurationsMessages.LaunchConfigurationsDialog_4;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java
deleted file mode 100644
index 0c91d59..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.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.debug.internal.ui.launchConfigurations;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * Groups configurations by type.
- * 
- * @since 3.3
- * CONTEXTLAUNCHING
- */
-public class LaunchConfigurationComparator extends WorkbenchViewerComparator {
-
-	/**
-	 * the map of categories of <code>ILaunchConfigurationType</code>s to <code>Integer</code>s entries
-	 */
-	private static Map fgCategories;
-	
-	/**
-	 * @see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object)
-	 */
-	public int category(Object element) {
-		Map map = getCategories();
-		if (element instanceof ILaunchConfiguration) {
-			ILaunchConfiguration configuration = (ILaunchConfiguration) element;
-			try {
-				Integer i = (Integer) map.get(configuration.getType());
-				if (i != null) {
-					return i.intValue();
-				}
-			} catch (CoreException e) {
-			}
-		}
-		return map.size();
-	}
-	
-	/**
-	 * Returns the map of categories
-	 * @return the map of categories
-	 */
-	private Map getCategories() {
-		if (fgCategories == null) {
-			fgCategories = new HashMap();
-			List types = Arrays.asList(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes());
-			Collections.sort(types, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					ILaunchConfigurationType t1 = (ILaunchConfigurationType) o1;
-					ILaunchConfigurationType t2 = (ILaunchConfigurationType) o2;
-					return t1.getName().compareTo(t2.getName());
-				}
-			
-			});
-			Iterator iterator = types.iterator();
-			int i = 0;
-			while (iterator.hasNext()) {
-				fgCategories.put(iterator.next(), new Integer(i));
-				i++;
-			}
-		}
-		return fgCategories;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.java
deleted file mode 100644
index 67b37ae..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dialog used to edit & launch a single launch configuration.
- */
-public class LaunchConfigurationDialog extends LaunchConfigurationPropertiesDialog {
-
-	/**
-	 * Constructs a dialog
-	 * 
-	 * @param shell
-	 * @param launchConfiguration
-	 * @param group
-	 */
-	public LaunchConfigurationDialog(Shell shell, ILaunchConfiguration launchConfiguration, LaunchGroupExtension group) {
-		super(shell, launchConfiguration, group);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, ID_LAUNCH_BUTTON, getLaunchButtonText(), true);
-		createButton(parent, ID_CLOSE_BUTTON, LaunchConfigurationsMessages.LaunchConfigurationDialog_Close_1, false);  
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#getShellTitle()
-	 */
-	protected String getShellTitle() {
-		return getLaunchConfiguration().getName();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#getTitleAreaTitle()
-	 */
-	protected String getTitleAreaTitle() {
-		return LaunchConfigurationsMessages.LaunchConfigurationDialog_Modify_attributes_and_launch__1; 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SINGLE_LAUNCH_CONFIGURATION_DIALOG;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#updateButtons()
-	 */
-	public void updateButtons() {
-		// Launch button
-		getTabViewer().refresh();
-		getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates());
-		
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#getDialogSettingsSectionName()
-	 */
-	protected String getDialogSettingsSectionName() {
-		return IDebugUIConstants.PLUGIN_ID + ".SINGLE_LAUNCH_CONFIGURATION_DIALOG_SECTION"; //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationEditDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationEditDialog.java
deleted file mode 100644
index af33234..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationEditDialog.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class is used to construct a launch configuration dialog used to edit a launch configuration and continue or cancel (optional),
- * not allowing a launch to occur.
- * 
- * @since 3.3
- */
-public class LaunchConfigurationEditDialog extends LaunchConfigurationDialog {
-
-	private boolean fShowCancel = false;
-	
-	/**
-	 * Constructor
-	 * @param shell the shell to create this dialog on
-	 * @param launchConfiguration the launch config that this dialog is allowing you to edit
-	 * @param group the launch group associated with the showing tab group
-	 * @param showcancel if the cancel button should be shown or not
-	 */
-	public LaunchConfigurationEditDialog(Shell shell, ILaunchConfiguration launchConfiguration, LaunchGroupExtension group, boolean showcancel) {
-		super(shell, launchConfiguration, group);
-		fShowCancel = showcancel;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#getTitleAreaTitle()
-	 */
-	protected String getTitleAreaTitle() {
-		return LaunchConfigurationsMessages.LaunchConfigurationEditDialog_0; 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, ID_LAUNCH_BUTTON, LaunchConfigurationsMessages.LaunchConfigurationEditDialog_1, true);
-		if(fShowCancel) {
-			createButton(parent, ID_CANCEL_BUTTON, IDialogConstants.CANCEL_LABEL, false);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#updateButtons()
-	 */
-	public void updateButtons() {
-		getTabViewer().refresh();
-		getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog#getDialogSettingsSectionName()
-	 */
-	protected String getDialogSettingsSectionName() {
-		return IDebugUIConstants.PLUGIN_ID + ".LAUNCH_CONFIGURATION_EDIT_DIALOG_SECTION"; //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if(buttonId == ID_LAUNCH_BUTTON) {
-			setReturnCode(IDialogConstants.OK_ID);
-			int status = shouldSaveCurrentConfig();
-			if(status != IDialogConstants.CANCEL_ID) {
-				if(status != ID_DISCARD_BUTTON) {
-					if(status == IDialogConstants.YES_ID) {
-						getTabViewer().handleApplyPressed();
-					}
-				}
-			}
-		}
-		else if(buttonId == ID_CANCEL_BUTTON) {
-			setReturnCode(IDialogConstants.CANCEL_ID);
-		}
-		close();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java
deleted file mode 100644
index 10ab28b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.FilteredTree;
-import org.eclipse.ui.dialogs.PatternFilter;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * Overrides the default filtered tree to use our own tree viewer which supports preserving selection after filtering
- * 
- * @see LaunchConfigurationView
- * @see LaunchConfigurationViewer
- * 
- * @since 3.3 
- */
-public final class LaunchConfigurationFilteredTree extends FilteredTree {
-
-	private ILaunchGroup fLaunchGroup = null;
-	private ViewerFilter[] fFilters = null;
-	private int fTreeStyle = -1;
-	private PatternFilter fPatternFilter = null;
-	boolean filtertextchanging = false;
-	
-	/**
-	 * Constructor
-	 * @param parent
-	 * @param treeStyle
-	 * @param filter
-	 */
-	public LaunchConfigurationFilteredTree(Composite parent, int treeStyle, PatternFilter filter, ILaunchGroup group, ViewerFilter[] filters) {
-		super(parent, treeStyle, filter);
-		fLaunchGroup = group;
-		fFilters = filters;
-		fPatternFilter = filter;
-		fTreeStyle = treeStyle;
-	}
-	
-	/**
-	 * @see org.eclipse.ui.dialogs.FilteredTree#doCreateTreeViewer(org.eclipse.swt.widgets.Composite, int)
-	 */
-	protected TreeViewer doCreateTreeViewer(Composite cparent, int style) {
-		treeViewer = new LaunchConfigurationViewer(cparent, style);
-		treeViewer.setLabelProvider(DebugUITools.newDebugModelPresentation());
-		treeViewer.setComparator(new WorkbenchViewerComparator());
-		treeViewer.setContentProvider(new LaunchConfigurationTreeContentProvider(fLaunchGroup.getMode(), cparent.getShell()));
-		treeViewer.addFilter(new LaunchGroupFilter(fLaunchGroup));
-		treeViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
-		if(fFilters != null) {
-			for (int i = 0; i < fFilters.length; i++) {
-				treeViewer.addFilter(fFilters[i]);
-			}
-		}
-		treeViewer.getControl().addHelpListener(new HelpListener() {
-			public void helpRequested(HelpEvent evt) {
-				handleHelpRequest(evt);
-			}
-		});
-		return treeViewer;
-	}
-	
-	/**
-	 * @see org.eclipse.ui.dialogs.FilteredTree#createControl(org.eclipse.swt.widgets.Composite, int)
-	 */
-	protected void createControl(Composite cparent, int treeStyle) {
-		super.createControl(cparent, treeStyle);
-		setBackground(cparent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-	}
-
-	/**
-	 * @see org.eclipse.ui.dialogs.FilteredTree#init(int, org.eclipse.ui.dialogs.PatternFilter)
-	 * force it to do nothing so that we can initialize the class properly
-	 */
-	protected void init(int treeStyle, PatternFilter filter) {}
-
-	/**
-	 * This method is used to create the actual set of controls for the dialog
-	 */
-	public void createViewControl() {
-		super.init(fTreeStyle, fPatternFilter);
-	}
-	
-	/**
-	 * Handle help events locally rather than deferring to WorkbenchHelp.  This
-	 * allows help specific to the selected config type to be presented.
-	 * 
-	 */
-	protected void handleHelpRequest(HelpEvent evt) {
-		if (getViewer().getTree() != evt.getSource()) {
-			return;
-		}
-		String id = computeContextId();
-		if (id != null)
-			PlatformUI.getWorkbench().getHelpSystem().displayHelp(id);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.FilteredTree#textChanged()
-	 */
-	protected void textChanged() {
-		if(!filtertextchanging) {
-			filtertextchanging = true;
-			LaunchConfigurationsDialog dialog = (LaunchConfigurationsDialog)LaunchConfigurationsDialog.getCurrentlyVisibleLaunchConfigurationDialog();
-			if(dialog != null) {
-				LaunchConfigurationTabGroupViewer viewer = dialog.getTabViewer();
-				if(viewer != null && viewer.isDirty()) {
-					if(viewer.canSave()) {
-						if(MessageDialog.openQuestion(getShell(), LaunchConfigurationsMessages.LaunchConfigurationFilteredTree_discard_changes, LaunchConfigurationsMessages.LaunchConfigurationFilteredTree_search_with_changes)) {
-							viewer.handleApplyPressed();
-							super.textChanged();
-						}
-						else {
-							setFilterText(LaunchConfigurationsMessages.LaunchConfigurationFilteredTree_type_filter_text);
-						}
-					}
-					else {
-						if(MessageDialog.openQuestion(getShell(), LaunchConfigurationsMessages.LaunchConfigurationFilteredTree_discard_changes, LaunchConfigurationsMessages.LaunchConfigurationFilteredTree_search_with_errors)) { 
-							viewer.handleRevertPressed();
-							super.textChanged();
-						}
-						else {
-							setFilterText(LaunchConfigurationsMessages.LaunchConfigurationFilteredTree_type_filter_text); 
-						}
-					}
-				}
-				else {
-					super.textChanged();
-				}
-			}
-			filtertextchanging = false;
-		}
-	}
-	
-	/**
-	 * Computes the context id for this viewer
-	 * @return the context id
-	 */
-	public String computeContextId() {
-		try {
-			ISelection selection = getViewer().getSelection();
-			if (!selection.isEmpty() && selection instanceof IStructuredSelection ) {
-				IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-				Object firstSelected = structuredSelection.getFirstElement();
-				ILaunchConfigurationType configType = null;
-				if (firstSelected instanceof ILaunchConfigurationType) {
-					configType = (ILaunchConfigurationType) firstSelected;
-				} 
-				else if (firstSelected instanceof ILaunchConfiguration) {
-					configType = ((ILaunchConfiguration) firstSelected).getType();
-				}
-				if (configType != null) {
-					String helpContextId = LaunchConfigurationPresentationManager.getDefault().getHelpContext(configType, fLaunchGroup.getMode());
-					if (helpContextId != null) {
-						return helpContextId;
-					}
-				}
-			}
-		} 
-		catch (CoreException ce) {DebugUIPlugin.log(ce);}
-		return null;
-	}
-	
-	/**
-	 * Returns the launch configuration viewer for this filtered tree
-	 * @return the tree viewer appropriately cast
-	 */
-	public LaunchConfigurationViewer getLaunchConfigurationViewer() {
-		return (LaunchConfigurationViewer) getViewer();
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * Called after a re-filter due to user typing text. Update the filter count
-	 * in the LCD
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredTree#updateToolbar(boolean)
-	 */
-	protected void updateToolbar(boolean visible) {
-		super.updateToolbar(visible);
-		// update filter count
-		getLaunchConfigurationViewer().filterChanged();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
deleted file mode 100644
index 2768457..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
+++ /dev/null
@@ -1,1234 +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.debug.internal.ui.launchConfigurations;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-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.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.ILaunchHistoryChangedListener;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Manages UI related launch configuration artifacts
- * 
- * Since 3.3 the Launch Configuration Manager is an <code>ISaveParticipant</code>, allowing it to participate in
- * workspace persistence life-cycles.
- * 
- * @see ISaveParticipant
- * @see org.eclipse.debug.ui.ILaunchShortcut
- * @see ILaunchGroup
- * @see ILaunchListener
- * @see ILaunchHistoryChangedListener
- * @see DebugUIPlugin
- * @see LaunchHistory
- */
-public class LaunchConfigurationManager implements ILaunchListener, ISaveParticipant {
-	/**
-	 * Launch group extensions, keyed by launch group identifier.
-	 */
-	protected Map fLaunchGroups;
-	
-	/**
-	 * Launch histories keyed by launch group identifier
-	 */	
-	protected Map fLaunchHistories;
-		
-	/**
-	 * The list of registered implementors of <code>ILaunchHistoryChangedListener</code>
-	 */
-	protected List fLaunchHistoryChangedListeners = new ArrayList(3);	
-
-	/**
-	 * Launch shortcuts
-	 */
-	private List fLaunchShortcuts = null;
-	
-	/**
-	 * Launch shortcuts, cached by perspective ids
-	 */
-	private Map fLaunchShortcutsByPerspective = null;
-		
-	/**
-	 * Cache of launch configuration tab images with error overlays
-	 */
-	protected ImageRegistry fErrorImages = null;
-	
-	/**
-	 * true when restoring launch history
-	 */
-	protected boolean fRestoring = false;
-	
-	/**
-	 * A set containing the launch modes supported by
-	 * current configurations.
-	 */
-	private Set fLoadedModes = null;
-		
-	/**
-	 * The name of the file used to persist the launch history.
-	 */
-	private static final String LAUNCH_CONFIGURATION_HISTORY_FILENAME = "launchConfigurationHistory.xml"; //$NON-NLS-1$
-	
-	/**
-	 * performs initialization of the manager when it is started 
-	 */
-	public void startup() {				
-		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-		launchManager.addLaunchListener(this);	
-		DebugUIPlugin.getDefault().addSaveParticipant(this);
-		//update histories for launches already registered
-		ILaunch[] launches = launchManager.getLaunches();
-		for (int i = 0; i < launches.length; i++) {
-			launchAdded(launches[i]);
-		}
-	}
-	
-	/**
-	 * Returns whether any launch config supports the given mode.
-	 * 
-	 * @param mode launch mode
-	 * @return whether any launch config supports the given mode
-	 */
-	public boolean launchModeAvailable(String mode) {
-		if (fLoadedModes == null) {
-			ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-			ILaunchConfigurationType[] types = launchManager.getLaunchConfigurationTypes();
-			ILaunchMode[] modes = launchManager.getLaunchModes();
-			fLoadedModes = new HashSet(3);
-			for (int i = 0; i < types.length; i++) {
-				for (int j = 0; j < modes.length; j++) {
-					if (types[i].supportsMode(modes[j].getIdentifier())) {
-						fLoadedModes.add(modes[j].getIdentifier());
-					}
-				}
-			}
-		}
-		return fLoadedModes.contains(mode);
-	}
-	
-	/**
-	 * Returns whether the given launch configuration should be visible in the
-	 * debug ui. If the config is marked as private, or belongs to a different
-	 * category (i.e. non-null), then this configuration should not be displayed
-	 * in the debug ui.
-	 * 
-	 * @param launchConfiguration
-	 * @return boolean
-	 */
-	public static boolean isVisible(ILaunchConfiguration launchConfiguration) {
-		try {
-			return !(launchConfiguration.getAttribute(IDebugUIConstants.ATTR_PRIVATE, false));
-		} catch (CoreException e) {
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns a collection of launch configurations that does not contain
-	 * configurations from disabled activities.
-	 * 
-	 * @param configurations a collection of configurations
-	 * @return the given collection minus any configurations from disabled activities
-	 */
-	public static ILaunchConfiguration[] filterConfigs(ILaunchConfiguration[] configurations) {
-		IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench().getActivitySupport();
-		if (activitySupport == null) {
-			return configurations;
-		}
-		List filteredConfigs = new ArrayList();
-		ILaunchConfigurationType type = null;
-		LaunchConfigurationTypeContribution contribution = null;
-		ILaunchConfiguration configuration = null;
-		for (int i = 0; i < configurations.length; i++) {
-			configuration = configurations[i];
-			try {
-				type = configuration.getType();
-				contribution = new LaunchConfigurationTypeContribution(type);
-				if (DebugUIPlugin.doLaunchConfigurationFiltering(configuration) & !WorkbenchActivityHelper.filterItem(contribution)) {
-					filteredConfigs.add(configuration);
-				}
-			} 
-			catch (CoreException e) {DebugUIPlugin.log(e.getStatus());}
-		}
-		return (ILaunchConfiguration[]) filteredConfigs.toArray(new ILaunchConfiguration[filteredConfigs.size()]);
-	}
-
-	/**
-	 * Returns a listing of <code>IlaunchDeleagtes</code> that does not contain any delegates from disabled activities
-	 * @param delegates the raw listing of delegates to filter
-	 * @return the filtered listing of <code>ILaunchDelegate</code>s or an empty array, never <code>null</code>.
-	 * @since 3.3
-	 */
-	public static ILaunchDelegate[] filterLaunchDelegates(ILaunchConfigurationType type, Set modes) throws CoreException {
-		IWorkbenchActivitySupport as = PlatformUI.getWorkbench().getActivitySupport();
-		ILaunchDelegate[] delegates = type.getDelegates(modes);
-		if(as == null) {
-			return delegates;
-		}
-		HashSet set = new HashSet();
-		for(int i = 0; i < delegates.length; i++) {
-			//filter by capabilities
-			if(!WorkbenchActivityHelper.filterItem(new LaunchDelegateContribution(delegates[i]))) {
-				set.add(delegates[i]);
-			}
-		}
-		return (ILaunchDelegate[]) set.toArray(new ILaunchDelegate[set.size()]);
-	}
-	
-	/**
-	 * Performs cleanup operations when the manager is being disposed of. 
-	 */
-	public void shutdown() {
-		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-		launchManager.removeLaunchListener(this);
-		if (fLaunchHistories != null) {
-			Iterator histories = fLaunchHistories.values().iterator();
-			while (histories.hasNext()) {
-				LaunchHistory history = (LaunchHistory)histories.next();
-				history.dispose();
-			}
-		}
-		DebugUIPlugin.getDefault().removeSaveParticipant(this);
-	}
-	
-	/**
-	 * @see ILaunchListener#launchRemoved(ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {}
-	
-	/**
-	 * @see ILaunchListener#launchChanged(ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {}
-
-	/**
-	 * Must not assume that will only be called from the UI thread.
-	 *
-	 * @see ILaunchListener#launchAdded(ILaunch)
-	 */
-	public void launchAdded(final ILaunch launch) {
-		removeTerminatedLaunches(launch);
-	}
-	
-	/**
-	 * Removes terminated launches from the launch view, leaving the specified launch in the view
-	 * @param newLaunch the newly added launch to leave in the view
-	 */
-	protected void removeTerminatedLaunches(ILaunch newLaunch) {
-	    if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_AUTO_REMOVE_OLD_LAUNCHES)) {
-	        ILaunchManager lManager= DebugPlugin.getDefault().getLaunchManager();
-	        Object[] launches= lManager.getLaunches();
-	        for (int i= 0; i < launches.length; i++) {
-	            ILaunch launch= (ILaunch)launches[i];
-	            if (launch != newLaunch && launch.isTerminated()) {
-	                lManager.removeLaunch(launch);
-	            }
-	        }
-	    }
-	}
-	
-	/**
-	 * Returns the most recent launch for the given group, or <code>null</code>
-	 * if none. This method does not include any filtering for the returned launch configuration.
-	 *	
-	 * This method is exposed via DebugTools.getLastLaunch
-	 *
-	 * @return the last launch, or <code>null</code> if none
-	 */	
-	public ILaunchConfiguration getLastLaunch(String groupId) {
-		LaunchHistory history = getLaunchHistory(groupId);
-		if (history != null) {
-			return history.getRecentLaunch();
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the most recent launch for the given group taking launch configuration
-	 * filters into account, or <code>null</code> if none.
-	 * 
-	 * @param groupId launch group
-	 * @return the most recent, un-filtered launch
-	 */
-	public ILaunchConfiguration getFilteredLastLaunch(String groupId) {
-		LaunchHistory history = getLaunchHistory(groupId);
-		if (history != null) {
-			ILaunchConfiguration[] filterConfigs = history.getCompleteLaunchHistory();
-			if (filterConfigs.length > 0) {
-				return filterConfigs[0];
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Add the specified listener to the list of listeners that will be notified when the
-	 * launch history changes.
-	 */
-	public void addLaunchHistoryListener(ILaunchHistoryChangedListener listener) {
-		if (!fLaunchHistoryChangedListeners.contains(listener)) {
-			fLaunchHistoryChangedListeners.add(listener);
-		}
-	}
-	
-	/**
-	 * Remove the specified listener from the list of listeners that will be notified when the
-	 * launch history changes.
-	 */
-	public void removeLaunchHistoryListener(ILaunchHistoryChangedListener listener) {
-		fLaunchHistoryChangedListeners.remove(listener);
-	}
-	
-	/**
-	 * Notify all launch history listeners that the launch history has changed in some way.
-	 */
-	protected void fireLaunchHistoryChanged() {
-		Iterator iterator = fLaunchHistoryChangedListeners.iterator();
-		ILaunchHistoryChangedListener listener = null;
-		while (iterator.hasNext()) {
-			listener = (ILaunchHistoryChangedListener) iterator.next();
-			listener.launchHistoryChanged();
-		}
-	}
-
-	/**
-	 * Returns the history listing as XML
-	 * @return the history listing as XML
-	 * @throws CoreException
-	 * @throws ParserConfigurationException
-	 * @throws TransformerException
-	 * @throws IOException
-	 */
-	protected String getHistoryAsXML() throws CoreException, ParserConfigurationException {
-		Document doc = DebugUIPlugin.getDocument();
-		Element historyRootElement = doc.createElement(IConfigurationElementConstants.LAUNCH_HISTORY); 
-		doc.appendChild(historyRootElement);
-		
-		Iterator histories = fLaunchHistories.values().iterator();
-		LaunchHistory history = null;
-		while (histories.hasNext()) {
-			history = (LaunchHistory)histories.next();
-			Element groupElement = doc.createElement(IConfigurationElementConstants.LAUNCH_GROUP);
-			groupElement.setAttribute(IConfigurationElementConstants.ID, history.getLaunchGroup().getIdentifier());
-			historyRootElement.appendChild(groupElement);
-			Element historyElement = doc.createElement(IConfigurationElementConstants.MRU_HISTORY);
-			groupElement.appendChild(historyElement);
-			createEntry(doc, historyElement, history.getCompleteLaunchHistory());
-			Element favs = doc.createElement(IConfigurationElementConstants.FAVORITES);
-			groupElement.appendChild(favs);
-			createEntry(doc, favs, history.getFavorites());
-			history.setSaved(true);
-		}
-		return DebugPlugin.serializeDocument(doc);
-	}
-
-	/**
-	 * Creates a new launch history element and adds it to the specified <code>Document</code>
-	 * @param doc the <code>Document</code> to add the new element to
-	 * @param historyRootElement the root element
-	 * @param mode the modes the history element should apply to
-	 * @param configurations the configurations to create entries for
-	 * @throws CoreException
-	 */
-	protected void createEntry(Document doc, Element historyRootElement, ILaunchConfiguration[] configurations) throws CoreException {
-		for (int i = 0; i < configurations.length; i++) {
-			ILaunchConfiguration configuration = configurations[i];
-			if (configuration.exists()) {
-				Element launch = doc.createElement(IConfigurationElementConstants.LAUNCH);
-				launch.setAttribute(IConfigurationElementConstants.MEMENTO, configuration.getMemento());
-				historyRootElement.appendChild(launch);
-			}
-		}
-	}
-				
-	/**
-	 * Returns the path to the local file for the launch history
-	 * @return the file path for the launch history file
-	 */
-	protected IPath getHistoryFilePath() {
-		return DebugUIPlugin.getDefault().getStateLocation().append(LAUNCH_CONFIGURATION_HISTORY_FILENAME); 
-	}
-
-	/**
-	 * Write out an XML file indicating the entries on the run & debug history lists and
-	 * the most recent launch.
-	 */
-	protected void persistLaunchHistory() throws IOException, CoreException, ParserConfigurationException {
-		synchronized (this) {
-			if (fLaunchHistories == null || fRestoring) {
-				return;
-			}			
-		}
-		boolean shouldsave = false;
-		for(Iterator iter = fLaunchHistories.values().iterator(); iter.hasNext();) {
-			shouldsave |= ((LaunchHistory)iter.next()).needsSaving();
-		}
-		if(shouldsave) {
-			IPath historyPath = getHistoryFilePath();
-			String osHistoryPath = historyPath.toOSString();
-			String xml = getHistoryAsXML();
-			File file = new File(osHistoryPath);
-			file.createNewFile();
-			
-			FileOutputStream stream = new FileOutputStream(file);
-			stream.write(xml.getBytes("UTF8")); //$NON-NLS-1$
-			stream.close();
-		}
-	}
-	
-	/**
-	 * Find the XML history file and parse it.  Place the corresponding configurations
-	 * in the appropriate history, and set the most recent launch.
-	 */
-	private void restoreLaunchHistory() {
-		// Find the history file
-		IPath historyPath = getHistoryFilePath();
-		String osHistoryPath = historyPath.toOSString();
-		File file = new File(osHistoryPath);
-		// If no history file, nothing to do
-		if (!file.exists()) {
-			return;
-		}
-		InputStream stream= null;
-		Element rootHistoryElement= null;
-		try {
-			// Parse the history file
-			stream = new BufferedInputStream(new FileInputStream(file));
-			try {
-				DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-				parser.setErrorHandler(new DefaultHandler());
-				rootHistoryElement = parser.parse(new InputSource(stream)).getDocumentElement();
-			} catch (SAXException e) {
-				DebugUIPlugin.log(e);
-				return;
-			} catch (ParserConfigurationException e) {
-				DebugUIPlugin.log(e);
-				return;
-			} finally {
-				stream.close();
-			}
-		} catch (IOException exception) {
-			DebugUIPlugin.log(exception);
-			return;
-		}	
-		// If root node isn't what we expect, return
-		if (!rootHistoryElement.getNodeName().equalsIgnoreCase(IConfigurationElementConstants.LAUNCH_HISTORY)) { 
-			return;
-		}
-		// For each child of the root node, construct a launch config handle and add it to
-		// the appropriate history, or set the most recent launch
-		Collection l = fLaunchHistories.values();
-		LaunchHistory[] histories = (LaunchHistory[])l.toArray(new LaunchHistory[l.size()]);
-		NodeList list = rootHistoryElement.getChildNodes();
-		int length = list.getLength();
-		Node node = null;
-		Element entry = null;
-		for (int i = 0; i < length; ++i) {
-			node = list.item(i);
-			short type = node.getNodeType();
-			if (type == Node.ELEMENT_NODE) {
-				entry = (Element) node;
-				if (entry.getNodeName().equalsIgnoreCase(IConfigurationElementConstants.LAUNCH)) { 
-					createHistoryElement(entry, histories, false);
-				} else if (entry.getNodeName().equalsIgnoreCase(IConfigurationElementConstants.LAST_LAUNCH)) {
-					createHistoryElement(entry, histories, true);
-				} else if (entry.getNodeName().equals(IConfigurationElementConstants.LAUNCH_GROUP)) {
-					String id = entry.getAttribute(IConfigurationElementConstants.ID);
-					if (id != null) {
-						LaunchHistory history = getLaunchHistory(id);
-						if (history != null) { 
-							restoreHistory(entry, history);
-						}
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Restores the given launch history.
-	 * 
-	 * @param groupElement launch group history
-	 * @param history associated history cache
-	 */
-	private void restoreHistory(Element groupElement, LaunchHistory history) {
-		NodeList nodes = groupElement.getChildNodes();
-		int length = nodes.getLength();
-		for (int i = 0; i < length; i++) {
-			Node node = nodes.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element element = (Element)node;
-				if (element.getNodeName().equals(IConfigurationElementConstants.MRU_HISTORY)) {
-					ILaunchConfiguration[] configs = getLaunchConfigurations(element);
-					for (int j = 0; j < configs.length; j++) {
-						history.addHistory(configs[j], false);
-					}
-				} else if (element.getNodeName().equals(IConfigurationElementConstants.FAVORITES)) {
-					ILaunchConfiguration[] favs = getLaunchConfigurations(element);
-					history.setFavorites(favs);
-				}
-			}
-		}
-	}
-	
-	/** 
-	 * Restores a list of configurations.
-	 * @param root element
-	 * @return list of configurations under the element
-	 */
-	private ILaunchConfiguration[] getLaunchConfigurations(Element root) {
-		List configs = new ArrayList();
-		NodeList nodes = root.getChildNodes();
-		int length = nodes.getLength();
-		for (int i = 0; i < length; i++) {
-			Node node = nodes.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element element = (Element) node;
-				if (element.getNodeName().equals(IConfigurationElementConstants.LAUNCH)) {
-					String memento = element.getAttribute(IConfigurationElementConstants.MEMENTO); 
-					if (memento != null) {
-						try {
-							ILaunchConfiguration configuration = DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(memento);
-							if (configuration.exists()) {
-								configs.add(configuration);
-							}
-						} catch (CoreException e) {
-						}
-					}
-				}
-			}
-		}
-		return (ILaunchConfiguration[]) configs.toArray(new ILaunchConfiguration[configs.size()]);
-	}
-	
-	/**
-	 * Construct a launch configuration corresponding to the specified XML
-	 * element, and place it in the appropriate history.
-	 */
-	private void createHistoryElement(Element entry, LaunchHistory[] histories, boolean prepend) {
-		String memento = entry.getAttribute(IConfigurationElementConstants.MEMENTO); 
-		String mode = entry.getAttribute(IConfigurationElementConstants.MODE);     
-		try {
-			ILaunchConfiguration launchConfig = DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(memento);
-			if (launchConfig.exists()) {
-				LaunchHistory history = null;
-				for (int i = 0; i < histories.length; i++) {
-					history = histories[i];
-					if (history.accepts(launchConfig) && history.getLaunchGroup().getMode().equals(mode)) {
-						history.addHistory(launchConfig, prepend);
-					}
-				}
-			}
-		} catch (CoreException e) {
-			//do nothing, as we want to throw away invalid launch history entries silently
-		}	
-	}
-	
-	/**
-	 * Load all registered extensions of the 'launch shortcut' extension point.
-	 */
-	private void loadLaunchShortcuts() {
-		if(fLaunchShortcuts == null) {
-			// Get the configuration elements
-			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_LAUNCH_SHORTCUTS);
-			IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-	
-			// Load the configuration elements into a Map 
-			fLaunchShortcuts = new ArrayList(infos.length);
-			for (int i = 0; i < infos.length; i++) {
-				fLaunchShortcuts.add(new LaunchShortcutExtension(infos[i]));
-			}
-			Collections.sort(fLaunchShortcuts, new ShortcutComparator());
-		}
-	}
-	
-	/**
-	 * Load all registered extensions of the 'launch groups' extension point.
-	 */
-	private void loadLaunchGroups() {
-		if (fLaunchGroups == null) {
-			// Get the configuration elements
-			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_LAUNCH_GROUPS);
-			IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
-	
-			// Load the configuration elements into a Map 
-			fLaunchGroups = new HashMap(infos.length);
-			LaunchGroupExtension ext = null;
-			for (int i = 0; i < infos.length; i++) {
-				ext = new LaunchGroupExtension(infos[i]);
-				fLaunchGroups.put(ext.getIdentifier(), ext);
-			}
-		}
-	}	
-	
-	/**
-	 * Returns all launch shortcuts
-	 * 
-	 * @return all launch shortcuts
-	 */
-	public List getLaunchShortcuts() {
-		if (fLaunchShortcuts == null) {
-			loadLaunchShortcuts();
-		}
-		return fLaunchShortcuts;
-	}
-
-	/**
-	 * Creates a listing of the launch shortcut extensions that are applicable to the underlying resource
-	 * @param resource the underlying resource
-	 * @return a listing of applicable launch shortcuts or an empty list, never <code>null</code>
-	 * @since 3.3
-	 */
-	public List getLaunchShortcuts(IResource resource) {
-		List list = new ArrayList(); 
-		List sc = getLaunchShortcuts();
-		List ctxt = new ArrayList();
-		ctxt.add(resource);
-		IEvaluationContext context = new EvaluationContext(null, ctxt);
-		context.addVariable("selection", ctxt); //$NON-NLS-1$
-		LaunchShortcutExtension ext = null;
-		for(Iterator iter = sc.iterator(); iter.hasNext();) {
-			ext = (LaunchShortcutExtension) iter.next();
-			try {
-				if(ext.evalEnablementExpression(context, ext.getContextualLaunchEnablementExpression()) && !WorkbenchActivityHelper.filterItem(ext)) {
-					if(!list.contains(ext)) {
-						list.add(ext);
-					}
-				}
-			}
-			catch(CoreException ce) {/*do nothing*/}
-		}
-		return list;
-	}
-	
-	/**
-	 * Returns a list of launch shortcuts based on the given shortcuts that support
-	 * the given launch mode.
-	 * 
-	 * @param shortctus launch shortcuts
-	 * @param mode launch mode id
-	 * @return shortcuts supporting the given mode, possible an empty list
-	 * @since 3.3
-	 */
-	public List getShortcutsSupportingMode(List shortctus, String mode) {
-		ArrayList supporting = new ArrayList(shortctus);
-		Iterator iterator = supporting.listIterator();
-		while (iterator.hasNext()) {
-			LaunchShortcutExtension ext = (LaunchShortcutExtension) iterator.next();
-			if (!ext.getModes().contains(mode)) {
-				iterator.remove();
-			}
-		}
-		return supporting;
-	}
-	
-	/**
-	 * Returns a listing of all of the <code>ILaunchConfigurationType</code>s that apply to the currently
-	 * specified <code>IResource</code>.
-	 * 
-	 * @param resource the resource context
-	 * @return a listing of applicable <code>ILaunchConfigurationType</code>s, or an empty list, never <code>null</code>
-	 * @since 3.3
-	 * CONTEXTLAUNCHING
-	 */
-	public List getApplicableConfigurationTypes(IResource resource) {
-		List types = new ArrayList();
-		List exts = getLaunchShortcuts();
-		LaunchShortcutExtension ext = null;
-		List list = new ArrayList();
-		list.add(resource);
-		IEvaluationContext context = new EvaluationContext(null, list);
-		context.setAllowPluginActivation(true);
-		context.addVariable("selection", list); //$NON-NLS-1$
-		HashSet set = new HashSet();
-		for(Iterator iter = exts.listIterator(); iter.hasNext();) {
-			ext = (LaunchShortcutExtension) iter.next();
-			try {
-				if(ext.evalEnablementExpression(context, ext.getContextualLaunchEnablementExpression())) {
-					set.addAll(ext.getAssociatedConfigurationTypes());
-				}
-			}
-			catch(CoreException ce) {
-				IStatus status = new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Launch shortcut '" + ext.getId() + "' enablement expression caused exception. Shortcut was removed.", ce); //$NON-NLS-1$ //$NON-NLS-2$
-				DebugUIPlugin.log(status);
-				iter.remove();
-			}
-		}
-		LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
-		ILaunchConfigurationType type = null;
-		for(Iterator iter = set.iterator(); iter.hasNext();) {
-			type = lm.getLaunchConfigurationType((String)iter.next());
-			if(type != null) { 
-				if(!types.contains(type) && type.isPublic() && !"org.eclipse.ui.externaltools.builder".equals(type.getCategory())) { //$NON-NLS-1$
-					types.add(type);
-				}
-			}
-		}
-		return types;
-	}
-	
-	/**
-	 * Returns a list of the <code>ILaunchConfiguration</code>s that apply to the specified <code>IResource</code>
-	 * @param resource the resource
-	 * @return a listing of applicable <code>ILaunchConfiguration</code>s for the specified <code>IResource</code> or an empty 
-	 * list if none, never <code>null</code>
-	 * @since 3.3
-	 */
-	public List getApplicableLaunchConfigurations(IResource resource) {
-		ArrayList list = new ArrayList();
-		try {
-			List types = getApplicableConfigurationTypes(resource);
-			ILaunchConfiguration[] configurations = filterConfigs(getLaunchManager().getLaunchConfigurations());
-			ILaunchConfiguration configuration = null;
-			IResource[] resources = null;
-			for(int i = 0; i < configurations.length; i++) {
-				configuration = configurations[i];
-				if(types.contains(configuration.getType()) && acceptConfiguration(configuration)) {
-					resources = configuration.getMappedResources();
-					if (resources != null) {
-						for (int j = 0; j < resources.length; j++) {
-							if (resource.equals(resources[j]) || resource.getFullPath().isPrefixOf(resources[j].getFullPath())) {
-								list.add(configuration);
-								break;
-							}
-						}
-					}
-					else {
-						//in the event the config has no mapping
-						list.add(configuration);
-					}
-				}
-			}
-		} catch (CoreException e) {
-			list.clear();
-			DebugPlugin.log(e);
-		}
-		return list;
-	}
-	
-	/**
-	 * Returns if the specified configuration should be considered as a potential candidate
-	 * @param config
-	 * @return if the specified configuration should be considered as a potential candidate
-	 * @throws CoreException
-	 */
-	private boolean acceptConfiguration(ILaunchConfiguration config) throws CoreException {
-		if(config != null && !DebugUITools.isPrivate(config)) {
-			if(!"org.eclipse.ui.externaltools".equals(config.getType().getCategory())) { //$NON-NLS-1$
-				return true;
-			}
-			else {
-				IResource[] res = config.getMappedResources();
-				if(res != null) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns all launch shortcuts for the given category
-	 *
-	 * @return all launch shortcuts
-	 */
-	public List getLaunchShortcuts(String category) {
-		return filterShortcuts(getLaunchShortcuts(), category);
-	}	
-	
-	/**
-	 * Return a list of filtered launch shortcuts, based on the given category.
-	 *  
-	 * @param unfiltered
-	 * @param category
-	 * @return List
-	 */
-	protected List filterShortcuts(List unfiltered, String category) {
-		List filtered = new ArrayList(unfiltered.size());
-		Iterator iter = unfiltered.iterator();
-		LaunchShortcutExtension extension = null;
-		while (iter.hasNext()){
-			extension = (LaunchShortcutExtension)iter.next();
-			if (category == null) {
-				if (extension.getCategory() == null) {
-					filtered.add(extension);
-				}
-			} else if (category.equals(extension.getCategory())){
-				filtered.add(extension);
-			}
-		}
-		return filtered;		
-	}
-	
-	/**
-	 * Returns all launch shortcuts defined for the given perspective,
-	 * empty list if none.
-	 * 
-	 * @param perpsective perspective identifier
-	 * @param category the category for the shortcut
-	 * @return all launch shortcuts defined for the given perspective,
-	 * empty list if none.
-	 * @deprecated the use of perspectives for launch shortcuts has been 
-	 * deprecated since 3.1, use a contextualLaunch element instead
-	 */
-	public List getLaunchShortcuts(String perpsective, String category) {
-		if (fLaunchShortcutsByPerspective == null) {
-			Iterator shortcuts = getLaunchShortcuts().iterator();
-			fLaunchShortcutsByPerspective = new HashMap(10);
-			LaunchShortcutExtension ext = null;
-			Iterator perspectives = null;
-			while (shortcuts.hasNext()) {
-				ext = (LaunchShortcutExtension)shortcuts.next();
-				perspectives = ext.getPerspectives().iterator();
-				while (perspectives.hasNext()) {
-					String id = (String)perspectives.next();
-					List list = (List)fLaunchShortcutsByPerspective.get(id);
-					if (list == null) {
-						list = new ArrayList(4);
-						fLaunchShortcutsByPerspective.put(id, list);
-					}
-					list.add(ext);
-				}
-			}
-		}
-		List list = (List)fLaunchShortcutsByPerspective.get(perpsective); 
-		if (list == null) {
-			return new ArrayList();
-		} 
-		return filterShortcuts(list, category);
-	}
-	
-	/**
-	 * Returns the first occurrence of any one of the configurations in the provided list, if they are found in the launch history
-	 * for the corresponding launch group
-	 * @param configurations
-	 * @param mode
-	 * @param resource
-	 * @return the associated launch configuration from the MRU listing or <code>null</code> if there isn't one
-	 * @since 3.3
-	 */
-	public ILaunchConfiguration getMRUConfiguration(List configurations, ILaunchGroup group, IResource resource) {
-		if(group != null) {
-			ArrayList candidates = new ArrayList();
-			LaunchHistory history = getLaunchHistory(group.getIdentifier());
-			if(history != null) {
-				ILaunchConfiguration[] configs = history.getCompleteLaunchHistory();
-				for(int i = 0; i < configs.length; i++) {
-					if(configurations.contains(configs[i])) {
-						if(resource instanceof IContainer) {
-							return configs[i];
-						}
-						else {
-							candidates.add(configs[i]);
-						}
-					}
-				}
-			}
-			//first try to find a config that exactly matches the resource mapping, and collect partial matches
-			ILaunchConfiguration config = null;
-			IResource[] res = null;
-			for(Iterator iter = candidates.iterator(); iter.hasNext();) {
-				config = (ILaunchConfiguration) iter.next();
-				try {
-					res = config.getMappedResources();
-					if(res != null) {
-						for(int i = 0; i < res.length; i++) {
-							if(res[i].equals(resource)) {
-								return config;
-							}
-						}
-					}
-				}
-				catch(CoreException ce) {}
-			}
-			config = getLastLaunch(group.getIdentifier());
-			if(candidates.contains(config)) {
-				return config;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the <code>LaunchShortcutExtension</code> that has the specified id
-	 * or <code>null</code>.
-	 * @param id the id of the <code>LaunchShortcutExtension</code> to look for
-	 * @return the <code>LaunchShortcutExtension</code> that has the specified id
-	 * or <code>null</code>
-	 * 
-	 * @since 3.3
-	 */
-	public LaunchShortcutExtension getLaunchShortcut(String id) {
-		loadLaunchShortcuts();
-		LaunchShortcutExtension ext = null;
-		for(int i = 0; i < fLaunchShortcuts.size(); i++) {
-			ext = (LaunchShortcutExtension) fLaunchShortcuts.get(i);
-			if(ext.getId().equals(id)) {
-				return ext;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the shared config from the selected resource or <code>null</code> if the selected resources is not a shared config
-	 * @param receiver the object to test if it is a shared launch configuration
-	 * @return the shared config from the selected resource or <code>null</code> if the selected resources is not a shared config
-	 * @since 3.3
-	 */
-	public ILaunchConfiguration isSharedConfig(Object receiver) {
-		if(receiver instanceof IFile) {
-			IFile file = (IFile) receiver;
-			String ext = file.getFileExtension();
-			if(ext == null) {
-				return null;
-			}
-			if(ext.equals("launch")) { //$NON-NLS-1$
-				ILaunchConfiguration config = DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(file);
-				if(config != null && config.exists()) {
-					return config;
-				}
-			}
-		}
-		else if(receiver instanceof IFileEditorInput) {
-			IFileEditorInput input = (IFileEditorInput) receiver;
-			return isSharedConfig(input.getFile());
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the image used to display an error in the given tab
-	 */
-	public Image getErrorTabImage(ILaunchConfigurationTab tab) {
-		if (fErrorImages == null) {
-			fErrorImages = new ImageRegistry();
-		}
-		String key = tab.getClass().getName();
-		Image image = fErrorImages.get(key);
-		if (image == null) {
-			// create image
-			Image base = tab.getImage();
-			if (base == null) {
-				base = DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OVR_TRANSPARENT);
-			}
-			base = new Image(Display.getCurrent(), base, SWT.IMAGE_COPY);
-			LaunchConfigurationTabImageDescriptor desc = new LaunchConfigurationTabImageDescriptor(base, LaunchConfigurationTabImageDescriptor.ERROR);
-			image = desc.createImage();
-			fErrorImages.put(key, image);
-		}
-		return image;
-	}
-	
-	/**
-	 * Return the launch group with the given id, or <code>null</code>
-	 * 
-	 * @return the launch group with the given id, or <code>null</code>
-	 */
-	public LaunchGroupExtension getLaunchGroup(String id) {
-		if (fLaunchGroups == null) {
-			loadLaunchGroups();
-		}
-		return (LaunchGroupExtension)fLaunchGroups.get(id);
-	}
-	
-	/**
-	 * Return all defined launch groups
-	 * 
-	 * @return all defined launch groups
-	 */
-	public ILaunchGroup[] getLaunchGroups() {
-		if (fLaunchGroups == null) {
-			loadLaunchGroups();
-		}
-		Collection groups = fLaunchGroups.values();
-		return (ILaunchGroup[])groups.toArray(new ILaunchGroup[groups.size()]);
-	}	
-	
-	/**
-	 * Return the launch history with the given group id, or <code>null</code>
-	 * 
-	 * @return the launch history with the given group id, or <code>null</code>
-	 */
-	public LaunchHistory getLaunchHistory(String id) {
-		loadLaunchHistories();
-		return (LaunchHistory)fLaunchHistories.get(id);
-	}	
-	
-	/**
-	 * Returns the singleton instance of the launch manager
-	 * @return the singleton instance of the launch manager
-	 * @since 3.3
-	 */
-	private LaunchManager getLaunchManager() {
-		return (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
-	}
-	
-	/**
-	 * Restore launch history
-	 */
-	private synchronized void loadLaunchHistories() {
-		if (fLaunchHistories == null) {
-			fRestoring = true;
-			ILaunchGroup[] groups = getLaunchGroups();
-			fLaunchHistories = new HashMap(groups.length);
-			ILaunchGroup extension = null;
-			for (int i = 0; i < groups.length; i++) {
-				extension = groups[i];
-				if (extension.isPublic()) {
-					fLaunchHistories.put(extension.getIdentifier(), new LaunchHistory(extension));
-				}
-			}
-			restoreLaunchHistory();
-			fRestoring = false;
-		}
-	}
-	
-	/**
-	 * Returns the default launch group for the given mode.
-	 * 
-	 * @param mode
-	 * @return launch group
-	 */
-	public LaunchGroupExtension getDefaultLaunchGroup(String mode) {
-		if (mode.equals(ILaunchManager.DEBUG_MODE)) {
-			return getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-		}
-		return getLaunchGroup(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-	}
-	
-	/**
-	 * Returns the launch group the given launch configuration belongs to, in
-	 * the specified mode, or <code>null</code> if none.
-	 * 
-	 * @param configuration
-	 * @param mode
-	 * @return the launch group the given launch configuration belongs to, in
-	 * the specified mode, or <code>null</code> if none
-	 */
-	public ILaunchGroup getLaunchGroup(ILaunchConfiguration configuration, String mode) {
-		try {
-			String category = configuration.getCategory();
-			ILaunchGroup[] groups = getLaunchGroups();
-			ILaunchGroup extension = null;
-			for (int i = 0; i < groups.length; i++) {
-				extension = groups[i];
-				if (category == null) {
-					if (extension.getCategory() == null && extension.getMode().equals(mode)) {
-						return extension;
-					}
-				} else if (category.equals(extension.getCategory())) {
-					if (extension.getMode().equals(mode)) {
-						return extension;
-					}
-				}
-			}
-		} 
-		catch (CoreException e) {DebugUIPlugin.log(e);}
-		return null;
-	}
-
-	/**
-	 * Returns the private launch configuration used as a placeholder to represent/store
-	 * the information associated with a launch configuration type.
-	 * 
-	 * @param type launch configuration type
-	 * @return launch configuration
-	 * @since 3.0
-	 */
-	public static ILaunchConfiguration getSharedTypeConfig(ILaunchConfigurationType type) throws CoreException {
-		String id = type.getIdentifier();
-		String name = id + ".SHARED_INFO"; //$NON-NLS-1$
-		ILaunchConfiguration shared = null;
-		ILaunchConfiguration[] configurations = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(type);
-		ILaunchConfiguration configuration = null;
-		for (int i = 0; i < configurations.length; i++) {
-			configuration = configurations[i];
-			if (configuration.getName().equals(name)) {
-				shared = configuration;
-				break;
-			}
-		}
-		
-		if (shared == null) {
-			// create a new shared config
-			ILaunchConfigurationWorkingCopy workingCopy;
-			workingCopy = type.newInstance(null, name);
-			workingCopy.setAttribute(IDebugUIConstants.ATTR_PRIVATE, true);
-			// null entries indicate default settings
-			// save
-			shared = workingCopy.doSave();
-		}
-		return shared;
-	}
-
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#doneSaving(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void doneSaving(ISaveContext context) {}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#prepareToSave(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void prepareToSave(ISaveContext context) throws CoreException {}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#rollback(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void rollback(ISaveContext context) {}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#saving(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void saving(ISaveContext context) throws CoreException {
-		try {
-			persistLaunchHistory();
-		}  catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Internal error saving launch history", e)); //$NON-NLS-1$
-		} catch (ParserConfigurationException e) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Internal error saving launch history", e)); //$NON-NLS-1$
-		} 
-	}
-	
-	/**
-	 * Sets the given launch to be the most recent launch in the launch
-	 * history (for applicable histories).
-	 * <p>
-	 * @param configuration configuration to be set as most recent
-	 * @since 3.3
-	 */
-	public void setRecentLaunch(ILaunch launch) {
-		ILaunchGroup[] groups = DebugUITools.getLaunchGroups();
-		int size = groups.length;
-		for (int i = 0; i < size; i++) {
-			String id = groups[i].getIdentifier();
-			LaunchHistory history = getLaunchHistory(id);
-			if (history != null)
-				history.launchAdded(launch);
-		}
-	}	
-
-}
-
-/**
- * A comparator for the ordering of launch shortcut extensions
- * @since 3.3
- */
-class ShortcutComparator implements Comparator {
-	/**
-	 * @see Comparator#compare(Object, Object)
-	 */
-	public int compare(Object a, Object b) {
-		LaunchShortcutExtension shorcutA = (LaunchShortcutExtension)a;
-		String labelA = shorcutA.getLabel();
-		String pathA = shorcutA.getMenuPath();
-		LaunchShortcutExtension shortcutB = (LaunchShortcutExtension)b;
-		String labelB = shortcutB.getLabel();
-		String pathB = shortcutB.getMenuPath();
-		
-		// group by path, then sort by label
-		// a null path sorts last (i.e. highest)
-		if (nullOrEqual(pathA, pathB)) {
-			// null labels sort last (i.e. highest)
-			if (labelA == labelB) {
-				return 0;
-			}
-			if (labelA == null) {
-				return 1;
-			}
-			if (labelB == null) {
-				return -1;
-			}
-			return labelA.compareToIgnoreCase(labelB);
-		}
-		// compare paths
-		if (pathA == null) {
-			return 1;
-		}
-		if (pathB == null) {
-			return -1;
-		}
-		return pathA.compareToIgnoreCase(pathB);
-	}
-	
-	private boolean nullOrEqual(String a, String b) {
-		if (a == null) {
-			return b == null;
-		}
-		return a.equals(b);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationPresentationManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationPresentationManager.java
deleted file mode 100644
index 8fda944..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationPresentationManager.java
+++ /dev/null
@@ -1,360 +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.debug.internal.ui.launchConfigurations;
-
- 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.LaunchConfigurationTabExtension;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * Manages contributed launch configuration tabs
- * 
- * @see LaunchConfigurationTabGroupWrapper
- * @see LaunchConfigurationTabExtension
- * @see LaunchConfigurationTabGroupExtension
- */ 
-public class LaunchConfigurationPresentationManager {
-	
-	/**
-	 * The singleton launch configuration presentation manager
-	 */
-	private static LaunchConfigurationPresentationManager fgDefault;
-			
-	/**
-	 * Collection of launch configuration tab group extensions
-	 * defined in plug-in xml. Entries are keyed by launch
-	 * configuration type identifier (<code>String</code>),
-	 * and entries are tables of launch modes (<code>String</code>)
-	 * to <code>LaunchConfigurationTabGroupExtension</code>. "*" is
-	 * used to represent the default tab group (i.e. unspecified mode).
-	 */
-	private Hashtable fTabGroupExtensions;	
-	
-	/**
-	 * contributed tabs are stored by the tab group id that they contribute to.
-	 * each entry is a <code>Hashtable</code> consisting of the corresponding
-	 * <code>LaunchConfigurationTabExtension</code> objects for each contributed tab stored by their 
-	 * id
-	 * 
-	 * @since 3.3
-	 */
-	private Hashtable fContributedTabs;
-			
-	/**
-	 * Constructs the singleton launch configuration presentation
-	 * manager.
-	 */
-	private LaunchConfigurationPresentationManager() {
-		fgDefault = this;
-	}
-
-	/**
-	 * Returns the launch configuration presentation manager
-	 */
-	public static LaunchConfigurationPresentationManager getDefault() {
-		if (fgDefault == null) {
-			fgDefault = new LaunchConfigurationPresentationManager();
-		}
-		return fgDefault;
-	}
-		
-	/**
-	 * Creates launch configuration tab group extensions for each extension
-	 * defined in XML, and adds them to the table of tab group extensions.
-	 */
-	private void initializeTabGroupExtensions() {
-		if(fTabGroupExtensions == null) {
-			fTabGroupExtensions = new Hashtable();
-			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_LAUNCH_CONFIGURATION_TAB_GROUPS);
-			IConfigurationElement[] groups = extensionPoint.getConfigurationElements();
-			LaunchConfigurationTabGroupExtension group = null;
-			String typeId = null;
-			Map map = null;
-			List modes = null;
-			for (int i = 0; i < groups.length; i++) {
-				group = new LaunchConfigurationTabGroupExtension(groups[i]);
-				typeId = group.getTypeIdentifier();
-				map = (Map)fTabGroupExtensions.get(typeId);
-				if (map == null) {
-					map = new Hashtable();
-					fTabGroupExtensions.put(typeId, map);
-				}
-				modes = group.getModes();
-				if(modes.isEmpty()) {
-					map.put("*", group); //$NON-NLS-1$
-				}
-				for(Iterator iter = modes.iterator(); iter.hasNext();) {
-					map.put(iter.next(), group);
-				}
-			}
-		}
-	}	
-	
-	/**
-	 * This method is used to collect all of the contributed tabs defined by the <code>launchConfigurationTabs</code>
-	 * extension point
-	 *
-	 * @since 3.3
-	 */
-	private void initializeContributedTabExtensions() {
-		fContributedTabs = new Hashtable();
-		IExtensionPoint epoint = Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_LAUNCH_TABS);
-		IConfigurationElement[] elements = epoint.getConfigurationElements();
-		LaunchConfigurationTabExtension tab = null;
-		Hashtable element = null;
-		for(int i = 0; i < elements.length; i++) {
-			tab = new LaunchConfigurationTabExtension(elements[i]);
-			element = (Hashtable) fContributedTabs.get(tab.getTabGroupId());
-			if(element == null) {
-				element = new Hashtable();
-				element.put(tab.getIdentifier(), tab);
-				fContributedTabs.put(tab.getTabGroupId(), element);
-			}
-			element.put(tab.getIdentifier(), tab);
-		}
-	}
-	
-	/**
-	 * Returns the tab group for the given launch configuration type and mode.
-	 * 
-	 * @param type launch configuration type
-	 * @param mode launch mode
-	 * @return the tab group for the given type of launch configuration, or <code>null</code> if none
-	 * @exception CoreException if an exception occurs creating the group
-	 */
-	public ILaunchConfigurationTabGroup getTabGroup(ILaunchConfigurationType type, String mode) throws CoreException {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		LaunchConfigurationTabGroupExtension ext = getExtension(type.getIdentifier(), modes);
-		if (ext == null) {
-			IStatus status = new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, "No tab group defined for launch configuration type " + type.getIdentifier(), null);   //$NON-NLS-1$
-			 throw new CoreException(status);
-		} 
-		return new LaunchConfigurationTabGroupWrapper(ext.newTabGroup(), ext.getIdentifier(), null);		
-	}
-	
-	/**
-	 * Returns the tab group for the given launch configuration and the mode the dialog opened in
-	 * @param type the type of the configuration
-	 * @param config
-	 * @param mode
-	 * @return
-	 * @throws CoreException
-	 */
-	public ILaunchConfigurationTabGroup getTabGroup(ILaunchConfiguration config, String mode) throws CoreException {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		LaunchConfigurationTabGroupExtension ext = getExtension(config.getType().getIdentifier(), modes);
-		if (ext == null) {
-			IStatus status = new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, "No tab group defined for launch configuration type " + config.getType().getIdentifier(), null);   //$NON-NLS-1$
-			 throw new CoreException(status);
-		} 
-		return new LaunchConfigurationTabGroupWrapper(ext.newTabGroup(), ext.getIdentifier(), config);
-	}
-	
-	/**
-	 * Returns the proxy elements for all contributed tabs for the specified tab group id
-	 * @param groupid the id of the tab group
-	 * @param config the config the tab group is opened on
-	 * @param mode the mode the associated launch dialog is opened on
-	 * @return the listing of all of the tab extensions or an empty array, never <code>null</code>
-	 * 
-	 * @since 3.3
-	 */
-	protected LaunchConfigurationTabExtension[] getTabExtensions(String groupid, ILaunchConfiguration config, String mode) throws CoreException {
-		initializeContributedTabExtensions();
-		Hashtable tabs = (Hashtable) fContributedTabs.get(groupid);
-		if(tabs != null) {
-			return filterLaunchTabExtensions((LaunchConfigurationTabExtension[]) tabs.values().toArray(new LaunchConfigurationTabExtension[tabs.size()]), config, mode);
-		}
-		return new LaunchConfigurationTabExtension[0];
-	}
-	
-	/**
-	 * Returns a listing of <code>LaunchConfiguraitonTabExtension</code>s that does not contain any tabs
-	 * from disabled activities
-	 * <p>
-	 * There are thre ways that tabs can be filtered form the launch dialog:
-	 * <ol>
-	 * <li>The tabs can belong to tooling that is contributed via a specific type of workbench activity, and is therefore filtered with capabilities</li>
-	 * <li>The tabs can be filtered via the associatedDelegate extension point, if a tab is said to apply only to certain tooling, only show it in the instance when that tooling is used</li>
-	 * <li>A tab is not part of a workbench activity, nor specifies an associated launch delegate -- show the tab</li>
-	 * </ol>
-	 * </p>
-	 * @param tabs the raw listing of tabs to filter
-	 * @return the listing of filtered <code>LaunchConfigurationTabExtension</code>s or an empty array, never <code>null</code>
-	 * 
-	 * @since 3.3
-	 */
-	protected LaunchConfigurationTabExtension[] filterLaunchTabExtensions(LaunchConfigurationTabExtension[] tabs, ILaunchConfiguration config, String mode) throws CoreException {
-		IWorkbenchActivitySupport as = PlatformUI.getWorkbench().getActivitySupport();
-		if(as == null || config == null) {
-			return tabs;
-		}
-		HashSet set = new HashSet();
-		for(int i = 0; i < tabs.length; i ++) {
-		//filter capabilities
-			if(!WorkbenchActivityHelper.filterItem(new LaunchTabContribution(tabs[i]))) {
-			//filter to preferred delegate (if there is one)
-				HashSet modes = (HashSet) config.getModes();
-				modes.add(mode);
-				ILaunchDelegate delegate = config.getPreferredDelegate(modes);
-				if(delegate == null) {
-					delegate = config.getType().getPreferredDelegate(modes);
-				}
-				Set delegateSet = tabs[i].getDelegateSet();
-				if(delegate != null) {
-					if(delegateSet.isEmpty() || delegateSet.contains(delegate.getId())) {
-						set.add(tabs[i]);
-					}
-				}
-				else {
-					//otherwise filter based on the collection of delegates for the modes
-					ILaunchDelegate[] delegates = config.getType().getDelegates(modes);
-					for(int j = 0; j < delegates.length; j++) {
-						if(delegateSet.size() == 0 || delegateSet.contains(delegates[j].getId())) {
-							//associated with all modes and tab groups or only specific ones if indicated
-							set.add(tabs[i]);
-						}
-					}
-				}
-			}
-		}
-		return (LaunchConfigurationTabExtension[]) set.toArray(new LaunchConfigurationTabExtension[set.size()]);
-	}
-	
-	/**
-	 * Returns the launch tab group extension for the given type and mode, or
-	 * <code>null</code> if none
-	 * 
-	 * @param type launch configuration type identifier
-	 * @param mode launch mode identifier
-	 * @return launch tab group extension or <code>null</code>
-	 */
-	protected LaunchConfigurationTabGroupExtension getExtension(String type, Set modes) {
-		initializeTabGroupExtensions();
-		Map map = (Map)fTabGroupExtensions.get(type);
-		if (map != null) {
-			Object extension = map.get(modes);
-			if (extension == null) {
-				// get the default tabs
-				extension = map.get("*"); //$NON-NLS-1$
-			}
-			return (LaunchConfigurationTabGroupExtension)extension;
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the identifier of the help context that is associated with the
-	 * specified launch configuration type and mode, or <code>null</code> if none.
-	 * 
-	 * @param type launch config type
-	 * @param mode launch mode
-	 * @return the identifier for the help context associated with the given
-	 * type of launch configuration, or <code>null</code>
-	 * @exception CoreException if an exception occurs creating the group
-	 * @since 2.1
-	 */
-	public String getHelpContext(ILaunchConfigurationType type, String mode) throws CoreException {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		LaunchConfigurationTabGroupExtension ext = getExtension(type.getIdentifier(), modes);
-		if (ext == null) {
-			IStatus status = new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, "No tab group defined for launch configuration type " + type.getIdentifier(), null);  //$NON-NLS-1$
-			 throw new CoreException(status);
-		} 
-		return ext.getHelpContextId();		
-	}
-	
-	/**
-	 * Returns the description of the given configuration type
-	 * in the specified mode or <code>null</code> if none.
-	 * 
-	 * @param configType the config type
-	 * @param mode the launch mode
-	 * @return the description of the given configuration type, possible <code>null</code>
-	 */
-	public String getDescription(ILaunchConfigurationType configType, String mode) {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		LaunchConfigurationTabGroupExtension extension = getExtension(configType.getAttribute(IConfigurationElementConstants.ID), modes);
-		return (extension != null ? extension.getDescription(modes) : null);
-	}	
-	
-	/**
-	 * Returns a sorted list of launch mode names corresponding to the given identifiers.
-	 * 
-	 * @param modes set of launch mode identifiers
-	 * @return sorted list of launch mode names
-	 */
-	public List getLaunchModeNames(Set modes) {
-		List names = new ArrayList();
-		Iterator iterator = modes.iterator();
-		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-		while (iterator.hasNext()) {
-			String id = (String) iterator.next();
-			ILaunchMode mode = manager.getLaunchMode(id);
-			if (mode == null) {
-				names.add(id);
-			} else {
-				names.add(DebugUIPlugin.removeAccelerators(mode.getLabel()));
-			}
-		}
-		Collections.sort(names);
-		return names;
-	}
-	
-	/**
-	 * Returns the label of the mode id with all accelerators removed
-	 * @param modeid the id of the mode i.e. 'run'
-	 * @return the formatted label of the specified mode id with all accelerators removed, or <code>null</code> if no label is available
-	 * @since 3.3
-	 */
-	public String getLaunchModeLabel(String modeid) {
-		String mode = null;
-		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-		ILaunchMode lmode = manager.getLaunchMode(modeid);
-		if(lmode != null) {
-			return lmode.getLabel();
-		}
-		return mode;
-	}
-	
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationPropertiesDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationPropertiesDialog.java
deleted file mode 100644
index 84c3f71..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationPropertiesDialog.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationListener;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.Shell;
-
-import com.ibm.icu.text.MessageFormat;
- 
-
-/**
- * A dialog used to edit a single launch configuration.
- */
-public class LaunchConfigurationPropertiesDialog extends LaunchConfigurationsDialog implements ILaunchConfigurationListener {
-	
-	/**
-	 * The launch configuration to display
-	 */
-	private ILaunchConfiguration fLaunchConfiguration;
-	
-	/**
-	 * Whether to set default values when opened
-	 * @since 3.3
-	 */
-	private boolean fSetDefaultOnOpen = false;
-
-	/**
-	 * Constructs a new launch configuration dialog on the given
-	 * parent shell.
-	 * 
-	 * @param shell the parent shell
-	 * @param selection the selection used to initialize this dialog, typically the 
-	 *  current workbench selection
-	 * @param group launch group
-	 */
-	public LaunchConfigurationPropertiesDialog(Shell shell, ILaunchConfiguration launchConfiguration, LaunchGroupExtension group) {
-		super(shell, group);
-		fLaunchConfiguration = launchConfiguration;
-		DebugPlugin.getDefault().getLaunchManager().addLaunchConfigurationListener(this);
-	}
-	
-	/**
-	 * Constructs a new launch configuration dialog on the given
-	 * parent shell.
-	 * 
-	 * @param shell the parent shell
-	 * @param selection the selection used to initialize this dialog, typically the 
-	 *  current workbench selection
-	 * @param reservednames a set of names of virtual launch configurations that need to be considered 
-	 *  when configuration names are generated
-	 * @param group launch group
-	 */
-	public LaunchConfigurationPropertiesDialog(Shell shell, ILaunchConfiguration launchConfiguration, LaunchGroupExtension group, Set reservednames) {
-		super(shell, group);
-		fLaunchConfiguration = launchConfiguration;
-		DebugPlugin.getDefault().getLaunchManager().addLaunchConfigurationListener(this);
-		fReservedNames = reservednames;
-	}
-	
-	/**
-	 * Returns the launch configuration being displayed.
-	 * 
-	 * @return ILaunchConfiguration
-	 */
-	protected ILaunchConfiguration getLaunchConfiguration() {
-		return fLaunchConfiguration;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#initializeBounds()
-	 */
-	protected void initializeBounds() {
-		super.initializeBounds();
-		resize();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#initializeContent()
-	 */
-	protected void initializeContent() {
-		ILaunchConfiguration launchConfiguration = getLaunchConfiguration();
-		if (fSetDefaultOnOpen && launchConfiguration instanceof ILaunchConfigurationWorkingCopy) {
-			ILaunchConfigurationWorkingCopy wc = (ILaunchConfigurationWorkingCopy) launchConfiguration;
-			try {
-				ILaunchConfigurationTabGroup tabGroup = LaunchConfigurationPresentationManager.getDefault().getTabGroup(wc, getMode());
-				// this only works because this action is only present when the dialog is open
-				ILaunchConfigurationDialog dialog = LaunchConfigurationsDialog.getCurrentlyVisibleLaunchConfigurationDialog();
-				tabGroup.createTabs(dialog, dialog.getMode());
-				ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
-				for (int i = 0; i < tabs.length; i++) {
-					tabs[i].setLaunchConfigurationDialog(dialog);
-				}
-				tabGroup.setDefaults(wc);
-				tabGroup.dispose();
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e.getStatus());
-			}
-		}
-		getTabViewer().setInput(launchConfiguration);
-		IStatus status = getInitialStatus();
-		if (status != null) {
-			handleStatus(status);
-		}		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#close()
-	 */
-	public boolean close() {
-	    if (!isSafeToClose()) {
-	        return false;
-	    }
-		getBannerImage().dispose();
-		getTabViewer().dispose();
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchConfigurationListener(this);
-		return super.close();
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#addContent(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void addContent(Composite dialogComp) {
-		GridData gd;
-		Composite topComp = new Composite(dialogComp, SWT.NONE);
-		gd = new GridData(GridData.FILL_BOTH);
-		topComp.setLayoutData(gd);
-		GridLayout topLayout = new GridLayout();
-		topLayout.numColumns = 1;
-		topLayout.marginHeight = 5;
-		topLayout.marginWidth = 5;
-		topComp.setLayout(topLayout);
-		topComp.setFont(dialogComp.getFont());
-	
-		// Set the things that TitleAreaDialog takes care of 
-		setTitle(getTitleAreaTitle());
-		setMessage(""); //$NON-NLS-1$
-		setModeLabelState();
-	
-		// Build the launch configuration edit area and put it into the composite.
-		Composite editAreaComp = createLaunchConfigurationEditArea(topComp);
-		gd = new GridData(GridData.FILL_BOTH);
-		editAreaComp.setLayoutData(gd);
-		editAreaComp.setFont(dialogComp.getFont());
-		
-		dialogComp.layout(true);
-		applyDialogFont(dialogComp);
-	}
-	
-	/**
-	 * returns the title area title of the dialog
-	 * @return the title area title
-	 */
-	protected String getTitleAreaTitle() {
-		return LaunchConfigurationsMessages.LaunchConfigurationPropertiesDialog_Edit_launch_configuration_properties_1; 
-	}
-			
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Cancel buttons by default
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-	}
-					
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#getShellTitle()
-	 */
-	protected String getShellTitle() {
-		return MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationPropertiesDialog_Properties_for__0__2, new String[]{getLaunchConfiguration().getName()}); 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.LAUNCH_CONFIGURATION_PROPERTIES_DIALOG;
-	}
-  	 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#updateButtons()
-	 */
-	public void updateButtons() {
-		getTabViewer().refresh();
-		getButton(IDialogConstants.OK_ID).setEnabled(getTabViewer().canSave());
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		getTabViewer().handleApplyPressed();
-		super.okPressed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#open()
-	 */
-	public int open() {
-		setOpenMode(-1);
-		return super.open();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog#getDialogSettingsSectionName()
-	 */
-	protected String getDialogSettingsSectionName() {
-		return IDebugUIConstants.PLUGIN_ID + ".LAUNCH_CONFIGURATION_PROPERTIES_DIALOG_SECTION"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationAdded(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationAdded(ILaunchConfiguration configuration) {
-		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-		if (getLaunchConfiguration().equals(manager.getMovedFrom(configuration))) {
-			// this config was re-named, update the dialog with the new config
-			fLaunchConfiguration = configuration;
-			getTabViewer().setInput(getLaunchConfiguration());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationChanged(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationChanged(ILaunchConfiguration configuration) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationRemoved(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationRemoved(ILaunchConfiguration configuration) {}
-	
-	/**
-	 * Sets whether the tab group should set default values in the launch configuration
-	 * when the dialog is opened. If this method is not called, default values are not
-	 * set.
-	 * 
-	 * @param setDefaults whether to set default values
-	 */
-	public void setDefaultsOnOpen(boolean setDefaults) {
-		fSetDefaultOnOpen = setDefaults;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationSelectionDialog.java
deleted file mode 100644
index 6bc35fa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationSelectionDialog.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.internal.ui.AbstractDebugListSelectionDialog;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a dialog for selecting a given launch configuration from a listing
- * 
- * @since 3.3.0
- * CONTEXTLAUNCHING
- */
-public class LaunchConfigurationSelectionDialog extends AbstractDebugListSelectionDialog {
-
-	private static final String DIALOG_SETTINGS = IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCH_CONFIGURATION_DIALOG"; //$NON-NLS-1$;
-	private Object fInput;
-	
-	/**
-	 * Constructor
-	 * @param parent
-	 */
-	public LaunchConfigurationSelectionDialog(Shell parent, Object input) {
-		super(parent);
-		fInput = input;
-		setTitle(LaunchConfigurationsMessages.LaunchConfigurationSelectionDialog_0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-	 */
-	protected String getDialogSettingsId() {
-		return DIALOG_SETTINGS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SELECT_LAUNCH_CONFIGURATION_DIALOG;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-	 */
-	protected Object getViewerInput() {
-		return fInput;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-	 */
-	protected String getViewerLabel() {
-		return LaunchConfigurationsMessages.LaunchConfigurationSelectionDialog_1;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupExtension.java
deleted file mode 100644
index 51741ce..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupExtension.java
+++ /dev/null
@@ -1,214 +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.debug.internal.ui.launchConfigurations;
-
- 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-
-
-/**
- * Proxy to a launch configuration tab group element
- */
-public class LaunchConfigurationTabGroupExtension {
-	
-	/**
-	 * The configuration element defining this tab group.
-	 */
-	private IConfigurationElement fConfig = null;
-	
-	/**
-	 * A list of sets of modes that this tab group supports
-	 * @since 3.3
-	 */
-	private List fModes = null;
-	
-	/**
-	 * A map of mode sets to descriptions
-	 * @since 3.3
-	 */
-	private Map fDescriptions = null;
-	
-	/**
-	 * Perspectives for each mode
-	 */
-	private Map fPerspectives = null;
-		
-	/**
-	 * Constructs a launch configuration tab extension based
-	 * on the given configuration element
-	 * 
-	 * @param element the configuration element defining the
-	 *  attributes of this launch configuration tab extension
-	 * @return a new launch configuration tab extension
-	 */
-	public LaunchConfigurationTabGroupExtension(IConfigurationElement element) {
-		setConfigurationElement(element);
-	}
-	
-	/**
-	 * Sets the configuration element that defines the attributes
-	 * for this launch configuration tab group extension.
-	 * 
-	 * @param element configuration element
-	 */
-	private void setConfigurationElement(IConfigurationElement element) {
-		fConfig = element;
-	}
-	
-	/**
-	 * Returns the configuration element that defines the attributes
-	 * for this launch configuration tab group extension.
-	 * 
-	 * @param configuration element that defines the attributes
-	 *  for this launch configuration tab extension
-	 */
-	protected IConfigurationElement getConfigurationElement() {
-		return fConfig;
-	}
-	
-	/**
-	 * Returns the set of modes specified in the configuration data, or <code>null</code>
-	 * if none (i.e. default tab group)
-	 * 
-	 * @return the set of modes specified in the configuration data, or
-	 *  <code>null</code>
-	 */
-	protected List getModes() {
-		if (fModes == null) {
-			fModes = new ArrayList();
-			fPerspectives = new Hashtable();
-			IConfigurationElement[] modes = fConfig.getChildren(IConfigurationElementConstants.LAUNCH_MODE);
-			if (modes.length > 0) {
-				IConfigurationElement element = null;
-				String perspective = null, mode = null;
-				Set mset = null;
-				for (int i = 0; i < modes.length; i++) {
-					element = modes[i];
-					mode = element.getAttribute(IConfigurationElementConstants.MODE);
-					mset = new HashSet();
-					mset.add(mode);
-					fModes.add(mset);
-					perspective = element.getAttribute(IConfigurationElementConstants.PERSPECTIVE);
-					if (perspective != null) {
-						fPerspectives.put(mset, perspective);
-					}
-				}
-			}
-		}
-		return fModes;
-	}
-	
-	/**
-	 * Returns the perspective associated with the given launch
-	 * mode, as specified in plug-in XML, or <code>null</code> if none.
-	 * 
-	 * @param modes the set of launch modes
-	 * @return perspective identifier, or <code>null</code>
-	 */
-	protected String getPerspective(Set modes) {
-		getModes();
-		return (String)fPerspectives.get(modes);
-	}
-	
-	/**
-	 * Returns the identifier of the type of launch configuration this
-	 * tab group is associated with
-	 * 
-	 * @return the identifier of the type of launch configuration this
-	 *  tab group is associated with
-	 */	
-	protected String getTypeIdentifier() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.TYPE);
-	}
-	
-	/**
-	 * Returns the identifier of the help context associated with this tab
-	 * group, or <code>null</code> if one was not specified.
-	 * 
-	 * @return the identifier of this tab group's help context or
-	 * <code>null</code>
-	 * @since 2.1
-	 */	
-	protected String getHelpContextId() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.HELP_CONTEXT_ID);		
-	}
-	
-	/**
-	 * Returns the identifier of the tab group
-	 * @return the id of the tab group
-	 * 
-	 * @since 3.3
-	 */
-	protected String getIdentifier() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.ID); 
-	}
-	
-	/**
-	 * Returns a new tab group defined by this extension
-	 * 
-	 * @return a new tab group defined by this extension
-	 * @exception CoreException if an exception occurs instantiating
-	 * 	the tab group
-	 */
-	public ILaunchConfigurationTabGroup newTabGroup() throws CoreException {
-		return (ILaunchConfigurationTabGroup)getConfigurationElement().createExecutableExtension(IConfigurationElementConstants.CLASS); 
-	}
-
-	/**
-	 * Returns this tab group's description in the given mode set.
-	 *
-	 * @param modes the set of modes
-	 * @return a description of the Launch Mode if available. If not available, attempts to return
-	 * a description of the Launch Configuration. If no appropriate description is found an empty string is returned.
-	 */
-	public String getDescription(Set modes) {
-		String description = null;
-		if(fDescriptions == null) {
-			fDescriptions = new HashMap();
-			IConfigurationElement[] children = fConfig.getChildren(IConfigurationElementConstants.LAUNCH_MODE);
-			IConfigurationElement child = null;
-			String mode = null;
-			HashSet set = null;
-			for (int i = 0; i < children.length; i++) {
-				child = children[i];
-				mode = child.getAttribute(IConfigurationElementConstants.MODE);
-				if(mode != null) {
-					set = new HashSet();
-					set.add(mode);
-				}
-				description = child.getAttribute(IConfigurationElementConstants.DESCRIPTION);
-				if(description != null) {
-					fDescriptions.put(set, description);
-				}
-			}
-			
-		} 
-		description = (String) fDescriptions.get(modes);
-		if(description == null) {
-			description = fConfig.getAttribute(IConfigurationElementConstants.DESCRIPTION);
-			
-		}
-		return (description == null ? "" : description); //$NON-NLS-1$
-	}
-	
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java
deleted file mode 100644
index cfca956..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java
+++ /dev/null
@@ -1,1442 +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.debug.internal.ui.launchConfigurations;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.internal.core.LaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-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.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.custom.ViewForm;
-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.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * A viewer that displays tabs for a launch configuration, with apply and revert
- * buttons.
- */
-public class LaunchConfigurationTabGroupViewer extends Viewer {
-
-	private final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * Containing launch dialog
-	 */
-	private ILaunchConfigurationDialog fDialog;
-	
-	/**
-	 * The this viewer's input
-	 */
-	private Object fInput;
-	
-	/**
-	 * The launch configuration (original) being edited
-	 */
-	private ILaunchConfiguration fOriginal;
-	
-	/**
-	 * The working copy of the original
-	 */
-	private ILaunchConfigurationWorkingCopy fWorkingCopy;
-	
-	/**
-	 * This view's control, which contains a composite area of controls
-	 */
-	private Composite fViewerControl;
-	
-	/**
-	 * The composite which is hidden/displayed as tabs are required.
-	 */
-	private Composite fVisibleArea;
-	
-	/**
-	 * Name label widget
-	 */
-	private Label fNameLabel;
-	
-	/**
-	 * Name text widget
-	 */
-	private Text fNameWidget;
-	
-	/**
-	 * Composite containing the launch config tab widgets
-	 */
-	private Composite fTabComposite;
-	
-	/**
-	 * Tab folder
-	 */
-	private CTabFolder fTabFolder;
-	
-	/**
-	 * The current tab group being displayed
-	 */
-	private ILaunchConfigurationTabGroup fTabGroup;
-
-	/**
-	 * The type of config tabs are currently displayed
-	 * for
-	 */
-	private ILaunchConfigurationType fTabType;	
-	
-	/**
-	 * Index of the active tab
-	 */
-	private int fCurrentTabIndex = -1;
-	
-	/**
-	 * Apply & Revert buttons
-	 */
-	private Button fApplyButton;
-	private Button fRevertButton;
-	
-	/**
-	 * Whether tabs are currently being disposed or initialized
-	 */
-	private boolean fDisposingTabs = false;
-	private boolean fInitializingTabs = false;
-
-	/**
-	 * The description of the currently selected launch configuration or
-	 * launch configuration type or <code>null</code> if none.
-	 */
-	private String fDescription = null;
-	
-	/**
-	 * A place holder for switching between the tabs for a config and the getting started tab
-	 * @since 3.2
-	 */
-	private Composite fTabPlaceHolder = null;
-	
-	/**
-	 * A link to allow users to select a valid set of launch options for the specified mode
-	 * @since 3.3
-	 */
-	private Link fOptionsLink = null;
-	
-	/**
-	 * A new composite replacing the perspectives tab
-	 * @since 3.2
-	 */
-	private Composite fGettingStarted = null;
-
-	private ViewForm fViewform;
-	
-	/**
-	 * Constructs a viewer in the given composite, contained by the given
-	 * launch configuration dialog.
-	 * 
-	 * @param parent composite containing this viewer
-	 * @param dialog containing launch configuration dialog
-	 */
-	public LaunchConfigurationTabGroupViewer(Composite parent, ILaunchConfigurationDialog dialog) {
-		super();
-		fDialog = dialog;
-		createControl(parent);
-	}
-	
-	/**
-	 * Cleanup
-	 */
-	public void dispose() {
-		disposeTabGroup();
-	}
-
-	/**
-	 * Dispose the active tab group, if any.
-	 */
-	protected void disposeTabGroup() {
-		if (fTabGroup != null) {
-			fTabGroup.dispose();
-			fTabGroup = null;
-			fTabType = null;
-		}
-	}	
-	
-	/**
-	 * Creates this viewer's control This area displays the name of the launch
-	 * configuration currently being edited, as well as a tab folder of tabs
-	 * that are applicable to the launch configuration.
-	 *
-	 * @return the composite used for launch configuration editing
-	 */
-	private void createControl(Composite parent) {
-		fViewerControl = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.horizontalSpacing = 0;
-		layout.verticalSpacing = 0;
-		fViewerControl.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		fViewerControl.setLayoutData(gd);
-		
-        fViewform = new ViewForm(fViewerControl, SWT.FLAT | SWT.BORDER);
-        layout = new GridLayout(1, false);
-        layout.horizontalSpacing = 0;
-        layout.verticalSpacing = 0;
-        fViewform.setLayout(layout);
-		gd = new GridData(GridData.FILL_BOTH);
-		fViewform.setLayoutData(gd);
-		fVisibleArea = fViewform;
-        fViewform.setTopLeft(null);
-        
-        Composite mainComp = new Composite(fViewform, SWT.FLAT);
-        layout = new GridLayout(1, false);
-        layout.verticalSpacing = 0;
-        layout.horizontalSpacing = 0;
-        mainComp.setLayout(layout);
-        fViewform.setContent(mainComp);
-
-		fTabPlaceHolder = new Composite(mainComp, SWT.NONE);
-		fTabPlaceHolder.setLayout(new StackLayout());
-		gd = new GridData(GridData.FILL_BOTH);
-		fTabPlaceHolder.setLayoutData(gd);
-        
-		fGettingStarted = new Composite(fTabPlaceHolder, SWT.NONE);
-		fGettingStarted.setLayout(new GridLayout());
-		gd = new GridData(GridData.FILL_BOTH);
-		fGettingStarted.setLayoutData(gd);
-		
-		createGettingStarted(fGettingStarted);
-		
-		fTabComposite = new Composite(fTabPlaceHolder, SWT.NONE);
-		layout = new GridLayout(2, false);
-		layout.verticalSpacing = 10;
-		layout.horizontalSpacing = 5;
-		fTabComposite.setLayout(layout);
-		gd = new GridData(GridData.FILL_BOTH);
-		fTabComposite.setLayoutData(gd);
-		
-		fNameLabel = new Label(fTabComposite, SWT.HORIZONTAL | SWT.LEFT);
-		fNameLabel.setText(LaunchConfigurationsMessages.LaunchConfigurationDialog__Name__16); 
-        fNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-       
-		fNameWidget = new Text(fTabComposite, SWT.SINGLE | SWT.BORDER);
-        fNameWidget.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        fNameWidget.addModifyListener(new ModifyListener() {
-    				public void modifyText(ModifyEvent e) {
-    					if(!fInitializingTabs) {
-    						handleNameModified();
-    					}
-    				}
-    			}
-    		);
-    		
-		createTabFolder(fTabComposite);
-		
-		Composite blComp = SWTFactory.createComposite(mainComp, mainComp.getFont(), 2, 1, GridData.FILL_HORIZONTAL);
-		Composite linkComp = SWTFactory.createComposite(blComp, blComp.getFont(), 1, 1, GridData.FILL_HORIZONTAL);
-
-	//a link for launch options
-		fOptionsLink = new Link(linkComp, SWT.WRAP);
-		fOptionsLink.setFont(linkComp.getFont());
-		gd = new GridData(SWT.LEFT);
-		gd.grabExcessHorizontalSpace = true;
-		fOptionsLink.setLayoutData(gd);
-		fOptionsLink.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				//collect the options available
-				try {
-					if(!canLaunchWithModes()) {
-						SelectLaunchModesDialog sld = new SelectLaunchModesDialog(getShell(), 
-								getLaunchConfigurationDialog().getMode(), getWorkingCopy());
-						if(sld.open() == IDialogConstants.OK_ID) {
-							//set the options to the config
-							Object[] res = sld.getResult();
-							if(res != null) {
-								Set modes = (Set) res[0];
-								modes.remove(getLaunchConfigurationDialog().getMode());
-								ILaunchConfigurationWorkingCopy wc = getWorkingCopy();
-								wc.setModes(modes);
-								refreshStatus();
-							}
-						}
-					}
-					else if(hasMultipleDelegates()) {
-						SelectLaunchersDialog sldd = new SelectLaunchersDialog(getShell(), 
-								getWorkingCopy().getType().getDelegates(getCurrentModeSet()), 
-								getWorkingCopy(), 
-								getLaunchConfigurationDialog().getMode());
-						if(sldd.open() == IDialogConstants.OK_ID) {
-							displayInstanceTabs(true);
-						}
-					}
-				} catch (CoreException ex) {}
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {}
-		});
-		fOptionsLink.setVisible(false);
-		
-		Composite buttonComp = new Composite(blComp, SWT.NONE);
-		GridLayout buttonCompLayout = new GridLayout();
-		buttonCompLayout.numColumns = 2;
-		buttonComp.setLayout(buttonCompLayout);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		buttonComp.setLayoutData(gd);
-		
-		fApplyButton = new Button(buttonComp, SWT.PUSH);
-		fApplyButton.setText(LaunchConfigurationsMessages.LaunchConfigurationDialog__Apply_17); 
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		fApplyButton.setLayoutData(gd);
-		SWTFactory.setButtonDimensionHint(fApplyButton);
-		fApplyButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleApplyPressed();
-			}
-		});
-
-		fRevertButton = new Button(buttonComp, SWT.PUSH);
-		fRevertButton.setText(LaunchConfigurationsMessages.LaunchConfigurationDialog_Revert_2);   
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		fRevertButton.setLayoutData(gd);
-		SWTFactory.setButtonDimensionHint(fRevertButton);
-		fRevertButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleRevertPressed();
-			}
-		});
-        Dialog.applyDialogFont(parent);
-	}
-	
-	/**
-	 * Creates some help text for the tab group launch types
-	 * @param parent the parent composite
-	 * @since 3.2
-	 */
-	private void createGettingStarted(Composite parent) {
-		Font font = parent.getFont();
-		GridData gd = null;
-		int width = parent.getBounds().width - 30;
-		SWTFactory.createWrapLabel(parent, LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_1, 1, width);
-		SWTFactory.createWrapCLabel(parent, LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_2, DebugUITools.getImage(IInternalDebugUIConstants.IMG_ELCL_NEW_CONFIG), 1, width);
-		SWTFactory.createWrapCLabel(parent, LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_6, DebugUITools.getImage(IInternalDebugUIConstants.IMG_ELCL_DUPLICATE_CONFIG), 1, width);
-		SWTFactory.createWrapCLabel(parent, LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_4, DebugUITools.getImage(IInternalDebugUIConstants.IMG_ELCL_DELETE_CONFIG), 1, width);
-        SWTFactory.createWrapCLabel(parent, LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_8, DebugUITools.getImage(IInternalDebugUIConstants.IMG_ELCL_FILTER_CONFIGS), 1, width);
-        SWTFactory.createWrapCLabel(parent, LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_3, DebugUITools.getImage(IInternalDebugUIConstants.IMG_OVR_TRANSPARENT), 1, width);
-        
-		SWTFactory.createHorizontalSpacer(parent, 2);
-		Link link = new Link(parent, SWT.LEFT | SWT.WRAP);
-		link.setText(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_5);
-		link.setFont(font);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = width;
-		link.setLayoutData(gd);
-		link.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				SWTFactory.showPreferencePage("org.eclipse.debug.ui.PerspectivePreferencePage"); //$NON-NLS-1$
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {}
-		});
-	}
-	
-	/**
-	 * Creates the tab folder for displaying config instances
-	 * @param parent
-	 */
-	private void createTabFolder(Composite parent) {
-		if (fTabFolder == null) {
-			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$
-			fTabFolder = new CTabFolder(parent, SWT.NO_REDRAW_RESIZE | SWT.NO_TRIM | SWT.FLAT);
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			gd.horizontalSpan = 2;
-			fTabFolder.setSelectionBackground(new Color[] {c1, c2},	new int[] {100}, true);
-			fTabFolder.setSelectionForeground(reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR")); //$NON-NLS-1$
-			fTabFolder.setSimple(PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS));
-			fTabFolder.setLayoutData(gd);
-	        fTabFolder.setBorderVisible(true);
-			fTabFolder.setFont(parent.getFont());
-			fTabFolder.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent event) {
-					if (!fInitializingTabs) {
-						handleTabSelected();
-						refresh();
-					}
-				}
-			});	
-		}
-	}
-	
-	/**
-	 * Returns the apply button
-	 */
-	protected Button getApplyButton() {
-		return fApplyButton;
-	}	
-
-	/**
-	 * Returns the revert button
-	 */
-	protected Button getRevertButton() {
-		return fRevertButton;
-	}	
-	
-	/**
-	 * Sets the tab folder
-	 */
-	protected CTabFolder getTabFolder() {
-		return fTabFolder;
-	}
-	
-	/**
-	 * Sets the current name
-	 */
-	public void setName(String name) {
-		if (getWorkingCopy() != null) {
-			if (name == null) {
-				fNameWidget.setText(EMPTY_STRING);
-			}
-			else {
-				fNameWidget.setText(name.trim());
-			}
-			refreshStatus();
-		}
-	}	
-
-	/**
-	 * @see org.eclipse.jface.viewers.Viewer#getControl()
-	 */
-	public Control getControl() {
-		return fViewerControl;
-	}
-	
-	/**
-	 * Returns the shell this viewer is contained in.
-	 */
-	protected Shell getShell() {
-		return getControl().getShell();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IInputProvider#getInput()
-	 */
-	public Object getInput() {
-		return fInput;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return new StructuredSelection(fWorkingCopy);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.Viewer#refresh()
-	 */
-	public void refresh() {
-		if (fInitializingTabs) {
-			return;
-		}
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (tabs != null) {
-			// update the working copy from the active tab
-			boolean newwc = !getWorkingCopy().isDirty();
-			getActiveTab().performApply(getWorkingCopy());
-			if(getOriginal() instanceof ILaunchConfigurationWorkingCopy && newwc) {
-				try {
-					getWorkingCopy().doSave();
-				} 
-				catch (CoreException e) {DebugUIPlugin.log(e);}
-			}
-			updateButtons();
-			// update error ticks
-			CTabItem item = null;
-			boolean error = false;
-			Image image = null;
-			for (int i = 0; i < tabs.length; i++) {
-				item = fTabFolder.getItem(i);
-				image = tabs[i].getImage();
-				item.setImage(image);
-				if(!tabs[i].isValid(getWorkingCopy())) {
-					error = tabs[i].getErrorMessage() != null;
-					if(error) {
-						item.setImage(DebugUIPlugin.getDefault().getLaunchConfigurationManager().getErrorTabImage(tabs[i]));
-					}
-				}
-			}
-			showLink();
-		}
-	}
-	
-	/**
-	 * Shows the link for either multiple launch delegates or bad launch mode combinations
-	 * 
-	 * @since 3.3
-	 */
-	private void showLink() {
-		String text = null;
-		if(!canLaunchWithModes()) {
-			text = LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_13;
-		}
-		else if(hasMultipleDelegates()) {
-			ILaunchDelegate delegate = getPreferredDelegate();
-			if(delegate != null) {
-				String name = delegate.getName();
-				if(name == null) {
-					text = LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_15;
-				}
-				else {
-					text = MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_16, new String[] {name});
-				}
-			}
-			else {
-				text = LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_17;
-			}
-		}
-		if(text != null) {
-			fOptionsLink.setText(text);
-		}
-		fOptionsLink.setVisible(!canLaunchWithModes() || hasMultipleDelegates());
-		fOptionsLink.getParent().getParent().layout(true);
-	}
-	
-	/**
-	 * Returns the preferred launch delegate for the current launch configuration and mode set
-	 * @return the preferred launch delegate
-	 * 
-	 * @since 3.3
-	 */
-	protected ILaunchDelegate getPreferredDelegate() {
-		ILaunchDelegate preferred = null;
-		ILaunchConfigurationWorkingCopy config = getWorkingCopy();
-		if(config != null) {
-			try {
-				Set modes = getCurrentModeSet();
-				preferred = config.getPreferredDelegate(modes);
-				if(preferred == null) {
-					preferred = config.getType().getPreferredDelegate(modes);
-				}
-			}
-			catch(CoreException ce) {DebugUIPlugin.log(ce);}
-		}
-		return preferred;
-	}
-	
-	/**
-	 * Returns the listing of modes for the current config
-	 * @return the listing of modes for the current config
-	 * @since 3.3
-	 */
-	private Set getCurrentModeSet() {
-		Set set = new HashSet();
-		ILaunchConfigurationWorkingCopy config = getWorkingCopy();
-		if(config != null) {
-			try {
-				set.addAll(config.getModes());
-				set.add(getLaunchConfigurationDialog().getMode());
-			}
-			catch(CoreException ce) {DebugUIPlugin.log(ce);}
-		}
-		return set;
-	}
-	
-	/**
-	 * updates the button states
-	 */
-	private void updateButtons() {
-		boolean dirty = isDirty();
-		fApplyButton.setEnabled(dirty && canSave());
-		fRevertButton.setEnabled(dirty);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#setInput(java.lang.Object)
-	 */
-	public void setInput(final Object input) {
-		if(DebugUIPlugin.getStandardDisplay().getThread().equals(Thread.currentThread())) {
-			setInput0(input);
-		}
-		else {
-			DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-				public void run() {
-					setInput0(input);
-				}
-			});
-		}
-		
-	}
-	/**
-	 * Sets the input to the tab group viewer
-	 * @param input the new input
-	 * @since 3.3
-	 */
-	private void setInput0(Object input) {
-		if (input == null) {
-			if (fInput == null) {
-				return;
-			}
-			inputChanged(input);
-		} else {
-			if (!input.equals(fInput)) {
-				inputChanged(input);
-			}
-		}
-	}
-	
-	/**
-	 * The input has changed to the given object, possibly <code>null</code>.
-	 * 
-	 * @param input the new input, possibly <code>null</code>
-	 */
-	protected void inputChanged(Object input) {
-		fInput = input;
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					fVisibleArea.setRedraw(false);
-					if (fInput instanceof ILaunchConfiguration) {
-						ILaunchConfiguration configuration = (ILaunchConfiguration)fInput;
-						boolean refreshtabs = !delegatesEqual(fWorkingCopy, configuration);
-						fOriginal = configuration;
-						fWorkingCopy = configuration.getWorkingCopy();
-						displayInstanceTabs(refreshtabs);
-					} else if (fInput instanceof ILaunchConfigurationType) {
-						fDescription = getDescription((ILaunchConfigurationType)fInput);
-						setNoInput();
-						refreshStatus();
-					} else {
-						setNoInput();
-						refreshStatus();
-					}
-				} catch (CoreException ce) {
-					errorDialog(ce);
-					setNoInput();
-				}
-				finally {
-					fVisibleArea.setRedraw(true);
-				}
-			}
-		};
-		BusyIndicator.showWhile(getShell().getDisplay(), r);
-	}
-	
-	/**
-	 * Sets the tab group viewer to have no input, this is the case when null is passed as an input type
-	 * Setting no input is equivalent to resetting all items, clearing any messages and showing the 'getting started' pane
-	 * @since 3.2 
-	 */
-	private void setNoInput() {
-		fOriginal = null;
-		fWorkingCopy = null;
-		disposeExistingTabs();	
-		updateButtons();
-		updateVisibleControls(false);
-		ILaunchConfigurationDialog lcd = getLaunchConfigurationDialog();
-		if(lcd instanceof LaunchConfigurationsDialog) {
-			if(((LaunchConfigurationsDialog)lcd).isTreeSelectionEmpty()) {
-				fDescription = EMPTY_STRING;
-			}
-		}
-	}
-	
-	/**
-	 * Returns if the two configurations are using the same <code>ILaunchDelegate</code> or not
-	 * @param config1
-	 * @param config2
-	 * @return true if the configurations are using the same <code>ILaunchDelegate</code> or false if they are not
-	 * @since 3.3
-	 */
-	protected boolean delegatesEqual(ILaunchConfiguration config1, ILaunchConfiguration config2) {
-		try {
-			if(config1 == null || config2 == null) {
-				return false;
-			}
-			Set modes = getCurrentModeSet();
-			ILaunchDelegate d1 = config1.getPreferredDelegate(modes);
-			if(d1 == null) {
-				d1 = config1.getType().getPreferredDelegate(modes);
-			}
-			ILaunchDelegate d2 = config2.getPreferredDelegate(modes);
-			if(d2 == null) {
-				d2 = config2.getType().getPreferredDelegate(modes);
-			}
-			if(d1 != null) {
-				return d1.equals(d2);
-			}
-		}
-		catch(CoreException ce) {DebugUIPlugin.log(ce);}
-		return false;
-	}
-	
-	/**
-	 * Updates the visibility of controls based on the status provided 
-	 * @param visible the visibility status to be applied to the controls
-	 */
-	private void updateVisibleControls(boolean visible) {
-		fApplyButton.setVisible(visible);
-		fRevertButton.setVisible(visible);
-		fOptionsLink.setVisible(visible);
-		if(visible) {
-			((StackLayout)fTabPlaceHolder.getLayout()).topControl = fTabComposite;
-			fTabComposite.layout();
-		}
-		else {
-			((StackLayout)fTabPlaceHolder.getLayout()).topControl = fGettingStarted;
-		}
-		fTabPlaceHolder.layout(true);
-	}
-	
-    /**
-     * sets the current widget focus to the 'Name' widget
-     */
-    protected void setFocusOnName() {
-        fNameWidget.setFocus();
-    }
-    
-	/**
-	 * Displays tabs for the current working copy
-	 */
-	protected void displayInstanceTabs(boolean redrawTabs) {
-		// Turn on initializing flag to ignore message updates
-		fInitializingTabs = true;
-		ILaunchConfigurationType type = null;
-		try {
-			type = getWorkingCopy().getType();
-		} 
-		catch (CoreException e) {
-			errorDialog(e);
-			fInitializingTabs = false;
-			return;
-		}
-		if(redrawTabs) {
-			showInstanceTabsFor(type);
-		}
-		// show the name area
-		updateVisibleControls(true);
-
-		// Retrieve the current tab group.  If there is none, clean up and leave
-		ILaunchConfigurationTabGroup tabGroup = getTabGroup();
-		if (tabGroup == null) {
-			IStatus status = new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_No_tabs_defined_for_launch_configuration_type__0__1, new String[]{type.getName()}), null); 
-			CoreException e = new CoreException(status);
-			errorDialog(e);
-			fInitializingTabs = false;
-			return;
-		}
-
-		// Update the tabs with the new working copy
-		tabGroup.initializeFrom(getWorkingCopy());
-
-		// Update the name field
-		fNameWidget.setText(getWorkingCopy().getName());
-		
-		fCurrentTabIndex = fTabFolder.getSelectionIndex();
-
-		// Turn off initializing flag to update message
-		fInitializingTabs = false;
-		
-		if (!fVisibleArea.isVisible()) {
-			fVisibleArea.setVisible(true);
-		}
-		refreshStatus();		
-	}
-	
-	/**
-	 * Populate the tabs in the configuration edit area to be appropriate to the current
-	 * launch configuration type.
-	 */
-	private void showInstanceTabsFor(ILaunchConfigurationType configType) {
-		// try to keep on same tab
-		Class tabKind = null;
-		if (getActiveTab() != null) {
-			tabKind = getActiveTab().getClass();
-		}
-		// Build the new tabs
-		ILaunchConfigurationTabGroup group = null;
-		try {
-			group = createGroup();
-		} catch (CoreException ce) {
-			DebugUIPlugin.errorDialog(getShell(), LaunchConfigurationsMessages.LaunchConfigurationDialog_Error_19, LaunchConfigurationsMessages.LaunchConfigurationDialog_Exception_occurred_creating_launch_configuration_tabs_27,ce); // 
-			return;
-		}
-		disposeExistingTabs();
-		fTabGroup = group;
-		fTabType = configType;
-		ILaunchConfigurationTab[] tabs = getTabs();
-		CTabItem tab = null;
-		String name = EMPTY_STRING;
-		Control control = null;
-		for (int i = 0; i < tabs.length; i++) {
-			tab = new CTabItem(fTabFolder, SWT.BORDER);
-			name = tabs[i].getName();
-			if (name == null) {
-				name = LaunchConfigurationsMessages.LaunchConfigurationDialog_unspecified_28; 
-			}
-			tab.setText(name);
-			tab.setImage(tabs[i].getImage());
-			tabs[i].createControl(tab.getParent());
-			control = tabs[i].getControl();
-			if (control != null) {
-				tab.setControl(control);
-			}
-		}
-		//set the default tab as the first one
-		setActiveTab(tabs[0]);
-		// select same tab as before, if possible
-		for (int i = 0; i < tabs.length; i++) {
-			if (tabs[i].getClass().equals(tabKind)) {
-				setActiveTab(tabs[i]);
-				break;
-			}
-		}
-		fDescription = getDescription(configType);
-	}	
-
-	/**
-	 * Returns the description of the given configuration type
-	 * in the current mode or <code>null</code> if none.
-	 * 
-	 * @param configType the config type
-	 * @return the description of the given configuration type or <code>null</code>
-	 */
-	private String getDescription(ILaunchConfigurationType configType) {
-		String description = null;
-		if(configType != null) {
-			String mode = fDialog.getMode();
-			description = LaunchConfigurationPresentationManager.getDefault().getDescription(configType, mode);
-		}	
-		if (description == null) {
-			description = EMPTY_STRING;
-		}
-		return description;
-	}
-	
-	/**
-	 * Returns tab group for the given type of launch configuration.
-	 * Tabs are initialized to be contained in this dialog.
-	 *
-	 * @exception CoreException if unable to instantiate a tab group
-	 */
-	protected ILaunchConfigurationTabGroup createGroup() throws CoreException {
-		// Use a final Object array to store the tab group and any exception that
-		// results from the Runnable
-		final Object[] finalArray = new Object[2];
-		Runnable runnable = new Runnable() {
-			public void run() {
-				ILaunchConfigurationTabGroup tabGroup = null;
-				try {
-					tabGroup = LaunchConfigurationPresentationManager.getDefault().getTabGroup(getWorkingCopy(), getLaunchConfigurationDialog().getMode());
-					finalArray[0] = tabGroup;
-				} catch (CoreException ce) {
-					finalArray[1] = ce;
-					return;
-				}
-				tabGroup.createTabs(getLaunchConfigurationDialog(), getLaunchConfigurationDialog().getMode());
-				ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
-				for (int i = 0; i < tabs.length; i++) {
-					tabs[i].setLaunchConfigurationDialog(getLaunchConfigurationDialog());
-				}
-			}
-		};
-
-		// Creating the tabs can result in plug-in loading, so we show the busy cursor
-		BusyIndicator.showWhile(getControl().getDisplay(), runnable);
-
-		// Re-throw any CoreException if there was one
-		if (finalArray[1] != null) {
-			throw (CoreException)finalArray[1];
-		}
-
-		// Otherwise return the tab group
-		return (ILaunchConfigurationTabGroup)finalArray[0];
-	}	
-
-	/**
-	 * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
-	 */
-	public void setSelection(ISelection selection, boolean reveal) {
-		if (getWorkingCopy() != null) {
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection structuredSelection = (IStructuredSelection)selection;
-				Object object = structuredSelection.getFirstElement();
-				if (object instanceof ILaunchConfigurationTab) {
-					ILaunchConfigurationTab[] tabs = getTabs();
-					for (int i = 0; i < tabs.length; i++) {
-						if (tabs[i].equals(object)) {
-							fCurrentTabIndex = i;
-							fTabFolder.setSelection(i);
-						}
-						return;
-					}
-				}
-			}
-		}
-			
-	}
-
-	/**
-	 * Returns the tabs currently being displayed, or
-	 * <code>null</code> if none.
-	 *
-	 * @return currently displayed tabs, or <code>null</code>
-	 */
-	public ILaunchConfigurationTab[] getTabs() {
-		if (getTabGroup() != null) {
-			return getTabGroup().getTabs();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the currently active <code>ILaunchConfigurationTab</code>
-	 * being displayed, or <code>null</code> if there is none.
-	 *
-	 * @return currently active <code>ILaunchConfigurationTab</code>, or <code>null</code>.
-	 */
-	public ILaunchConfigurationTab getActiveTab() {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (fTabFolder != null && tabs != null) {
-			int pageIndex = fTabFolder.getSelectionIndex();
-			if (pageIndex >= 0) {
-				return tabs[pageIndex];
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns whether the launch configuration being edited is dirty (i.e.
-	 * needs saving)
-	 * 
-	 * @return whether the launch configuration being edited needs saving
-	 */
-	public boolean isDirty() {
-		ILaunchConfigurationWorkingCopy workingCopy = getWorkingCopy();
-		if (workingCopy == null) {
-			return false;
-		}
-		if(workingCopy.getParent() != null) {
-			return !workingCopy.getParent().contentsEqual(workingCopy);
-		}
-		// Working copy hasn't been saved
-		if (workingCopy.getOriginal() == null) {
-			return true;
-		}
-		ILaunchConfiguration original = getOriginal();
-		return !original.contentsEqual(workingCopy);
-	}
-	
-	/**
-	 * Update apply & revert buttons, as well as buttons and message on the
-	 * launch config dialog.
-	 */
-	protected void refreshStatus() {
-		if (!fInitializingTabs) {
-			getLaunchConfigurationDialog().updateButtons();
-			getLaunchConfigurationDialog().updateMessage();
-		}
-	}	
-	
-	/**
-	 * Returns the containing launch dialog
-	 */
-	protected ILaunchConfigurationDialog getLaunchConfigurationDialog() {
-		return fDialog;
-	}
-
-	/**
-	 * Returns the original launch configuration being edited, possibly
-	 * <code>null</code>.
-	 * 
-	 * @return ILaunchConfiguration
-	 */
-	protected ILaunchConfiguration getOriginal() {
-		return fOriginal;
-	}
-	
-	/**
-	 * Returns the working copy used to edit the original, possibly
-	 * <code>null</code>.
- 	 */
-	protected ILaunchConfigurationWorkingCopy getWorkingCopy() {
-		return fWorkingCopy;
-	}
-	
-	/**
-	 * Return whether the current configuration can be saved.
-	 * <p>
-	 * Note this is NOT the same thing as the config simply being valid. It
-	 * is possible to save a config that does not validate. This method
-	 * determines whether the config can be saved without causing a serious
-	 * error. For example, a shared config that has no specified location would
-	 * cause this method to return <code>false</code>.
-	 * </p>
-	 */
-	public boolean canSave() {
-		if (fInitializingTabs) {
-			return false;
-		}
-		// First make sure that name doesn't prevent saving the config
-		try {
-			verifyName();
-		} catch (CoreException ce) {
-			return false;
-		}
-
-		// Next, make sure none of the tabs object to saving the config
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (tabs == null) {
-			return false;
-		}
-		for (int i = 0; i < tabs.length; i++) {
-			if (!tabs[i].canSave()) {
-				return false;
-			}
-		}
-		if(getWorkingCopy() != null) {
-			return !getWorkingCopy().isReadOnly();
-		}
-		return true;
-	}	
-	
-	/**
-	 * @see ILaunchConfigurationDialog#canLaunch()
-	 */
-	public boolean canLaunch() {
-		if(fInitializingTabs) {
-			return false;
-		}
-		if (getWorkingCopy() == null) {
-			return false;
-		}
-		try {
-			verifyName();
-		} catch (CoreException e) {
-			return false;
-		}
-
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (tabs == null) {
-			return false;
-		}
-		for (int i = 0; i < tabs.length; i++) {
-			if (!tabs[i].isValid(getWorkingCopy())) {
-				return false;
-			}
-		}
-		return true;
-	}	
-	
-	/**
-	 * Determines if the tab groups that is currently visible can launch with the currently selected
-	 * set of options.
-	 * 
-	 * @return true if the dialog can launch with the given set of modes, false otherwise
-	 * 
-	 * @since 3.3
-	 */
-	public boolean canLaunchWithModes() {
-		if(fInitializingTabs) {
-			return false;
-		}
-		//check if selected options exist and that the selected combination can be launched
-		try {
-			ILaunchConfigurationWorkingCopy wc = getWorkingCopy();
-			if(wc != null) {
-				return wc.getType().supportsModeCombination(getCurrentModeSet());
-			}
-		}  catch (CoreException e) {
-		}
-		return true;
-	}
-	
-	/**
-	 * Returns if the type currently showing in the tab group viewer has duplicate launch delegates for the given set of modes.
-	 * 
-	 * The given set of modes comprises the current mode that the launch dialog was opened in as well as any modes that have been set on the launch
-	 * configuration.
-	 * @return the true if there are duplicates, false otherwise
-	 * 
-	 * @since 3.3
-	 */
-	public boolean hasDuplicateDelegates() {
-		if(fInitializingTabs) {
-			return false;
-		}
-		ILaunchConfiguration config = getWorkingCopy();
-		if(config != null) {
-			if(hasMultipleDelegates()) {
-				return getPreferredDelegate() == null;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Determines if the currently showing launch configuration has multiple launch delegates for the same mode set, but does not care
-	 * if there has been a default selected yet or not
-	 * @return true if the current launch configuration has multiple launch delegates, false otherwise
-	 */
-	private boolean hasMultipleDelegates() {
-		ILaunchConfiguration config = getWorkingCopy();
-		if(config != null) {
-			try {
-				Set modes = getCurrentModeSet();
-				ILaunchDelegate[] delegates = LaunchConfigurationManager.filterLaunchDelegates(fTabType, modes);
-				return delegates.length > 1;
-			}
-			catch (CoreException ce) {DebugUIPlugin.log(ce);}
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns the current error message or <code>null</code> if none.
-	 */
-	public String getErrorMesssage() {
-		if (fInitializingTabs) {
-			return null;
-		}
-		
-		if (getWorkingCopy() == null) {
-			return null;
-		}
-		try {
-			verifyName();
-		} catch (CoreException ce) {
-			return ce.getStatus().getMessage();
-		}
-	
-		String message = null;
-		ILaunchConfigurationTab activeTab = getActiveTab();
-		if (activeTab == null) {
-			return null;
-		} 
-		message = activeTab.getErrorMessage();
-		if (message != null) {
-			return message;
-		}
-		
-		ILaunchConfigurationTab[] allTabs = getTabs();
-		for (int i = 0; i < allTabs.length; i++) {
-			ILaunchConfigurationTab tab = allTabs[i];
-			if (tab == activeTab) {
-				continue;
-			}
-			message = tab.getErrorMessage();
-			if (message != null) {
-				StringBuffer temp= new StringBuffer();
-				temp.append('[');
-				temp.append(DebugUIPlugin.removeAccelerators(tab.getName()));
-				temp.append("]: "); //$NON-NLS-1$
-				temp.append(message);
-				return temp.toString();
-			}
-		}
-		if(getWorkingCopy().isReadOnly()) {
-			return LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_9;
-		}
-		if(!canLaunchWithModes()) {
-			Set modes = getCurrentModeSet();
-			List names = LaunchConfigurationPresentationManager.getDefault().getLaunchModeNames(modes);
-			return MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_14, new String[]{names.toString()});
-		}
-		if(hasDuplicateDelegates()) {
-			return LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_18;
-		}
-		return null;
-	}	
-	
-	/**
-	 * Returns the current message or <code>null</code> if none.
-	 * @return Returns an appropriate message for display to user. The message returned will be:
-	 * The message defined by the visible tab,
-	 * or The tab group description for the particular launch mode,
-	 * or The generic tab group description,
-	 * or <code>null</code> if no message is defined 
-	 */
-	public String getMessage() {
-		if (fInitializingTabs) {
-			return null;
-		}
-		
-		String message = fDescription;
-		
-		ILaunchConfigurationTab tab = getActiveTab();
-		if (tab != null) {
-			String tabMessage = tab.getMessage();
-			if (tabMessage != null) {
-				message = tabMessage;
-			}
-		}
-		
-		return message;
-	}	
-		
-	/**
-	 * Verify that the launch configuration name is valid.
-	 */
-	protected void verifyName() throws CoreException {
-		if (fNameWidget.isVisible()) {
-			String currentName = fNameWidget.getText().trim();
-	
-			// If there is no name, complain
-			if (currentName.length() < 1) {
-				throw new CoreException(new Status(IStatus.ERROR,
-													 DebugUIPlugin.getUniqueIdentifier(),
-													 0,
-													 LaunchConfigurationsMessages.LaunchConfigurationDialog_Name_required_for_launch_configuration_11, 
-													 null));
-			}
-	
-			// See if name contains any 'illegal' characters
-			IStatus status = ResourcesPlugin.getWorkspace().validateName(currentName, IResource.FILE);
-			if (status.getCode() != IStatus.OK) {
-				throw new CoreException(new Status(IStatus.ERROR,
-													 DebugUIPlugin.getUniqueIdentifier(),
-													 0,
-													 status.getMessage(),
-													 null));
-			}
-			
-			// See if name contains any characters that we deem illegal.
-			// '@' and '&' are disallowed because they corrupt menu items.
-			char[] disallowedChars = new char[] { '@', '&' };
-			for (int i = 0; i < disallowedChars.length; i++) {
-				char c = disallowedChars[i];
-				if (currentName.indexOf(c) > -1) {
-					throw new CoreException(new Status(IStatus.ERROR,
-														DebugUIPlugin.getUniqueIdentifier(),
-														0,
-														MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_0, new String[] { new String(new char[] {c}), currentName }), 
-														null));
-				}
-			}
-	
-			// Otherwise, if there's already a config with the same name, complain
-			if (!getOriginal().getName().equals(currentName)) {
-				Set reservednames = ((LaunchConfigurationsDialog)getLaunchConfigurationDialog()).getReservedNameSet();
-				if (DebugPlugin.getDefault().getLaunchManager().isExistingLaunchConfigurationName(currentName) || (reservednames != null ? reservednames.contains(currentName) : false)) {
-					throw new CoreException(new Status(IStatus.ERROR,
-														 DebugUIPlugin.getUniqueIdentifier(),
-														 0,
-														 LaunchConfigurationsMessages.LaunchConfigurationDialog_Launch_configuration_already_exists_with_this_name_12, 
-														 null));
-				}
-			}
-		}
-	}		
-	
-	/**
-	 * Remove the existing tabs that are showing 
-	 */
-	private void disposeExistingTabs() {
-		fDisposingTabs = true;
-        fTabFolder.dispose();
-        fTabFolder = null;
-		createTabFolder(fTabComposite);
-		disposeTabGroup();
-		fDisposingTabs = false;
-	}	
-
-	/**
-	 * Returns the current tab group
-	 *
-	 * @return the current tab group, or <code>null</code> if none
-	 */
-	public ILaunchConfigurationTabGroup getTabGroup() {
-		return fTabGroup;
-	}
-	
-	/**
-	 * Notification that a tab has been selected
-	 *
-	 * Disallow tab changing when the current tab is invalid.
-	 * Update the config from the tab being left, and refresh
-	 * the tab being entered.
-	 */
-	protected void handleTabSelected() {
-		if (fDisposingTabs || fInitializingTabs) {
-			return;
-		}
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (fCurrentTabIndex == fTabFolder.getSelectionIndex() || tabs == null || tabs.length == 0 || fCurrentTabIndex > (tabs.length - 1)) {
-			return;
-		}
-		if (fCurrentTabIndex != -1) {
-			ILaunchConfigurationTab tab = tabs[fCurrentTabIndex];
-			ILaunchConfigurationWorkingCopy wc = getWorkingCopy();
-			if (wc != null) {
-				tab.deactivated(wc);
-				getActiveTab().activated(wc);
-			}
-		}
-		fCurrentTabIndex = fTabFolder.getSelectionIndex();
-	}
-	
-	/**
-	 * Notification the name field has been modified
-	 */
-	protected void handleNameModified() {
-		getWorkingCopy().rename(fNameWidget.getText().trim());
-		refreshStatus();
-	}		
-	
-	/**
-	 * Notification that the 'Apply' button has been pressed
-	 */
-	protected void handleApplyPressed() {
-		Exception exception = null;
-		try {
-			// update launch config
-			fInitializingTabs = true;
-			// trim name
-			String trimmed = fNameWidget.getText().trim();
-			fNameWidget.setText(trimmed);
-			if(fWorkingCopy == null) {
-				fWorkingCopy = fOriginal.getWorkingCopy();
-			}
-			fWorkingCopy.rename(trimmed);
-			getTabGroup().performApply(fWorkingCopy);
-			if (isDirty()) {
-				if(!fWorkingCopy.isLocal()) {
-					IRunnableWithProgress runnable = new IRunnableWithProgress() {
-						public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-							try {
-								((LaunchConfigurationWorkingCopy)fWorkingCopy).doSave(monitor);
-							} 
-							catch (CoreException e) {DebugUIPlugin.log(e);}
-						}
-					};
-					getLaunchConfigurationDialog().run(true, false, runnable);
-				}
-				else {
-					fWorkingCopy.doSave();
-				}
-			}
-			updateButtons();
-			fInitializingTabs = false;
-		} 
-		catch (CoreException e) {exception = e;} 
-		catch (InvocationTargetException e) {exception = e;} 
-		catch (InterruptedException e) {exception = e;} 
-		if(exception != null) {
-			DebugUIPlugin.errorDialog(getShell(), LaunchConfigurationsMessages.LaunchConfigurationDialog_Launch_Configuration_Error_46, LaunchConfigurationsMessages.LaunchConfigurationDialog_Exception_occurred_while_saving_launch_configuration_47, exception); // 
-			return;
-		}
-	}
-
-	/**
-	 * Notification that the 'Revert' button has been pressed
-	 */
-	protected void handleRevertPressed() {
-		try {
-			if(fTabGroup != null) {
-				fTabGroup.initializeFrom(fOriginal);
-				fNameWidget.setText(fOriginal.getName());
-				fWorkingCopy = fOriginal.getWorkingCopy();
-				refreshStatus();
-			}
-		} 
-		catch (CoreException e) {DebugUIPlugin.log(e);}
-	}	
-	
-	/**
-	 * Show an error dialog on the given exception.
-	 *
-	 * @param exception
-	 */
-	protected void errorDialog(CoreException exception) {
-		ErrorDialog.openError(getShell(), null, null, exception.getStatus());
-	}	
-
-	/**
-	 * Sets the displayed tab to the given tab. Has no effect if the specified
-	 * tab is not one of the tabs being displayed in the dialog currently.
-	 * 
-	 * @param tab the tab to display/activate
-	 */
-	public void setActiveTab(ILaunchConfigurationTab tab) {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if(tabs != null) {
-			for (int i = 0; i < tabs.length; i++) {
-				if (tabs[i].getClass().equals(tab.getClass())) {
-					setActiveTab(i);
-					return;
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Sets the displayed tab to the tab with the given index. Has no effect if
-	 * the specified index is not within the limits of the tabs returned by
-	 * <code>getTabs()</code>.
-	 * 
-	 * @param index the index of the tab to display
-	 */
-	public void setActiveTab(int index) {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (index >= 0 && index < tabs.length) {
-			fTabFolder.setSelection(index);
-			handleTabSelected();
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupWrapper.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupWrapper.java
deleted file mode 100644
index a0417d5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupWrapper.java
+++ /dev/null
@@ -1,199 +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.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.LaunchConfigurationTabExtension;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-
-/**
- * This class is used to wrap a contributed <code>ILaunchConfigurationTabGroup</code> with any contributed tabs
- * for that group (from a <code>launchConfigurationTabs</code> extension point).
- * 
- * @since 3.3
- */
-public class LaunchConfigurationTabGroupWrapper implements ILaunchConfigurationTabGroup {
-	
-	private ILaunchConfigurationTabGroup fGroup = null;
-	private String fGroupId = null;
-	/**
-	 * listing of tab extensions that we have to create
-	 */
-	private List fTabs = null;
-	private String fMode = null;
-	private ILaunchConfiguration fConfig = null;
-	
-	/**
-	 * Constructor
-	 * @param group the existing group to wrapper
-	 * @param groupId the string id of the associated tab group
-	 * @param config the launch configuration this tab group is opened on
-	 */
-	public LaunchConfigurationTabGroupWrapper(ILaunchConfigurationTabGroup group, String groupId, ILaunchConfiguration config) {
-		fGroup = group;
-		fGroupId = groupId;
-		fConfig = config;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String)
-	 */
-	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-		if(fGroup != null) {
-			fGroup.createTabs(dialog, mode);
-			fMode = mode;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#dispose()
-	 */
-	public void dispose() {
-		fGroup.dispose();
-		if(fTabs != null) {
-			List tabs = Arrays.asList(fGroup.getTabs());
-			ILaunchConfigurationTab tab = null;
-			for(int i = 0; i < fTabs.size(); i++) {
-				tab = (ILaunchConfigurationTab)fTabs.get(i);
-				if(!tabs.contains(tab)) {
-					tab.dispose();
-				}
-			}
-			fTabs.clear();
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#getTabs()
-	 */
-	public ILaunchConfigurationTab[] getTabs() {
-		if(fTabs == null) {
-			try {
-				fTabs = new ArrayList();
-			//add the tab groups' tabs first (defaults)
-				fTabs.addAll(Arrays.asList(fGroup.getTabs()));
-			//last, add the extensions (if any)
-				LaunchConfigurationTabExtension[] ext = LaunchConfigurationPresentationManager.getDefault().getTabExtensions(fGroupId, fConfig, fMode);
-				//copy contributed into correct position or end if no id or id is not found
-				String id = null;
-				for(int i = 0; i < ext.length; i++) {
-					id = ext[i].getRelativeTabId();
-					if(id != null) {
-						int idx = indexofTab(id);
-						if(idx  > -1) {
-							fTabs.add(idx+1, ext[i].getTab());
-						}
-						else {
-							fTabs.add(ext[i].getTab());
-						}
-					}
-					else {
-						fTabs.add(ext[i].getTab());
-					}
-				}
-			}
-			catch (CoreException ce) {DebugUIPlugin.log(ce);}
-		}
-		return (ILaunchConfigurationTab[]) fTabs.toArray(new ILaunchConfigurationTab[fTabs.size()]);
-	}
-	
-	/**
-	 * Returns the index of the tab matching the specified id
-	 * @param id the id of the tab to find the index for
-	 * @return the index of the tab specified by the id or -1 if not found
-	 */
-	private int indexofTab(String id) {
-		if(id != null) { 
-			Object o = null;
-			for(int i = 0; i < fTabs.size(); i++) {
-				o = fTabs.get(i);
-				if(o instanceof AbstractLaunchConfigurationTab) {
-					if(id.equals(((AbstractLaunchConfigurationTab)o).getId())) {
-						return i;
-					}
-				}
-			}
-		}
-		return -1;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		fGroup.initializeFrom(configuration);
-		if(fTabs != null) {
-			List tabs = Arrays.asList(fGroup.getTabs());
-			ILaunchConfigurationTab tab = null;
-			for(int i = 0; i < fTabs.size(); i++) {
-				tab = (ILaunchConfigurationTab)fTabs.get(i);
-				if(!tabs.contains(tab)) {
-					tab.initializeFrom(configuration);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#launched(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launched(ILaunch launch) {
-		if(fGroup != null) {
-			fGroup.launched(launch);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		fGroup.performApply(configuration);
-		if(fTabs != null) {
-			List tabs = Arrays.asList(fGroup.getTabs());
-			ILaunchConfigurationTab tab = null;
-			for(int i = 0; i < fTabs.size(); i++) {
-				tab = (ILaunchConfigurationTab)fTabs.get(i);
-				if(!tabs.contains(tab)) {
-					tab.performApply(configuration);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		fGroup.setDefaults(configuration);
-		if(fTabs != null) {
-			List tabs = Arrays.asList(fGroup.getTabs());
-			ILaunchConfigurationTab tab = null;
-			for(int i = 0; i < fTabs.size(); i++) {
-				tab = (ILaunchConfigurationTab)fTabs.get(i);
-				if(!tabs.contains(tab)) {
-					tab.setDefaults(configuration);
-				}
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabImageDescriptor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabImageDescriptor.java
deleted file mode 100644
index 1cb7e16..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabImageDescriptor.java
+++ /dev/null
@@ -1,119 +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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * A JDIImageDescriptor consists of a main icon and several adornments. The adornments
- * are computed according to flags set on creation of the descriptor.
- */
-public class LaunchConfigurationTabImageDescriptor extends CompositeImageDescriptor {
-	
-	/** Flag to render the error adornment */
-	public final static int ERROR= 		0x001;
-
-	private Image fBaseImage;
-	private int fFlags;
-	private Point fSize;
-	
-	/**
-	 * Create a new JDIImageDescriptor.
-	 * 
-	 * @param baseImage an image descriptor used as the base image
-	 * @param flags flags indicating which adornments are to be rendered
-	 * 
-	 */
-	public LaunchConfigurationTabImageDescriptor(Image baseImage, int flags) {
-		setBaseImage(baseImage);
-		setFlags(flags);
-	}
-	
-	/**
-	 * @see CompositeImageDescriptor#getSize()
-	 */
-	protected Point getSize() {
-		if (fSize == null) {
-			ImageData data= getBaseImage().getImageData();
-			setSize(new Point(data.width, data.height));
-		}
-		return fSize;
-	}
-	
-	/**
-	 * @see Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {
-		if (!(object instanceof LaunchConfigurationTabImageDescriptor)){
-			return false;
-		}
-			
-		LaunchConfigurationTabImageDescriptor other= (LaunchConfigurationTabImageDescriptor)object;
-		return (getBaseImage().equals(other.getBaseImage()) && getFlags() == other.getFlags());
-	}
-	
-	/**
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return getBaseImage().hashCode() | getFlags();
-	}
-	
-	/**
-	 * @see CompositeImageDescriptor#drawCompositeImage(int, int)
-	 */
-	protected void drawCompositeImage(int width, int height) {
-		ImageData bg= getBaseImage().getImageData();
-		if (bg == null) {
-			bg= DEFAULT_IMAGE_DATA;
-		}
-		drawImage(bg, 0, 0);
-		drawOverlays();
-	}
-
-	/**
-	 * Add any overlays to the image as specified in the flags.
-	 */
-	protected void drawOverlays() {
-		int flags= getFlags();
-		ImageData data= null;
-		if ((flags & ERROR) != 0) {
-			data= DebugUITools.getImage(IDebugUIConstants.IMG_OVR_ERROR).getImageData();
-			drawImage(data, 0, 0);
-		}
-	}
-	
-	protected Image getBaseImage() {
-		return fBaseImage;
-	}
-
-	protected void setBaseImage(Image baseImage) {
-		fBaseImage = baseImage;
-	}
-
-	protected int getFlags() {
-		return fFlags;
-	}
-
-	protected void setFlags(int flags) {
-		fFlags = flags;
-	}
-
-	protected void setSize(Point size) {
-		fSize = size;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.java
deleted file mode 100644
index 09cdd70..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTreeContentProvider.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.debug.internal.ui.launchConfigurations;
-
- 
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * Content provider for representing launch configuration types & launch configurations in a tree.
- * 
- * @since 2.1
- */
-public class LaunchConfigurationTreeContentProvider implements ITreeContentProvider {
-
-	/**
-	 * Empty Object array
-	 */
-	private static final Object[] EMPTY_ARRAY = new Object[0];	
-	
-	/**
-	 * The mode in which the tree is being shown, one of <code>RUN_MODE</code> 
-	 * or <code>DEBUG_MODE</code> defined in <code>ILaunchManager</code>.
-	 * If this is <code>null</code>, then it means both modes are being shown.
-	 */
-	private String fMode;
-	
-	/**
-	 * The Shell context
-	 */
-	private Shell fShell;
-	
-	/**
-	 * Constructor
-	 * @param mode the mode
-	 * @param shell the parent shell
-	 */
-	public LaunchConfigurationTreeContentProvider(String mode, Shell shell) {
-		setMode(mode);
-		setShell(shell);
-	}
-
-	/**
-	 * Actual launch configurations have no children.  Launch configuration types have
-	 * all configurations of that type as children, minus any configurations that are 
-	 * marked as private.
-	 * <p>
-	 * In 2.1, the <code>category</code> attribute was added to launch config
-	 * types. The debug UI only displays those configs that do not specify a
-	 * category.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		if (parentElement instanceof ILaunchConfiguration) {
-			return EMPTY_ARRAY;
-		} else if (parentElement instanceof ILaunchConfigurationType) {
-			try {
-				ILaunchConfigurationType type = (ILaunchConfigurationType)parentElement;
-				return getLaunchManager().getLaunchConfigurations(type);
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(getShell(), LaunchConfigurationsMessages.LaunchConfigurationDialog_Error_19, LaunchConfigurationsMessages.LaunchConfigurationDialog_An_exception_occurred_while_retrieving_launch_configurations_20, e); // 
-			}
-		} else {
-			return getLaunchManager().getLaunchConfigurationTypes();
-		}
-		return EMPTY_ARRAY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof ILaunchConfiguration) {
-			if (!((ILaunchConfiguration)element).exists()) {
-				return null;
-			}
-			try {
-				return ((ILaunchConfiguration)element).getType();
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(getShell(), LaunchConfigurationsMessages.LaunchConfigurationDialog_Error_19, LaunchConfigurationsMessages.LaunchConfigurationDialog_An_exception_occurred_while_retrieving_launch_configurations_20, e); // 
-			}
-		} else if (element instanceof ILaunchConfigurationType) {
-			return ResourcesPlugin.getWorkspace().getRoot();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		if (element instanceof ILaunchConfiguration) {
-			return false;
-		} 
-		return getChildren(element).length > 0;
-	}
-
-	/**
-	 * Return only the launch configuration types that support the current mode AND
-	 * are marked as 'public'.
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		ILaunchConfigurationType[] allTypes = getLaunchManager().getLaunchConfigurationTypes();
-		return filterTypes(allTypes).toArray();
-	}
-
-	/**
-	 * Returns a list containing the given types minus any types that
-	 * should not be visible. A type should not be visible if it doesn't match
-	 * the current mode or if it matches a disabled activity.
-	 * 
-	 * @param allTypes the types
-	 * @return the given types minus any types that should not be visible.
-	 */
-	private List filterTypes(ILaunchConfigurationType[] allTypes) {
-		List filteredTypes= new ArrayList();
-		String mode = getMode();
-		LaunchConfigurationTypeContribution contribution;
-		for (int i = 0; i < allTypes.length; i++) {
-			ILaunchConfigurationType type = allTypes[i];
-			contribution= new LaunchConfigurationTypeContribution(type);
-			if (isVisible(type, mode) && !WorkbenchActivityHelper.filterItem(contribution)) {
-				filteredTypes.add(type);
-			}
-		}
-		return filteredTypes;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-	
-	/**
-	 * Return <code>true</code> if the specified launch configuration type should
-	 * be visible in the specified mode, <code>false</code> otherwise.
-	 */
-	private boolean isVisible(ILaunchConfigurationType configType, String mode) {
-		if (!configType.isPublic()) {
-			return false;
-		}
-		if (mode == null) {
-			return true;
-		}
-		return configType.supportsMode(mode);
-	}
-
-	/**
-	 * Convenience method to get the singleton launch manager.
-	 */
-	private ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-
-	/**
-	 * Write accessor for the mode value
-	 */
-	private void setMode(String mode) {
-		fMode = mode;
-	}
-	
-	/**
-	 * Read accessor for the mode value
-	 */
-	private String getMode() {
-		return fMode;
-	}
-
-	/**
-	 * Write accessor for the shell value
-	 */
-	private void setShell(Shell shell) {
-		fShell = shell;
-	}
-	
-	/**
-	 * Read accessor for the shell value
-	 */
-	private Shell getShell() {
-		return fShell;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTypeContribution.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTypeContribution.java
deleted file mode 100644
index 8a7b3c6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTypeContribution.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.ui.IPluginContribution;
-
-/**
- * A plug-in contribution (UI element) which contains a launch configuration
- * type (Core element). Plug-in contributions are passed to the workbench
- * activity support to filter elements from the UI.
- */
-class LaunchConfigurationTypeContribution implements IPluginContribution {
-	
-	protected ILaunchConfigurationType type;
-	
-	/**
-	 * Creates a new plug-in contribution for the given type
-	 * 
-	 * @param type the launch configuration type
-	 */
-	public LaunchConfigurationTypeContribution(ILaunchConfigurationType type) {
-		this.type= type;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
-	 */
-	public String getLocalId() {
-		return type.getIdentifier();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-	 */
-	public String getPluginId() {
-		return type.getPluginIdentifier();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTypeFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTypeFilter.java
deleted file mode 100644
index 86d5d60..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTypeFilter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * Provides the implementation of the filter for filtering the launch configuration viewer based on the preference
- * <code>IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES</code> 
- * 
- * @since 3.2
- */
-public class LaunchConfigurationTypeFilter extends ViewerFilter {
-
-	/**
-	 * Constructor
-	 */
-	public LaunchConfigurationTypeFilter() {
-		super();
-	}
-
-	/* (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 ILaunchConfiguration) {
-			return true;
-		}
-		//we only care about launch configuration types
-		if(element instanceof ILaunchConfigurationType) {
-			IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-			String[] types = store.getString(IInternalDebugUIConstants.PREF_FILTER_TYPE_LIST).split("\\,"); //$NON-NLS-1$
-			for(int i = 0; i < types.length; i++) {
-				if(types[i].equals(((ILaunchConfigurationType)element).getIdentifier())) {
-					return false;
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationView.java
deleted file mode 100644
index c61d69b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationView.java
+++ /dev/null
@@ -1,436 +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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationListener;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.AbstractDebugView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IDebugView;
-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.Separator;
-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.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PatternFilter;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * A tree view of launch configurations
- */
-public class LaunchConfigurationView extends AbstractDebugView implements ILaunchConfigurationListener {
-	
-	/**
-	 * the filtering tree viewer
-	 * 
-	 * @since 3.2
-	 */
-	private LaunchConfigurationFilteredTree fTree;
-	
-	/**
-	 * a handle to the launch manager
-	 * 
-	 * @since 3.2
-	 */
-	private ILaunchManager fLaunchManager = DebugPlugin.getDefault().getLaunchManager();
-	
-	/**
-	 * The launch group to display
-	 */
-	private LaunchGroupExtension fLaunchGroup;
-	
-	/**
-	 * Actions
-	 */
-	private CreateLaunchConfigurationAction fCreateAction;
-	private DeleteLaunchConfigurationAction fDeleteAction;
-	private DuplicateLaunchConfigurationAction fDuplicateAction;
-	private CollapseAllLaunchConfigurationAction fCollapseAllAction;
-	
-	/**
-	 * Action for providing filtering to the Launch Configuration Dialog
-	 * @since 3.2
-	 */
-	private FilterLaunchConfigurationAction fFilterAction;
-	
-	/**
-	 * This label is used to notify users that items (possibly) have been filtered from the 
-	 * launch configuration view
-	 * @since 3.3
-	 */
-	private Label fFilteredNotice = null;
-	
-	/**
-	 * Whether to automatically select configs that are added
-	 */
-	private boolean fAutoSelect = true;
-	
-	/**
-	 * the group of additional filters to be added to the viewer
-	 * @since 3.2
-	 */
-	private ViewerFilter[] fFilters = null;
-	
-	/**
-	 * Constructs a launch configuration view for the given launch group
-	 */
-	public LaunchConfigurationView(LaunchGroupExtension launchGroup) {
-		super();
-		fLaunchGroup = launchGroup;
-	}
-	
-	/**
-	 * Constructor
-	 * @param launchGroup
-	 * @param filters
-	 */
-	public LaunchConfigurationView(LaunchGroupExtension launchGroup, ViewerFilter[] filters) {
-		super();
-		fLaunchGroup = launchGroup;
-		fFilters = filters;
-	}
-	
-	/**
-	 * Returns the launch group this view is displaying.
-	 * 
-	 * @return the launch group this view is displaying
-	 */
-	protected LaunchGroupExtension getLaunchGroup() {
-		return fLaunchGroup;
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Viewer createViewer(Composite parent) {
-		fTree = new LaunchConfigurationFilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter(), fLaunchGroup, fFilters);
-		fTree.createViewControl();
-		getLaunchManager().addLaunchConfigurationListener(this);
-		LaunchConfigurationViewer viewer = fTree.getLaunchConfigurationViewer();
-		viewer.setLaunchConfigurationView(this);
-		return viewer;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		if (key == IContextProvider.class) {
-			return new IContextProvider () {
-				public int getContextChangeMask() {
-					return SELECTION;
-				}
-
-				public IContext getContext(Object target) {
-					String id = fTree.computeContextId();
-					if (id!=null)
-						return HelpSystem.getContext(id);
-					return null;
-				}
-
-				public String getSearchExpression(Object target) {
-					return null;
-				}
-			};
-		}
-		return super.getAdapter(key);
-	}
-	
-	/**
-	 * gets the filtering text control from the viewer
-	 * @return the filtering text control
-	 * 
-	 * @since 3.2
-	 */
-	public Text getFilteringTextControl() {
-		return fTree.getFilterControl();
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createActions()
-	 */
-	protected void createActions() {
-		fCreateAction = new CreateLaunchConfigurationAction(getViewer(), getLaunchGroup().getMode());
-		setAction(CreateLaunchConfigurationAction.ID_CREATE_ACTION, fCreateAction);
-		
-		fDeleteAction = new DeleteLaunchConfigurationAction(getViewer(), getLaunchGroup().getMode());
-		setAction(DeleteLaunchConfigurationAction.ID_DELETE_ACTION, fDeleteAction);
-		setAction(IDebugView.REMOVE_ACTION, fDeleteAction);
-		
-		fDuplicateAction = new DuplicateLaunchConfigurationAction(getViewer(), getLaunchGroup().getMode());
-		setAction(DuplicateLaunchConfigurationAction.ID_DUPLICATE_ACTION, fDuplicateAction);
-		
-		fCollapseAllAction = new CollapseAllLaunchConfigurationAction((TreeViewer)getViewer());
-		setAction(CollapseAllLaunchConfigurationAction.ID_COLLAPSEALL_ACTION, fCollapseAllAction);
-		
-		fFilterAction = new FilterLaunchConfigurationAction();
-		setAction(FilterLaunchConfigurationAction.ID_FILTER_ACTION, fFilterAction);
-		
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.LAUNCH_CONFIGURATION_VIEW;
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void fillContextMenu(IMenuManager menu) {
-		menu.add(fCreateAction);
-		menu.add(fDuplicateAction);
-		menu.add(fDeleteAction);
-		menu.add(new Separator());
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#configureToolBar(org.eclipse.jface.action.IToolBarManager)
-	 */
-	protected void configureToolBar(IToolBarManager tbm) {}
-	
-	/**
-	 * Returns this view's tree viewer
-	 * 
-	 * @return this view's tree viewer 
-	 */
-	protected TreeViewer getTreeViewer() {
-		return fTree.getLaunchConfigurationViewer();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		fCreateAction.dispose();
-		fDeleteAction.dispose();
-		fDuplicateAction.dispose();
-		fFilterAction = null;
-		fCollapseAllAction = null;
-		getLaunchManager().removeLaunchConfigurationListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationAdded(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationAdded(final ILaunchConfiguration configuration) {
-		if(isSupportedConfiguration(configuration)) {
-			Display display = DebugUIPlugin.getStandardDisplay();
-			if (display.getThread() == Thread.currentThread()) {
-			    // If we're already in the UI thread (user pressing New in the
-			    // dialog), update the tree immediately.
-			    handleConfigurationAdded(configuration);
-			} else {
-		        display.asyncExec(new Runnable() {
-		            public void run() {
-		                handleConfigurationAdded(configuration);
-		            }
-		        });
-			}
-		}
-	}
-
-    /**
-     * The given launch configuration has been added. Add it to the tree.
-     * @param configuration the added configuration
-     */
-    private void handleConfigurationAdded(final ILaunchConfiguration configuration) {
-        TreeViewer viewer = getTreeViewer();
-        if (viewer != null) {
-			try {
-                viewer.add(configuration.getType(), configuration);
-                // if moved, remove original now
-                ILaunchConfiguration from = getLaunchManager().getMovedFrom(configuration);
-                if (from != null) {
-                    viewer.remove(from);
-                }
-                if (isAutoSelect()) {
-    				viewer.setSelection(new StructuredSelection(configuration), true);
-    			}
-                updateFilterLabel();
-			} 
-			catch (CoreException e) {}
-        }
-    }
-
-    /**
-     * Returns if the specified configuration is supported by this instance of the view.
-     * Supported means that:
-     * <ul>
-     * <li>The configuration is not private</li>
-     * <li>AND that the configurations' type supports the mode of the current launch group</li>
-     * <li>AND that the category of the configurations' type matches that of the current launch group</li>
-     * </ul>
-     * @param configuration the configuration
-     * @return true if the configuration is supported by this instance of the view, false otherwise
-     * 
-     * @since 3.4
-     */
-    protected boolean isSupportedConfiguration(ILaunchConfiguration configuration) {
-    	try {
-    		ILaunchConfigurationType type = configuration.getType();
-    		return !configuration.getAttribute(IDebugUIConstants.ATTR_PRIVATE, false) && 
-    				type.supportsMode(getLaunchGroup().getMode()) && 
-    				equalCategories(type.getCategory(), getLaunchGroup().getCategory());
-    	}
-    	catch(CoreException ce) {
-    		DebugUIPlugin.log(ce);
-    	}
-    	return false;
-    }
-    
-    /**
-	 * Returns whether the given categories are equal.
-	 * 
-	 * @param c1 category identifier or <code>null</code>
-	 * @param c2 category identifier or <code>null</code>
-	 * @return boolean
-	 * 
-	 * @since 3.4
-	 */
-	private boolean equalCategories(String c1, String c2) {
-		if (c1 == null || c2 == null) {
-			return c1 == c2;
-		}
-		return c1.equals(c2);
-	} 
-    
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationChanged(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationChanged(ILaunchConfiguration configuration) {}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationRemoved(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationRemoved(final ILaunchConfiguration configuration) {
-		// if moved, ignore
-		ILaunchConfiguration to = getLaunchManager().getMovedTo(configuration);
-		if (to != null) {
-			return;
-		}
-		Display display = DebugUIPlugin.getStandardDisplay();
-		if (display.getThread() == Thread.currentThread()) {
-		    // If we're already in the UI thread (user pressing Delete in the
-		    // dialog), update the tree immediately.
-            handleConfigurationRemoved(configuration);
-		} else {
-			display.asyncExec(new Runnable() {
-		        public void run() {
-		            handleConfigurationRemoved(configuration);
-		        }
-			});
-		}
-	}
-
-	/**
-	 * The given launch configuration has been removed. Remove it from the tree.
-     * @param configuration the deleted configuration
-     */
-    private void handleConfigurationRemoved(ILaunchConfiguration configuration) {
-        getTreeViewer().remove(configuration);
-		updateFilterLabel();
-    }
-
-    /**
-	 * This is similar to IWorkbenchPart#createPartControl(Composite), but it is
-	 * called by the launch dialog when creating the launch config tree view.
-	 * Since this view is not contained in the workbench, we cannot do all the
-	 * usual initialization (toolbars, etc).
-	 */
-	public void createLaunchDialogControl(Composite parent) {
-		createViewer(parent);
-		createActions();
-		createContextMenu(getViewer().getControl());
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, getHelpContextId());
-		getViewer().getControl().addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				handleKeyPressed(e);
-			}
-		});
-		if (getViewer() instanceof StructuredViewer) {
-			((StructuredViewer)getViewer()).addDoubleClickListener(this);
-		}
-		fFilteredNotice = SWTFactory.createLabel(parent, "", 1); //$NON-NLS-1$
-		fFilteredNotice.setBackground(parent.getBackground());
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.IDebugView#getViewer()
-	 */
-	public Viewer getViewer() {
-		return fTree.getLaunchConfigurationViewer();
-	}
-	
-	/**
-	 * Updates the filter notification label
-	 * @since 3.3
-	 */
-	public void updateFilterLabel() {
-		LaunchConfigurationViewer viewer = (LaunchConfigurationViewer) getViewer();
-		fFilteredNotice.setText(MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationView_0, new String[] {Integer.toString(viewer.getNonFilteredChildCount()), Integer.toString(viewer.getTotalChildCount())}));
-	}
-	
-	/**
-	 * returns the launch manager
-	 * @return
-	 */
-	protected ILaunchManager getLaunchManager() {
-		return fLaunchManager;
-	}
-	
-	/**
-	 * Sets whether to automatically select configs that are
-	 * added into the view (newly created).
-	 * 
-	 * @param select whether to automatically select configs that are
-	 * added into the view (newly created)
-	 */
-	public void setAutoSelect(boolean select) {
-		fAutoSelect = select;
-	}
-	
-	/**
-	 * Returns whether this view is currently configured to
-	 * automatically select newly created configs that are
-	 * added into the view.
-	 * 
-	 * @return whether this view is currently configured to
-	 * automatically select newly created configs
-	 */
-	protected boolean isAutoSelect() {
-		return fAutoSelect;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationViewer.java
deleted file mode 100644
index 428a452..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationViewer.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreePath;
-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;
-
-/**
- * This class allow the notion of the viewer to be abstracted from the launch configuration view, as well as allowing the over-riding of 
- * selection preservation when filtering/deletion occurs
- * @since 3.3
- */
-public class LaunchConfigurationViewer extends TreeViewer {
-
-	private int fTotalCount = 0;
-	private LaunchConfigurationView fView = null;
-	
-	/**
-	 * Constructor
-	 * @param tree the tree to create the viewer on
-	 */
-	public LaunchConfigurationViewer(Tree tree) {
-		super(tree);
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent
-	 * @param style
-	 */
-	public LaunchConfigurationViewer(Composite parent, int style) {
-		this(new Tree(parent, style));
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.StructuredViewer#preservingSelection(java.lang.Runnable)
-	 */
-	protected void preservingSelection(Runnable updateCode) {
-		IStructuredSelection selection = (IStructuredSelection) getSelection();
-		if(!selection.isEmpty()) {
-			int[] indices = collectIndices(selection.getFirstElement());
-			updateCode.run();
-			ArrayList set = new ArrayList();
-			Object o = null;
-			for(Iterator iter = selection.iterator(); iter.hasNext();) {
-				o = iter.next();
-				if(internalGetWidgetToSelect(o) != null) {
-					if(!set.contains(o)) {
-						set.add(o);
-					}
-				}
-			}
-			if(set.isEmpty()) {
-				//make a new selection based on the first item in the structured selection
-				Tree tree = getTree();
-				if(tree.getItemCount() > 0) {
-					int index = selectIndex(tree.getItemCount(), indices[0]);
-					if(index > -1) {
-						TreeItem pitem = null;
-						if(indices[0] > tree.getItemCount()-1) {
-							pitem = tree.getItem(tree.getItemCount()-1);
-						}
-						else {
-							pitem = tree.getItem(indices[0]);
-						}
-						if(pitem != null) {
-							o = pitem.getData();
-							if(indices[1] > -1) {
-								index = selectIndex(pitem.getItemCount(), indices[1]);
-								if(index > -1) {
-									Object d = pitem.getItem(index).getData();
-									if(d != null) {
-										o = d; 
-									}
-								}
-								else {
-									if(pitem.getItemCount() > 0) {
-										o = pitem.getItem((indices[1]-1 > -1 ? indices[1]-1 : 0)).getData();
-										if(o == null) {
-											o = pitem.getData();
-										}
-									}
-								}
-							}
-						}
-					}
-					if(!set.contains(o)) {
-						set.add(o);
-					}
-				}
-			}
-			setSelection(new StructuredSelection(set), true);
-		}
-		else {
-			super.preservingSelection(updateCode);
-		}
-		getTree().getHorizontalBar().setSelection(0);
-	}
-	
-	/**
-	 * Covers the case of an outlier indice
-	 * @param count the count to compare the index to
-	 * @param index the index to compare against the count
-	 * @return the adjusted index in the event index is an outlier, or -1 if it falls within the 'count' range
-	 */
-	private int selectIndex(int count, int index) {
-		if(index < count) {
-			return index;
-		}
-		if(index > count-1) {
-			return count-1;
-		}
-		if(index < 0) {
-			return 0;
-		}
-		return -1;
-	}
-	
-	/**
-	 * Returns the total count of all of the children that <i>could</i> be visible at 
-	 * the time the input was set to the viewer
-	 * @return the total number of elements
-	 */
-	protected int getTotalChildCount() {
-		return fTotalCount;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#remove(java.lang.Object)
-	 */
-	public void remove(Object elementsOrTreePaths) {
-		super.remove(elementsOrTreePaths);
-		fTotalCount--;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.TreeViewer#internalAdd(org.eclipse.swt.widgets.Widget, java.lang.Object, java.lang.Object[])
-	 */
-	protected void internalAdd(Widget widget, Object parentElement, Object[] childElements) {
-		super.internalAdd(widget, parentElement, childElements);
-		fTotalCount++;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#inputChanged(java.lang.Object, java.lang.Object)
-	 */
-	protected void inputChanged(Object input, Object oldInput) {
-		super.inputChanged(input, oldInput);
-		//calc the total number of items that could be visible in the view
-		LaunchConfigurationTreeContentProvider cp = (LaunchConfigurationTreeContentProvider) getContentProvider();
-		Object[] types = cp.getElements(null);
-		LaunchGroupFilter filter = new LaunchGroupFilter(((LaunchConfigurationsDialog)LaunchConfigurationsDialog.getCurrentlyVisibleLaunchConfigurationDialog()).getLaunchGroup());
-		for(int i = 0; i < types.length; i++) {
-			if(filter.select(this, types[i], null)) {
-				fTotalCount += cp.getChildren(types[i]).length + 1; //+1 for the type
-			}
-		}
-	}
-
-	/**
-	 * returns the number of children that are remaining in the view.
-	 * Note that this method will force the loading of all children
-	 * @return the count of all children in the viewer
-	 * 
-	 * @since 3.3
-	 */
-	protected int getNonFilteredChildCount() {
-		int count = 0;
-		getTree().setRedraw(false);
-		TreeItem[] items = getTree().getItems();
-		count += items.length;
-		boolean expanded = false;
-		TreeItem item = null;
-		for(int i = 0; i < items.length; i++) {
-			item = items[i];
-			expanded = item.getExpanded();
-			setExpandedState(item.getData(), true);
-			count += item.getItems().length;
-			item.setExpanded(expanded);
-		}
-		getTree().setRedraw(true);
-		return count;
-	}
-	
-	/**
-	 * Collects the indices of the child and parent items for the specified element
-	 * @param object the element to collect indices for
-	 * @return an array of indices for the specified element
-	 */
-	private int[] collectIndices(Object object) {
-		int[] indices = {-1, -1};
-		if(object != null) {
-			TreeItem item = (TreeItem) findItem(object);
-			if(item != null) {
-				TreePath path = getTreePathFromItem(item); 
-				item = (TreeItem) findItem(path.getFirstSegment());
-				if(item != null) {
-					indices[0] = getTree().indexOf(item);
-					if(path.getSegmentCount() == 2) {
-						indices[1] = indexOf(item.getItems(), path.getLastSegment());
-					}
-				}
-			}
-		}
-		return indices;
-	}
-	
-	/**
-	 * Finds the index of the specified object in the given array of tree items
-	 * @param items the items to search for the specified object
-	 * @param object the object to find the index of
-	 * @return the index of the specified object in the listing of tree items, or -1 if not found
-	 */
-	private int indexOf(TreeItem[] items, Object object) {
-		if(object != null) {
-			for(int i = 0; i < items.length; i++) {
-				if(object.equals(items[i].getData())) {
-					return i;
-				}
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * The filter changed due to text typing - update the filter count
-	 */
-	protected void filterChanged() {
-		if (fView != null) {
-			fView.updateFilterLabel();
-		}
-		
-	}
-
-	/**
-	 * @param launchConfigurationView
-	 */
-	protected void setLaunchConfigurationView(LaunchConfigurationView launchConfigurationView) {
-		fView = launchConfigurationView;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java
deleted file mode 100644
index 2b05856..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java
+++ /dev/null
@@ -1,1570 +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 - Bug 137923
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IPageChangeProvider;
-import org.eclipse.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.SafeRunnable;
-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.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.wizard.ProgressMonitorPart;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-import com.ibm.icu.text.MessageFormat;
- 
-/**
- * The dialog used to edit and launch launch configurations.
- */
-public class LaunchConfigurationsDialog extends TitleAreaDialog implements ILaunchConfigurationDialog, IPageChangeProvider,  IPropertyChangeListener {
-
-	/**
-	 * Keep track of the currently visible dialog instance
-	 */
-	private static ILaunchConfigurationDialog fgCurrentlyVisibleLaunchConfigurationDialog;
-	/**
-	 * Id for 'Launch' button.
-	 */
-	protected static final int ID_LAUNCH_BUTTON = IDialogConstants.CLIENT_ID + 1;
-		
-	/**
-	 * Id for 'Close' button.
-	 */
-	protected static final int ID_CLOSE_BUTTON = IDialogConstants.CLIENT_ID + 2;
-	/**
-	 * Id for 'Cancel' button.
-	 */
-	protected static final int ID_CANCEL_BUTTON = IDialogConstants.CLIENT_ID + 3;
-	
-	/**
-	 * The id for the 'No' button on the discard changes message box
-	 * @since 3.3
-	 */
-	protected static final int ID_DISCARD_BUTTON = IDialogConstants.CLIENT_ID + 4;
-	
-	/**
-	 * Constant specifying how wide this dialog is allowed to get (as a percentage of
-	 * total available screen width) as a result of tab labels in the edit area.
-	 */
-	protected static final float MAX_DIALOG_WIDTH_PERCENT = 0.75f;
-	/**
-	 * Constant specifying how tall this dialog is allowed to get (as a percentage of
-	 * total available screen height) as a result of preferred tab size.
-	 */
-	protected static final float MAX_DIALOG_HEIGHT_PERCENT = 0.60f;
-	/**
-	 * Size of this dialog if there is no preference specifying a size.
-	 */
-	protected static final Point DEFAULT_INITIAL_DIALOG_SIZE = new Point(800, 640);
-	/**
-	 * defines some default sashweights when we have a new workspace
-	 * @since 3.2
-	 */
-	private static final int[] DEFAULT_SASH_WEIGHTS = new int[] {190, 610};
-	/**
-	 * Constant specifying that this dialog should be opened with the last configuration launched
-	 * in the workspace selected.
-	 */
-	public static final int LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_LAST_LAUNCHED = 2;
-	/**
-	 * Constant specifying that this dialog should be opened with the value specified via 
-	 * <code>setInitialSelection()</code> selected.
-	 */
-	public static final int LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_SELECTION = 3;
-	/**
-	 * Constant specifying that a new launch configuration dialog was not opened.  Instead
-	 * an existing launch configuration dialog was used.
-	 */
-	public static final int LAUNCH_CONFIGURATION_DIALOG_REUSE_OPEN = 4;
-	/**
-	 * defines the empty string
-	 * @since 3.2
-	 */
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * defines the delimiter used in the persistence of the expanded state
-	 * @since 3.2
-	 */
-	private static final String DELIMITER = ", "; //$NON-NLS-1$
-	/**
-	 * Specifies how this dialog behaves when opened.  Value is one of the 
-	 * 'LAUNCH_CONFIGURATION_DIALOG' constants defined in this class.
-	 */
-	private int fOpenMode = LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_LAST_LAUNCHED;
-	
-	/**
-	 * dialog settings
-	 */
-	private static final String DIALOG_SASH_WEIGHTS_1 = IDebugUIConstants.PLUGIN_ID + ".DIALOG_SASH_WEIGHTS_1"; //$NON-NLS-1$
-	private static final String DIALOG_SASH_WEIGHTS_2 = IDebugUIConstants.PLUGIN_ID + ".DIALOG_SASH_WEIGHTS_2"; //$NON-NLS-1$
-	private static final String DIALOG_EXPANDED_NODES = IDebugUIConstants.PLUGIN_ID + ".EXPANDED_NODES"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the currently visible dialog
-	 * @return the currently visible launch dialog
-	 */
-	public static ILaunchConfigurationDialog getCurrentlyVisibleLaunchConfigurationDialog() {
-		return fgCurrentlyVisibleLaunchConfigurationDialog;
-	}
-	/**
-	 * Sets which launch dialog is currently the visible one
-	 * @param dialog the dialog to set as the visible one
-	 */
-	public static void setCurrentlyVisibleLaunchConfigurationDialog(ILaunchConfigurationDialog dialog) {
-		fgCurrentlyVisibleLaunchConfigurationDialog = dialog;
-	}
-	
-	/**
-	 * widgets
-	 */
-	private Control fLastControl;
-	private Composite fButtonComp;
-	private SashForm fSashForm;
-	private LaunchConfigurationView fLaunchConfigurationView;
-	private LaunchConfigurationTabGroupViewer fTabViewer;
-	private Button fProgressMonitorCancelButton;	
-	private ProgressMonitorPart fProgressMonitorPart;
-	private LaunchGroupExtension fGroup;
-	private Image fBannerImage;
-	
-	/**
-	 * When this dialog is opened in <code>LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_SELECTION</code>
-	 * mode, this specifies the selection that is initially shown in the dialog.
-	 */
-	private IStructuredSelection fInitialSelection;
-		
-	/**
-	 * The status to open the dialog on, or <code>null</code> if none.
-	 */
-	private IStatus fInitialStatus;
-
-	/**
-	 * Listener for a list
-	 */
-	private ListenerList changeListeners = new ListenerList();
-	
-	/**
-	 * The number of 'long-running' operations currently taking place in this dialog
-	 */	
-	private long fActiveRunningOperations = 0;
-
-	/**
-	 * Double-click action
-	 */
-	private IAction fDoubleClickAction;
-	
-	/**
-	 * Filters for the LCD
-	 * @since 3.2
-	 */
-	private ClosedProjectFilter fClosedProjectFilter;
-	private DeletedProjectFilter fDeletedProjectFilter;
-	private LaunchConfigurationTypeFilter fLCTFilter;
-	private WorkingSetsFilter fWorkingSetsFilter;
-	
-	/**
-	 * set of reserved names that should not be considered when generating a new name for a launch configuration
-	 */
-	protected Set fReservedNames = null;
-	
-	/**
-	 * Constructs a new launch configuration dialog on the given
-	 * parent shell.
-	 * 
-	 * @param shell the parent shell
-	 * @param group the group of launch configuration to display
-	 */
-	public LaunchConfigurationsDialog(Shell shell, LaunchGroupExtension group) {
-		super(shell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		setLaunchGroup(group);
-	}
-
-	/**
-	 * Adds content to the dialog area
-	 * 
-	 * @param dialogComp
-	 */
-	protected void addContent(Composite dialogComp) {
-		GridData gd;
-		Composite topComp = new Composite(dialogComp, SWT.NONE);
-		gd = new GridData(GridData.FILL_BOTH);
-		topComp.setLayoutData(gd);
-		GridLayout topLayout = new GridLayout(2, false);
-		topLayout.marginHeight = 5;
-		topLayout.marginWidth = 5;
-		topComp.setLayout(topLayout);
-		
-		// Set the things that TitleAreaDialog takes care of 
-		setTitle(LaunchConfigurationsMessages.LaunchConfigurationDialog_Create__manage__and_run_launch_configurations_8); 
-		setMessage(LaunchConfigurationsMessages.LaunchConfigurationDialog_Ready_to_launch_2); 
-		setModeLabelState();
-		
-		// Create the SashForm that contains the selection area on the left,
-		// and the edit area on the right
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 2;
-		SashForm sash = new SashForm(topComp, SWT.SMOOTH);
-		sash.setOrientation(SWT.HORIZONTAL);
-		sash.setLayoutData(gd);
-		sash.setFont(dialogComp.getFont());
-		sash.setVisible(true);
-		fSashForm = sash;
-		
-		// Build the launch configuration selection area and put it into the composite.
-		Control launchConfigSelectionArea = createLaunchConfigurationSelectionArea(fSashForm);
-		gd = new GridData(GridData.FILL_VERTICAL);
-		launchConfigSelectionArea.setLayoutData(gd);
-		
-		// Build the launch configuration edit area and put it into the composite.
-		Composite editAreaComp = createLaunchConfigurationEditArea(fSashForm);
-		gd = new GridData(GridData.FILL_BOTH);
-		editAreaComp.setLayoutData(gd);
-		
-		dialogComp.layout(true);
-		applyDialogFont(dialogComp);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#addPageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener)
-	 */
-	public void addPageChangedListener(IPageChangedListener listener) {
-		changeListeners.add(listener);
-	}
-	
-	/**
-	 * Handle the 'close' & 'launch' buttons here, all others are handled
-	 * in <code>Dialog</code>
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == ID_LAUNCH_BUTTON) {
-			handleLaunchPressed();
-		} 
-		else if (buttonId == ID_CLOSE_BUTTON) {
-			handleClosePressed();
-		} 
-		else {
-			super.buttonPressed(buttonId);
-		}
-	}
-
-	/**
-	 * Return whether the current configuration should be saved or discarded.  This involves determining
-	 * if it is dirty, and if it is, asking the user what to do.
-	 * 
-	 * @return if we can discard the current config or not
-	 */
-	protected int shouldSaveCurrentConfig() {				
-		if (getTabViewer().isDirty()) {
-			if (getTabViewer().canSave()) {
-				return showSaveChangesDialog();
-			}
-			return showUnsavedChangesDialog();
-		}
-		return IDialogConstants.NO_ID;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-	    if (!isSafeToClose()) {
-	        return false;
-	    }
-	    persistSashWeights();
-	    persistExpansion();
-		setCurrentlyVisibleLaunchConfigurationDialog(null);
-		getBannerImage().dispose();
-		getTabViewer().dispose();
-		if (fLaunchConfigurationView != null) {
-			fLaunchConfigurationView.dispose();
-		}
-		DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		return super.close();
-	}
-	
-	/**
-	 * Sets the title for the dialog, and establishes the help context.
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell);
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		shell.setText(getShellTitle());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#create()
-	 */
-	public void create() {
-		super.create();
-		if (getTabViewer().getInput() == null) {
-			getTabViewer().inputChanged(null);
-		}	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createButtonBar(Composite parent) {
-		Font font = parent.getFont();
-		Composite composite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginHeight= 0;
-		layout.marginWidth= 0;
-		layout.marginLeft = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		composite.setFont(font);
-		// create help control if needed
-        if (isHelpAvailable()) {
-        	createHelpControl(composite);
-        }
-		Composite monitorComposite = new Composite(composite, SWT.NULL);
-		layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.numColumns = 2;
-		monitorComposite.setLayout(layout);
-		monitorComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		GridLayout pmLayout = new GridLayout();
-		fProgressMonitorPart = new ProgressMonitorPart(monitorComposite, pmLayout);
-		fProgressMonitorPart.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		fProgressMonitorPart.setFont(font);
-		fProgressMonitorCancelButton = createButton(monitorComposite, ID_CANCEL_BUTTON, LaunchConfigurationsMessages.LaunchConfigurationDialog_Cancel_3, true);
-		fProgressMonitorCancelButton.setFont(font);
-		monitorComposite.setVisible(false);
-
-		/*
-		 * Create the rest of the button bar, but tell it not to
-		 * create a help button (we've already created it).
-		 */
-		boolean helpAvailable = isHelpAvailable();
-		setHelpAvailable(false);
-		fButtonComp = (Composite) super.createButtonBar(composite);
-		setHelpAvailable(helpAvailable);
-		return composite;
-	}
-
-	
-	
-	/**
-	 * A launch configuration dialog overrides this method
-	 * to create a custom set of buttons in the button bar.
-	 * This dialog has 'Launch' and 'Cancel'
-	 * buttons.
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		Button button = createButton(parent, ID_LAUNCH_BUTTON, getLaunchButtonText(), true);
-        button.setEnabled(false);
-		createButton(parent, ID_CLOSE_BUTTON, LaunchConfigurationsMessages.LaunchConfigurationDialog_Close_1, false);  
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control contents = super.createContents(parent);
-		initializeContent();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getShell(), getHelpContextId());
-		return contents;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite dialogComp = (Composite)super.createDialogArea(parent);
-		addContent(dialogComp);
-		if(fLaunchConfigurationView != null) {
-			fLaunchConfigurationView.updateFilterLabel();
-		}
-		return dialogComp;
-	}
-			
-	/**
-	 * Creates the launch configuration edit area of the dialog.
-	 * This area displays the name of the launch configuration
-	 * currently being edited, as well as a tab folder of tabs
-	 * that are applicable to the launch configuration.
-	 * 
-	 * @return the composite used for launch configuration editing
-	 */ 
-	protected Composite createLaunchConfigurationEditArea(Composite parent) {
-		setTabViewer(new LaunchConfigurationTabGroupViewer(parent, this));
-		getTabViewer().addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				handleTabSelectionChanged();
-			}
-		});
-		return (Composite)getTabViewer().getControl();
-	}
-    
-	/**
-	 * Creates all of the actions for the toolbar
-	 * @param toolbar
-	 * @since 3.2
-	 */
-	protected void createToolbarActions(ToolBarManager tmanager) {
-		tmanager.add(getNewAction());
-		tmanager.add(getDuplicateAction());
-		tmanager.add(getDeleteAction());
-		tmanager.add(new Separator());
-		tmanager.add(getCollapseAllAction());
-		tmanager.add(getFilterAction());
-		tmanager.update(true);
-		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-	}
-    
-	/**
-	 * Creates the launch configuration selection area of the dialog.
-	 * This area displays a tree of launch configurations that the user
-	 * may select, and allows users to create new configurations, and
-	 * delete and duplicate existing configurations.
-	 * 
-	 * @return the composite used for launch configuration selection area
-	 */ 
-	protected Control createLaunchConfigurationSelectionArea(Composite parent) {
-        Composite comp = new Composite(parent, SWT.FLAT);
-        GridLayout gridLayout = new GridLayout(1, false);
-        gridLayout.marginHeight = 0;
-        gridLayout.marginWidth = 0;
-        comp.setLayout(gridLayout);
-        comp.setLayoutData(new GridData(GridData.FILL_BOTH));
-        
-        ViewForm viewForm = new ViewForm(comp, SWT.FLAT | SWT.BORDER);
-        ToolBar toolBar = new ToolBar(viewForm, SWT.FLAT);
-        toolBar.setBackground(parent.getBackground());
-        ToolBarManager toolBarManager= new ToolBarManager(toolBar);
-        viewForm.setTopLeft(toolBar);
-        viewForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-        
-        Composite viewFormContents = new Composite(viewForm, SWT.FLAT);
-        gridLayout = new GridLayout();
-        gridLayout.marginHeight = 5;
-        gridLayout.marginWidth = 5;
-        viewFormContents.setLayout(gridLayout);
-        viewFormContents.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		fLaunchConfigurationView = new LaunchConfigurationView(getLaunchGroup(), createViewerFilters());
-		fLaunchConfigurationView.createLaunchDialogControl(viewFormContents);
-		
-	//create toolbar actions, we reuse the actions from the view so we wait until after
-	//the view is created to add them to the toolbar
-		createToolbarActions(toolBarManager);
-		fDoubleClickAction = new Action() {
-			public void run() {
-				IStructuredSelection selection = (IStructuredSelection)fLaunchConfigurationView.getViewer().getSelection();
-				Object target = selection.getFirstElement();
-				if (target instanceof ILaunchConfiguration) {
-					if (getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates()) {
-						handleLaunchPressed();
-					}
-				} else {
-					getNewAction().run();
-				}
-			}
-		};
-		fLaunchConfigurationView.setAction(IDebugView.DOUBLE_CLICK_ACTION, fDoubleClickAction);
-		Viewer viewer = fLaunchConfigurationView.getViewer();
-		
-		Control control = viewer.getControl();
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		control.setLayoutData(gd);
-        viewForm.setContent(viewFormContents);
-		AbstractLaunchConfigurationAction.IConfirmationRequestor requestor = new AbstractLaunchConfigurationAction.IConfirmationRequestor() {
-			public boolean getConfirmation() {
-				int status = shouldSaveCurrentConfig();
-				if(status == IDialogConstants.YES_ID) {
-					fTabViewer.handleApplyPressed();
-					return true;
-				}
-				else if(status == IDialogConstants.NO_ID) {
-					fTabViewer.handleRevertPressed();
-					return true;
-				}
-				return false;
-			}
-		};
-		getDuplicateAction().setConfirmationRequestor(requestor);
-		getNewAction().setConfirmationRequestor(requestor);
-		((StructuredViewer) viewer).addPostSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				handleLaunchConfigurationSelectionChanged(event);
-				getNewAction().setEnabled(getNewAction().isEnabled());
-				getDeleteAction().setEnabled(getDeleteAction().isEnabled());
-				getDuplicateAction().setEnabled(getDuplicateAction().isEnabled());
-			}
-		});
-		return comp;
-	}	
-
-	/**
-	 * Create the filters to be initially applied to the viewer.
-	 * The initial filters are based on the persisted preferences
-	 * @return the array of initial filters
-	 * @since 3.2
-	 */
-	private ViewerFilter[] createViewerFilters() {
-		ArrayList filters = new ArrayList();
-		fClosedProjectFilter = new ClosedProjectFilter();
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED)) {
-			filters.add(fClosedProjectFilter);
-		}
-		fDeletedProjectFilter = new DeletedProjectFilter();
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED)) {
-			filters.add(fDeletedProjectFilter);
-		}
-		fLCTFilter = new LaunchConfigurationTypeFilter();
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES)) {
-			filters.add(fLCTFilter);
-		}
-		fWorkingSetsFilter = new WorkingSetsFilter();
-		if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_WORKING_SETS)) {
-			filters.add(fWorkingSetsFilter);
-		}
-		return (ViewerFilter[]) filters.toArray(new ViewerFilter[filters.size()]);
-	} 
-	
-	/**
-	 * Set the initial selection in the tree.
-	 */
-	public void doInitialTreeSelection() {
-		fLaunchConfigurationView.getViewer().setSelection(fInitialSelection);
-	}	
-	
-	/**
-     * Notifies any selection changed listeners that the selected page
-     * has changed.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a selection changed event
-     *
-     * @see IPageChangedListener#pageChanged
-     */
-    protected void firePageChanged(final PageChangedEvent event) {
-        Object[] listeners = changeListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            final IPageChangedListener l = (IPageChangedListener) listeners[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.pageChanged(event);
-                }
-            });
-        }
-    }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#generateName(java.lang.String)
-	 */
-	public String generateName(String name) {
-		if (name == null) {
-			name = EMPTY_STRING;
-		}
-		return getLaunchManager().generateUniqueLaunchConfigurationNameFrom(name);
-	}
-	
-	/**
-	 * Generates and returns a unique name using the specified name as a prefix in the event 
-	 * the specified name already exists or is contained in the set of reserved names.
-	 * @param name the name to use as a prefix for generating a new name
-	 * @param reservednames a listing of names that should be considered as 'taken' and cannot be generated
-	 * by this method
-	 * @return a new name based on the specified name.
-	 * 
-	 * @since 3.3
-	 */
-	public String generateName(String name, Set reservednames) {
-		if(name == null) {
-			name = EMPTY_STRING;
-		}
-		return ((LaunchManager)getLaunchManager()).generateUniqueLaunchConfigurationNameFrom(name, reservednames);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#getActiveTab()
-	 */
-	public ILaunchConfigurationTab getActiveTab() {
-		return getTabViewer().getActiveTab();
-	}
-	
-	/**
-	 * Returns the banner image to display in the title area
-	 */
-	protected Image getBannerImage() {
-		if (fBannerImage == null) {
-			ImageDescriptor descriptor = getLaunchGroup().getBannerImageDescriptor(); 
-			if (descriptor != null) {
-				fBannerImage = descriptor.createImage();
-			} 		
-		}
-		return fBannerImage;
-	}
-	
-	/**
-	 * Gets the delete menu action
-	 * 
-	 * @return the delete menu action
-	 */
-	protected AbstractLaunchConfigurationAction getDeleteAction() {
-		return (AbstractLaunchConfigurationAction)fLaunchConfigurationView.getAction(DeleteLaunchConfigurationAction.ID_DELETE_ACTION);
-	}
-
-	/**
-	 * Gets the filter action
-	 * @return the filter menu action
-	 * @since 3.2
-	 */
-	protected IAction getFilterAction() {
-		return fLaunchConfigurationView.getAction(FilterLaunchConfigurationAction.ID_FILTER_ACTION);
-	}
-	
-	/**
-	 * Gets the collapse all action
-	 * @return the collapse all action
-	 * @since 3.2
-	 */
-	protected IAction getCollapseAllAction() {
-		return fLaunchConfigurationView.getAction(CollapseAllLaunchConfigurationAction.ID_COLLAPSEALL_ACTION);
-	}
-	
-	 /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
-     * @since 3.2
-     */
-    protected IDialogSettings getDialogBoundsSettings() {
-    	return getDialogSettings();
-    }
-    
-	/**
-	 * Returns the dialog settings for this dialog. Subclasses should override
-	 * <code>getDialogSettingsSectionName()</code>.
-	 * 
-	 * @return IDialogSettings
-	 */
-	protected IDialogSettings getDialogSettings() {
-		IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-		IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
-		if (section == null) {
-			section = settings.addNewSection(getDialogSettingsSectionName());
-		} 
-		return section;
-	}
-
-	/**
-	 * Returns the name of the section that this dialog stores its settings in
-	 * 
-	 * @return String
-	 */
-	protected String getDialogSettingsSectionName() {
-		return IDebugUIConstants.PLUGIN_ID + ".LAUNCH_CONFIGURATIONS_DIALOG_SECTION"; //$NON-NLS-1$
-	}	
-		
-	/**
-	 * Gets the current display
-	 * 
-	 * @return the display
-	 */
-	protected Display getDisplay() {
-		Shell shell = getShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		} 
-		return Display.getDefault();
-	}
-  	
-  	/**
-  	 * Gets the duplicate menu action
-  	 * 
-  	 * @return the duplicate menu action
-  	 */
-  	protected AbstractLaunchConfigurationAction getDuplicateAction() {
-		return (AbstractLaunchConfigurationAction)fLaunchConfigurationView.getAction(DuplicateLaunchConfigurationAction.ID_DUPLICATE_ACTION);
-	}
-  	
-	/**
-	 * Gets the help context id
-	 * 
-	 * @return the help context id
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG;
-	}
- 
- 	/**
-	 * Returns the status the dialog was opened on or <code>null</code> if none.
-	 * 
-	 * @return IStatus
-	 */
-	protected IStatus getInitialStatus() {
-		return fInitialStatus;
-	}
- 	 	 	
- 	/**
-	 * Return the last launched configuration in the workspace.
-	 * 
-	 * @return the last launched configuration
-	 */
-	protected ILaunchConfiguration getLastLaunchedWorkbenchConfiguration() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLastLaunch(getLaunchGroup().getIdentifier());
-	}
-
- 	/**
-	 * Returns the appropriate text for the launch button - run or debug.
-	 * 
-	 * @return the launch button text
-	 */
-	protected String getLaunchButtonText() {
-		return DebugPlugin.getDefault().getLaunchManager().getLaunchMode(getMode()).getLabel();
-	}
- 	 
- 	/**
-	 * Returns the launch group being displayed.
-	 * 
-	 * @return launch group
-	 */
-	public LaunchGroupExtension getLaunchGroup() {
-		return fGroup;
-	}
- 	 	 	
- 	/* (non-Javadoc)
- 	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#getMode()
- 	 */
- 	public String getMode() {
- 		return getLaunchGroup().getMode();
- 	} 	
- 	
-	/**
-	 * Gets the new menu action
-	 * 
-	 * @return the new menu action
-	 */
-	protected AbstractLaunchConfigurationAction getNewAction() {
-		return (AbstractLaunchConfigurationAction)fLaunchConfigurationView.getAction(CreateLaunchConfigurationAction.ID_CREATE_ACTION);
-	}
-	
-	/**
-	 * Returns the reserved name set (if there is one), <code>null</code> otherwise
-	 * @return the reserved name set or <code>null</code>
-	 * @since 3.3
-	 * 
-	 */
-	public Set getReservedNameSet() {
-		return fReservedNames;
-	}
-	
-	/**
-	 * returns the open mode
-	 * 
-	 * @return the open mode
-	 */
-	protected int getOpenMode() {
-		return fOpenMode;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#getSelectedPage()
-	 */
-	public Object getSelectedPage() {
-		return getActiveTab();
-	}
-	
-	/**
-	 * Returns the title of the shell
-	 * @return the shell title
-	 */
-	protected String getShellTitle() {
-		String title = null;
-		if(getLaunchGroup() != null) {
-			 title = DebugUIPlugin.removeAccelerators(getLaunchGroup().getLabel());
-		}
-		if (title == null) {
-			title = LaunchConfigurationsMessages.LaunchConfigurationDialog_Launch_Configurations_18; 
-		}
-		return title;
-	}
-
-	/**
- 	 * Returns the current tab group
- 	 * 
- 	 * @return the current tab group, or <code>null</code> if none
- 	 */
- 	public ILaunchConfigurationTabGroup getTabGroup() {
- 		if (getTabViewer() != null) {
- 			return getTabViewer().getTabGroup();
- 		}
- 		return null;
- 	}
-
-	/* (non-Javadoc)
- 	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#getTabs()
- 	 */
- 	public ILaunchConfigurationTab[] getTabs() {
- 		if (getTabGroup() == null) {
- 			return null;
- 		} 
- 		return getTabGroup().getTabs();
- 	}
-
-	/**
-	 * Returns the viewer used to display the tabs for a launch configuration.
-	 * 
-	 * @return LaunchConfigurationTabGroupViewer
-	 */
-	protected LaunchConfigurationTabGroupViewer getTabViewer() {
-		return fTabViewer;
-	}
-
-	/**
-	 * Notification the 'Close' button has been pressed.
-	 */
-	protected void handleClosePressed() {
-		int status = shouldSaveCurrentConfig();
-		if(status != IDialogConstants.CANCEL_ID) {
-			if(status != ID_DISCARD_BUTTON) {
-				if(status == IDialogConstants.YES_ID) {
-					getTabViewer().handleApplyPressed();
-				}
-				cancelPressed();
-			}
-		}
-	}
-	
-	/**
-	 * Notification that selection has changed in the launch configuration tree.
-	 * <p>
-	 * If the currently displayed configuration is not saved,
-	 * prompt for saving before moving on to the new selection.
-	 * </p>
-	 * 
-	 * @param event selection changed event
-	 */
- 	protected void handleLaunchConfigurationSelectionChanged(SelectionChangedEvent event) {
- 		Object input = getTabViewer().getInput();
- 		Object newInput = null;
- 		IStructuredSelection selection = (IStructuredSelection) event.getSelection();
- 		if (!selection.isEmpty()) {
-			if (selection.size() == 1) {
-				newInput = selection.getFirstElement();
-			}
- 		}
- 		if (!isEqual(input, newInput)) {
- 			LaunchConfigurationTabGroupViewer viewer = getTabViewer();
- 			ILaunchConfiguration original = viewer.getOriginal();
- 	 		if (original != null && newInput == null && getLaunchManager().getMovedTo(original) != null) {
- 				return;
- 			}
- 			boolean deleted = false;
- 			if (original != null) {
- 				deleted = !original.exists();
- 			}
-			boolean renamed = false;
-			if (newInput instanceof ILaunchConfiguration) {
-				renamed = getLaunchManager().getMovedFrom((ILaunchConfiguration)newInput) != null;
-			}
-			Object in = input;
- 			if (viewer.isDirty() && !deleted && !renamed) {
- 				if(fLaunchConfigurationView != null) {
- 					fLaunchConfigurationView.setAutoSelect(false);
- 				}
- 				int ret = showUnsavedChangesDialog();
- 				boolean cansave = viewer.canSave();
- 				if(ret == IDialogConstants.YES_ID) {
- 					if(cansave) {
- 						viewer.handleApplyPressed();
- 					}
- 					else {
- 						viewer.handleRevertPressed();
- 					}
- 					in = newInput;
- 				}
- 				else if(ret == IDialogConstants.NO_ID) {
- 					if(cansave) {
- 						viewer.handleRevertPressed();
- 						if(viewer.isDirty()) {
- 							viewer.handleApplyPressed();
- 						}
- 						in = newInput;
- 					}
- 				}
- 				if(fLaunchConfigurationView != null) {
-	 				if(in != null) {
-	 	 				fLaunchConfigurationView.getViewer().setSelection(new StructuredSelection(in));
-	 	 			}
- 					fLaunchConfigurationView.setAutoSelect(true);
- 				}
-  			}
- 			else {
- 				viewer.setInput(newInput);
- 				if(newInput != null) {
-	 				if(viewer.isDirty()) {
-	 					viewer.handleApplyPressed();
-	 				}
-	 				if (getShell() != null && getShell().isVisible()) {
-						resize();
-	 				}
- 				}
- 			}
- 			
- 		}
-  	}
-	
-	/**
-	 * Notification the 'launch' button has been pressed.
-	 * Save and launch.
-	 */
-	protected void handleLaunchPressed() {
-		ILaunchConfiguration config = getTabViewer().getOriginal(); 
-		if (getTabViewer().isDirty() & getTabViewer().canSave()) {
-			getTabViewer().handleApplyPressed();
-			config = getTabViewer().getOriginal();
-		}
-		String mode = getMode();
-		close();
-		if(config != null) {
-			DebugUITools.launch(config, mode);
-		}
-	}
-
-	/**
-	 * Consult a status handler for the given status, if any. The status handler
-	 * is passed this launch config dialog as an argument.
-	 * 
-	 * @param status the status to be handled
-	 */
-	public void handleStatus(IStatus status) {		
-		IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status);
-		if (handler != null) {
-			try {
-				handler.handleStatus(status, this);
-				return;
-			} 
-			catch (CoreException e) {status = e.getStatus();} 
-		}
-		// if no handler, or handler failed, display error/warning dialog
-		String title = null;
-		switch (status.getSeverity()) {
-			case IStatus.ERROR:
-				title = LaunchConfigurationsMessages.LaunchConfigurationsDialog_Error_1; 
-				break;
-			case IStatus.WARNING:
-				title = LaunchConfigurationsMessages.LaunchConfigurationsDialog_Warning_2; 
-				break;
-			default:
-				title = LaunchConfigurationsMessages.LaunchConfigurationsDialog_Information_3; 
-				break;
-		}
-		ErrorDialog.openError(getShell(), title, null, status);
-	}
-	
-	/**
-	 * Notification that tab selection has changed.
-	 *
-	 */
-	protected void handleTabSelectionChanged() {
-		updateMessage();
-		firePageChanged(new PageChangedEvent(this, getSelectedPage()));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#initializeBounds()
-	 */
-	protected void initializeBounds() {
-		IDialogSettings settings = getDialogSettings();
-		if (fSashForm != null) {
-			int w1, w2;
-			try {
-				w1 = settings.getInt(DIALOG_SASH_WEIGHTS_1);
-				w2 = settings.getInt(DIALOG_SASH_WEIGHTS_2);
-			}
-			catch(NumberFormatException nfe) {
-				w1 = DEFAULT_SASH_WEIGHTS[0];
-				w2 = DEFAULT_SASH_WEIGHTS[1];
-			}
-			fSashForm.setWeights(new int[] {w1, w2});
-		}
-		super.initializeBounds();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		IDialogSettings settings = getDialogSettings();
-		if(settings.get(DIALOG_SASH_WEIGHTS_1) != null) {
-			return super.getInitialSize();
-		}
-		return DEFAULT_INITIAL_DIALOG_SIZE;
-	}
-
-	/**
-	 * Performs initialization of the content by setting the initial tree selection
-	 */
-	protected void initializeContent() {
-		doInitialTreeSelection();
-		IStatus status = getInitialStatus();
-		if (status != null) {
-			handleStatus(status);
-		}
-		fLaunchConfigurationView.getFilteringTextControl().setFocus();
-		restoreExpansion();
-	}
-	
-	/**
-	 * Compares two objects to determine their equality
-	 * 
-	 * @param o1 the first object
-	 * @param o2 the object to compare to object one
-	 * @return true if they are equal, false if object 1 is null, the result of o1.equals(o2) otherwise
-	 */
-	protected boolean isEqual(Object o1, Object o2) {
-  		if (o1 == o2) {
-  			return true;
-  		} else if (o1 == null) {
-  			return false;
-  		} else {
-  			return o1.equals(o2);
-  		}
-  	}
-
-	/**
-	 * Returns whether the dialog can be closed
-	 * 
-	 * @return whether the dialog can be closed
-	 */
-	protected boolean isSafeToClose() {
-	    return fActiveRunningOperations == 0;
-	}
-	
-	/**
-	 * Determine the initial configuration for this dialog.
-	 * Open the dialog in the mode set using #setOpenMode(int) and return one of
-	 * <code>Window. OK</code> or <code>Window.CANCEL</code>.
-	 * 
-	 * @see org.eclipse.jface.window.Window#open()
-	 * @return the int status of opening the dialog
-	 */
-	public int open() {		
-		int mode = getOpenMode();
-		setCurrentlyVisibleLaunchConfigurationDialog(this);	
-		if (mode == LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_LAST_LAUNCHED) {
-			ILaunchConfiguration lastLaunchedConfig = getLastLaunchedWorkbenchConfiguration();
-			if (lastLaunchedConfig != null) {
-				setInitialSelection(new StructuredSelection(lastLaunchedConfig));
-			}			
-		}
-		return super.open();
-	}
-	
-	/**
-	 * saves which of the nodes are expanded at the time the dialog is closed
-	 * @since 3.2
-	 */
-	protected void persistExpansion() {
-		if(fLaunchConfigurationView != null) {
-			IDialogSettings settings = getDialogSettings();
-			TreeItem[] items = fLaunchConfigurationView.getTreeViewer().getTree().getItems();
-			String value = settings.get(DIALOG_EXPANDED_NODES);
-			if(value == null) {
-				value = EMPTY_STRING;
-			}
-			ArrayList list = new ArrayList();
-			String[] persisted = value.split(DELIMITER); 
-			for(int i = 0; i < persisted.length; i++) {
-				list.add(persisted[i]);
-			}
-			String type = EMPTY_STRING;
-			//if the item is not in the list and is expanded add it, otherwise if it
-			//is not expanded do a remove...either way for the else we query the list
-			for(int i = 0; i < items.length; i++) {
-				type = ((ILaunchConfigurationType)items[i].getData()).getIdentifier();
-				if(!list.contains(type) & items[i].getExpanded()) {
-					list.add(type);
-				}
-				else if(!items[i].getExpanded()) {
-					list.remove(type);
-				}
-			}
-			value = EMPTY_STRING;
-			//build the preference string
-			for(Iterator iter = list.iterator(); iter.hasNext();) {
-				value += iter.next() + DELIMITER;
-			}
-			settings.put(DIALOG_EXPANDED_NODES, value);
-		}
-	}
-	
-	/**
-	 * Restore the original expansion state of the nodes in the viewer
-	 * @since 3.2
-	 */
-	protected void restoreExpansion() {
-		if(fLaunchConfigurationView != null) {
-			IDialogSettings settings = getDialogSettings();
-			String value = settings.get(DIALOG_EXPANDED_NODES);
-			if(value != null) {
-				String[] nodes = value.split(DELIMITER);
-				TreeItem[] items = fLaunchConfigurationView.getTreeViewer().getTree().getItems();
-				ArrayList toexpand = new ArrayList();
-				// if we have a selection make sure it is expanded
-				if(fInitialSelection != null && !fInitialSelection.isEmpty()) {
-					Object obj = fInitialSelection.getFirstElement();
-					if(obj instanceof ILaunchConfigurationType) {
-						toexpand.add(obj);
-					}
-					else if(obj instanceof ILaunchConfiguration) {
-						try {
-							toexpand.add(((ILaunchConfiguration) obj).getType());
-						} 
-						catch (CoreException e) {DebugUIPlugin.log(e);}					
-					}
-				}
-				for(int i = 0; i < nodes.length; i++) {
-					for(int k = 0; k < items.length; k++) {
-						ILaunchConfigurationType type = (ILaunchConfigurationType)items[k].getData();
-						if(type.getIdentifier().equals(nodes[i])) {
-							toexpand.add(type);
-						}
-					}
-				}
-				fLaunchConfigurationView.getTreeViewer().setExpandedElements(toexpand.toArray());
-			}
-		}
-	}
-	
-	/**
-	 * Save the current sash weights
-	 */
-	protected void persistSashWeights() {
-		IDialogSettings settings = getDialogSettings();
-		if (fSashForm != null) {
-			int[] sashWeights = fSashForm.getWeights();
-			settings.put(DIALOG_SASH_WEIGHTS_1, sashWeights[0]);
-			settings.put(DIALOG_SASH_WEIGHTS_2, sashWeights[1]);
-		}
-	}
-	
-	/**
-	 * Update buttons and message.
-	 */
-	protected void refreshStatus() {
-		updateMessage();
-		updateButtons();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#removePageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener)
-	 */
-	public void removePageChangedListener(IPageChangedListener listener) {
-		changeListeners.remove(listener);
-	}
-
-	/**
-	 * resize the dialog to show all relevant content, maintains aspect in all resolutions down to 1024x768
-	 */
-	protected void resize() {
- 		if(getTabGroup() != null) {
- 			Point shell = getShell().getSize();
- 			int maxx = (int)(getDisplay().getBounds().width * MAX_DIALOG_WIDTH_PERCENT),
-				maxy = (int) (getDisplay().getBounds().height * MAX_DIALOG_HEIGHT_PERCENT);
- 			maxx = (maxx < DEFAULT_INITIAL_DIALOG_SIZE.x ? DEFAULT_INITIAL_DIALOG_SIZE.x : maxx);
- 			maxy = (maxy < DEFAULT_INITIAL_DIALOG_SIZE.y ? DEFAULT_INITIAL_DIALOG_SIZE.y : maxy);
- 			Point psize = getShell().computeSize(SWT.DEFAULT, maxy);
- 			if((psize.x > maxx ? maxx : psize.x) > shell.x || (psize.y > maxy ? maxy : psize.y) > shell.y) {
-				setShellSize(Math.min(psize.x, maxx), Math.min(psize.y, maxy));
- 			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
-	 */
-	public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException {
-		if (getShell() != null && getShell().isVisible()) {
-			// Save focus control
-			fLastControl = getShell().getDisplay().getFocusControl();
-			if (fLastControl != null && fLastControl.getShell() != getShell()) {
-				fLastControl = null;
-			}
-			fProgressMonitorCancelButton.setEnabled(cancelable);
-			// Attach the progress monitor part to the cancel button
-			fProgressMonitorPart.attachToCancelComponent(fProgressMonitorCancelButton);
-			fProgressMonitorPart.getParent().setVisible(true);
-			fProgressMonitorCancelButton.setFocus();
-			fActiveRunningOperations++;
-			
-		//do work here collecting enabled states, otherwise to get these states we would need to 
-		//perform the validation of the dialog again, which is expensive and would cause flashing of widgets.
-			Control[] children = ((Composite)fButtonComp.getChildren()[0]).getChildren();
-			boolean[] prev = new boolean[children.length+2];
-			prev[0] = getTabViewer().getApplyButton().isEnabled();
-			prev[1] = getTabViewer().getRevertButton().isEnabled();
-			for(int i = 0; i < children.length; i++) {
-				prev[i+2] = children[i].isEnabled();
-			}
-			try {
-				updateRunnnableControls(false, prev);
-				ModalContext.run(runnable, fork, fProgressMonitorPart, getShell().getDisplay());
-			} 
-			finally {
-				fActiveRunningOperations--;
-				updateRunnnableControls(true, prev);
-				if (getShell() != null) {
-					fProgressMonitorPart.getParent().setVisible(false);
-					fProgressMonitorPart.removeFromCancelComponent(fProgressMonitorCancelButton);
-					if (fLastControl != null) {
-						fLastControl.setFocus();
-					}
-				}
-			}
-		} 
-		else {
-			PlatformUI.getWorkbench().getProgressService().run(fork, cancelable, runnable);
-		}
-	}
-	
-	/**
-	 * Updates the enablement of the runnable controls to appear disabled as a job is running
-	 * @param enabled the desired enable status of the dialog area, revert//apply buttons, and
-	 * @param prev the previous settings for the apply and revert buttons to be reset to, only takes effect if enable is set to true
-	 * any children of the button bar
-	 * @since 3.3.0
-	 */
-	private void updateRunnnableControls(boolean enabled, boolean[] prev) {
-		getTabViewer().getApplyButton().setEnabled(enabled ? prev[0] : enabled);
-		getTabViewer().getRevertButton().setEnabled(enabled ? prev[1] : enabled);
-		//the arrangement never differs: button comp has one child that holds all the buttons
-		Control[] children = ((Composite)fButtonComp.getChildren()[0]).getChildren();
-		for(int i = 0; i < children.length; i++) {
-			children[i].setEnabled(enabled ? prev[i+2] : enabled);
-		}
-		getDialogArea().setEnabled(enabled);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#setActiveTab(org.eclipse.debug.ui.ILaunchConfigurationTab)
-	 */
-	public void setActiveTab(ILaunchConfigurationTab tab) {
-		getTabViewer().setActiveTab(tab);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#setActiveTab(int)
-	 */
-	public void setActiveTab(int index) {
-		getTabViewer().setActiveTab(index);
-	}
-	
-	/**
-	 * Sets the initial selection for the dialog when opened in 
-	 * <code>LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_SELECTION</code> mode.
-	 */
-	public void setInitialSelection(IStructuredSelection selection) {
-		fInitialSelection = selection;
-	}
-	
-	/**
-	 * Sets the status to open the dialog on.
-	 * 
-	 * @param status the initial status for the dialog
-	 */
-	public void setInitialStatus(IStatus status) {
-		fInitialStatus = status;
-	}
-	
-	/**
-	 * Sets the launch group to display.
-	 * 
-	 * @param group launch group
-	 */
-	protected void setLaunchGroup(LaunchGroupExtension group) {
-		fGroup = group;
-	}
-	
-	/**
-	 * Set the title area image based on the mode this dialog was initialized with
-	 */
-	protected void setModeLabelState() {
-		setTitleImage(getBannerImage());
-	}		
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#setName(java.lang.String)
-	 */
-	public void setName(String name) {
-		getTabViewer().setName(name);
-	}
-	
-	/**
-	 * Returns the current launch manager
-	 * @return the current launch manager
-	 */
-	protected ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-	
-	/**
-	 * Set the flag indicating how this dialog behaves when the <code>open()</code> method is called.
-	 * Valid values are defined by the LAUNCH_CONFIGURATION_DIALOG... constants in this class.
-	 */
-	public void setOpenMode(int mode) {
-		fOpenMode = mode;
-	}
-	
-	/**
- 	 * Increase the size of this dialog's <code>Shell</code> by the specified amounts.
- 	 * Do not increase the size of the Shell beyond the bounds of the Display.
- 	 */
-	protected void setShellSize(int width, int height) {
-		Rectangle bounds = getShell().getMonitor().getBounds();
-		getShell().setSize(Math.min(width, bounds.width), Math.min(height, bounds.height));
-	}
-
-	/**
-	 * Sets the viewer used to display the tabs for a launch configuration.
-	 * 
-	 * @param viewer the new view to set
-	 */
-	protected void setTabViewer(LaunchConfigurationTabGroupViewer viewer) {
-		fTabViewer = viewer;
-	}
-
-	/**
-	 * Create and return a dialog that asks the user whether they want to discard
-	 * unsaved changes.
-	 *   
-	 * @return the return code based on the button selected.
-	 * The value will be one of <code>YES_ID</code> or <code>NO_ID</code> from
-	 * <code>IDialogConstants</code>.
-	 */
-	private int showDiscardChangesDialog() {
-		StringBuffer buffer = new StringBuffer(MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationDialog_The_configuration___35, new String[]{getTabViewer().getWorkingCopy().getName()})); 
-		buffer.append(getTabViewer().getErrorMesssage());
-		buffer.append(LaunchConfigurationsMessages.LaunchConfigurationDialog_Do_you_wish_to_discard_changes_37); 
-		MessageDialog dialog = new MessageDialog(getShell(), 
-												 LaunchConfigurationsMessages.LaunchConfigurationDialog_Discard_changes__38, 
-												 null,
-												 buffer.toString(),
-												 MessageDialog.QUESTION,
-												 new String[] {LaunchConfigurationsMessages.LaunchConfigurationDialog_Yes_32, 
-															   LaunchConfigurationsMessages.LaunchConfigurationDialog_No_33},  
-												 1);
-		int val = IDialogConstants.NO_ID;
-		if (dialog.open() == 0) {
-			if (fLaunchConfigurationView != null) {
-				fLaunchConfigurationView.setAutoSelect(false);
-			}
-			getTabViewer().handleRevertPressed();
-			val = IDialogConstants.YES_ID;
-			if (fLaunchConfigurationView != null) {
-				fLaunchConfigurationView.setAutoSelect(true);
-			}
-		}
-		if(val == IDialogConstants.NO_ID) {
-			val = ID_DISCARD_BUTTON;
-		}
-		return val;
-	}
-
-	/**
-	 * Create and return a dialog that asks the user whether they want to save
-	 * unsaved changes.  
-	 * 
-	 * @return the return code based on the button selected.
-	 * The value will be one of <code>YES_ID</code>, <code>NO_ID</code>, or <code>CANCEL_ID</code>, from
-	 * <code>IDialogConstants</code>.
-	 */
-	private int showSaveChangesDialog() {
-		String message = MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationDialog_The_configuration___29, new String[]{getTabViewer().getWorkingCopy().getName()}); 
-		MessageDialog dialog = new MessageDialog(getShell(), 
-												 LaunchConfigurationsMessages.LaunchConfigurationDialog_Save_changes__31, 
-												 null,
-												 message,
-												 MessageDialog.QUESTION,
-												 new String[] {LaunchConfigurationsMessages.LaunchConfigurationDialog_Yes_32, 
-															   LaunchConfigurationsMessages.LaunchConfigurationDialog_No_33,
-															   LaunchConfigurationsMessages.LaunchConfigurationsDialog_c_ancel},  
-												 0);
-		int ret = dialog.open();
-		int val = IDialogConstants.CANCEL_ID;
-		if (ret == 0 || ret == 1) {
-			if (ret == 0) {
-				val = IDialogConstants.YES_ID;
-			} 
-			else {
-				val = IDialogConstants.NO_ID;
-			}
-		}
-		return val;
-	}
-
-	/**
-	 * Show the user a dialog appropriate to whether the unsaved changes in the current config
-	 * can be saved or not.  Return <code>true</code> if the user indicated that they wish to replace
-	 * the current config, either by saving changes or by discarding the, return <code>false</code>
-	 * otherwise.
-	 * 
-	 * @return returns the <code>showSaveChangesDialog</code> return value
-	 */
-	private int showUnsavedChangesDialog() {
-		if (getTabViewer().canSave()) {
-			return showSaveChangesDialog();
-		}
-		return showDiscardChangesDialog();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#updateButtons()
-	 */
-	public void updateButtons() {
-		// New, Delete, & Duplicate toolbar actions
- 		getNewAction().setEnabled(getNewAction().isEnabled());
-		getDeleteAction().setEnabled(getDeleteAction().isEnabled());
-		getDuplicateAction().setEnabled(getDuplicateAction().isEnabled());
-		getTabViewer().refresh();
-		getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationDialog#updateMessage()
-	 */
-	public void updateMessage() {
-		setErrorMessage(getTabViewer().getErrorMesssage());
-		setMessage(getTabViewer().getMessage());	
-	}
-	
-	/**
-	 * Returns if there is a selection in the tree viewer or not
-	 * @return true if something in the tree is selected, false otherwise
-	 * @since 3.2
-	 */
-	public boolean isTreeSelectionEmpty() {
-		return fLaunchConfigurationView.getTreeViewer().getSelection().isEmpty();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(final PropertyChangeEvent event) {
-		WorkbenchJob job = new WorkbenchJob(EMPTY_STRING) {
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				TreeViewer viewer = fLaunchConfigurationView.getTreeViewer();
-				boolean newvalue = Boolean.valueOf(event.getNewValue().toString()).booleanValue();
-				if(event.getProperty().equals(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED)) {
-					updateFilter(newvalue, fClosedProjectFilter);
-				}
-				else if(event.getProperty().equals(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED)) {
-					updateFilter(newvalue, fDeletedProjectFilter);
-				}
-				else if(event.getProperty().equals(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES)) {
-					updateFilter(newvalue, fLCTFilter);
-				}
-				else if(event.getProperty().equals(IInternalDebugUIConstants.PREF_FILTER_WORKING_SETS)) {
-					updateFilter(newvalue, fWorkingSetsFilter);
-				}
-				else if(event.getProperty().equals(IInternalDebugUIConstants.PREF_FILTER_TYPE_LIST)) {
-					if(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES)) {
-						viewer.refresh();
-						fLaunchConfigurationView.updateFilterLabel();
-					}
-				}
-				
-				return Status.OK_STATUS;
-			}
-		};
-		job.runInUIThread(new NullProgressMonitor());
-	}
-
-	/**
-	 * Updates the state of a filter based on the state variable
-	 * @param state if the filter needs to be added or removed, true indicates add, false indicates remove
-	 * @param filter the filter to update
-	 */
-	private void updateFilter(boolean state, ViewerFilter filter) {
-		TreeViewer viewer = (TreeViewer)fLaunchConfigurationView.getViewer();
-		if(state) {
-			viewer.addFilter(filter);
-		}
-		else {
-			viewer.removeFilter(filter);
-		}
-		fLaunchConfigurationView.updateFilterLabel();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java
deleted file mode 100644
index 6b0bc39..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java
+++ /dev/null
@@ -1,226 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.osgi.util.NLS;
-
-public class LaunchConfigurationsMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsMessages";//$NON-NLS-1$
-
-	public static String CommonTab__Browse_6;
-	public static String CommonTab__Common_15;
-	public static String CommonTab_Display_in_favorites_menu__10;
-	public static String CommonTab_Invalid_shared_configuration_location_14;
-	public static String CommonTab_L_ocal_3;
-	public static String CommonTab_S_hared_4;
-	public static String CommonTab_Select_a_location_for_the_launch_configuration_13;
-	public static String CommonTab_Cannot_save_launch_configuration_in_a_closed_project__1;
-	public static String CommonTab_10;
-	public static String CommonTab_11;
-	public static String CommonTab_12;
-	public static String CommonTab_13;
-	public static String CommonTab_14;
-	public static String CommonTab_0;
-	public static String CommonTab_1;
-	public static String CommonTab_2;
-	public static String CommonTab_3;
-	public static String CommonTab_4;
-	public static String CommonTab_5;
-	public static String CommonTab_6;
-	public static String CommonTab_7;
-	public static String CommonTab_8;
-	public static String CommonTab_9;
-
-	public static String CompileErrorProjectPromptStatusHandler_0;
-	public static String CompileErrorProjectPromptStatusHandler_1;
-	public static String CompileErrorPromptStatusHandler_0;
-	public static String CompileErrorPromptStatusHandler_1;
-	public static String CompileErrorPromptStatusHandler_2;
-	public static String EnvironmentTab_22;
-
-	public static String EnvironmentTab_7;
-
-	public static String LaunchConfigurationDialog__Apply_17;
-	public static String LaunchConfigurationDialog__Name__16;
-	public static String LaunchConfigurationDialog_An_exception_occurred_while_retrieving_launch_configurations_20;
-
-	public static String LaunchConfigurationEditDialog_0;
-
-	public static String LaunchConfigurationEditDialog_1;
-
-	public static String LaunchConfigurationFilteredTree_discard_changes;
-
-	public static String LaunchConfigurationFilteredTree_search_with_changes;
-
-	public static String LaunchConfigurationFilteredTree_search_with_errors;
-
-	public static String LaunchConfigurationFilteredTree_type_filter_text;
-	public static String LaunchConfigurationTabGroupViewer_0;
-	public static String LaunchConfigurationDialog_Create__manage__and_run_launch_configurations_8;
-	public static String LaunchConfigurationDialog_Discard_changes__38;
-	public static String LaunchConfigurationDialog_Do_you_wish_to_discard_changes_37;
-	public static String LaunchConfigurationDialog_Error_19;
-	public static String LaunchConfigurationDialog_Exception_occurred_creating_launch_configuration_tabs_27;
-	public static String LaunchConfigurationDialog_Exception_occurred_while_saving_launch_configuration_47;
-	public static String LaunchConfigurationDialog_Launch_configuration_already_exists_with_this_name_12;
-	public static String LaunchConfigurationDialog_Launch_Configuration_Error_46;
-	public static String LaunchConfigurationDialog_Launch_Configurations_18;
-	public static String LaunchConfigurationDialog_Name_required_for_launch_configuration_11;
-	public static String LaunchConfigurationDialog_No_33;
-	public static String LaunchConfigurationDialog_Ready_to_launch_2;
-	public static String LaunchConfigurationDialog_Save_changes__31;
-	public static String LaunchConfigurationDialog_The_configuration___29;
-	public static String LaunchConfigurationDialog_The_configuration___35;
-	public static String LaunchConfigurationDialog_unspecified_28;
-	public static String LaunchConfigurationDialog_Yes_32;
-	public static String LaunchConfigurationDialog_Do_you_wish_to_delete_the_selected_launch_configurations__1;
-	public static String LaunchConfigurationDialog_Do_you_wish_to_delete_the_selected_launch_configuration__2;
-	public static String LaunchConfigurationDialog_Confirm_Launch_Configuration_Deletion_3;
-	public static String LaunchConfigurationDialog_Close_1;
-	public static String LaunchConfigurationDialog_Revert_2;
-	public static String LaunchConfigurationDialog_Cancel_3;
-	public static String LaunchConfigurationsDialog_Error_1;
-	public static String LaunchConfigurationsDialog_Warning_2;
-	public static String LaunchConfigurationsDialog_Information_3;
-	public static String LaunchConfigurationSelectionDialog_0;
-	public static String LaunchConfigurationSelectionDialog_1;
-
-	public static String LaunchConfigurationTabGroupViewer_14;
-
-	public static String LaunchConfigurationTabGroupViewer_15;
-
-	public static String LaunchConfigurationTabGroupViewer_16;
-
-	public static String LaunchConfigurationTabGroupViewer_17;
-
-	public static String LaunchConfigurationTabGroupViewer_18;
-	public static String LaunchConfigurationTabGroupViewer_9;
-	public static String LaunchConfigurationTabGroupViewer_13;
-
-	public static String LaunchConfigurationView_0;
-
-	public static String LaunchShortcutSelectionDialog_0;
-
-	public static String LaunchShortcutSelectionDialog_1;
-
-	public static String LaunchShortcutSelectionDialog_2;
-
-	public static String LaunchShortcutSelectionDialog_3;
-
-	public static String LaunchShortcutSelectionDialog_4;
-
-	public static String PerspectiveManager_Error_1;
-	public static String PerspectiveManager_Unable_to_switch_perpsectives_as_specified_by_launch___0__4;
-	public static String PerspectiveManager_Unable_to_switch_to_perspective___0__2;
-	public static String LaunchShortcutExtension_Error_4;
-	public static String LaunchShortcutExtension_Unable_to_use_launch_shortcut_5;
-
-	public static String LaunchConfigurationPropertiesDialog_Edit_launch_configuration_properties_1;
-	public static String LaunchConfigurationPropertiesDialog_Properties_for__0__2;
-
-	public static String LaunchConfigurationDialog_Modify_attributes_and_launch__1;
-
-	public static String LaunchConfigurationTabGroupViewer_No_tabs_defined_for_launch_configuration_type__0__1;
-
-	public static String DuplicateLaunchConfigurationAction__Duplicate_1;
-
-	public static String DeleteLaunchConfigurationAction_Dele_te_1;
-
-	public static String CreateLaunchConfigurationAction_Ne_w_1;
-	public static String CreateLaunchConfigurationAction_New_configuration_2;
-
-	public static String EnvironmentTab_Variable_1;
-	public static String EnvironmentTab_Value_2;
-	public static String EnvironmentTab_Environment_variables_to_set__3;
-	public static String EnvironmentTab_New_4;
-	public static String EnvironmentTab_Edit_5;
-	public static String EnvironmentTab_Remove_6;
-	public static String EnvironmentTab_Environment_7;
-	public static String EnvironmentTab_8;
-	public static String EnvironmentTab_9;
-	public static String EnvironmentTab_11;
-	public static String EnvironmentTab_12;
-	public static String EnvironmentTab_13;
-	public static String EnvironmentTab_16;
-	public static String EnvironmentTab_17;
-	public static String EnvironmentTab_18;
-	public static String EnvironmentTab_19;
-	public static String EnvironmentTab_20;
-
-	public static String FavoritesDialog_1;
-	public static String FavoritesDialog_2;
-	public static String FavoritesDialog_3;
-	public static String FavoritesDialog_4;
-	public static String FavoritesDialog_5;
-	public static String FavoritesDialog_6;
-	public static String FavoritesDialog_7;
-	public static String FavoritesDialog_0;
-
-	public static String OrganizeFavoritesAction_0;
-	public static String PerspectiveManager_12;
-	public static String PerspectiveManager_13;
-	public static String PerspectiveManager_15;
-	public static String PerspectiveManager_suspend_description;
-	public static String PerspectiveManager_launch_description;
-
-	public static String DebugModePromptStatusHandler_0;
-	public static String DebugModePromptStatusHandler_1;
-
-    public static String CommonTab_No_Encoding_Selected;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, LaunchConfigurationsMessages.class);
-	}
-
-	public static String LaunchConfigurationTabGroupViewer_1;
-	public static String LaunchConfigurationTabGroupViewer_2;
-	public static String LaunchConfigurationTabGroupViewer_3;
-	public static String LaunchConfigurationTabGroupViewer_4;
-	public static String LaunchConfigurationTabGroupViewer_5;
-    public static String LaunchConfigurationTabGroupViewer_6;
-
-	public static String SaveScopeResourcesHandler_1;
-	public static String SaveScopeResourcesHandler_2;
-	public static String SaveScopeResourcesHandler_3;
-
-	public static String FavoritesDialog_8;
-
-	public static String LaunchConfigurationsDialog_0;
-	public static String LaunchConfigurationsDialog_1;
-	public static String LaunchConfigurationsDialog_4;
-	public static String LaunchConfigurationsDialog_5;
-	public static String FilterLaunchConfigurationAction_0;
-	
-
-	public static String LaunchConfigurationTabGroupViewer_8;
-
-	public static String FilterDropDownMenuCreator_0;
-	public static String FilterDropDownMenuCreator_1;
-	public static String FilterDropDownMenuCreator_2;
-	public static String FilterDropDownMenuCreator_3;
-	public static String FilterDropDownMenuCreator_4;
-
-	public static String LaunchConfigurationsDialog_c_ancel;
-
-	public static String CollapseAllLaunchConfigurationAction_0;
-	public static String CollapseAllLaunchConfigurationAction_1;
-	public static String CollapseAllLaunchConfigurationAction_2;
-
-	public static String SelectLaunchersDialog_0;
-	public static String SelectLaunchersDialog_1;
-	public static String SelectLaunchersDialog_2;
-	public static String SelectLaunchersDialog_4;
-	public static String SelectLaunchersDialog_5;
-	public static String SelectLaunchOptionsDialog_3;
-	public static String SelectLaunchOptionsDialog_4;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties
deleted file mode 100644
index ad2fc7d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties
+++ /dev/null
@@ -1,205 +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
-###############################################################################
-
-CommonTab_No_Encoding_Selected=Console encoding not selected
-CommonTab__Browse_6=&Browse...
-CommonTab__Common_15=&Common
-CommonTab_Display_in_favorites_menu__10=Display in favor&ites menu
-CommonTab_Invalid_shared_configuration_location_14=Invalid shared configuration location
-CommonTab_L_ocal_3=L&ocal file
-CommonTab_S_hared_4=S&hared file:
-CommonTab_Select_a_location_for_the_launch_configuration_13=Select a location for the launch configuration
-CommonTab_Cannot_save_launch_configuration_in_a_closed_project__1=Cannot save launch configuration in a closed project.
-CommonTab_10=Launch in bac&kground
-CommonTab_11=A&ppend
-CommonTab_12=&Workspace...
-CommonTab_13=Select a Resource:
-CommonTab_14=Select a resource to redirect output to:
-CommonTab_0=Save as
-CommonTab_1=Console Encoding
-CommonTab_2=Workspace Defa&ult ({0})
-CommonTab_3=Oth&er
-CommonTab_4=Standard Input and Output
-CommonTab_5=&Allocate Console (necessary for input)
-CommonTab_6=Fi&le:
-CommonTab_7=File Syste&m...
-CommonTab_8=No file specified for process output
-CommonTab_9=Variable&s...
-
-CompileErrorPromptStatusHandler_0=Errors in Workspace
-CompileErrorPromptStatusHandler_1=Errors exist in a required project. Continue launch?
-CompileErrorPromptStatusHandler_2=Errors exist in required project(s):\n\n{0}\n\nProceed with launch?
-CompileErrorProjectPromptStatusHandler_1=&Always launch without asking
-# {0} is replaced with a comma separated list of project names
-CompileErrorProjectPromptStatusHandler_0={0}...
-
-EnvironmentTab_22=New Environment Variable
-
-LaunchConfigurationDialog__Apply_17=Appl&y
-LaunchConfigurationDialog__Name__16=&Name:
-LaunchConfigurationDialog_An_exception_occurred_while_retrieving_launch_configurations_20=An exception occurred while retrieving launch configurations
-
-LaunchConfigurationTabGroupViewer_0={0} is an invalid character in launch configuration name {1}
-LaunchConfigurationTabGroupViewer_1=Configure launch settings from this dialog:
-LaunchConfigurationTabGroupViewer_2=- Press the 'New' button to create a configuration of the selected type.
-LaunchConfigurationTabGroupViewer_3=- Edit or view an existing configuration by selecting it.
-LaunchConfigurationTabGroupViewer_4=- Press the 'Delete' button to remove the selected configuration.
-LaunchConfigurationTabGroupViewer_6=- Press the 'Duplicate' button to copy the selected configuration.
-LaunchConfigurationTabGroupViewer_5=Configure launch perspective settings from the <a>Perspectives</a> preference page.
-LaunchConfigurationTabGroupViewer_8=- Press the 'Filter' button to configure filtering options.
-LaunchConfigurationTabGroupViewer_9=The file associated with this launch configuration is read-only and cannot be modified.\n
-LaunchConfigurationTabGroupViewer_13=Select a supported <a>launch mode</a>.
-LaunchConfigurationTabGroupViewer_14=Mixed launch mode not supported: {0}
-LaunchConfigurationTabGroupViewer_15=More than one launcher available - <a>Select other...</a>
-LaunchConfigurationTabGroupViewer_16=Using {0} - <a>Select other...</a>
-LaunchConfigurationTabGroupViewer_17=Multiple launchers available - <a>Select one...</a>
-LaunchConfigurationTabGroupViewer_18=Multiple launchers available - select one to continue
-
-LaunchConfigurationDialog_Create__manage__and_run_launch_configurations_8=Create, manage, and run configurations
-LaunchConfigurationDialog_Discard_changes__38=Discard changes?
-LaunchConfigurationDialog_Do_you_wish_to_discard_changes_37=\nDo you wish to discard changes?\n
-LaunchConfigurationDialog_Error_19=Error
-LaunchConfigurationDialog_Exception_occurred_creating_launch_configuration_tabs_27=Exception occurred creating launch configuration tabs
-LaunchConfigurationDialog_Exception_occurred_while_saving_launch_configuration_47=Exception occurred while saving launch configuration
-LaunchConfigurationDialog_Launch_configuration_already_exists_with_this_name_12=Launch configuration already exists with this name
-LaunchConfigurationDialog_Launch_Configuration_Error_46=Launch Configuration Error
-LaunchConfigurationDialog_Launch_Configurations_18=Launch Configurations
-LaunchConfigurationFilteredTree_search_with_changes=You cannot perform a text search when the current configuration has pending changes.\n\nDo you want to save the changes and continue searching?
-LaunchConfigurationFilteredTree_search_with_errors=You cannot perform a text search when the current configuration has errors.\n\nDo you want to discard the changes and continue searching?
-LaunchConfigurationDialog_Name_required_for_launch_configuration_11=Name required for launch configuration
-LaunchConfigurationDialog_No_33=No
-LaunchConfigurationEditDialog_0=Modify configuration and continue.
-LaunchConfigurationEditDialog_1=Con&tinue
-LaunchConfigurationDialog_Ready_to_launch_2=Ready to launch
-LaunchConfigurationDialog_Save_changes__31=Save changes?
-LaunchConfigurationDialog_The_configuration___29=The configuration "{0}" has unsaved changes.  Do you wish to save them?
-LaunchConfigurationDialog_The_configuration___35=The configuration "{0}" has unsaved changes that CANNOT be saved because of the following error:\n\n
-LaunchConfigurationFilteredTree_discard_changes=Discard Changes?
-LaunchConfigurationFilteredTree_type_filter_text=type filter text
-LaunchConfigurationDialog_unspecified_28=unspecified
-LaunchConfigurationDialog_Yes_32=Yes
-LaunchConfigurationDialog_Do_you_wish_to_delete_the_selected_launch_configurations__1=Do you wish to delete the selected launch configurations?
-LaunchConfigurationDialog_Do_you_wish_to_delete_the_selected_launch_configuration__2=Do you wish to delete the selected launch configuration?
-LaunchConfigurationDialog_Confirm_Launch_Configuration_Deletion_3=Confirm Launch Configuration Deletion
-LaunchConfigurationDialog_Close_1=Close
-LaunchConfigurationDialog_Revert_2=Re&vert
-LaunchConfigurationDialog_Cancel_3=Cance&l
-LaunchConfigurationsDialog_Error_1=Error
-LaunchConfigurationsDialog_Warning_2=Warning
-LaunchConfigurationsDialog_Information_3=Information
-LaunchConfigurationsDialog_0=New launch configuration
-LaunchConfigurationsDialog_1=Delete selected launch configuration(s)
-LaunchConfigurationsDialog_4=Filter launch configurations...
-LaunchConfigurationsDialog_5=Duplicates the currently selected launch configuration
-LaunchConfigurationSelectionDialog_0=Select Configuration
-LaunchConfigurationSelectionDialog_1=&Select a configuration to launch:
-LaunchConfigurationView_0=Filter matched {0} of {1} items
-LaunchConfigurationsDialog_c_ancel=Cancel
-PerspectiveManager_Error_1=Error
-PerspectiveManager_Unable_to_switch_perpsectives_as_specified_by_launch___0__4=Unable to open perspectives as specified by launch: {0}
-PerspectiveManager_Unable_to_switch_to_perspective___0__2=Unable to open perspective: {0}
-LaunchShortcutExtension_Error_4=Error
-
-# {0} is substituted with a launch mode - possible values include Run, Debug, Profile,
-# or any label of a contributed ILaunchMode.
-LaunchShortcutSelectionDialog_0={0} As
-
-# {0} is substituted with a launch mode - possible values include run, debug, profile, or
-# any label of a contributed ILaunchMode.
-#
-# {1} is the name of the resource being launched (run or debugged, etc.). 
-# Possible values can be the name of any IResource in the current workspace: for example
-# if you tried to launch a class named Main in the file Main.java and you were presented
-# with the selection dialog, the value of {1} would be Main.java (the name of the IResource)
-LaunchShortcutSelectionDialog_1=&Select a way to {0} ''{1}'': 
-LaunchShortcutSelectionDialog_2=Description
-LaunchShortcutSelectionDialog_3=Description not available
-# {0} is substituted with a launch mode - possible values include Run, Debug, Profile,
-# or any label of a contributed ILaunchMode.
-LaunchShortcutSelectionDialog_4=&Select what to {0}:
-LaunchShortcutExtension_Unable_to_use_launch_shortcut_5=Unable to use launch shortcut
-
-LaunchConfigurationPropertiesDialog_Edit_launch_configuration_properties_1=Edit launch configuration properties
-LaunchConfigurationPropertiesDialog_Properties_for__0__2=Properties for {0}
-
-LaunchConfigurationDialog_Modify_attributes_and_launch__1=Edit configuration and launch.
-
-LaunchConfigurationTabGroupViewer_No_tabs_defined_for_launch_configuration_type__0__1=No tabs defined for launch configuration type {0}
-
-DuplicateLaunchConfigurationAction__Duplicate_1=&Duplicate
-
-DeleteLaunchConfigurationAction_Dele_te_1=Dele&te
-
-CreateLaunchConfigurationAction_Ne_w_1=Ne&w
-CreateLaunchConfigurationAction_New_configuration_2=New_configuration
-
-EnvironmentTab_Variable_1=Variable
-EnvironmentTab_Value_2=Value
-EnvironmentTab_Environment_variables_to_set__3=Environment variables to &set:
-EnvironmentTab_New_4=N&ew...
-EnvironmentTab_Edit_5=E&dit...
-EnvironmentTab_Remove_6=Rem&ove
-EnvironmentTab_Environment_7=Environment
-EnvironmentTab_8=&Name:
-EnvironmentTab_9=&Value:
-
-# This externalized string is used in the select environment variables dialog's label provider.
-# Each item in the dialog is a single environment variable.
-# {0} is replaced with the name of the environment variable
-# {1} is replaced with the current value of the environment variable
-EnvironmentTab_7={0} [ {1} ]
-EnvironmentTab_11=Edit Environment Variable
-EnvironmentTab_12=Overwrite variable?
-EnvironmentTab_13=A variable named {0} already exists. Overwrite?
-EnvironmentTab_16=&Append environment to native environment
-EnvironmentTab_17=Re&place native environment with specified environment
-EnvironmentTab_18=Se&lect...
-EnvironmentTab_19=Select &environment variables to add:
-EnvironmentTab_20=Select Environment Variables
-
-FavoritesDialog_1=Organize {0} Favorites
-FavoritesDialog_2=Fa&vorites:
-FavoritesDialog_3=Ad&d...
-FavoritesDialog_4=Re&move
-FavoritesDialog_5=U&p
-FavoritesDialog_6=Do&wn
-FavoritesDialog_7=Select &Launch Configurations:
-FavoritesDialog_0=Add {0} Favorites
-FavoritesDialog_8=Updating Favorites...
-
-OrganizeFavoritesAction_0=Organize Fa&vorites...
-PerspectiveManager_12=Confirm Perspective Switch
-PerspectiveManager_13=This kind of launch is configured to open the {0} perspective when it suspends. Do you want to open this perspective now?
-PerspectiveManager_15=This kind of launch is associated with the {0} perspective. Do you want to open this perspective now?
-PerspectiveManager_suspend_description=This kind of launch is configured to open the {0} perspective when it suspends.\n\n{1}\n\nDo you want to open this perspective now?
-PerspectiveManager_launch_description=This kind of launch is associated with the {0} perspective.\n\n{1}\n\nDo you want to open this perspective now?
-
-DebugModePromptStatusHandler_0=Breakpoints in Workspace
-DebugModePromptStatusHandler_1=There are breakpoints enabled in the workspace. Would you rather launch in debug mode?
-SaveScopeResourcesHandler_2=Select resources to save:
-SaveScopeResourcesHandler_3=Save and Launch
-SaveScopeResourcesHandler_1=Always save &resources before launching
-FilterLaunchConfigurationAction_0=Filter
-FilterDropDownMenuCreator_0=Filter &Closed Projects
-FilterDropDownMenuCreator_1=Filter &Deleted/Unavailable Projects
-FilterDropDownMenuCreator_2=Filter Configuration &Types
-FilterDropDownMenuCreator_3=Filtering &Preferences...
-FilterDropDownMenuCreator_4=Apply Window &Working Set(s)
-CollapseAllLaunchConfigurationAction_0=Collapse All
-CollapseAllLaunchConfigurationAction_1=Collapses all expanded launch configurations.
-CollapseAllLaunchConfigurationAction_2=This action collapses all of the launch configurations currently visible and expanded.
-SelectLaunchOptionsDialog_3=Select Launch Mode
-SelectLaunchOptionsDialog_4=&Select a supported mode combination:
-SelectLaunchersDialog_0=Select Preferred Launcher
-SelectLaunchersDialog_1=&Override workspace settings:
-SelectLaunchersDialog_2=This dialog allows you to specify which launcher to use when multiple launchers are available for a configuration and launch mode.
-SelectLaunchersDialog_4=<a href="ws">Change Workspace Settings...</a>
-SelectLaunchersDialog_5=Description
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateContribution.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateContribution.java
deleted file mode 100644
index de7828e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateContribution.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.ui.IPluginContribution;
-
-/**
- * This class provides a wrapper for a launch delegate so tht it can be filtered from UI and launching choices
- * @since 3.3
- */
-public class LaunchDelegateContribution implements IPluginContribution {
-
-	private ILaunchDelegate fDelegate = null;
-	
-	/**
-	 * Constructor
-	 * @param delegate
-	 */
-	public LaunchDelegateContribution(ILaunchDelegate delegate) {
-		fDelegate = delegate;
-	}
-	
-	/**
-	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
-	 */
-	public String getLocalId() {
-		return fDelegate.getId();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-	 */
-	public String getPluginId() {
-		return fDelegate.getPluginIdentifier();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java
deleted file mode 100644
index f81f750..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a mechanism to prompt users in the UI thread from debug.core in the case where
- * a launch delegate has gone missing and a new choice needs to be made in the launch dialog.
- * 
- * @since 3.3
- */
-public class LaunchDelegateNotAvailableHandler implements IStatusHandler {
-
-	/**
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		if(source instanceof Object[]) {
-			Object[] infos = (Object[]) source;
-			if(infos.length == 2) {
-				final ILaunchConfiguration config = (ILaunchConfiguration) infos[0];
-				final String mode = (String) infos[1];
-				final Shell shell = DebugUIPlugin.getShell();
-				Runnable runnable = new Runnable() {
-					public void run() {
-						DebugUITools.openLaunchConfigurationDialog(shell, config, DebugUITools.getLaunchGroup(config, mode).getIdentifier(), null);
-					}
-				};
-				DebugUIPlugin.getStandardDisplay().asyncExec(runnable);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchGroupExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchGroupExtension.java
deleted file mode 100644
index b1e9beb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchGroupExtension.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.debug.internal.ui.launchConfigurations;
-
- 
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-
-/**
- * Proxy to a launch group extension
- */
-public class LaunchGroupExtension implements ILaunchGroup {
-	
-	/**
-	 * The configuration element defining this launch group.
-	 */
-	private IConfigurationElement fConfig;
-	
-	/**
-	 * The image for this group
-	 */
-	private ImageDescriptor fImageDescriptor;
-	
-	/**
-	 * The banner image for this group
-	 */
-	private ImageDescriptor fBannerImageDescriptor;
-	
-	/**
-	 * Constructs a launch group extension based on the given configuration
-	 * element
-	 * 
-	 * @param element the configuration element defining the
-	 *  attributes of this launch group extension
-	 * @return a new launch group extension
-	 */
-	public LaunchGroupExtension(IConfigurationElement element) {
-		setConfigurationElement(element);
-	}
-	
-	/**
-	 * Sets the configuration element that defines the attributes
-	 * for this launch group extension.
-	 * 
-	 * @param element configuration element
-	 */
-	private void setConfigurationElement(IConfigurationElement element) {
-		fConfig = element;
-	}
-	
-	/**
-	 * Returns the configuration element that defines the attributes
-	 * for this launch group extension.
-	 * 
-	 * @param configuration element that defines the attributes
-	 *  for this launch group extension
-	 */
-	protected IConfigurationElement getConfigurationElement() {
-		return fConfig;
-	}
-	
-	/**
-	 * Returns the image for this launch group, or <code>null</code> if none
-	 * 
-	 * @return the image for this launch group, or <code>null</code> if none
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		if (fImageDescriptor == null) {
-			fImageDescriptor = createImageDescriptor("image"); //$NON-NLS-1$
-		}
-		return fImageDescriptor;
-	}
-	
-	/**
-	 * Returns the banner image for this launch group, or <code>null</code> if
-	 * none
-	 * 
-	 * @return the banner image for this launch group, or <code>null</code> if
-	 * none
-	 */
-	public ImageDescriptor getBannerImageDescriptor() {
-		if (fBannerImageDescriptor == null) {
-			fBannerImageDescriptor = createImageDescriptor("bannerImage"); //$NON-NLS-1$
-		}
-		return fBannerImageDescriptor;
-	}	
-	
-	/**
-	 * Returns the label for this launch group
-	 * 
-	 * @return the label for this launch group
-	 */
-	public String getLabel() {
-		return getConfigurationElement().getAttribute("label"); //$NON-NLS-1$
-	}	
-		
-	/**
-	 * Returns the id for this launch group
-	 * 
-	 * @return the id for this launch group
-	 */
-	public String getIdentifier() {
-		return getConfigurationElement().getAttribute("id"); //$NON-NLS-1$
-	}	
-	
-	/**
-	 * Returns the category for this launch group, possibly <code>null</code>
-	 * 
-	 * @return the category for this launch group, possibly <code>null</code>
-	 */
-	public String getCategory() {
-		return getConfigurationElement().getAttribute("category"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Returns the mode for this launch group
-	 * 
-	 * @return the mode for this launch group
-	 */
-	public String getMode() {
-		return getConfigurationElement().getAttribute("mode"); //$NON-NLS-1$
-	}					
-	
-	/**
-	 * Creates an image descriptor based on the given attribute name
-	 * 
-	 * @param attribute
-	 * @return ImageDescriptor
-	 */
-	protected ImageDescriptor createImageDescriptor(String attribute) {
-		return DebugUIPlugin.getImageDescriptor(getConfigurationElement(), attribute);
-	}
-	
-	/**
-	 * Returns whether this launch group is public
-	 *  
-	 * @return boolean
-	 */
-	public boolean isPublic() {
-		String string = getConfigurationElement().getAttribute("public"); //$NON-NLS-1$
-		if (string == null) {
-			return true;
-		}
-		return string.equals("true"); //$NON-NLS-1$
-	}
-
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchGroupFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchGroupFilter.java
deleted file mode 100644
index 6fcb9a1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchGroupFilter.java
+++ /dev/null
@@ -1,85 +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.debug.internal.ui.launchConfigurations;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * Displays launch configurations for a specific launch group
- */
-public class LaunchGroupFilter extends ViewerFilter {
-	
-	private ILaunchGroup fGroup;
-	
-	/**
-	 * Constructor
-	 * @param groupExtension
-	 */
-	public LaunchGroupFilter(ILaunchGroup groupExtension) {
-		super();
-		fGroup = groupExtension;
-	}
-
-	/**
-	 * @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) {
-			ILaunchConfigurationType type = null;
-			ILaunchConfiguration config = null;
-			if (parentElement instanceof ILaunchConfigurationType) {
-				type = (ILaunchConfigurationType)parentElement;
-			}
-			if (element instanceof ILaunchConfigurationType) {
-				type = (ILaunchConfigurationType)element;
-			}
-			if (element instanceof ILaunchConfiguration) {
-				config = (ILaunchConfiguration)element;
-				try {
-					type = config.getType();
-				} 
-				catch (CoreException e) {}
-			}
-			boolean priv = false;
-			if (config != null) {
-				try {
-					priv = config.getAttribute(IDebugUIConstants.ATTR_PRIVATE, false);
-				} catch (CoreException e) {
-				}
-			}
-			if (type != null) {
-				return !priv && type.supportsMode(fGroup.getMode()) && equalCategories(type.getCategory(), fGroup.getCategory()) && !WorkbenchActivityHelper.filterItem(new LaunchConfigurationTypeContribution(type));
-			}
-			return false;
-	}
-	
-	/**
-	 * Returns whether the given categories are equal.
-	 * 
-	 * @param c1 category identifier or <code>null</code>
-	 * @param c2 category identifier or <code>null</code>
-	 * @return boolean
-	 */
-	private boolean equalCategories(String c1, String c2) {
-		if (c1 == null || c2 == null) {
-			return c1 == c2;
-		}
-		return c1.equals(c2);
-	} 
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchHistory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchHistory.java
deleted file mode 100644
index e99b04b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchHistory.java
+++ /dev/null
@@ -1,434 +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.debug.internal.ui.launchConfigurations;
-
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationListener;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * A history of launches and favorites for a launch group
- */
-public class LaunchHistory implements ILaunchListener, ILaunchConfigurationListener {
-
-	/**
-	 * Listing of the complete launch history, which includes favorites in the launched ordering
-	 */
-	private Vector fCompleteHistory = new Vector();
-	
-	/**
-	 * The launch group this history is provided for
-	 */
-	private ILaunchGroup fGroup;
-	
-	/**
-	 * Ordered listing of the favorites of this history
-	 */
-	private Vector fFavorites = new Vector();
-	
-	/**
-	 * A new saved flag to prevent save participants from serializing unchanged launch histories.
-	 * @since 3.3.1
-	 */
-	private boolean fSaved = true;
-	
-	/**
-	 * List of instances of this launch history 
-	 */
-	private static List fgLaunchHistoryInstances = new ArrayList();
-	
-	/**
-	 * Creates a new launch history for the given launch group
-	 */
-	public LaunchHistory(ILaunchGroup group) {
-		fGroup = group;
-		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); 
-		manager.addLaunchListener(this);
-		manager.addLaunchConfigurationListener(this);
-		fgLaunchHistoryInstances.add(this);
-	}
-	
-	/**
-	 * Disposes this history
-	 */
-	public void dispose() {
-		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-		manager.removeLaunchListener(this);
-		manager.removeLaunchConfigurationListener(this);
-		fgLaunchHistoryInstances.remove(this);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		ILaunchConfiguration configuration = launch.getLaunchConfiguration();
-		if (configuration != null && !configuration.isWorkingCopy() && DebugUIPlugin.doLaunchConfigurationFiltering(configuration) && accepts(configuration)) {
-			addHistory(configuration, true);
-		}
-	}
-	
-	/**
-	 * Returns if the current history contains the specified <code>ILaunchConfiguration</code>
-	 * @param config the configuration to look for
-	 * @return true if the current history contains the specified configuration, false otherwise
-	 * @since 3.3
-	 */
-	public synchronized boolean contains(ILaunchConfiguration configuration) {
-		return fCompleteHistory.contains(configuration);
-	}
-	
-	/**
-	 * Adds the given configuration to this history
-	 * 
-	 * @param configuration
-	 * @param prepend whether the configuration should be added to the beginning of
-	 * the history list
-	 */
-	protected void addHistory(ILaunchConfiguration configuration, boolean prepend) {
-		synchronized (this) {
-			if(configuration.isWorkingCopy()) {
-				return;
-			}
-			checkFavorites(configuration);
-			int index = fCompleteHistory.indexOf(configuration);
-			if(index == 0) {
-				return;
-			}
-			if(index < 0) {
-				if(prepend) {
-					fCompleteHistory.add(0, configuration);
-				}
-				else {
-					fCompleteHistory.add(configuration);
-				}
-			}
-			else {
-				fCompleteHistory.add(0, fCompleteHistory.remove(index));
-			}
-			resizeHistory();
-		}
-		fireLaunchHistoryChanged();
-	}
-
-	/**
-	 * Notifies all <code>ILaunchHistoryChangedListener</code>s that the launch history has been modified
-	 * 
-	 * @since 3.3
-	 */
-	private void fireLaunchHistoryChanged() {
-		DebugUIPlugin.getDefault().getLaunchConfigurationManager().fireLaunchHistoryChanged();
-		setSaved(false);
-	}
-	
-	/**
-	 * Returns if the launch history requires saving or not
-	 * @return true if the history needs to be saved, false otherwise
-	 * @since 3.3.1
-	 */
-	public boolean needsSaving() {
-		return !fSaved;
-	}
-	
-	/**
-	 * Allows the dirty flag for this launch history to be set.
-	 * It is the clients of this class that must set the saved flag to true
-	 * if they have persisted the launch history
-	 * @param saved
-	 * @since 3.3.1
-	 */
-	public void setSaved(boolean saved) {
-		fSaved = saved;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {}
-
-	/**
-	 * Returns the most recently launched configuration in this history, or
-	 * <code>null</code> if none.
-	 * 
-	 * @return the most recently launched configuration in this history, or
-	 * <code>null</code> if none 
-	 */
-	public synchronized ILaunchConfiguration getRecentLaunch() {
-		ILaunchConfiguration[] history = getCompleteLaunchHistory();
-		if(history.length > 0) {
-			return history[0];
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the launch configurations in this history, in most recently
-	 * launched order, not including any entries from the favorites listing.
-	 * 
-	 * @return launch history
-	 */
-	public synchronized ILaunchConfiguration[] getHistory() {
-		Vector history = new Vector();
-		try {
-			ILaunchConfiguration config = null;
-			for(Iterator iter = fCompleteHistory.iterator(); iter.hasNext();) {
-				config = (ILaunchConfiguration) iter.next();
-				if(config.exists() && !fFavorites.contains(config) && 
-						DebugUIPlugin.doLaunchConfigurationFiltering(config) && 
-						!WorkbenchActivityHelper.filterItem(new LaunchConfigurationTypeContribution(config.getType()))) {
-					history.add(config);
-				}
-			}
-			//size it to the max specified history size
-			if(history.size() > getMaxHistorySize()) {
-				history.setSize(getMaxHistorySize());
-			}
-		}
-		catch(CoreException ce) {DebugUIPlugin.log(ce);}
-		return (ILaunchConfiguration[]) history.toArray(new ILaunchConfiguration[history.size()]);
-	}
-	
-	/**
-	 * Returns the complete launch history in the order they were last launched, this listing includes all
-	 * entries including those from the favorites listing, but not those that have been filtered via
-	 * launch configuration filtering or capabilities filtering
-	 * @return the list of last launched <code>ILaunchConfiguration</code>s
-	 * 
-	 * @since 3.3
-	 */
-	public synchronized ILaunchConfiguration[] getCompleteLaunchHistory() {
-		Vector history = new Vector();
-		try {
-			ILaunchConfiguration config = null;
-			for(Iterator iter = fCompleteHistory.listIterator(); iter.hasNext();){
-				config = (ILaunchConfiguration) iter.next();
-				if(config.exists() && DebugUIPlugin.doLaunchConfigurationFiltering(config) && 
-				!WorkbenchActivityHelper.filterItem(new LaunchConfigurationTypeContribution(config.getType()))) {
-					history.add(config);
-				}
-			}
-		}
-		catch (CoreException ce) {DebugUIPlugin.log(ce);}
-		return (ILaunchConfiguration[]) history.toArray(new ILaunchConfiguration[history.size()]);
-	}
-	
-	/**
-	 * Returns the favorite launch configurations in this history, in the order
-	 * they were created.
-	 * 
-	 * @return launch favorites
-	 */
-	public synchronized ILaunchConfiguration[] getFavorites() {
-		return (ILaunchConfiguration[])fFavorites.toArray(new ILaunchConfiguration[fFavorites.size()]);
-	}
-	
-	/**
-	 * Sets this container's favorites.
-	 * 
-	 * @param favorites
-	 */
-	public synchronized void setFavorites(ILaunchConfiguration[] favorites) {
-		fFavorites = new Vector(Arrays.asList(favorites));
-		setSaved(false);
-	}	
-	
-	/**
-	 * Adds the given configuration to the favorites list.
-	 * 
-	 * @param configuration
-	 */
-	public synchronized void addFavorite(ILaunchConfiguration configuration) {
-		if (!fFavorites.contains(configuration)) {
-			fFavorites.add(configuration);
-			setSaved(false);
-		}
-	}
-	
-	/**
-	 * Returns the launch group associated with this history
-	 * 
-	 * @return group
-	 */
-	public ILaunchGroup getLaunchGroup() {
-		return fGroup;
-	}
-	
-	/**
-	 * Returns whether the given configuration is included in the group
-	 * associated with this launch history.
-	 * 
-	 * @param launch
-	 * @return boolean
-	 */
-	public boolean accepts(ILaunchConfiguration configuration) {
-		try {
-			if (!LaunchConfigurationManager.isVisible(configuration)) {
-				return false;
-			}
-			if (configuration.getType().supportsMode(getLaunchGroup().getMode())) {
-				String launchCategory = null;
-				launchCategory = configuration.getCategory();
-				String category = getLaunchGroup().getCategory();
-				if (launchCategory == null || category == null) {
-					return launchCategory == category;
-				}
-				return category.equals(launchCategory);
-			}
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}
-		return false;
-	}	
-	
-	/**
-	 * Notifies all launch histories that the launch history size has changed.
-	 */
-	public static void launchHistoryChanged() {
-		for(Iterator iter = fgLaunchHistoryInstances.iterator(); iter.hasNext();) {
-			((LaunchHistory) iter.next()).resizeHistory();		
-		}
-	}
-	
-	/**
-	 * The max history size has changed - remove any histories if current
-	 * collection is too long.
-	 */
-	protected synchronized void resizeHistory() {
-		int max = getMaxHistorySize() + fFavorites.size();
-		if (fCompleteHistory.size() > max) {
-			fCompleteHistory.setSize(max);
-		}
-	}
-
-	/**
-	 * Returns the maximum number of entries allowed in this history
-	 * 
-	 * @return the maximum number of entries allowed in this history
-	 */
-	protected int getMaxHistorySize() {
-		return DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_HISTORY_SIZE);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationAdded(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationAdded(ILaunchConfiguration configuration) {
-		checkFavorites(configuration);
-	}
-	
-	/**
-	 * Adds the given config to the favorites list if it is a favorite, and
-	 * returns whether the config was added to the favorites list.
-	 * 
-	 * @param configuration
-	 * @return whether added to the favorites list
-	 */
-	protected boolean checkFavorites(ILaunchConfiguration configuration) {
-		// update favorites
-		if (configuration.isWorkingCopy()) {
-			return false;
-		}
-		try {
-			List favoriteGroups = configuration.getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, (List)null);
-			if (favoriteGroups == null) {
-				// check deprecated attributes for backwards compatibility
-				String groupId = getLaunchGroup().getIdentifier();
-				boolean fav = false;
-				if (groupId.equals(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP)) {
-					fav = configuration.getAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, false);
-				} else if (groupId.equals(IDebugUIConstants.ID_RUN_LAUNCH_GROUP)) {
-					fav = configuration.getAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, false);
-				}
-				if (fav) {
-					addFavorite(configuration);
-					return true;
-				} 
-				removeFavorite(configuration);
-				return false;
-			} 
-			else if (favoriteGroups.contains(getLaunchGroup().getIdentifier())) {
-				addFavorite(configuration);
-				return true;
-			} 
-			else {
-				removeFavorite(configuration);
-				return false;
-			}
-		} 
-		catch (CoreException e) {}		
-		return false;
-	}
-	
-	/**
-	 * Removes the given config from the favorites list, if needed.
-	 * 
-	 * @param configuration
-	 */
-	protected synchronized void removeFavorite(ILaunchConfiguration configuration) {
-		fFavorites.remove(configuration);
-		setSaved(false);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationChanged(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationChanged(ILaunchConfiguration configuration) {
-		checkFavorites(configuration);
-	}
-
-	/**
-	 * @see org.eclipse.debug.core.ILaunchConfigurationListener#launchConfigurationRemoved(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void launchConfigurationRemoved(ILaunchConfiguration configuration) {
-		synchronized (this) {	
-			ILaunchConfiguration newConfig = DebugPlugin.getDefault().getLaunchManager().getMovedTo(configuration);
-			if (newConfig == null) {
-				//deleted
-				fCompleteHistory.remove(configuration);
-				fFavorites.remove(configuration);
-			} else {
-				// moved/renamed
-				int index = fCompleteHistory.indexOf(configuration);
-				if (index >= 0) {
-					fCompleteHistory.remove(index);
-					fCompleteHistory.add(index, newConfig);
-				} 
-				index = fFavorites.indexOf(configuration);
-				if (index >= 0) {
-					fFavorites.remove(index);
-					fFavorites.add(index, newConfig);
-				}
-				checkFavorites(newConfig);
-			}
-		}
-		fireLaunchHistoryChanged();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java
deleted file mode 100644
index 200bad4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java
+++ /dev/null
@@ -1,485 +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.debug.internal.ui.launchConfigurations;
- 
-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 java.util.StringTokenizer;
-
-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.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.ExpressionTagNames;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.Pair;
-import org.eclipse.debug.internal.ui.actions.LaunchShortcutAction;
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.IHandlerService;
-
-/**
- * Proxy to a launch shortcut extension
- */
-public class LaunchShortcutExtension implements ILaunchShortcut, IPluginContribution {
-	
-	private ImageDescriptor fImageDescriptor = null;
-	private List fPerspectives = null;
-	private ILaunchShortcut fDelegate = null;
-	private Set fModes = null;
-	private Set fAssociatedTypes = null;
-	private Map fDescriptions = null;
-	private IConfigurationElement fContextualLaunchConfigurationElement = null;
-	private Expression fContextualLaunchExpr = null;
-	private Expression fStandardLaunchExpr = null;
-	
-	/**
-	 * Command handler for launch shortcut key binding.
-	 */
-	private class LaunchCommandHandler extends AbstractHandler {
-	    // the shortcut to invoke
-	    private LaunchShortcutExtension fShortcut;
-	    private String fMode;
-	    
-	    /**
-	     * Constructs a new command handler for the given shortcut
-	     * 
-	     * @param shortcut
-	     */
-	    public LaunchCommandHandler(LaunchShortcutExtension shortcut, String mode) {
-	        fShortcut = shortcut;
-	        fMode = mode;
-	    }
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-           LaunchShortcutAction action = new LaunchShortcutAction(fMode, fShortcut);
-            if (action.isEnabled()) {
-                action.run();
-            } else {
-                fShortcut.launch(new StructuredSelection(), fMode);
-            }
-            return null;
-		}
-	}
-	
-	/**
-	 * The configuration element defining this tab.
-	 */
-	private IConfigurationElement fConfig;
-	private /* <Pair> */ List fContextLabels;
-	
-	/**
-	 * Constructs a launch configuration tab extension based
-	 * on the given configuration element
-	 * 
-	 * @param element the configuration element defining the
-	 *  attributes of this launch configuration tab extension
-	 * @return a new launch configuration tab extension
-	 */
-	public LaunchShortcutExtension(IConfigurationElement element) {
-		setConfigurationElement(element);
-		registerLaunchCommandHandlers();
-	}
-	
-	/**
-	 * Registers command handlers for launch shortcut key bindings
-	 */
-    private void registerLaunchCommandHandlers() {
-        Iterator modes = getModes().iterator();
-        IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getAdapter(IHandlerService.class);
-        while (modes.hasNext()) {
-            String mode = (String) modes.next();
-            String id = getId() + "." + mode; //$NON-NLS-1$
-	        IHandler handler = new LaunchCommandHandler(this, mode);
-	        handlerService.activateHandler(id, handler);
-        }
-    }	
-	
-	/**
-	 * Sets the configuration element that defines the attributes
-	 * for this extension.
-	 * 
-	 * @param element configuration element
-	 */
-	private void setConfigurationElement(IConfigurationElement element) {
-		fConfig = element;
-	}
-	
-	/**
-	 * Returns the configuration element that defines the attributes
-	 * for this extension.
-	 * 
-	 * @param configuration element that defines the attributes
-	 *  for this launch configuration tab extension
-	 */
-	public IConfigurationElement getConfigurationElement() {
-		return fConfig;
-	}
-	
-	/**
-	 * Returns the label of this shortcut
-	 * 
-	 * @return the label of this shortcut, or <code>null</code> if not
-	 *  specified
-	 */
-	public String getLabel() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.LABEL);
-	}
-	
-	/**
-	 * Returns the configuration element for the optional Contextual Launch
-	 * element of this Launch Configuration description.
-	 * @return contextualLaunch element
-	 */
-	public IConfigurationElement getContextualLaunchConfigurationElement() {
-		if (fContextualLaunchConfigurationElement == null) {
-			IConfigurationElement[] elements = getConfigurationElement().getChildren(IConfigurationElementConstants.CONTEXTUAL_LAUNCH);
-			if (elements.length > 0) {
-				// remember so we don't have to hunt again
-				fContextualLaunchConfigurationElement = elements[0];
-			}
-		}
-		return fContextualLaunchConfigurationElement;
-	}
-	/**
-	 * Returns the contextual launch label of this shortcut for the named mode.
-	 * <p>
-	 * <samp>
-	 * <launchShortcut...>
-	 *   <contextualLaunch>
-	 *     <contextLabel mode="run" label="Run Java Application"/>
-	 *     <contextLabel mode="debug" label="Debug Java Application"/>
-	 *     ...
-	 *   </contextualLaunch>
-	 * </launchShortcut>
-	 * </samp>
-	 * 
-	 * @return the contextual label of this shortcut, or <code>null</code> if not
-	 *  specified
-	 */
-	public String getContextLabel(String mode) {
-		// remember the list of context labels for this shortcut
-		if (fContextLabels == null) {
-			IConfigurationElement context = getContextualLaunchConfigurationElement();
-			if (context == null) {
-				return null;
-			}
-			IConfigurationElement[] labels = context.getChildren(IConfigurationElementConstants.CONTEXT_LABEL);
-			fContextLabels = new ArrayList(labels.length);
-			for (int i = 0; i < labels.length; i++) {
-				fContextLabels.add(new Pair(labels[i].getAttribute(IConfigurationElementConstants.MODE),
-						labels[i].getAttribute(IConfigurationElementConstants.LABEL)));
-			}
-		}
-		// pick out the first occurance of the "name" bound to "mode"
-		Iterator iter = fContextLabels.iterator();
-		while (iter.hasNext()) {
-			Pair p = (Pair) iter.next();
-			if (p.firstAsString().equals(mode)) {
-				return p.secondAsString();
-			}
-		}
-		return getLabel();
-	}
-	
-	/**
-	 * Returns the set of associated launch configuration type ids.
-	 * 
-	 * @return the set of associated launch configuration type ids
-	 * @since 3.3
-	 */
-	public Set getAssociatedConfigurationTypes() {
-		if(fAssociatedTypes == null) {
-			fAssociatedTypes = new HashSet();
-			IConfigurationElement[] children = fConfig.getChildren(IConfigurationElementConstants.CONFIGURATION_TYPES);
-			String id = null;
-			for (int i = 0; i < children.length; i++) {
-				id = children[i].getAttribute(IConfigurationElementConstants.ID);
-				if(id != null) {
-					fAssociatedTypes.add(id);
-				}
-			}
-		}
-		return fAssociatedTypes;
-	}
-	
-	/**
-	 * Returns the contributed description of the launch delegate or <code>null</code>
-	 * if one has not been provided
-	 * @param mode the mode to get the description for
-	 * @return the description of the shortcut for that specific mode or <code>null</code> if one was not provided
-	 * 
-	 * @since 3.3
-	 */
-	public String getShortcutDescription(String mode) {
-		if(mode == null) {
-			return null;
-		}
-		if(fDescriptions == null) {
-			fDescriptions = new HashMap();
-			//get the description for the main element first
-			String descr = fConfig.getAttribute(IConfigurationElementConstants.DESCRIPTION);
-			String lmode = null;
-			Set modes = getModes();
-			if(descr != null) {
-				for(Iterator iter = modes.iterator(); iter.hasNext();) {
-					lmode = (String) iter.next();
-					fDescriptions.put(lmode, descr);
-				}
-			}
-			//load descriptions for child description elements
-			IConfigurationElement[] children = fConfig.getChildren(IConfigurationElementConstants.DESCRIPTION);
-			for(int i = 0; i < children.length; i++) {
-				lmode = children[i].getAttribute(IConfigurationElementConstants.MODE);
-				descr = children[i].getAttribute(IConfigurationElementConstants.DESCRIPTION);
-				fDescriptions.put(lmode, descr);
-			}
-		}
-		return (String) fDescriptions.get(mode);
-	}
-	
-	/**
-	 * Evaluate the given expression within the given context and return
-	 * the result. Returns <code>true</code> iff result is either TRUE or NOT_LOADED.
-	 * This allows optimistic inclusion of shortcuts before plugins are loaded.
-	 * Returns <code>false</code> if exp is <code>null</code>.
-	 * 
-	 * @param exp the enablement expression to evaluate or <code>null</code>
-	 * @param context the context of the evaluation. Usually, the
-	 *  user's selection.
-	 * @return the result of evaluating the expression
-	 * @throws CoreException
-	 */
-	public boolean evalEnablementExpression(IEvaluationContext context, Expression exp) throws CoreException {
-		return (exp != null) ? ((exp.evaluate(context)) != EvaluationResult.FALSE) : false;
-	}
-	
-	/**
-	 * Returns an expression that represents the enablement logic for the
-	 * contextual launch element of this launch shortcut description or
-	 * <code>null</code> if none.
-	 * @return an evaluatable expression or <code>null</code>
-	 * @throws CoreException if the configuration element can't be
-	 *  converted. Reasons include: (a) no handler is available to
-	 *  cope with a certain configuration element or (b) the XML
-	 *  expression tree is malformed.
-	 */
-	public Expression getContextualLaunchEnablementExpression() throws CoreException {
-		// all of this stuff is optional, so...tedious testing is required
-		if (fContextualLaunchExpr == null) {
-			IConfigurationElement contextualLaunchElement = getContextualLaunchConfigurationElement();
-			if (contextualLaunchElement == null) {
-				// not available
-				return null;
-			}
-			IConfigurationElement[] elements = contextualLaunchElement.getChildren(ExpressionTagNames.ENABLEMENT);
-			IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-
-			if (enablement != null) {
-				fContextualLaunchExpr= ExpressionConverter.getDefault().perform(enablement);
-			}
-		}
-		return fContextualLaunchExpr;
-	}
-	
-	/**
-	 * Returns an expression that represents the enablement logic for the
-	 * launch shortcut description or <code>null</code> if none.
-	 * @return an evaluatable expression or <code>null</code>
-	 * @throws CoreException if the configuration element can't be
-	 *  converted. Reasons include: (a) no handler is available to
-	 *  cope with a certain configuration element or (b) the XML
-	 *  expression tree is malformed.
-	 */
-	public Expression getShortcutEnablementExpression() throws CoreException {
-		// all of this stuff is optional, so...tedious testing is required
-		if (fStandardLaunchExpr == null) {
-			IConfigurationElement[] elements = getConfigurationElement().getChildren(ExpressionTagNames.ENABLEMENT);
-			IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-			if (enablement != null) {
-				fStandardLaunchExpr= ExpressionConverter.getDefault().perform(enablement);
-			}
-		}
-		return fStandardLaunchExpr;
-	}	
-	
-	/**
-	 * Returns the id of this shortcut
-	 * 
-	 * @return the id of this shortcut, or <code>null</code> if not specified
-	 */
-	public String getId() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.ID);
-	}
-	
-	/**
-	 * Returns the identifier of the help context associated with this launch
-	 * shortcut, or <code>null</code> if one was not specified.
-	 * 
-	 * @return the identifier of this launch shortcut's help context or
-	 * <code>null</code>
-	 * @since 2.1
-	 */	
-	public String getHelpContextId() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.HELP_CONTEXT_ID);		
-	}
-	
-	/**
-	 * Returns the category of this shortcut
-	 *
-	 * @return the category of this shortcut, or <code>null</code> if not
-	 *  specified
-	 */
-	public String getCategory() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.CATEGORY);
-	}	
-	
-	/**
-	 * Returns the image for this shortcut, or <code>null</code> if none
-	 * 
-	 * @return the image for this shortcut, or <code>null</code> if none
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		if (fImageDescriptor == null) {
-			fImageDescriptor = DebugUIPlugin.getImageDescriptor(getConfigurationElement(), "icon"); //$NON-NLS-1$
-			if (fImageDescriptor == null) {
-				fImageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-		}
-		return fImageDescriptor;
-	}
-	
-	/**
-	 * Returns the perspectives this shortcut is registered for.
-	 * 
-	 * @return list of Strings representing perspective identifiers 
-	 * @deprecated The use of the perspectives element has been deprecated since 3.1.
-	 */
-	public List getPerspectives() {
-		if (fPerspectives == null) {
-			IConfigurationElement[] perspectives = getConfigurationElement().getChildren(IConfigurationElementConstants.PERSPECTIVE);
-			fPerspectives = new ArrayList(perspectives.length);
-			for (int i = 0; i < perspectives.length; i++) {
-				fPerspectives.add(perspectives[i].getAttribute(IConfigurationElementConstants.ID)); 
-			}
-		}
-		return fPerspectives;
-	}
-	
-	/**
-	 * Returns this shortcut's delegate, or <code>null</code> if none
-	 * 
-	 * @return this shortcut's delegate, or <code>null</code> if none
-	 */
-	protected ILaunchShortcut getDelegate() {
-		if (fDelegate == null) {
-			try {
-				fDelegate = (ILaunchShortcut)fConfig.createExecutableExtension(IConfigurationElementConstants.CLASS);
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), LaunchConfigurationsMessages.LaunchShortcutExtension_Error_4, LaunchConfigurationsMessages.LaunchShortcutExtension_Unable_to_use_launch_shortcut_5, e.getStatus()); // 
-			}
-		}
-		return fDelegate;
-	}
-	
-	/**
-	 * @see ILaunchShortcut#launch(IEditorPart, String)
-	 */
-	public void launch(IEditorPart editor, String mode) {
-		ILaunchShortcut shortcut = getDelegate();
-		if (shortcut != null) {
-			shortcut.launch(editor, mode);
-		}
-	}
-
-	/**
-	 * @see ILaunchShortcut#launch(ISelection, String)
-	 */
-	public void launch(ISelection selection, String mode) {
-		ILaunchShortcut shortcut = getDelegate();
-		if (shortcut != null) {
-			shortcut.launch(selection, mode);
-		}		
-	}
-	
-	/**
-	 * Returns the set of modes this shortcut supports.
-	 * 
-	 * @return the set of modes this shortcut supports
-	 */
-	public Set getModes() {
-		if (fModes == null) {
-			String modes= getConfigurationElement().getAttribute(IConfigurationElementConstants.MODES);
-			if (modes == null) {
-				return new HashSet(0);
-			}
-			StringTokenizer tokenizer= new StringTokenizer(modes, ","); //$NON-NLS-1$
-			fModes = new HashSet(tokenizer.countTokens());
-			while (tokenizer.hasMoreTokens()) {
-				fModes.add(tokenizer.nextToken().trim());
-			}
-		}
-		return fModes;
-	}
-	
-	/**
-	 * Returns the menu path attribute this shortcut, or <code>null</code> if none
-	 * 
-	 * @return the menu path attribute this shortcut, or <code>null</code> if none
-	 * @since 3.0.1
-	 */
-	public String getMenuPath() {
-		return getConfigurationElement().getAttribute(IConfigurationElementConstants.PATH);
-	}	
-	
-	/*
-	 * Only for debugging
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getId();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
-	 */
-	public String getLocalId() {
-		return getId();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-	 */
-	public String getPluginId() {
-		return fConfig.getContributor().getName();
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java
deleted file mode 100644
index 39526f3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.internal.ui.AbstractDebugListSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.StructuredViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Specialized dialog for showing/selecting a specific launch shortcut extension, and allowing it
- * to be marked to be set as the default
- * 
- * @see {@link org.eclipse.debug.internal.ui.actions.ContextLaunchingAction}
- * 
- * @since 3.3
- * CONTEXTLAUNCHING
- */
-public class LaunchShortcutSelectionDialog extends AbstractDebugListSelectionDialog {
-
-	private static final String DIALOG_SETTINGS = IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCH_SHORTCUT_DIALOG"; //$NON-NLS-1$;
-	
-	/**
-	 * The list of input for the dialog
-	 */
-	private String fModeName = null;
-	private String fMode = null;
-	private IResource fResource = null;
-	private List fShortcuts = null;
-	private Text fDescriptionText = null;
-	
-	/**
-	 * Constructor
-	 * @param input
-	 * @param resource
-	 * @param mode
-	 */
-	public LaunchShortcutSelectionDialog(List shortcuts, IResource resource, String mode) {
-		super(DebugUIPlugin.getShell());
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fShortcuts = shortcuts;
-		fResource = resource;
-		fMode = mode;
-		ILaunchMode lmode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(mode);
-		fModeName = mode;
-		if (lmode != null) {
-			fModeName = DebugUIPlugin.removeAccelerators(lmode.getLabel());
-		}
-		setTitle(MessageFormat.format(LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_0, new String[] {fModeName}));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SELECT_LAUNCH_METHOD_DIALOG;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-	 */
-	protected String getDialogSettingsId() {
-		return DIALOG_SETTINGS;
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugListSelectionDialog#addViewerListeners(org.eclipse.jface.viewers.StructuredViewer)
-	 */
-	protected void addViewerListeners(StructuredViewer viewer) {
-		super.addViewerListeners(viewer);
-		viewer.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection selection = event.getSelection();
-				if (!selection.isEmpty()) {
-					LaunchShortcutExtension shortcutSource = (LaunchShortcutExtension) ((IStructuredSelection)selection).getFirstElement();
-					String description = shortcutSource.getShortcutDescription(fMode);
-					fDescriptionText.setText((description == null ? LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_3 : description)); 
-				}
-			}
-		});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#addCustomFooterControls(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void addCustomFooterControls(Composite parent) {
-		super.addCustomFooterControls(parent);
-		Group group = SWTFactory.createGroup(parent, LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_2, 1, 1, GridData.FILL_BOTH);
-		GridData gd = (GridData) group.getLayoutData();
-		gd.heightHint = 100;
-		fDescriptionText = SWTFactory.createText(group, SWT.WRAP | SWT.READ_ONLY, 1, GridData.FILL_BOTH);
-		fDescriptionText.setBackground(group.getBackground());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-	 */
-	protected Object getViewerInput() {
-		return fShortcuts;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-	 */
-	protected String getViewerLabel() {
-		if(fResource == null) {
-			return MessageFormat.format(LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_4, new String[] {fModeName.toLowerCase()});
-		}
-		else {
-			return MessageFormat.format(LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_1, new String[] {fModeName.toLowerCase(), fResource.getName()});
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugListSelectionDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		getButton(IDialogConstants.OK_ID).setEnabled(!getViewer().getSelection().isEmpty());
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchTabContribution.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchTabContribution.java
deleted file mode 100644
index b6bfec2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchTabContribution.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.internal.ui.LaunchConfigurationTabExtension;
-import org.eclipse.ui.IPluginContribution;
-
-/**
- * This class provides a wrapper for a launch tab contribution so that it can be filtered from the UI 
- * via the use of capabilities
- * 
- * @since 3.3
- */
-public class LaunchTabContribution implements IPluginContribution {
-
-	LaunchConfigurationTabExtension fTab = null;
-	
-	public LaunchTabContribution(LaunchConfigurationTabExtension tab) {
-		fTab = tab;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
-	 */
-	public String getLocalId() {
-		return fTab.getIdentifier();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-	 */
-	public String getPluginId() {
-		return fTab.getPluginIdentifier();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/MultiLaunchGroupFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/MultiLaunchGroupFilter.java
deleted file mode 100644
index 7ca6555..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/MultiLaunchGroupFilter.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * This class extends <code>LaunchGroupFilter</code> by allowing more than one launch group to be used in 
- * the filtering
- * 
- * @since 3.2
- */
-public class MultiLaunchGroupFilter extends ViewerFilter {
-
-	/**
-	 * array of launchgroup extensions to test for filtering against
-	 */
-	private LaunchGroupExtension[] fGroups;
-	
-	public MultiLaunchGroupFilter(LaunchGroupExtension[] groups) {
-		fGroups = groups;
-	}                                                
-	
-	/* (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) {
-		ILaunchConfigurationType type = null;
-		ILaunchConfiguration config = null;
-		boolean priv = false;
-		if (parentElement instanceof ILaunchConfigurationType) {
-			type = (ILaunchConfigurationType)parentElement;
-		}
-		if (element instanceof ILaunchConfigurationType) {
-			type = (ILaunchConfigurationType)element;
-			priv = !type.isPublic();
-		}
-		if (element instanceof ILaunchConfiguration) {
-			config = (ILaunchConfiguration)element;
-			try {
-				type = config.getType();
-				priv = config.getAttribute(IDebugUIConstants.ATTR_PRIVATE, false);
-			} 
-			catch (CoreException e) {}
-		}
-		if (type != null) {
-			return !priv && equalModes(type) && equalCategories(type.getCategory()) && !WorkbenchActivityHelper.filterItem(new LaunchConfigurationTypeContribution(type));
-		}
-		return false;
-	}
-
-	/**
-	 * compares a mode against the modes form the list of group modes
-	 * @param mode the mode to compare
-	 * @return true if the mode matches any one of the modes in the listing, false otherwise
-	 */
-	private boolean equalModes(ILaunchConfigurationType type) {
-		for(int i = 0; i < fGroups.length; i++) {
-			if(type.supportsMode(fGroups[i].getMode())) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * compares a category against those passed in the creation of the filter
-	 * @param category the category to compare
-	 * @return true if the category matches any one fo the categories in the listing, false otherwise
-	 */
-	private boolean equalCategories(String category) {
-		String lcat = null;
-		for(int i = 0; i < fGroups.length; i++) {
-			lcat = fGroups[i].getCategory();
-			if(category == null || lcat == null) {
-				if(category == lcat) {
-					return true;
-				}
-			}
-			else {
-				if(category.equals(lcat)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/OrganizeFavoritesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/OrganizeFavoritesAction.java
deleted file mode 100644
index 5991d5e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/OrganizeFavoritesAction.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.debug.internal.ui.launchConfigurations;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.Action;
-
-/**
- * OrganizeFavoritesAction
- */
-public class OrganizeFavoritesAction extends Action {
-	
-	// launch group identifier
-	private String fGroupId; 
-	
-	/**
-	 * @param text
-	 */
-	public OrganizeFavoritesAction(String launchGroupId) {
-		super(LaunchConfigurationsMessages.OrganizeFavoritesAction_0); 
-		fGroupId = launchGroupId;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		LaunchHistory history = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchHistory(fGroupId);
-		FavoritesDialog dialog = new FavoritesDialog(DebugUIPlugin.getShell(), history);
-		dialog.open();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java
deleted file mode 100644
index 8a1d2dd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java
+++ /dev/null
@@ -1,1057 +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.debug.internal.ui.launchConfigurations;
-
-
-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 javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.views.ViewContextManager;
-import org.eclipse.debug.internal.ui.views.ViewContextService;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.ISuspendTrigger;
-import org.eclipse.debug.ui.contexts.ISuspendTriggerListener;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * The perspective manager manages the 'perspective' settings
- * defined by launch configurations. Specifically it: 
- * <ul>
- * <li>changes perspectives as launches are registered</li>
- * <li>change perspective when a thread suspends</li>
- * </ul>
- * 
- * Since 3.3 the Perspectives Manager is an <code>ISaveParticipant</code>, allowing it to participate in
- * workspace persistence life-cycles.
- * 
- * @see IDebugUIContants.ATTR_RUN_PERSPECTIVE
- * @see IDebugUIContants.ATTR_DEBUG_PERSPECTIVE
- * @see ISaveParticipant
- * @see ISuspendTriggerListener
- * @see ILaunchListener
- * @see org.eclipse.debug.internal.ui.preferences.LaunchPerspectivePreferencePage
- * @see DebugUIPlugin
- */
-public class PerspectiveManager implements ILaunchListener, ISuspendTriggerListener, ISaveParticipant {
-		
-	/**
-	 * Lock used to synchronize perspective switching with view activation.
-	 * Clients wanting to perform an action after a perspective switch should
-	 * schedule jobs with the perspective manager via #schedulePostSwitch(..)
-	 */
-	public class PerspectiveSwitchLock {
-
-		private int fSwitch = 0;
-		private List fJobs = new ArrayList();
-		
-		public synchronized void startSwitch() {
-			fSwitch++;
-		}
-		
-		public synchronized void endSwitch() {
-			fSwitch--;
-			if (fSwitch == 0) {
-				Iterator jobs = fJobs.iterator();
-				while (jobs.hasNext()) {
-					((Job)jobs.next()).schedule();
-				}
-				fJobs.clear();
-			}
-		}
-				
-		public synchronized void schedulePostSwitch(Job job) {
-			if (fSwitch > 0) {
-				fJobs.add(job);	
-			} 
-			else {
-				job.schedule();
-			}
-		}
-	}
-	
-	/**
-	 * Describes exactly one perspective context, which is composed of an <code>ILaunchCOnfigurationType</code>, and set of modes
-	 * and an <code>ILaunchDelegate</code>. Perspective ids are then cached for a context based on mode set.
-	 * 
-	 * @since 3.3
-	 */
-	class PerspectiveContext {
-		
-		private ILaunchConfigurationType fType = null;
-		private ILaunchDelegate fDelegate = null;
-		private Map fPerspectives = null;
-		
-		/**
-		 * Constructor
-		 * @param type
-		 * @param delegate
-		 * @param modes
-		 */
-		public PerspectiveContext(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes) {
-			fType = type;
-			fDelegate = delegate;
-			fPerspectives = new HashMap();
-			fPerspectives.put(modes, null);
-		}
-		
-		/**
-		 * We can specially compare two cases:
-		 * <ol>
-		 * <li>a launch object</li>
-		 * <li>an object array of the form [IlaunchConfigurationType, ILaunchDelegate, Set]</li>
-		 * </ol>
-		 * @see java.lang.Object#equals(java.lang.Object)
-		 */
-		public boolean equals(Object object) {
-			ILaunchDelegate delegate = null;
-			ILaunchConfigurationType type = null;
-			if(object instanceof ILaunch) {
-				try {
-					ILaunch launch = (ILaunch) object;
-					type = launch.getLaunchConfiguration().getType();
-					delegate = resolveLaunchDelegate(launch);
-				} 
-				catch (CoreException e) {return false;}
-			}
-			else if(object instanceof PerspectiveContext) {
-				PerspectiveContext context = (PerspectiveContext) object;
-				type = context.getLaunchConfigurationType();
-				delegate = context.getLaunchDelegate();
-			}
-			if(fType != null && type != null && fType.getIdentifier().equals(type.getIdentifier())) {
-				if(fDelegate == null) {
-					return delegate == null;
-				}
-				else {
-					return fDelegate.equals(delegate);
-				}
-			}
-			return super.equals(object);
-		}
-		
-		public ILaunchConfigurationType getLaunchConfigurationType() {return fType;}
-		public ILaunchDelegate getLaunchDelegate() {return fDelegate;}
-		public Map getPersepctiveMap() {return fPerspectives;}
-		
-		/**
-		 * Creates a new mapping of the specified perspective id to the specified mode set.
-		 * If a mapping for the modeset already exists it is over-written.
-		 * @param modes the set of modes 
-		 * @param pid the id of the perspective
-		 */
-		public void setPerspective(Set modes, String pid) {
-			if(fPerspectives == null) {
-				fPerspectives = new HashMap();
-			}
-			fPerspectives.put(modes, pid);
-		}
-		
-		/**
-		 * Returns the perspective id associated with the given mode set
-		 * @param modes the set of mode
-		 * @return the perspective id associated with the given mode set, or
-		 * <code>null</code>, if there isn't one
-		 */
-		public String getPerspective(Set modes) {
-			if(fPerspectives != null) {
-				return (String) fPerspectives.get(modes);
-			}
-			return null;
-		}
-	}
-	
-	/**
-	 * A listing of <code>PerspectiveContext</code>s
-	 * 
-	 * @since 3.3
-	 */
-	private Set fPerspectiveContexts = null;
-	
-	/**
-	 * id for the 'delegate' attribute
-	 * 
-	 * @since 3.3
-	 */
-	public static final String ATTR_DELEGATE_ID = "delegate"; //$NON-NLS-1$
-
-	/**
-	 * Flag used to indicate that the user is already being prompted to
-	 * switch perspectives. This flag allows us to not open multiple
-	 * prompts at the same time.
-	 */
-	private boolean fPrompting;
-	
-	/**
-	 * Lock to sync other jobs on the perspective switch
-	 */
-	private PerspectiveSwitchLock fPerspectiveSwitchLock = new PerspectiveSwitchLock();
-    
-    /**
-     * Maps each launch to its perspective context activation. These
-     * are disabled when a launch terminates.
-     */
-    private Map fLaunchToContextActivations = new HashMap();
-
-	/**
-	 * Called by the debug ui plug-in on startup.
-	 * The perspective manager starts listening for
-	 * launches to be registered.
-	 */
-	public void startup() {
-		DebugUIPlugin.getDefault().addSaveParticipant(this);
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-		initPerspectives();
-	}
-
-	/**
-	 * Called by the debug ui plug-in on shutdown.
-	 * The perspective manager de-registers as a 
-	 * launch listener.
-	 */
-	public void shutdown() {
-		DebugUIPlugin.getDefault().removeSaveParticipant(this);
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-	}
-	
-	/**
-	 * If there are no launches, remove the Suspend Trigger Listener
-	 * 
-	 * @see ILaunchListener#launchRemoved(ILaunch)
-	 */
-	public synchronized void launchRemoved(final ILaunch launch) {
-        ISuspendTrigger trigger = (ISuspendTrigger) launch.getAdapter(ISuspendTrigger.class);
-        if (trigger != null) {
-            trigger.removeSuspendTriggerListener(this);
-        }
-        Runnable r= new Runnable() {
-			public void run() {
-		        IContextActivation[] activations = (IContextActivation[]) fLaunchToContextActivations.remove(launch);
-		        if (activations != null) {
-		        	for (int i = 0; i < activations.length; i++) {
-						IContextActivation activation = activations[i];
-						activation.getContextService().deactivateContext(activation);
-					}
-		        }
-			}
-		};
-		async(r);
-	}
-	
-	/**
-	 * Do nothing.
-	 * 
-	 * @see ILaunchListener#launchChanged(ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {}	
-
-	/** 
-	 * Switch to the perspective specified by the
-	 * launch configuration.
-	 * 
-	 * @see ILaunchListener#launchAdded(ILaunch)
-	 */
-	public synchronized void launchAdded(ILaunch launch) {
-        ISuspendTrigger trigger = (ISuspendTrigger) launch.getAdapter(ISuspendTrigger.class);
-        if (trigger != null) {
-            trigger.addSuspendTriggerListener(this);
-        }
-	    fPerspectiveSwitchLock.startSwitch();
-		String perspectiveId = null;
-		// check event filters
-		try {
-			perspectiveId = getPerspectiveId(launch);
-		} 
-		catch (CoreException e) {
-			String name = DebugUIPlugin.getModelPresentation().getText(launch);
-			switchFailed(e, name);
-		}
-		// don't switch if a private config
-		ILaunchConfiguration configuration = launch.getLaunchConfiguration();
-		if (configuration != null) {
-			if (!LaunchConfigurationManager.isVisible(configuration)) {
-				perspectiveId = null;
-			}
-		}
-		final String id = perspectiveId;
-		// switch
-		async(new Runnable() {
-			public void run() {
-				try {
-					IWorkbenchWindow window = getWindowForPerspective(id);
-					if (id != null && window != null && shouldSwitchPerspective(window, id, IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE)) {
-						switchToPerspective(window, id);
-					}
-				}
-				finally {
-					fPerspectiveSwitchLock.endSwitch();
-				}
-			}
-		});
-	}
-
-
-	/**
-	 * Switches to the specified perspective
-	 * 
-	 * @param id perspective identifier
-	 */
-	protected void switchToPerspective(IWorkbenchWindow window, String id) {
-		try {
-			window.getWorkbench().showPerspective(id, window);
-		} catch (WorkbenchException e) {
-			DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(),
-			LaunchConfigurationsMessages.PerspectiveManager_Error_1,  
-			MessageFormat.format(LaunchConfigurationsMessages.PerspectiveManager_Unable_to_switch_to_perspective___0__2, new String[]{id}), 
-			e);
-		}
-	}
-	
-	/**
-	 * Utility method to submit an asynchronous runnable to the UI
-	 */
-	protected void async(Runnable r) {
-		Display d = DebugUIPlugin.getStandardDisplay();
-		if (d != null && !d.isDisposed()) {
-			d.asyncExec(r);
-		}
-	}
-	
-	/**
-	 * Utility method to submit a synchronous runnable to the UI
-	 */
-	protected void sync(Runnable r) {
-		Display d = DebugUIPlugin.getStandardDisplay();
-		if (d != null && !d.isDisposed()) {
-			d.syncExec(r);
-		}
-	}	
-
-	/**
-	 * Reports failure to switch perspectives to the user
-	 * 
-	 * @param status exception status describing failure
-	 * @param launchName the name of the launch that the
-	 *  failure is associated with
-	 */
-	protected void switchFailed(final Throwable t, final String launchName) {
-		sync(new Runnable() {
-			public void run() {
-				DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), LaunchConfigurationsMessages.PerspectiveManager_Error_1,  
-				 MessageFormat.format(LaunchConfigurationsMessages.PerspectiveManager_Unable_to_switch_perpsectives_as_specified_by_launch___0__4, new String[] {launchName}), 
-				 t);
-			}});
-	}
-	
-	/**
-	 * A breakpoint has been hit. Carry out perspective switching
-	 * as appropriate for the given debug event. 
-	 * 
-	 * @param event the suspend event
-	 */
-	private void handleBreakpointHit(final ILaunch launch) {
-		
-		// Must be called here to indicate that the perspective
-		// may be switching.
-		// Putting this in the async UI call will cause the Perspective
-		// Manager to turn on the lock too late.  Consequently, LaunchViewContextListener
-		// may not know that the perspective will switch and will open view before
-		// the perspective switch.
-		fPerspectiveSwitchLock.startSwitch();
-		
-		String perspectiveId = null;
-		try {
-			perspectiveId = getPerspectiveId(launch);
-		} 
-		catch (CoreException e) {DebugUIPlugin.log(e);}
-		// if no perspective specified, always switch to debug
-		// perspective 
-
-		// this has to be done in an async, such that the workbench
-		// window can be accessed
-		final String targetId = perspectiveId;
-		Runnable r = new Runnable() {
-			public void run() {
-				IWorkbenchWindow window = null;
-				try{
-					if (targetId != null) {
-						// get the window to open the perspective in
-						window = getWindowForPerspective(targetId);
-						if (window == null) {
-							return;
-						}
-						
-						// switch the perspective if user preference is set
-						if (shouldSwitchPerspective(window, targetId, IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND)) {
-							switchToPerspective(window, targetId);
-							window = getWindowForPerspective(targetId);
-							if (window == null) {
-								return;
-							}
-						}
-						
-						// make sure the shell is active
-						Shell shell= window.getShell();
-						if (shell != null) {
-							if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_ACTIVATE_WORKBENCH)) {
-								if (shell.getMinimized()) {
-									shell.setMinimized(false);
-								}
-								shell.forceActive();
-							}
-						}
-	
-						// Activate a context for the launch
-						Object ca = fLaunchToContextActivations.get(launch);
-						if (ca == null) {
-							ILaunchConfiguration launchConfiguration = launch.getLaunchConfiguration();
-							if (launchConfiguration != null) {
-								try {
-									String type = launchConfiguration.getType().getIdentifier();
-									ViewContextService service = ViewContextManager.getDefault().getService(window);
-									if (service != null) {
-										IContextService contextServce = (IContextService) PlatformUI.getWorkbench().getAdapter(IContextService.class);
-										String[] ids = service.getEnabledPerspectives();
-										IContextActivation[] activations = new IContextActivation[ids.length];
-										for (int i = 0; i < ids.length; i++) {
-											// Include the word '.internal.' so the context is filtered from the key binding pref page (Bug 144019) also see ViewContextService.contextActivated()
-											Context context = contextServce.getContext(type + ".internal." + ids[i]); //$NON-NLS-1$
-											if (!context.isDefined()) {
-												context.define(context.getId(), null, null);
-											}
-											IContextActivation activation = contextServce.activateContext(context.getId());
-											activations[i] = activation;
-										}
-										fLaunchToContextActivations.put(launch, activations);
-									}
-								} catch (CoreException e) {
-									DebugUIPlugin.log(e);
-								}
-							}
-						}
-
-					}
-					if (window != null && DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW)) {
-						ViewContextService service = ViewContextManager.getDefault().getService(window);
-						service.showViewQuiet(IDebugUIConstants.ID_DEBUG_VIEW);
-					}
-				}
-				finally
-				{
-					fPerspectiveSwitchLock.endSwitch();
-				}
-			}
-		};
-		async(r);
-	}
-	
-	/**
-	 * Returns the workbench window in which the given perspective
-	 * should be shown. First, check the current window to see if it
-	 * is already showing the perspective. Then check any other windows.
-	 * 
-	 * @param perspectiveId the perspective identifier
-	 * @return which window the given perspective should be shown in
-	 *  or <code>null</code> if there are no windows available
-	 */
-	private IWorkbenchWindow getWindowForPerspective(String perspectiveId) {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (isWindowShowingPerspective(window, perspectiveId)) {
-			return window;
-		}
-		IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-		for (int i = 0; i < windows.length; i++) {
-			window = windows[i];
-			if (isWindowShowingPerspective(window, perspectiveId)) {
-				return window;
-			}
-		}
-		window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window != null) {
-			return window;
-		}
-		if (windows.length > 0) {
-			return windows[0];
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns if the specified window is showing the perspective denoted by the specified id
-	 * @param window the window to query
-	 * @param perspectiveId the perspective to ask about
-	 * @return true if the specified window is showing the perspective, false otherwise
-	 */
-	private boolean isWindowShowingPerspective(IWorkbenchWindow window, String perspectiveId) {
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				IPerspectiveDescriptor perspectiveDescriptor = page.getPerspective();
-				if (perspectiveDescriptor != null && perspectiveDescriptor.getId().equals(perspectiveId)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns whether or not the user wishes to switch to the specified
-	 * perspective when a launch occurs.
-	 * 
-	 * @param perspectiveName the name of the perspective that will be presented
-	 *  to the user for confirmation if they've asked to be prompted about
-	 *  perspective switching
-	 * @param message a message to be presented to the user. This message is expected to
-	 *  contain a slot for the perspective name to be inserted ("{0}").
-	 * @param preferenceKey the preference key of the perspective switching preference
-	 * @return whether or not the user wishes to switch to the specified perspective
-	 *  automatically
-	 */
-	private boolean shouldSwitchPerspective(IWorkbenchWindow window, String perspectiveId, String preferenceKey) {
-		if (isCurrentPerspective(window, perspectiveId)) {
-			return false;
-		}
-		String perspectiveName = getPerspectiveLabel(perspectiveId);
-		if (perspectiveName == null) {
-			return false;
-		}
-		String perspectiveDesc = getPerspectiveDescription(perspectiveId);
-		String[] args;
-		if (perspectiveDesc != null) {
-			args = new String[] { perspectiveName , perspectiveDesc };
-		}
-		else { 
-			args = new String[] { perspectiveName };
-		}
-		String switchPerspective = DebugUIPlugin.getDefault().getPreferenceStore().getString(preferenceKey);
-		if (MessageDialogWithToggle.ALWAYS.equals(switchPerspective)) {
-			return true;
-		} else if (MessageDialogWithToggle.NEVER.equals(switchPerspective)) {
-			return false;
-		}
-		
-		Shell shell= window.getShell();
-		if (shell == null || fPrompting) {
-			return false;
-		}
-		fPrompting= true;
-		// Activate the shell if necessary so the prompt is visible
-		if (shell.getMinimized()) {
-			shell.setMinimized(false);
-		}
-		if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_ACTIVATE_WORKBENCH)) {
-			shell.forceActive();
-		}
-		String message = ""; //$NON-NLS-1$
-		if(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND.equals(preferenceKey)) {
-			if (getPerspectiveDescription(perspectiveId) != null) {
-				message = LaunchConfigurationsMessages.PerspectiveManager_suspend_description;
-			}
-			else {
-				message = LaunchConfigurationsMessages.PerspectiveManager_13;
-			}
-		}
-		else if(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE.equals(preferenceKey)) {
-			if (getPerspectiveDescription(perspectiveId) != null) {
-				message = LaunchConfigurationsMessages.PerspectiveManager_launch_description;
-			}
-			else {
-				message = LaunchConfigurationsMessages.PerspectiveManager_15;
-			}
-		}
-		MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(shell, LaunchConfigurationsMessages.PerspectiveManager_12, MessageFormat.format(message, args), null, false, DebugUIPlugin.getDefault().getPreferenceStore(), preferenceKey); 
-		boolean answer = (dialog.getReturnCode() == IDialogConstants.YES_ID);
-		synchronized (this) {
-			fPrompting= false;
-			notifyAll();
-		}
-		if (isCurrentPerspective(window, perspectiveId)) {
-			answer = false;
-		}
-		return answer;
-	}
-	
-	/**
-	 * Returns whether the given perspective identifier matches the
-	 * identifier of the current perspective.
-	 * 
-	 * @param perspectiveId the identifier
-	 * @return whether the given perspective identifier matches the
-	 *  identifier of the current perspective
-	 */
-	protected boolean isCurrentPerspective(IWorkbenchWindow window, String perspectiveId) {
-		boolean isCurrent= false;
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				IPerspectiveDescriptor perspectiveDescriptor = page.getPerspective();
-				if (perspectiveDescriptor != null) {
-					isCurrent= perspectiveId.equals(perspectiveDescriptor.getId());
-				}
-			}
-		}
-		return isCurrent;
-	}
-	
-	/**
-	 * Returns the label of the perspective with the given identifier or
-	 * <code>null</code> if no such perspective exists.
-	 * 
-	 * @param perspectiveId the identifier
-	 * @return the label of the perspective with the given identifier or
-	 *  <code>null</code> if no such perspective exists 
-	 */
-	protected String getPerspectiveLabel(String perspectiveId) {
-		IPerspectiveDescriptor newPerspective = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
-		if (newPerspective == null) {
-			return null;
-		}
-		return newPerspective.getLabel();
-	}
-
-	
-	/**
-	 * Returns the label of the perspective with the given identifier or
-	 * <code>null</code> if no such perspective exists.
-	 * 
-	 * @param perspectiveId the identifier
-	 * @return the label of the perspective with the given identifier or
-	 *  <code>null</code> if no such perspective exists 
-	 */
-	protected String getPerspectiveDescription(String perspectiveId) {
-		IPerspectiveDescriptor newPerspective = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
-		if (newPerspective == null) {
-			return null;
-		}
-		return newPerspective.getDescription();
-	}
-	
-	/** 
-	 * Returns the perspective associated with the
-	 * given launch, or <code>null</code> if none.
-	 * 
-	 * @param launch a launch
-	 * @return the perspective associated with the launch,
-	 * 	or <code>null</code>
-	 * @exception CoreException if unable to retrieve a required
-	 *  launch configuration attribute
-	 */
-	protected String getPerspectiveId(ILaunch launch) throws CoreException {
-		if (launch == null) {
-			return null;
-		}
-		ILaunchConfiguration config = launch.getLaunchConfiguration();
-		if (config == null) {
-			return null;
-		}
-		Set modes = launch.getLaunchConfiguration().getModes();
-		modes.add(launch.getLaunchMode());
-		String perspectiveId = getLaunchPerspective(config.getType(), modes, resolveLaunchDelegate(launch));
-		if (perspectiveId != null && perspectiveId.equals(IDebugUIConstants.PERSPECTIVE_NONE)) {
-			perspectiveId = null;
-		}
-		return perspectiveId;
-	}
-	
-	/**
-	 * Returns the id of the perspective associated with the given type and set of modes. Passing <code>null</code> for 
-	 * the launch delegate results in the default perspective id being returned (if there is one).
-	 * @param type the type we are launching
-	 * @param modes the set of modes the type was launched with
-	 * @param delegate the delegate performing the launch for this type and modeset
-	 * @return the id of the perspective for the given launch configuration type, modeset and launch delegate
-	 * 
-	 * @since 3.3
-	 */
-	public String getLaunchPerspective(ILaunchConfigurationType type, Set modes, ILaunchDelegate delegate) {
-		String id = null;
-		PerspectiveContext context = findContext(new PerspectiveContext(type, delegate, modes));
-		if(context == null || (context != null && !context.getPersepctiveMap().containsKey(modes))) {
-			//try with a null delegate, denoting the perspective for the type
-			context = findContext(new PerspectiveContext(type, null, modes));
-			if(context == null || (context != null && !context.getPersepctiveMap().containsKey(modes))) {
-				//last resort, try the default perspective
-				return getDefaultLaunchPerspective(type, delegate, modes);
-			}
-		}
-		if(context != null) {
-			id = context.getPerspective(modes);
-		}
-		return id;
-	}
-	
-	/**
-	 * Returns the perspective to switch to when a configuration of the given type
-	 * is launched in the given mode, or <code>null</code> if no switch should take
-	 * place.
-	 * <p>
-	 * This method is equivalent to calling <code>getLaunchPerspective(ILaunchConfigurationType type, Set modes, ILaunchDelegate delegate)</code>,
-	 * with the 'mode' parameter comprising a single element set and passing <code>null</code> as the launch delegate.
-	 * </p>
-	 * @param type launch configuration type
-	 * @param mode launch mode identifier
-	 * @return perspective identifier or <code>null</code>
-	 * @since 3.0
-	 */
-	public String getLaunchPerspective(ILaunchConfigurationType type, String mode) {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		return getLaunchPerspective(type, modes, null);
-	}
-	
-	/**
-	 * Sets the perspective to switch to when a configuration of the given type
-	 * is launched in the given mode. <code>PERSPECTIVE_NONE</code> indicates no
-	 * perspective switch should take place. <code>PERSPECTIVE_DEFAULT</code> indicates
-	 * a default perspective switch should take place, as defined by the associated
-	 * launch tab group extension.
-	 * <p>
-	 * Calling this method is equivalent to calling <code>setLaunchPerspective(ILaunchConfigurationType type, Set modes, ILaunchDelegate delegate, String perspectiveid)</code>, 
-	 * with the parameter 'mode' used in the set modes, and null passed as the delegate
-	 * </p>
-	 * @param type launch configuration type
-	 * @param mode launch mode identifier
-	 * @param perspective identifier, <code>PERSPECTIVE_NONE</code>, or
-	 *   <code>PERSPECTIVE_DEFAULT</code>
-	 * @since 3.0
-	 */
-	public void setLaunchPerspective(ILaunchConfigurationType type, String mode, String perspective) {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		setLaunchPerspective(type, modes, null, perspective);
-	}
-	
-	/**
-	 * Sets the perspective that should be switched to when a configuration of the given type is launched with the 
-	 * specified modes set by the given launch delegate.
-	 * <p>
-	 * Passing <code>null</code> as a launch delegate will set the default perspective switch for that type and modeset, where
-	 * <code>PERSPECTIVE_NONE</code> indicates no perspective switch should take place.
-	 * </p>
-	 * @param type the type to set a perspective context for
-	 * @param modes the set of modes 
-	 * @param delegate the delegate, or <code>null</code> if the default perspective should be used
-	 * 
-	 * @since 3.3
-	 */
-	public void setLaunchPerspective(ILaunchConfigurationType type, Set modes, ILaunchDelegate delegate, String perspectiveid) {
-		PerspectiveContext context = new PerspectiveContext(type, delegate, modes);
-		String id = null;
-		if(!IDebugUIConstants.PERSPECTIVE_NONE.equals(perspectiveid)) {
-			if(IDebugUIConstants.PERSPECTIVE_DEFAULT.equals(perspectiveid)) {
-				id = getDefaultLaunchPerspective(type, delegate, modes);
-			}
-			else {
-				id = perspectiveid;
-			}
-		}
-		PerspectiveContext item = findContext(context);
-		if(item != null) {
-			item.setPerspective(modes, id);
-		}
-		else {
-			context.setPerspective(modes, id);
-			item = context;
-		}
-		fPerspectiveContexts.add(item);
-	}
-	
-	/**
-	 * Searches the listing of perspective contexts to see if the specified one already exists
-	 * @param context the context to compare
-	 * @return the matching <code>PerspectiveContext</code> or <code>null</code> if none
-	 * 
-	 * @since 3.3
-	 */
-	private PerspectiveContext findContext(PerspectiveContext context) {
-		PerspectiveContext item = null;
-		Object o = null;
-		for(Iterator iter = fPerspectiveContexts.iterator(); iter.hasNext();) {
-			o = iter.next();
-			if(context.equals(o)) {
-				item = (PerspectiveContext) o;
-				return item;
-			}
-		}
-		return item;
-	}
-	
-	/**
-	 * Generates XML for the user specified perspective settings.
-	 *  
-	 * @return XML
-	 * @exception IOException if unable to generate the XML
-     * @exception TransformerException if unable to generate the XML
-     * @exception ParserConfigurationException if unable to generate the XML
-	 */
-	private String generatePerspectiveXML() throws ParserConfigurationException, CoreException {
-		Document doc = DebugUIPlugin.getDocument();
-		Element root = doc.createElement(IConfigurationElementConstants.LAUNCH_PERSPECTIVES);
-		doc.appendChild(root);
-		PerspectiveContext context = null;
-		Map modesets = null;
-		Element element = null;
-		Set modes = null;
-		String id = null;
-		ILaunchDelegate delegate = null;
-		for(Iterator iter = fPerspectiveContexts.iterator(); iter.hasNext();) {
-			context = (PerspectiveContext) iter.next();
-			modesets = context.getPersepctiveMap();
-			for(Iterator iter2 = modesets.keySet().iterator(); iter2.hasNext();) {
-				modes = (Set) iter2.next();
-				id = context.getPerspective(modes);
-				if(id != null) {
-					element = doc.createElement(IConfigurationElementConstants.LAUNCH_PERSPECTIVE);
-					element.setAttribute(IConfigurationElementConstants.MODE, createModesetString(modes));
-					delegate = context.getLaunchDelegate();
-					if(delegate != null) {
-						element.setAttribute(ATTR_DELEGATE_ID, delegate.getId());
-					}
-					element.setAttribute(IConfigurationElementConstants.CONFIGURATION_TYPES, context.getLaunchConfigurationType().getIdentifier());
-					element.setAttribute(IConfigurationElementConstants.PERSPECTIVE, id);
-					root.appendChild(element);
-				}
-			}
-			
-		}
-		return DebugPlugin.serializeDocument(doc);		
-	}
-
-	/**
-	 * Returns the default perspective to switch to when a configuration of the given
-	 * type is launched in the given mode, or <code>null</code> if none.
-	 * 
-	 * <p>
-	 * Calling this method is equivalent to using the new method <code>getDefaultLaunchPerspective(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes)</code>
-	 * with a null delegate and the specified mode comprising a set of one mode
-	 * </p>
-	 * 
-	 * @param type launch configuration type
-	 * @param mode launch mode
-	 * @return perspective identifier, or <code>null</code>
-	 */
-	public String getDefaultLaunchPerspective(ILaunchConfigurationType type, String mode) {
-		HashSet modes = new HashSet();
-		modes.add(mode);
-		return getDefaultLaunchPerspective(type, null, modes);
-	}
-
-	/**
-	 * Returns the default perspective to switch to when a configuration of the given type is launched by the specified
-	 * launch delegate in the given mode set, or <code>null</code> if none
-	 * @param type the type
-	 * @param delegate the associated delegate, or <code>null</code> to specify that the default perspective id for that given type and mode set should be returned
-	 * @param modes the set of modes this applies to
-	 * @return the default perspective id for the given type, delegate and mode set combination, or <code>null</code> if none
-	 * 
-	 * @since 3.3
-	 */
-	public String getDefaultLaunchPerspective(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes) {
-		String id = null;
-		if(delegate != null) {
-			id = delegate.getPerspectiveId(modes);
-		}
-		if(id == null) {
-			LaunchConfigurationTabGroupExtension extension = LaunchConfigurationPresentationManager.getDefault().getExtension(type.getIdentifier(), modes);
-			if (extension != null) {
-				id = extension.getPerspective(modes);
-				if (id == null) {
-					if (modes.contains(ILaunchManager.DEBUG_MODE)) {
-						id = IDebugUIConstants.ID_DEBUG_PERSPECTIVE;
-					}	
-				} 
-			}
-		}
-		return id;
-	}
-	
-	/**
-	 * Resolves the <code>ILaunchDelegate</code> from the given <code>ILaunch</code>
-	 * @param launch the launch
-	 * @return
-	 * @throws CoreException
-	 */
-	private ILaunchDelegate resolveLaunchDelegate(ILaunch launch) throws CoreException {
-		Set modes = launch.getLaunchConfiguration().getModes();
-		modes.add(launch.getLaunchMode());
-		ILaunchConfigurationType type = launch.getLaunchConfiguration().getType();
-		ILaunchDelegate[] delegates = LaunchConfigurationManager.filterLaunchDelegates(type, modes);
-		ILaunchDelegate delegate = null;
-		if(delegates.length == 1) {
-			delegate = delegates[0];
-		}
-		else if(delegates.length > 1) {
-			delegate = launch.getLaunchConfiguration().getPreferredDelegate(modes);
-			if(delegate == null) {
-				delegate = type.getPreferredDelegate(modes);
-			}
-		}
-		return delegate;
-	}
-	
-	/**
-	 * Initialize the preference set with settings from user preferences
-	 */
-	private void initPerspectives() {
-		if(fPerspectiveContexts == null) {
-			fPerspectiveContexts = new HashSet();
-			String xml = DebugUIPlugin.getDefault().getPreferenceStore().getString(IInternalDebugUIConstants.PREF_LAUNCH_PERSPECTIVES);
-			if (xml != null && xml.length() > 0) {
-				try {
-					Element root = DebugPlugin.parseDocument(xml);
-					NodeList list = root.getChildNodes();
-					LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
-					ILaunchConfigurationType lctype = null;
-					ILaunchDelegate ldelegate = null;
-					Set modes = null;
-					Node node = null;
-					Element element = null;
-					for (int i = 0; i < list.getLength(); ++i) {
-						node = list.item(i);
-						if (node.getNodeType() == Node.ELEMENT_NODE) {
-							element = (Element) node;
-							String nodeName = element.getNodeName();
-							if (nodeName.equalsIgnoreCase(IConfigurationElementConstants.LAUNCH_PERSPECTIVE)) {
-								String type = element.getAttribute(IConfigurationElementConstants.CONFIGURATION_TYPES);
-								String mode = element.getAttribute(IConfigurationElementConstants.MODE);
-								String perspective = element.getAttribute(IConfigurationElementConstants.PERSPECTIVE);
-								String delegate = element.getAttribute(ATTR_DELEGATE_ID);
-								lctype = lm.getLaunchConfigurationType(type);
-								ldelegate = lm.getLaunchDelegate(delegate);
-								modes = parseModes(mode);
-								if(lctype != null && !modes.isEmpty() && !"".equals(perspective)) { //$NON-NLS-1$
-									setLaunchPerspective(lctype, modes, ldelegate, perspective);
-								}
-							}
-						}
-					}				
-				} 
-				catch (CoreException e) {DebugUIPlugin.log(e);} 
-			}
-		}
-	}
-	
-	/**
-	 * Parses a string argument into a set of modes
-	 * @param modes the string to parse
-	 * @return a set of modes parsed from the specified string of the empty set, never null
-	 * 
-	 * @since 3.3
-	 */
-	private Set parseModes(String modes) {
-		HashSet modeset = new HashSet();
-		String[] ms = modes.split(","); //$NON-NLS-1$
-		for(int i = 0; i < ms.length; i++) {
-			modeset.add(ms[i].trim());
-		}
-		return modeset;
-	}
-	
-	/**
-	 * Creates a standard comma separated list of the modes from the specified set
-	 * @param modes the set to write to string
-	 * @return the 
-	 */
-	private String createModesetString(Set modes) {
-		String str = ""; //$NON-NLS-1$
-		if(modes != null) {
-			for(Iterator iter = modes.iterator(); iter.hasNext();) {
-				str += iter.next();
-				if(iter.hasNext()) {
-					str += ","; //$NON-NLS-1$
-				}
-			}
-		}
-		return str;
-	}
-	
-	/**
-	 * Schedules the given job after perspective switching is complete, or
-	 * immediately if a perspective switch is not in progress.
-	 * 
-	 * @param job job to run after perspective switching
-	 */
-	public void schedulePostSwitch(Job job) {
-		fPerspectiveSwitchLock.schedulePostSwitch(job);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.ISuspendTriggerListener#suspended(org.eclipse.debug.core.ILaunch, java.lang.Object)
-	 */
-	public void suspended(ILaunch launch, Object context) {
-		handleBreakpointHit(launch);
-	}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#doneSaving(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void doneSaving(ISaveContext context) {}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#prepareToSave(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void prepareToSave(ISaveContext context) throws CoreException {}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#rollback(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void rollback(ISaveContext context) {}
-
-	/**
-	 * @see org.eclipse.core.resources.ISaveParticipant#saving(org.eclipse.core.resources.ISaveContext)
-	 */
-	public void saving(ISaveContext context) throws CoreException {
-		try {
-			DebugUIPlugin.getDefault().getPreferenceStore().putValue(IInternalDebugUIConstants.PREF_LAUNCH_PERSPECTIVES, generatePerspectiveXML());			
-		}   catch (ParserConfigurationException e) {
-			throw new CoreException(DebugUIPlugin.newErrorStatus("Exception occurred while generating launch perspectives preference XML", e)); //$NON-NLS-1$
-		} 
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java
deleted file mode 100644
index 925fb46..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-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.model.AdaptableList;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchPartLabelProvider;
-
-/**
- * Status handler to prompt for saving of resources prior to launching.
- * <p>
- * This class provides a behavior breaking function from 3.1. We now perform pre-launch saving for resources
- * scoped to the affected projects of the launch instead of all unsaved resources from within the current workspace.
- * </p>
- * <p>
- * The 'breaking' occurs as the saving is moved from <code>DebugUIPlugin</code> to the launch configuration delegate, which will require
- * implementors of <code>LaunchConfigurationDelegate</code> to incorporate the use of this status handler to perform any pre-launch saving. 
- * </p>
- * @since 3.2
- */
-public class SaveScopeResourcesHandler implements IStatusHandler {
-
-	/**
-	 * Provides a custom class for a resizable selection dialog with a don't ask again button on it
-	 * @since 3.2
-	 */
-	class ScopedResourcesSelectionDialog extends AbstractDebugCheckboxSelectionDialog {
-
-		private final String SETTINGS_ID = IDebugUIConstants.PLUGIN_ID + ".SCOPED_SAVE_SELECTION_DIALOG"; //$NON-NLS-1$
-		Button fSavePref;
-		Object fInput;
-		IStructuredContentProvider fContentProvider;
-		ILabelProvider fLabelProvider;
-		
-		public ScopedResourcesSelectionDialog(Shell parentShell, Object input, IStructuredContentProvider contentProvider, ILabelProvider labelProvider) {
-			super(parentShell);
-			fInput = input;
-			fContentProvider = contentProvider;
-			fLabelProvider = labelProvider;
-			setShellStyle(getShellStyle() | SWT.RESIZE);
-			setShowSelectAllButtons(true);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getContentProvider()
-		 */
-		protected IContentProvider getContentProvider() {
-			return fContentProvider;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getLabelProvider()
-		 */
-		protected IBaseLabelProvider getLabelProvider() {
-			return fLabelProvider;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-		 */
-		protected String getDialogSettingsId() {
-			return SETTINGS_ID;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-		 */
-		protected String getHelpContextId() {
-			return IDebugHelpContextIds.SELECT_RESOURCES_TO_SAVE_DIALOG;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-		 */
-		protected Object getViewerInput() {
-			return fInput;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-		 */
-		protected String getViewerLabel() {
-			return LaunchConfigurationsMessages.SaveScopeResourcesHandler_2;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugCheckboxSelectionDialog#addCustomFooterControls(org.eclipse.swt.widgets.Composite)
-		 */
-		protected void addCustomFooterControls(Composite parent) {
-			super.addCustomFooterControls(parent);
-			fSavePref = new Button(parent, SWT.CHECK);
-			fSavePref.setText(LaunchConfigurationsMessages.SaveScopeResourcesHandler_1);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugCheckboxSelectionDialog#okPressed()
-		 */
-		protected void okPressed() {
-			IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-			String val = (fSavePref.getSelection() ? MessageDialogWithToggle.ALWAYS : MessageDialogWithToggle.PROMPT);
-			store.setValue(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH, val);
-			super.okPressed();
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugCheckboxSelectionDialog#addViewerListeners(org.eclipse.jface.viewers.StructuredViewer)
-		 */
-		protected void addViewerListeners(StructuredViewer viewer) {
-			// Override to remove listener that affects the ok button
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugCheckboxSelectionDialog#refreshEnablement()
-		 */
-		protected void refreshEnablement() {
-			// OK button is always enabled
-			getOkButton().setEnabled(true);
-		}
-	}
-	
-	/**
-	 * The objects to save (if any)
-	 */
-	Object[] fSaves = null;
-	
-	/* (non-Javadoc)
-	 * 
-	 * Source object is an array - a launch configuration and an array of projects to save resources for.
-	 * 
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		// retrieve config and projects
-		ILaunchConfiguration config = null;
-		IProject[] projects = null;
-		if (source instanceof Object[]) {
-			Object[] objects = (Object[]) source;
-			if (objects.length == 2) {
-				 config = (ILaunchConfiguration) objects[0];
-				 projects = (IProject[]) objects[1];
-			}
-		}
-        if (config != null) {
-            if (DebugUITools.isPrivate(config)) {
-                return Boolean.TRUE;
-            }
-        } 
-        if (projects != null) {
-            IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-            String save = store.getString(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH);
-            int ret = showSaveDialog(projects, !save.equals(MessageDialogWithToggle.NEVER), save.equals(MessageDialogWithToggle.PROMPT));
-            if(ret == IDialogConstants.OK_ID) {
-            	doSave();
-            	return Boolean.TRUE;
-            }
-            return Boolean.FALSE;
-        } 
-        else {
-            boolean cancel = DebugUIPlugin.preLaunchSave();
-            return Boolean.valueOf(cancel);
-        }
-    }
-	
-	/**
-	 * 
-	 * Builds the list of editors that apply to this build that need to be saved
-	 * 
-	 * @param projects the projects involved in this build, used to scope the searching process
-	 * @return the list of dirty editors for this launch to save, never null
-	 */
-	protected IEditorPart[] getScopedDirtyEditors(IProject[] projects) {
-		List dirtyparts = new ArrayList();
-		IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-		for(int l = 0; l < windows.length; l++) {
-			IWorkbenchPage[] pages = windows[l].getPages();
-			for(int i = 0; i < pages.length; i++) {
-				IEditorPart[] eparts = pages[i].getDirtyEditors();
-				for(int j = 0; j < eparts.length; j++) {
-					IResource resource = (IResource)eparts[j].getEditorInput().getAdapter(IResource.class);
-					if(resource != null) {
-						for(int k = 0; k < projects.length; k++) {
-							if(projects[k].equals(resource.getProject()) & !dirtyparts.contains(eparts[j])) {
-								dirtyparts.add(eparts[j]);
-							}
-						}
-					}
-				}
-			}
-		}
-		return (IEditorPart[])dirtyparts.toArray(new IEditorPart[dirtyparts.size()]);
-	}
-	
-	/**
-	 * Performs the save of the editor parts returned by getScopedResources
-	 */
-	protected void doSave() {
-		if(fSaves != null) {
-			for (int i = 0; i < fSaves.length; i++) {
-				((IEditorPart)fSaves[i]).doSave(new NullProgressMonitor());
-			}
-		}
-	} 
-	
-	/**
-	 * show the save dialog with a list of editors to save (if any)
-	 * The dialog is also not shown if the the preference for automatically saving dirty before launch is set to always
-	 * @param projects the projects to consider for the save
-	 * @param save if we should save
-	 * @param prompt if we should prompt to save or do it automatically
-	 * @return the dialog status, to be propagated back to the <code>handleStatus</code> method
-	 */
-	protected int showSaveDialog(IProject[] projects, boolean save, boolean prompt) {
-		if(save) {
-			IEditorPart[] editors = getScopedDirtyEditors(projects);
-			if(prompt && (editors.length > 0)) {
-				ScopedResourcesSelectionDialog lsd = new ScopedResourcesSelectionDialog(DebugUIPlugin.getShell(),
-						new AdaptableList(editors),
-						new WorkbenchContentProvider(),
-						new WorkbenchPartLabelProvider());
-				lsd.setInitialSelections(editors);
-				lsd.setTitle(LaunchConfigurationsMessages.SaveScopeResourcesHandler_3);
-				if(lsd.open() == IDialogConstants.CANCEL_ID) {
-					return IDialogConstants.CANCEL_ID;
-				}
-				fSaves = lsd.getResult();
-			}
-			else {
-				fSaves = editors;
-			}
-		}
-		return IDialogConstants.OK_ID;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectFavoritesDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectFavoritesDialog.java
deleted file mode 100644
index a01a608..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectFavoritesDialog.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This dialog is used to select one or more launch configurations to add to your favorites
- * 
- * @since 3.3.0
- */
-public class SelectFavoritesDialog extends AbstractDebugCheckboxSelectionDialog {
-
-	/**
-	 * Content provider for table
-	 */	
-	protected class LaunchConfigurationContentProvider implements IStructuredContentProvider {
-		public Object[] getElements(Object inputElement) {
-			ILaunchConfiguration[] all = null;
-			try {
-				all = LaunchConfigurationManager.filterConfigs(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations());
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-				return new ILaunchConfiguration[0];
-			}
-			List list = new ArrayList(all.length);
-			ViewerFilter filter = new LaunchGroupFilter(fHistory.getLaunchGroup());
-			for (int i = 0; i < all.length; i++) {
-				if (filter.select(null, null, all[i])) {
-					list.add(all[i]);
-				}
-			}
-			list.removeAll(fCurrentFavoriteSet);
-			Object[] objs = list.toArray();
-			new WorkbenchViewerComparator().sort(getCheckBoxTableViewer(), objs);
-			return objs;
-		}
-
-		public void dispose() {}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-	}	
-	
-	private LaunchHistory fHistory;
-	private List fCurrentFavoriteSet;
-	
-	/**
-	 * Constructor
-	 * @param parentShell
-	 * @param history
-	 * @param favorites
-	 */
-	public SelectFavoritesDialog(Shell parentShell, LaunchHistory history, List favorites) {
-		super(parentShell);
-		fHistory = history;
-		fCurrentFavoriteSet = favorites;
-		setTitle(MessageFormat.format(LaunchConfigurationsMessages.FavoritesDialog_0, new String[]{getModeLabel()}));
-		setShowSelectAllButtons(true);
-	}
-
-	/**
-	 * Returns a label to use for launch mode with accelerators removed.
-	 * 
-     * @return label to use for launch mode with accelerators removed
-     */
-    private String getModeLabel() {
-        return DebugUIPlugin.removeAccelerators(fHistory.getLaunchGroup().getLabel());
-    }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-	 */
-	protected String getDialogSettingsId() {
-		return IDebugUIConstants.PLUGIN_ID + ".SELECT_FAVORITESS_DIALOG"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-	 */
-	protected Object getViewerInput() {
-		return fHistory.getLaunchGroup().getMode();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getContentProvider()
-	 */
-	protected IContentProvider getContentProvider() {
-		return new LaunchConfigurationContentProvider();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SELECT_FAVORITES_DIALOG;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-	 */
-	protected String getViewerLabel() {
-		return LaunchConfigurationsMessages.FavoritesDialog_7;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java
deleted file mode 100644
index d4d63ea..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.AbstractDebugListSelectionDialog;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a dialog to present the user with a list of of viable launch options in the event 
- * the plug-in that provides either a launch option or a contributed launch delegate is no longer available.
- * The user can select one of the launch mode/option configuration from this dialog and repair the option 
- * configuration state of the the current launch configuration
- * 
- *  @since 3.3
- */
-public class SelectLaunchModesDialog extends AbstractDebugListSelectionDialog{
-
-	/**
-	 * Builds labels for list control
-	 */
-	class OptionsLabelProvider implements ILabelProvider {
-		public Image getImage(Object element) {return null;}
-		public String getText(Object element) {
-			Set modes = (Set) element;
-			List names = LaunchConfigurationPresentationManager.getDefault().getLaunchModeNames(modes);
-			return names.toString();
-		}
-		public void addListener(ILabelProviderListener listener) {}
-		public void dispose() {}
-		public boolean isLabelProperty(Object element, String property) {return false;}
-		public void removeListener(ILabelProviderListener listener) {}
-	}
-	
-	private List fValidModes = null;
-	
-	/**
-	 * Constructor
-	 * @param parentShell the parent shell
-	 * @param mode the current mode context
-	 * @param configuration the current launch configuration context
-	 * 
-	 * @throws CoreException
-	 */
-	public SelectLaunchModesDialog(Shell parentShell, String mode, ILaunchConfiguration configuration) throws CoreException {
-		super(parentShell);
-		super.setTitle(LaunchConfigurationsMessages.SelectLaunchOptionsDialog_3);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fValidModes = new ArrayList();
-		Set modes = configuration.getType().getSupportedModeCombinations();
-		Set modeset = null;
-		for(Iterator iter = modes.iterator(); iter.hasNext();) {
-			modeset = (Set) iter.next();
-			if(modeset.contains(mode)) {
-				fValidModes.add(modeset);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-	 */
-	protected String getDialogSettingsId() {
-		return IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCH_MODES_DIALOG"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getLabelProvider()
-	 */
-	protected IBaseLabelProvider getLabelProvider() {
-		return new OptionsLabelProvider();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-	 */
-	protected Object getViewerInput() {
-		return fValidModes.toArray();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SELECT_LAUNCH_MODES_DIALOG;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-	 */
-	protected String getViewerLabel() {
-		return LaunchConfigurationsMessages.SelectLaunchOptionsDialog_4;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java
deleted file mode 100644
index 9719b5a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.launchConfigurations;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-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.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This dialog is used to select a preferred launcher, and also provides access to the 
- * workspace defaults for preferred launchers
- * 
- *  @since 3.3
- */
-public class SelectLaunchersDialog extends AbstractDebugCheckboxSelectionDialog {
-
-	/**
-	 * Builds labels for table control
-	 */
-	class DelegatesLabelProvider implements ILabelProvider {
-		public Image getImage(Object element) {return null;}
-		public String getText(Object element) {
-			if(element instanceof ILaunchDelegate) {
-				ILaunchDelegate ldp = (ILaunchDelegate) element;
-				String name = ldp.getName();
-				if(name == null) {
-					name = ldp.getContributorName();
-				}
-				return name;
-			}
-			return element.toString();
-		}
-		public void addListener(ILabelProviderListener listener) {}
-		public void dispose() {}
-		public boolean isLabelProperty(Object element, String property) {return false;}
-		public void removeListener(ILabelProviderListener listener) {}
-	}
-	
-	private Text fDescriptionText = null;
-	private ILaunchDelegate[] fDelegates = null;
-	private Button fUseSystemLauncher = null;
-	private ILaunchConfigurationWorkingCopy fConfiguration = null;
-	private String fLaunchMode = null;
-	
-	/**
-	 * Constructor
-	 * @param parentShell
-	 */
-	public SelectLaunchersDialog(Shell parentShell, ILaunchDelegate[] delegates, ILaunchConfigurationWorkingCopy configuration, String launchmode) {
-		super(parentShell);
-		super.setTitle(LaunchConfigurationsMessages.SelectLaunchersDialog_0);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fDelegates = delegates;
-		fConfiguration = configuration;
-		fLaunchMode = launchmode;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		IDialogSettings settings = getDialogBoundsSettings();
-		if(settings != null) {
-			try {
-				int width = settings.getInt("DIALOG_WIDTH"); //$NON-NLS-1$
-				int height = settings.getInt("DIALOG_HEIGHT"); //$NON-NLS-1$
-				if(width > 0 & height > 0) {
-					return new Point(width, height);
-				}
-			}
-			catch (NumberFormatException nfe) {
-				return new Point(450, 450);
-			}
-		}
-		return new Point(450, 450);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-	 */
-	protected String getDialogSettingsId() {
-		return IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCHERS_DIALOG"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.SELECT_LAUNCHERS_DIALOG;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getLabelProvider()
-	 */
-	protected IBaseLabelProvider getLabelProvider() {
-		return new DelegatesLabelProvider();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-	 */
-	protected Object getViewerInput() {
-		return fDelegates;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#addCustomHeaderControls(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void addCustomHeaderControls(Composite parent) {
-		SWTFactory.createWrapLabel(parent, LaunchConfigurationsMessages.SelectLaunchersDialog_2, 1);
-		Link link = new Link(parent, SWT.WRAP);
-		link.setText(LaunchConfigurationsMessages.SelectLaunchersDialog_4);
-		link.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
-		link.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				SWTFactory.showPreferencePage("org.eclipse.debug.ui.LaunchDelegatesPreferencePage"); //$NON-NLS-1$
-				if(!fUseSystemLauncher.getSelection()) {
-					resetDelegate();
-				}
-			}
-		});
-		fUseSystemLauncher = SWTFactory.createCheckButton(parent, LaunchConfigurationsMessages.SelectLaunchersDialog_1, null, true, 1);
-		fUseSystemLauncher.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				boolean checked = ((Button)e.widget).getSelection();
-				getCheckBoxTableViewer().getTable().setEnabled(checked);
-				resetDelegate();
-			}
-		});
-	}
-	
-	/**
-	 * Returns the currently checked launch delegate
-	 * @return the currently selected launch delegate or <code>null</code> if none are checked
-	 */
-	protected ILaunchDelegate getSelectedDelegate() {
-		Object[] checked = getCheckBoxTableViewer().getCheckedElements();
-		if(checked.length > 0) {
-			return (ILaunchDelegate) checked[0];
-		}
-		return null;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		ILaunchDelegate delegate = null;
-		Set modes = getCurrentModeSet();
-		if(fUseSystemLauncher.getSelection()) {
-			delegate = getSelectedDelegate();	
-			if(delegate != null) {
-				fConfiguration.setPreferredLaunchDelegate(modes, delegate.getId());
-			}
-		}
-		else {
-			fConfiguration.setPreferredLaunchDelegate(modes, null);
-		}
-		if(fConfiguration.isDirty()) {
-			try {
-				fConfiguration.doSave();
-			} 
-			catch (CoreException e) {DebugUIPlugin.log(e);}
-		}
-		super.okPressed();
-	}
-
-	/**
-	 * Resets the selected and checked delegate in the preferred launcher view part to be the one from the workspace
-	 */
-	private void resetDelegate() {
-		if(!fUseSystemLauncher.getSelection()) {
-			try {
-				ILaunchDelegate preferred = fConfiguration.getType().getPreferredDelegate(getCurrentModeSet());
-				CheckboxTableViewer viewer = getCheckBoxTableViewer();
-				if(preferred != null) {
-					viewer.setSelection(new StructuredSelection(preferred));
-					viewer.setCheckedElements(new Object[] {preferred});
-				}
-				else {
-					viewer.setSelection(new StructuredSelection());
-					viewer.setAllChecked(false);
-				}
-				getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-			}
-			catch (CoreException ce) {DebugUIPlugin.log(ce);}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#addCustomFooterControls(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void addCustomFooterControls(Composite parent) {
-		Group group = SWTFactory.createGroup(parent, LaunchConfigurationsMessages.SelectLaunchersDialog_5, 1, 1, GridData.FILL_BOTH);
-		fDescriptionText = SWTFactory.createText(group, SWT.WRAP | SWT.READ_ONLY, 1, GridData.FILL_BOTH);
-		fDescriptionText.setBackground(group.getBackground());
-	}
-
-	/**
-	 * @return the complete set of modes that the associated launch configuration is concerned with
-	 */
-	protected Set getCurrentModeSet() {
-		Set modes = new HashSet();
-		try {
-			modes = fConfiguration.getModes();
-			modes.add(fLaunchMode);
-		}
-		catch (CoreException ce) {DebugUIPlugin.log(ce);}
-		return modes;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#initializeControls()
-	 */
-	protected void initializeControls() {
-		final CheckboxTableViewer viewer = getCheckBoxTableViewer();
-		viewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				viewer.setCheckedElements(new Object[]{event.getElement()});
-			}
-		});
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection ss = (IStructuredSelection) event.getSelection();
-				if(ss != null && !ss.isEmpty()) {
-					fDescriptionText.setText(((ILaunchDelegate)ss.getFirstElement()).getDescription());
-				}
-				else {
-					fDescriptionText.setText(IInternalDebugUIConstants.EMPTY_STRING);
-				}
-			}
-		});
-		try {
-			ILaunchDelegate delegate = fConfiguration.getPreferredDelegate(getCurrentModeSet());
-			boolean custom = delegate != null;
-			fUseSystemLauncher.setSelection(custom);
-			if(custom) {
-				viewer.setSelection(new StructuredSelection(delegate));
-				viewer.setCheckedElements(new Object[] {delegate});
-			}
-			else {
-				resetDelegate();
-				getCheckBoxTableViewer().getTable().setEnabled(false);
-			}
-		}
-		catch (CoreException ce) {DebugUIPlugin.log(ce);}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-	 */
-	protected String getViewerLabel() {
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/WorkingSetComparator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/WorkingSetComparator.java
deleted file mode 100644
index d1a89c6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/WorkingSetComparator.java
+++ /dev/null
@@ -1,52 +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.debug.internal.ui.launchConfigurations;
-
-import java.util.Comparator;
-
-import org.eclipse.debug.ui.RefreshTab;
-import org.eclipse.ui.IWorkingSet;
-
-/**
- * Comparator for refresh scope launch configuration attribute
- * <code>ATTR_REFRESH_SCOPE</code>.
- */
-public class WorkingSetComparator implements Comparator {
-
-	/* (non-Javadoc)
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		String one= (String)o1;
-		String two= (String)o2;
-		if (one == null || two == null) {
-			if (one == two) {
-				return 0;
-			}
-			return -1;
-		}
-		if (one.startsWith("${working_set:") && two.startsWith("${working_set:")) {		  //$NON-NLS-1$//$NON-NLS-2$
-			IWorkingSet workingSet1 = RefreshTab.getWorkingSet(one);
-			IWorkingSet workingSet2 = RefreshTab.getWorkingSet(two);
-			if (workingSet1 == null || workingSet2 == null) {
-				if (workingSet1 == workingSet2) {
-					return 0;
-				}
-				return -1;
-			}
-			if (workingSet1.equals(workingSet2)) {
-				return 0;
-			}
-			return -1;
-		} 
-		return one.compareTo(two);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/WorkingSetsFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/WorkingSetsFilter.java
deleted file mode 100644
index 05dfbe6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/WorkingSetsFilter.java
+++ /dev/null
@@ -1,114 +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.debug.internal.ui.launchConfigurations;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-
-/**
- * creates a filter for the current working sets in use on the workbench to be applied in the launch configuration
- * dialog and the launch history/last launched
- * 
- * @since 3.2
- */
-public class WorkingSetsFilter 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 ILaunchConfigurationType) {
-			return true;
-		}
-		if(element instanceof ILaunchConfiguration) {
-			ILaunchConfiguration config = (ILaunchConfiguration)element;
-			try {
-				IResource[] resources = config.getMappedResources();
-				if(resources == null) {
-					return true;
-				}
-				IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-				if(window == null) {
-					return true;
-				}
-				IWorkbenchPage page = window.getActivePage();
-				if(page == null) {
-					return true;
-				}
-				IWorkingSet[] wsets = page.getWorkingSets();
-				if(wsets.length < 1) {
-					return true;
-				}
-				//remove breakpoint working sets
-				ArrayList ws = new ArrayList();
-				for (int i = 0; i < wsets.length; i++) {
-					if(!IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(wsets[i].getId())) {
-						ws.add(wsets[i]);
-					}
-				}
-				if(ws.isEmpty()) {
-					return true;
-				}
-				for (int i = 0; i < resources.length; i++) {
-					if(workingSetContains((IWorkingSet[]) ws.toArray(new IWorkingSet[ws.size()]), resources[i])) {
-						return true;
-					}
-				}
-			} 
-			catch (CoreException e) {}
-		}
-		return false;
-	}
-
-	/**
-	 * Determines if the specified group of working sets contains the specified resource.
-	 * @param wsets the set of working sets to examine
-	 * @param res the resource to check for containment
-	 * @return true iff any one of the specified working sets contains the specified resource
-	 * @since 3.2
-	 */
-	public static boolean workingSetContains(IWorkingSet[] wsets, IResource res) {
-		ArrayList parents = new ArrayList();
-		parents.add(res);
-		while(res != null) {
-			res = res.getParent();
-			if(res != null) {
-				parents.add(res);
-			}
-		}
-		IResource lres = null;
-		for(int i = 0; i < wsets.length; i++) {	
-			IAdaptable[] elements = wsets[i].getElements();
-			for(int j = 0; j < elements.length; j++) {
-				lres = (IResource)elements[j].getAdapter(IResource.class);
-				if(lres != null) {
-					if(parents.contains(lres)) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IMemoryBlockConnection.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IMemoryBlockConnection.java
deleted file mode 100644
index 2a30b8d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IMemoryBlockConnection.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.memory;
-
-/**
- * Represents a connection to a memory block.  An IMemoryRenderingUpdater can call
- * a connection to update instead of relying on a rendering to listen
- * for CHANGE / SUSPEND debug event to trigger an update.
- * 
- * This interface is EXPERIMENTAL.
- *
- */
-public interface IMemoryBlockConnection {
-	
-	/**
-	 * Update the content of a memory block in a connection.
-	 */
-	public void update();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IMemoryRenderingUpdater.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IMemoryRenderingUpdater.java
deleted file mode 100644
index 874a436..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IMemoryRenderingUpdater.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.memory;
-
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-
-
-/**
- * Represents an object that will manage the update of an IMemoryRendering
- * based on connections.  If the memory block implements this interface or returns
- * an object of this type when getAdapter(...) is called, a rendering would
- * call #supportsManagedUpdate to determine if it should handle and refresh
- * upon a debug event.  
- * 
- * If the client wants to manage its own update, it would return true when
- * #supportsManagedUpdate is called.  The rendering will not get refreshed
- * upon any debug events.  Instead, the rendering will update when 
- * <code>IMemoryBlockConnection.update</code> is called.
- * 
- * This interface is EXPERIMENTAL.
- *
- */
-public interface IMemoryRenderingUpdater extends IMemoryBlockExtension {
-	
-	/**
-	 * @return true if the updater will manage the update of a rendering
-	 */
-	public boolean supportsManagedUpdate(IMemoryRendering rendering);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IPersistableDebugElement.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IPersistableDebugElement.java
deleted file mode 100644
index 338db1a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/IPersistableDebugElement.java
+++ /dev/null
@@ -1,63 +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.debug.internal.ui.memory;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
-
-/**
- * Represents an element that is capable of persisting properties.
- * @since 3.2
- */
-public interface IPersistableDebugElement {
-
-	/**
-	 * Return the property with the specified propertyId.  
-	 * @param context is the context who is asking for this property.
-	 * @param propertyId is the property id of the property.
-	 * @return the value of the specified property
-	 * @throws CoreException when an error has occurred getting this property
-	 */
-	public Object getProperty(Object context, String propertyId) throws CoreException;
-	
-	/**
-	 * Sets the property with the specified propertyId.  Clients are expected
-	 * to save the properties specified.
-	 * @param context is the context who is asking for this property to be saved.
-	 * @param propertyId is the id of the property to be saved
-	 * @param value is the value of the property
-	 * @throws CoreException when an error has occurred setting this property
-	 */
-	public void setProperty(Object context, String propertyId, Object value) throws CoreException;
-	
-	/**
-	 * @param context is the contex who is asking if this property is supported
-	 * @param propertyId
-	 * @return true if the peristable debug element wishes to handle persistence of
-	 * the specified property.
-	 */
-	public boolean supportsProperty(Object context, String propertyId);
-	
-	/**
-	 * Add the property change listener to the persistable.  The listener will
-	 * be notified when properties have changed from the peristable element.
-	 * @param listener is the listener to add
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener);
-	
-	/**
-	 * Remove the property change listener from the persistable.  The listener will
-	 * no longer be notified when properties are changed from the persistable element.
-	 * @param listener is the listener to remove
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/MemoryRenderingManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/MemoryRenderingManager.java
deleted file mode 100644
index 9118472..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/MemoryRenderingManager.java
+++ /dev/null
@@ -1,183 +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.debug.internal.ui.memory;
-
-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.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractMemoryRenderingBindingsProvider;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener;
-import org.eclipse.debug.ui.memory.IMemoryRenderingManager;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-
-/**
- * The memory rendering manager.
- * 
- * @see org.eclipse.debug.ui.memory.IMemoryRenderingManager
- * @since 3.1
- */
-public class MemoryRenderingManager extends AbstractMemoryRenderingBindingsProvider implements IMemoryRenderingManager {
-    
-    // map of rendering type ids to valid rendering types
-    private Map fRenderingTypes = new HashMap();
-    
-    // list of renderingBindings
-    private List fBindings = new ArrayList();
-        
-    // singleton manager
-    private static MemoryRenderingManager fgDefault;
-	
-    // elements in the memory renderings extension point
-    public static final String ELEMENT_MEMORY_RENDERING_TYPE = "renderingType"; //$NON-NLS-1$
-    public static final String ELEMENT_RENDERING_BINDINGS = "renderingBindings"; //$NON-NLS-1$
-    
-    /**
-     * Returns the memory rendering manager.
-     * 
-     * @return the memory rendering manager
-     */
-    public static IMemoryRenderingManager getDefault() {
-        if (fgDefault == null) {
-            fgDefault = new MemoryRenderingManager();
-        }
-        return fgDefault;
-    }
-    /**
-     * Construts a new memory rendering manager. Only to be called by DebugUIPlugin.
-     */
-    private MemoryRenderingManager() {
-        initializeRenderings();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingManager#createRendering(java.lang.String)
-     */
-    public IMemoryRendering createRendering(String id) throws CoreException {
-        IMemoryRenderingType type = getRenderingType(id);
-        if (type != null) {
-            return type.createRendering();
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingManager#getRenderingTypes()
-     */
-    public IMemoryRenderingType[] getRenderingTypes() {
-        Collection types = fRenderingTypes.values();
-        return (IMemoryRenderingType[]) types.toArray(new IMemoryRenderingType[types.size()]);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingManager#getRenderingType(java.lang.String)
-     */
-    public IMemoryRenderingType getRenderingType(String id) {
-        return (IMemoryRenderingType) fRenderingTypes.get(id);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#getDefaultRenderingTypes(org.eclipse.debug.core.model.IMemoryBlock)
-     */
-    public IMemoryRenderingType[] getDefaultRenderingTypes(IMemoryBlock block) {
-        List allTypes = new ArrayList();
-        Iterator iterator = fBindings.iterator();
-        while (iterator.hasNext()) {
-            RenderingBindings binding = (RenderingBindings)iterator.next();
-            IMemoryRenderingType[] renderingTypes = binding.getDefaultRenderingTypes(block);
-            for (int i = 0; i < renderingTypes.length; i++) {
-                IMemoryRenderingType type = renderingTypes[i];
-                if (!allTypes.contains(type)) {
-                    allTypes.add(type);
-                }
-            }
-        }
-        return (IMemoryRenderingType[]) allTypes.toArray(new IMemoryRenderingType[allTypes.size()]);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#getPrimaryRenderingType(org.eclipse.debug.core.model.IMemoryBlock)
-     */
-    public IMemoryRenderingType getPrimaryRenderingType(IMemoryBlock block) {
-        Iterator iterator = fBindings.iterator();
-        while (iterator.hasNext()) {
-            RenderingBindings binding = (RenderingBindings)iterator.next();
-            IMemoryRenderingType renderingType = binding.getPrimaryRenderingType(block);
-            if (renderingType != null) {
-                return renderingType;
-            }
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#getRenderingTypes(org.eclipse.debug.core.model.IMemoryBlock)
-     */
-    public IMemoryRenderingType[] getRenderingTypes(IMemoryBlock block) {
-        List allTypes = new ArrayList();
-        Iterator iterator = fBindings.iterator();
-        while (iterator.hasNext()) {
-            RenderingBindings binding = (RenderingBindings)iterator.next();
-            IMemoryRenderingType[] renderingTypes = binding.getRenderingTypes(block);
-            for (int i = 0; i < renderingTypes.length; i++) {
-                IMemoryRenderingType type = renderingTypes[i];
-                if (!allTypes.contains(type)) {
-                    allTypes.add(type);
-                }
-            }
-        }
-        return (IMemoryRenderingType[]) allTypes.toArray(new IMemoryRenderingType[allTypes.size()]);
-    }
-    
-    /**
-     * Processes memory rendering contributions.
-     */
-    private void initializeRenderings() {
-        IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_MEMORY_RENDERIGNS);
-        IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
-        for (int i = 0; i < configurationElements.length; i++) {
-            IConfigurationElement element= configurationElements[i];
-            String name = element.getName();
-            if (name.equals(ELEMENT_MEMORY_RENDERING_TYPE)) {
-                MemoryRenderingType type = new MemoryRenderingType(element);
-                try {
-                    type.validate();
-                    fRenderingTypes.put(type.getId(), type);
-                } catch (CoreException e) {
-                    DebugUIPlugin.log(e);
-                }
-            } else if (name.equals(ELEMENT_RENDERING_BINDINGS)) {
-                RenderingBindings bindings = new RenderingBindings(element);
-                try {
-                    bindings.validate();
-                    fBindings.add(bindings);
-					bindings.addListener(new IMemoryRenderingBindingsListener() {
-						public void memoryRenderingBindingsChanged() {
-							fireBindingsChanged();
-						}});
-                } catch (CoreException e) {
-                    DebugUIPlugin.log(e);
-                }
-            }
-        }        
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/MemoryRenderingType.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/MemoryRenderingType.java
deleted file mode 100644
index 85a743e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/MemoryRenderingType.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.memory;
-
-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.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate;
-
-/**
- * A contributed memory rendering type.
- * 
- * @since 3.1
- */
-class MemoryRenderingType implements IMemoryRenderingType {
-    
-    private IConfigurationElement fConfigurationElement;
-    private IMemoryRenderingTypeDelegate fDelegate;
-    
-    // attributes for a memoryRenderingType
-    static final String ATTR_MEM_RENDERING_TYPE_NAME = "name"; //$NON-NLS-1$
-    static final String ATTR_MEM_RENDERING_TYPE_ID = "id"; //$NON-NLS-1$
-    static final String ATTR_MEM_RENDERING_TYPE_DELEGATE = "class"; //$NON-NLS-1$
-    
-    /**
-     * Constructs a rendering type from a contribution. 
-     */
-    MemoryRenderingType(IConfigurationElement element) {
-        fConfigurationElement = element;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingType#getLabel()
-     */
-    public String getLabel() {
-        return fConfigurationElement.getAttribute(ATTR_MEM_RENDERING_TYPE_NAME);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingType#getId()
-     */
-    public String getId() {
-        return fConfigurationElement.getAttribute(ATTR_MEM_RENDERING_TYPE_ID);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingType#createRendering()
-     */
-    public IMemoryRendering createRendering() throws CoreException {
-        if (fDelegate == null) {
-            fDelegate = (IMemoryRenderingTypeDelegate) fConfigurationElement.createExecutableExtension(ATTR_MEM_RENDERING_TYPE_DELEGATE);
-        }
-        return fDelegate.createRendering(getId());
-    }
-
-    /**
-     * Validates this contribution.
-     * 
-     * @exception CoreException if invalid
-     */
-    void validate() throws CoreException {
-        verifyPresent(ATTR_MEM_RENDERING_TYPE_ID);
-        verifyPresent(ATTR_MEM_RENDERING_TYPE_NAME);
-        verifyPresent(ATTR_MEM_RENDERING_TYPE_DELEGATE);
-    }
-    
-    private void verifyPresent(String attrName) throws CoreException {
-        if (fConfigurationElement.getAttribute(attrName) == null) {
-            Status status = new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR,
-                    "<memoryRenderingType> element missing required attribute: " + attrName, null); //$NON-NLS-1$
-            throw new CoreException(status);
-        }
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/RenderingBindings.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/RenderingBindings.java
deleted file mode 100644
index 3a4f15b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/RenderingBindings.java
+++ /dev/null
@@ -1,296 +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.debug.internal.ui.memory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.ExpressionTagNames;
-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.core.runtime.Status;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractMemoryRenderingBindingsProvider;
-import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener;
-import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider;
-import org.eclipse.debug.ui.memory.IMemoryRenderingManager;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-
-/**
- * Represents a renderingBindings element of a memoryRenderings
- * contribution.
- * 
- * @since 3.1
- */
-class RenderingBindings extends AbstractMemoryRenderingBindingsProvider implements IMemoryRenderingBindingsProvider {
-    
-    // element
-    protected IConfigurationElement fConfigurationElement;
-    
-    // cached rendering ids
-    private IMemoryRenderingType[] fAllTypes;
-    private IMemoryRenderingType[] fRenderingTypes;
-    private IMemoryRenderingType[] fDefaultTypes;
-    
-    // rendering type provider, or null (optional)
-    private IMemoryRenderingBindingsProvider fProvider;
-    
-    // optional exprssion
-    private Expression fExpression;
-	
-    // element attribute
-    public static final String ATTR_RENDERING_IDS = "renderingIds"; //$NON-NLS-1$
-    public static final String ATTR_DEFAULT_IDS = "defaultIds"; //$NON-NLS-1$
-    public static final String ATTR_PRIMARY = "primaryId"; //$NON-NLS-1$
-    public static final String ATTR_PROVIDER = "class"; //$NON-NLS-1$
-    
-    // empty bindings
-    private static final IMemoryRenderingType[] EMPTY = new IMemoryRenderingType[0]; 
-    
-    /**
-     * Constructs a bindings element from the given contribution.
-     * 
-     * @param element contribution
-     */
-    RenderingBindings(IConfigurationElement element) {
-        fConfigurationElement = element;
-    }
-    
-    /**
-     * Returns the non-default bindings specified by this contribution.
-     * 
-     * @return the non-default bindings specified by this contribution
-     */
-    private IMemoryRenderingType[] getBindings() {
-        if (fRenderingTypes == null) {
-            String ids = fConfigurationElement.getAttribute(ATTR_RENDERING_IDS);
-            List list = new ArrayList();
-            IMemoryRenderingManager manager = getManager();
-            if (ids != null) {
-                String[] strings = ids.split(","); //$NON-NLS-1$
-                for (int i = 0; i < strings.length; i++) {
-                    String id = strings[i].trim();
-                    IMemoryRenderingType type = manager.getRenderingType(id);
-                    if (type != null) {
-                        list.add(type);
-                    }
-                }
-            }
-            // remove any default bindings, in case of duplicate specification
-            IMemoryRenderingType[] defaultBindings = getDefaultBindings();
-            for (int i = 0; i < defaultBindings.length; i++) {
-                list.remove(defaultBindings[i]);
-            }
-            fRenderingTypes = (IMemoryRenderingType[]) list.toArray(new IMemoryRenderingType[list.size()]);
-        }
-        return fRenderingTypes;
-    }
-    
-    /**
-     * Returns the default bindings specified by this contribution.
-     * 
-     * @return the default bindings specified by this contribution
-     */
-    private IMemoryRenderingType[] getDefaultBindings() {
-        if (fDefaultTypes == null) {
-            String ids = fConfigurationElement.getAttribute(ATTR_DEFAULT_IDS);
-            List list = new ArrayList();
-            IMemoryRenderingManager manager = getManager();
-            if (ids != null) {
-                String[] strings = ids.split(","); //$NON-NLS-1$
-                for (int i = 0; i < strings.length; i++) {
-                    String id = strings[i].trim();
-                    IMemoryRenderingType type = manager.getRenderingType(id);
-                    if (type != null) {
-                        list.add(type);
-                    }
-                }
-            }
-            // the primary is also considered a default rendering
-            String primaryId = getPrimaryId();
-            if (primaryId != null) {
-                IMemoryRenderingType type = manager.getRenderingType(primaryId);
-                if (type != null) {
-                    list.add(type);
-                }
-            }
-            fDefaultTypes = (IMemoryRenderingType[]) list.toArray(new IMemoryRenderingType[list.size()]);
-        }
-        return fDefaultTypes;
-    }  
-    
-    /**
-     * Returns the primary id, or <code>null</code> if none.
-     * 
-     * @return the primary id, or <code>null</code> if none
-     */
-    private String getPrimaryId() {
-        return fConfigurationElement.getAttribute(ATTR_PRIMARY);
-    }
-    
-    /**
-     * Returns the provider for this binding or <code>null</code> of none.
-     * 
-     * @return the provider for this binding or <code>null</code> of none
-     */
-    protected IMemoryRenderingBindingsProvider getProvider(IMemoryBlock memoryBlock) {
-		if (isBound(memoryBlock))
-		{
-	        if (fProvider == null) {
-	            String name = fConfigurationElement.getAttribute(ATTR_PROVIDER);
-	            if (name != null) {
-	                try {
-	                    fProvider = (IMemoryRenderingBindingsProvider) fConfigurationElement.createExecutableExtension(ATTR_PROVIDER);
-	                } catch (CoreException e) {
-	                    DebugUIPlugin.log(e);
-	                }
-	            }
-				
-				if (fProvider != null)
-				{
-					fProvider.addListener(new IMemoryRenderingBindingsListener() {
-						public void memoryRenderingBindingsChanged() {
-							fireBindingsChanged();
-						}});
-				}
-	        }
-		}
-		return fProvider;
-    }
-    
-    /**
-     * Returns whether this binding is applies to the given memory block.
-     * 
-     * @param block memory block
-     * @return whether this binding is applies to the given memory block
-     */
-    private boolean isBound(IMemoryBlock block) {
-        Expression expression = getExpression();
-        if (expression != null) {
-            IEvaluationContext context = new EvaluationContext(null, block);
-            try {
-                return expression.evaluate(context) == EvaluationResult.TRUE;
-            } catch (CoreException e) {
-                DebugUIPlugin.log(e);
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    /**
-     * Validates this contribution.
-     * 
-     * @exception CoreException if invalid
-     */
-    void validate() throws CoreException {
-        if (fConfigurationElement.getAttribute(ATTR_PROVIDER) != null) {
-            if (fConfigurationElement.getAttribute(ATTR_RENDERING_IDS) != null ||
-                    fConfigurationElement.getAttribute(ATTR_DEFAULT_IDS) != null ||
-                    fConfigurationElement.getAttribute(ATTR_PRIMARY) != null) {
-                Status status = new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR,
-                        "<renderingBindings> element cannot specify other attributes when " + ATTR_PROVIDER + " is present", null); //$NON-NLS-1$ //$NON-NLS-2$
-                throw new CoreException(status);
-            }
-        }
-    }
-    
-    /**
-     * Returns this binding's enablement expression, or <code>null</code> if none.
-     * 
-     * @return enablement expression, or <code>null</code> if none
-     */
-    private Expression getExpression() {
-        if (fExpression == null) {
-            IConfigurationElement[] elements = fConfigurationElement.getChildren(ExpressionTagNames.ENABLEMENT);
-            IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-            if (enablement != null) {
-                try {
-                    fExpression = ExpressionConverter.getDefault().perform(enablement);
-                } catch (CoreException e) {
-                    DebugUIPlugin.log(e);
-                }
-            }
-        }
-        return fExpression;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#getRenderingTypes(org.eclipse.debug.core.model.IMemoryBlock)
-     */
-    public IMemoryRenderingType[] getRenderingTypes(IMemoryBlock block) {
-        if (isBound(block)) {
-            IMemoryRenderingBindingsProvider provider = getProvider(block);
-            if (provider == null) {
-                if (fAllTypes == null) {
-                    IMemoryRenderingType[] defaultBindings = getDefaultBindings();
-                    IMemoryRenderingType[] bindings = getBindings();
-                    fAllTypes = new IMemoryRenderingType[defaultBindings.length + bindings.length];
-                    for (int i = 0; i < defaultBindings.length; i++) {
-                        fAllTypes[i] = defaultBindings[i];
-                    }
-                    for (int i = 0, j = defaultBindings.length; i < bindings.length; i++, j++) {
-                        fAllTypes[j] = bindings[i];
-                    }
-                }
-                return fAllTypes;
-            }
-            return provider.getRenderingTypes(block);
-        }
-        return EMPTY;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#getDefaultRenderingTypes(org.eclipse.debug.core.model.IMemoryBlock)
-     */
-    public IMemoryRenderingType[] getDefaultRenderingTypes(IMemoryBlock block) {
-        if (isBound(block)) {
-            IMemoryRenderingBindingsProvider provider = getProvider(block);
-            if (provider == null) {
-                return getDefaultBindings();
-            }
-            return provider.getDefaultRenderingTypes(block);
-        }
-        return EMPTY;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#getPrimaryRenderingType(org.eclipse.debug.core.model.IMemoryBlock)
-     */
-    public IMemoryRenderingType getPrimaryRenderingType(IMemoryBlock block) {
-        if (isBound(block)) {
-            IMemoryRenderingBindingsProvider provider = getProvider(block);
-            if (provider == null) {
-                String primaryId = getPrimaryId();
-                if (primaryId != null) {
-                    return getManager().getRenderingType(primaryId);
-                }
-            } else {
-                return provider.getPrimaryRenderingType(block);
-            }
-        }
-        return null;
-    }
-    
-    private IMemoryRenderingManager getManager() { 
-        return DebugUITools.getMemoryRenderingManager();
-    }
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java
deleted file mode 100644
index 34cc56e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java
+++ /dev/null
@@ -1,3293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.memory.provisional;
-
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-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.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.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.memory.IPersistableDebugElement;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AbstractBaseTableRendering;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AbstractVirtualContentTableModel;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AsyncCopyTableRenderingAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AsyncPrintTableRenderingAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AsyncTableRenderingCellModifier;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AsyncTableRenderingViewer;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AsyncVirtualContentTableViewer;
-import org.eclipse.debug.internal.ui.views.memory.renderings.CopyTableRenderingToClipboardAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.FormatTableRenderingAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.FormatTableRenderingDialog;
-import org.eclipse.debug.internal.ui.views.memory.renderings.GoToAddressAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.GoToAddressComposite;
-import org.eclipse.debug.internal.ui.views.memory.renderings.IPresentationErrorListener;
-import org.eclipse.debug.internal.ui.views.memory.renderings.IVirtualContentListener;
-import org.eclipse.debug.internal.ui.views.memory.renderings.MemorySegment;
-import org.eclipse.debug.internal.ui.views.memory.renderings.PendingPropertyChanges;
-import org.eclipse.debug.internal.ui.views.memory.renderings.PrintTableRenderingAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.ReformatAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.ResetToBaseAddressAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingContentDescriptor;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingLine;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.debug.ui.memory.IMemoryBlockTablePresentation;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.debug.ui.memory.IResettableMemoryRendering;
-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.dialogs.IDialogConstants;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackAdapter;
-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.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Abstract implementation of a table rendering.
- * <p>
- * Clients should subclass from this class if they wish to provide a
- * table rendering.
- * </p>
- * <p>
- *
- * The label of the rendering is constructed by retrieving the expression from
- * <code>IMemoryBlockExtension</code>.  For IMemoryBlock, the label is constructed
- * using the memory block's start address.
- * 
- * This rendering manages the change states of its memory bytes if the memory
- * block does not opt to manage the change states.  For IMemoryBlockExtension, if
- * the memory block returns false when #supportsChangeManagement() is called, this
- * rendering will calculate the change state for each byte when its content is updated.
- * Clients may manages the change states of its memory block by returning true when
- * #supportsChangeManagement() is called.  This will cause this rendering to stop
- * calculating the change states of the memory block.  Instead it would rely on the
- * attributes returned in the MemoryByte array to determine if a byte has changed.
- * For IMemoryBlock, this rendering will manage the change states its content.   
- * 
- *  When firing change event, be aware of the following:
- *  - whenever a change event is fired, the content provider for Memory View
- *    view checks to see if memory has actually changed.  
- *  - If memory has actually changed, a refresh will commence.  Changes to the memory block
- *    will be computed and will be shown with the delta icons.
- *  - If memory has not changed, content will not be refreshed.  However, previous delta information 
- * 	  will be erased.  The screen will be refreshed to show that no memory has been changed.  (All
- *    delta icons will be removed.)
- *    
- * Please note that these APIs will be called multiple times by the Memory View.
- * To improve performance, debug adapters need to cache the content of its memory block and only
- * retrieve updated data when necessary.
- * </p>
-
- * @since 3.2
- */
-public abstract class AbstractAsyncTableRendering extends AbstractBaseTableRendering implements IPropertyChangeListener, IResettableMemoryRendering {
-
-	/**
-	 *  Property identifier for the selected address in a table rendering
-	 *  This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_SELECTED_ADDRESS = AbstractTableRendering.PROPERTY_SELECTED_ADDRESS;
-	
-	/**
-	 * Property identifier for the column size in a table rendering
-	 * This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_COL_SIZE = AbstractTableRendering.PROPERTY_COL_SIZE;
-	
-	/**
-	 * Property identifier for the top row address in a table rendering. 
-	 * This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_TOP_ADDRESS = AbstractTableRendering.PROPERTY_TOP_ADDRESS;
-	
-	private static final String ID_ASYNC_TABLE_RENDERING_CONTEXT = "org.eclipse.debug.ui.memory.abstractasynctablerendering"; //$NON-NLS-1$
-	private static final String ID_GO_TO_ADDRESS_COMMAND = "org.eclipse.debug.ui.command.gotoaddress"; //$NON-NLS-1$
-	private static final String ID_NEXT_PAGE_COMMAND = "org.eclipse.debug.ui.command.nextpage"; //$NON-NLS-1$
-	private static final String ID_PREV_PAGE_COMMAND = "org.eclipse.debug.ui.command.prevpage"; //$NON-NLS-1$
-	
-	/**
-	 * Property identifier for the row size in a table rendering
-	 * This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_ROW_SIZE = AbstractTableRendering.PROPERTY_ROW_SIZE;
-
-	private static final int DEFAULT_BUFFER_THRESHOLD = 1;
-	
-	private boolean fActivated = false;
-	
-//	TODO:  review use of MemorySegment, need to be careful to ensure flexible hierarchy
-	
-	private class ToggleAddressColumnAction extends Action {
-
-		public ToggleAddressColumnAction() {
-			super();
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID
-					+ ".ShowAddressColumnAction_context"); //$NON-NLS-1$
-			updateActionLabel();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			fIsShowAddressColumn = !fIsShowAddressColumn;
-			if (!fIsShowAddressColumn)
-			{
-				fTableViewer.getTable().getColumn(0).setWidth(0);
-			}
-			else
-			{
-				fTableViewer.getTable().getColumn(0).pack();
-			}
-			updateActionLabel();
-		}
-
-		/**
-		 * 
-		 */
-		private void updateActionLabel() {
-			if (fIsShowAddressColumn) {
-				setText(DebugUIMessages.ShowAddressColumnAction_0); 
-			} else {
-				setText(DebugUIMessages.ShowAddressColumnAction_1); 
-			}
-		}
-	}
-	
-	private class NextPageAction extends Action
-	{
-		private NextPageAction()
-		{
-			super();
-			setText(DebugUIMessages.AbstractTableRendering_4);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".NextPageAction_context"); //$NON-NLS-1$ 
-		}
-
-		public void run() {
-			BigInteger address = fContentDescriptor.getLoadAddress();
-			address = address.add(BigInteger.valueOf(getPageSizeInUnits()));
-			handlePageStartAddressChanged(address);
-		}
-	}
-	
-	private class PrevPageAction extends Action
-	{
-		private PrevPageAction()
-		{
-			super();
-			setText(DebugUIMessages.AbstractTableRendering_6);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".PrevPageAction_context"); //$NON-NLS-1$
-		}
-
-		public void run() {
-			BigInteger address = fContentDescriptor.getLoadAddress();
-			address = address.subtract(BigInteger.valueOf(getPageSizeInUnits()));
-			handlePageStartAddressChanged(address);
-		}
-	}
-	
-	private class RenderingGoToAddressAction extends GoToAddressAction
-	{
-		public RenderingGoToAddressAction(AbstractBaseTableRendering rendering) {
-			super(rendering);
-		}
-		
-		public void run() {
-			showGoToAddressComposite();
-		}
-	}
-	
-	private class SwitchPageJob extends UIJob {
-		private Object fLock = new Object();
-		private boolean fShowMessagePage = false;
-		private String fMessage = ""; //$NON-NLS-1$
-
-		private SwitchPageJob() {
-			super("SwitchPageJob");//$NON-NLS-1$
-			setSystem(true);
-		}
-
-		private void setShowMessagePage(boolean showMsg) {
-			synchronized(fLock)
-			{
-				fShowMessagePage = showMsg;
-			}
-		}
-
-		private void setMessage(String message) {
-			synchronized(fLock)
-			{
-				fMessage = message;
-			}
-		}
-
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			
-			if (fPageBook.isDisposed())
-				return Status.OK_STATUS;
-			
-			String msgToShow = null;
-			boolean showMsgPage = false;
-			synchronized (fLock) {
-				msgToShow = fMessage;
-				showMsgPage = fShowMessagePage;
-			}
-			
-			if (showMsgPage) {
-				StyledText styleText = null;
-				fShowMessage = true;
-
-				styleText = fTextViewer.getTextWidget();
-
-				if (styleText != null)
-					styleText.setText(msgToShow);
-				fPageBook.showPage(fTextViewer.getControl());
-			} else {
-				fShowMessage = false;
-				fPageBook.showPage(fTableViewer.getControl().getParent());
-			}
-			return Status.OK_STATUS;
-		}
-	}
-	
-	
-	private class SerialByObjectRule implements ISchedulingRule
-	{
-    	private Object fObject = null;
-    	
-    	public SerialByObjectRule(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 SerialByObjectRule) {
-				SerialByObjectRule rRule = (SerialByObjectRule) rule;
-				return fObject == rRule.fObject;
-			}
-			return false;
-		}
-	}
-	
-	private PageBook fPageBook;
-	private AsyncTableRenderingViewer fTableViewer;
-	private TextViewer fTextViewer;
-	private Shell fToolTipShell;
-	private MemoryViewPresentationContext fPresentationContext;
-	private int fAddressableSize;
-	private TableRenderingContentDescriptor fContentDescriptor;
-	private int fBytePerLine;
-	private int fColumnSize;
-	private boolean fShowMessage = false;
-	private String fLabel;
-	private IWorkbenchAdapter fWorkbenchAdapter;
-	private int fPageSize;
-	private int fPreBufferSize = -1;
-	private int fPostBufferSize = -1;
-	private SashForm fSashForm;
-	private GoToAddressComposite fGoToAddressComposite;
-	
-	// actions
-	private GoToAddressAction fGoToAddressAction;
-	private PrintTableRenderingAction fPrintViewTabAction;
-	private CopyTableRenderingToClipboardAction fCopyToClipboardAction;
-	private FormatTableRenderingAction fFormatRenderingAction;
-	private ReformatAction fReformatAction;
-	private ToggleAddressColumnAction fToggleAddressColumnAction;
-	private ResetToBaseAddressAction fResetMemoryBlockAction;
-	private PropertyDialogAction fPropertiesDialogAction;
-	private NextPageAction fNextAction;
-	private PrevPageAction fPrevAction;
-	
-	private ArrayList fContext = new ArrayList();
-	private AbstractHandler fGoToAddressHandler;
-	
-	private AbstractHandler fNextPageHandler;
-	private AbstractHandler fPrevPageHandler;
-	
-	private boolean fIsCreated = false;
-	private boolean fIsDisposed = false;
-	private boolean fIsShowAddressColumn = true;
-	
-	private SwitchPageJob fSwitchPageJob = new SwitchPageJob();
-	private boolean fError = false;
-	
-	private PendingPropertyChanges fPendingSyncProperties;
-	
-	// list of menu listeners for popupMenuMgr.  
-	private ArrayList fMenuListeners;
-	private MenuManager fMenuMgr;
-	
-	private ISchedulingRule serialByRenderingRule = new SerialByObjectRule(this);
-	
-	/** 
-	 * Identifier for an empty group preceding all context menu actions 
-	 * (value <code>"popUpBegin"</code>).
-	 */
-	public static final String EMPTY_MEMORY_GROUP = "popUpBegin"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for an empty group following navigation actions in the rendering
-	 * (value <code>navigationGroup</code>).
-	 */
-	public static final String EMPTY_NAVIGATION_GROUP = "navigationGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for an empty group following actions that are only applicable in
-	 * non-auto loading mode
-	 * (value <code>nonAutoLoadGroup</code>).
-	 */
-	public static final String EMPTY_NON_AUTO_LOAD_GROUP = "nonAutoLoadGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for an empty group following properties actions
-	 * (value <code>propertyGroup</code>).
-	 */
-	public static final String EMPTY_PROPERTY_GROUP = "propertyGroup"; //$NON-NLS-1$
-	
-	private ISelectionChangedListener fViewerSelectionChangedListener = new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			updateSyncTopAddress(getTopVisibleAddress());
-			updateSyncSelectedAddress(getSelectedAddress());
-		}
-	};
-	
-	private SelectionAdapter fScrollBarSelectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			updateSyncTopAddress(getTopVisibleAddress());
-		}
-	};
-	
-	private IModelChangedListener fModelChangedListener = new IModelChangedListener() {
-		public void modelChanged(IModelDelta delta, IModelProxy proxy) {
-			if (delta.getElement() == getMemoryBlock())
-			{
-				showTable();
-				updateRenderingLabel(isVisible());
-			}
-		}};
-	
-	private IVirtualContentListener fViewerListener = new IVirtualContentListener() {
-		
-		private int startThreshold;
-		private int endThreshold;
-
-		public void handledAtBufferStart() {
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				if (isDynamicLoad() && startThreshold != 0)
-				{
-					BigInteger address = getTopVisibleAddress();
-					if (address != null && !isAtTopLimit())
-						reloadTable(address);
-				}
-			}
-		}
-
-		public void handleAtBufferEnd() {
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				if (isDynamicLoad() && endThreshold != 0)
-				{
-					BigInteger address = getTopVisibleAddress();
-					if (address != null && !isAtBottomLimit())
-						reloadTable(address);
-				}
-			}
-		}
-
-		public int getThreshold(int bufferEndOrStart) {
-			
-			int threshold = DEFAULT_BUFFER_THRESHOLD;
-			
-			if (bufferEndOrStart == IVirtualContentListener.BUFFER_START)
-			{
-				if (threshold > getPreBufferSize())
-				{
-					threshold = getPreBufferSize();
-				}
-			}
-			else
-			{
-				if (threshold > getPostBufferSize())
-				{
-					threshold = getPostBufferSize();
-				}
-			}
-			
-			if (bufferEndOrStart == IVirtualContentListener.BUFFER_START)
-				startThreshold = threshold;
-			else
-				endThreshold = threshold;
-			
-			return threshold;
-		}};
-		
-	private IPresentationErrorListener fPresentationErrorListener = new IPresentationErrorListener() {
-		public void handlePresentationFailure(IStatusMonitor monitor, IStatus status) {
-			showMessage(status.getMessage());
-		}};
-	
-	
-	/**
-	 * Constructs a new table rendering of the specified type.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 */
-	public AbstractAsyncTableRendering(String renderingId) {
-		super(renderingId);
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IResettableMemoryRendering#resetRendering()
-	 */
-	public void resetRendering() throws DebugException {
-		BigInteger baseAddress = fContentDescriptor.getContentBaseAddress();
-
-		fTableViewer.setSelection(baseAddress);
-		reloadTable(baseAddress);
-		fTableViewer.setTopIndex(baseAddress);
-		if (!isDynamicLoad())
-		{						
-			updateSyncPageStartAddress(baseAddress);
-		}
-		
-		updateSyncSelectedAddress(baseAddress);
-		updateSyncTopAddress(baseAddress);		
-	}
-
-	public Control createControl(Composite parent) {
-		
-		fPageBook = new PageBook(parent, SWT.NONE);
-		createMessagePage(fPageBook);
-		createTableViewer(fPageBook);
-		addListeners();
-		
-		return fPageBook;
-	}
-	
-	/**
-	 * Create the error page of this rendering
-	 * @param parent
-	 */
-	private void createMessagePage(Composite parent)
-	{
-		if (fTextViewer == null)
-		{
-			fTextViewer = new TextViewer(parent, SWT.WRAP);	
-			fTextViewer.setDocument(new Document());
-			StyledText styleText = fTextViewer.getTextWidget();
-			styleText.setEditable(false);
-			styleText.setEnabled(false);
-		}
-	}
-	
-	/**
-	 * @param parent
-	 */
-	private void createTableViewer(final Composite parent)
-	{
-		StringBuffer buffer = new StringBuffer();
-		IMemoryRenderingType type = DebugUITools.getMemoryRenderingManager().getRenderingType(getRenderingId());
-		buffer.append(type.getLabel());
-		buffer.append(": "); //$NON-NLS-1$
-		buffer.append(DebugUIMessages.AbstractAsyncTableRendering_2);
-		
-		Job job = new Job(buffer.toString()) {
-
-			protected IStatus run(IProgressMonitor monitor) {
-				
-				// gather information from memory block
-				initAddressableSize();					
-				final BigInteger topVisibleAddress = getInitialTopVisibleAddress();
-				BigInteger mbBaseAddress = null;
-				try {
-					mbBaseAddress = getMemoryBlockBaseAddress();
-				} catch (DebugException e) {
-					fError = true;
-					showMessage(e.getMessage());
-				}
-				
-				// if it takes too long to get the base address, and user has canceled
-				// remove this rendering.
-				if (monitor.isCanceled())
-				{
-					getMemoryRenderingContainer().removeMemoryRendering(AbstractAsyncTableRendering.this);
-					return Status.CANCEL_STATUS;
-				}
-				
-				final BigInteger finalMbBaseAddress = mbBaseAddress;
-				final BigInteger initialSelectedAddress = getInitialSelectedAddress();
-				
-				if (monitor.isCanceled())
-				{
-					getMemoryRenderingContainer().removeMemoryRendering(AbstractAsyncTableRendering.this);
-					return Status.CANCEL_STATUS;
-				}
-				
-				createContentDescriptor(topVisibleAddress);
-				
-				// if it takes too long to get other information, and user has canceled
-				// remove this rendering.
-				if (monitor.isCanceled())
-				{
-					getMemoryRenderingContainer().removeMemoryRendering(AbstractAsyncTableRendering.this);
-					return Status.CANCEL_STATUS;
-				}
-				
-				// batch update on UI thread
-				UIJob uiJob = new UIJob("Create Table Viewer UI Job"){ //$NON-NLS-1$
-					public IStatus runInUIThread(IProgressMonitor progressMonitor) {
-						
-						if (fPageBook.isDisposed())
-							return Status.OK_STATUS;
-						
-						fSashForm = new SashForm(parent, SWT.VERTICAL);
-						fTableViewer = new AsyncTableRenderingViewer(AbstractAsyncTableRendering.this, fSashForm, SWT.VIRTUAL | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.HIDE_SELECTION | SWT.BORDER);
-
-						GridData data = new GridData(GridData.FILL_BOTH);
-						fTableViewer.getControl().setLayoutData(data);
-						
-						createGoToAddressComposite(fSashForm);
-						hideGotoAddressComposite();
-						
-						IMemoryRenderingSite site = getMemoryRenderingContainer().getMemoryRenderingSite();
-						IMemoryRenderingContainer container = getMemoryRenderingContainer();
-						fPresentationContext = new MemoryViewPresentationContext(site, container, AbstractAsyncTableRendering.this);
-						fTableViewer.setContext(fPresentationContext);
-						
-						// must call this after the context is created as the information is stored in the context
-						getDynamicLoadFromPreference();
-						getPageSizeFromPreference();
-						
-						int numberOfLines = getNumLinesToLoad();
-						fContentDescriptor.setNumLines(numberOfLines);
-						
-						if (numberOfLines == 0)
-						{
-							// if the table viewer is not initialized yet, add listener
-							// and load table when we can get the height of the table
-							fTableViewer.getTable().addPaintListener(new PaintListener() {
-								public void paintControl(PaintEvent e) {
-									fTableViewer.getTable().removePaintListener(this);
-									fContentDescriptor.setNumLines(getNumLinesToLoad());
-									refresh();
-								}});
-						}
-						
-						BigInteger baseAddress = finalMbBaseAddress;
-						if (baseAddress == null)
-							baseAddress = BigInteger.ZERO;
-						
-						if (!(getMemoryBlock() instanceof IMemoryBlockExtension) || !isDynamicLoad())
-						{		
-							// If not extended memory block, do not create any buffer
-							// no scrolling
-							fContentDescriptor.setPreBuffer(0);
-							fContentDescriptor.setPostBuffer(0);
-						} 
-						
-						setupInitialFormat();
-						fTableViewer.setCellModifier(newInternalCellModifier());
-						fTableViewer.getTable().setHeaderVisible(true);
-						fTableViewer.getTable().setLinesVisible(true);	
-						fTableViewer.addPresentationErrorListener(fPresentationErrorListener);
-						fTableViewer.setInput(getMemoryBlock());
-						fTableViewer.resizeColumnsToPreferredSize();
-						fTableViewer.setTopIndex(topVisibleAddress);
-						
-						fTableViewer.setSelection(initialSelectedAddress);
-
-						// SET UP FONT		
-						// set to a non-proportional font
-						fTableViewer.getTable().setFont(JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME));
-						
-						if (!fError)
-							showTable();
-						
-						fTableViewer.addVirtualContentListener(fViewerListener);
-						
-						// create context menu
-						// create pop up menu for the rendering
-						createActions();
-						IMenuListener menuListener = new IMenuListener() {
-							public void menuAboutToShow(IMenuManager mgr) {
-								fillContextMenu(mgr);
-							}
-						};
-						createPopupMenu(fTableViewer.getControl(), menuListener);
-						createPopupMenu(fTableViewer.getCursor(), menuListener);
-						
-						fTableViewer.addSelectionChangedListener(fViewerSelectionChangedListener);
-						fTableViewer.getTable().getVerticalBar().addSelectionListener(fScrollBarSelectionListener);
-						
-						// add resize listener to figure out number of visible lines 
-						// so that the viewer get refreshed with the correct number of lines on the
-						// next refresh request
-						fTableViewer.getTable().addListener(SWT.Resize, new Listener() {
-							public void handleEvent(Event event) {
-								if (!fTableViewer.getTable().isDisposed())
-									fContentDescriptor.setNumLines(getNumLinesToLoad());
-							}});
-						
-						createToolTip();
-						
-						if (isActivated())
-						{
-							activatePageActions();
-						}
-						
-						// now the rendering is successfully created
-						fIsCreated = true;											
-						
-						return Status.OK_STATUS;
-					}};
-				uiJob.setSystem(true);
-				uiJob.schedule();
-					
-				return Status.OK_STATUS;
-
-			}};
-			
-		job.schedule();
-	}
-	
-	/**
-	 * Create popup menu for this rendering
-	 * @param control - control to create the popup menu for
-	 * @param menuListener - listener to notify when popup menu is about to show
-	 */
-	private void createPopupMenu(Control control, IMenuListener menuListener)
-	{
-		IMemoryRenderingContainer container = getMemoryRenderingContainer();
-		if (fMenuMgr == null)
-		{
-			fMenuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-			fMenuMgr.setRemoveAllWhenShown(true);
-			IMemoryRenderingSite site = container.getMemoryRenderingSite();
-			String menuId = container.getId();
-						
-			ISelectionProvider selProvider = site.getSite().getSelectionProvider();
-			
-			addMenuListener(menuListener);
-
-			site.getSite().registerContextMenu(menuId, fMenuMgr, selProvider);
-		}
-		
-		addMenuListener(menuListener);
-		
-		Menu popupMenu = fMenuMgr.createContextMenu(control);
-		control.setMenu(popupMenu);
-	}
-
-
-	private void addMenuListener(IMenuListener menuListener) {
-		if (fMenuListeners == null)
-			fMenuListeners = new ArrayList();
-		
-		if (!fMenuListeners.contains(menuListener))
-		{
-			fMenuMgr.addMenuListener(menuListener);
-			fMenuListeners.add(menuListener);
-		}
-	}
-
-	private BigInteger getInitialSelectedAddress() {
-		// figure out selected address 
-		BigInteger selectedAddress = (BigInteger) getSynchronizedProperty(AbstractAsyncTableRendering.PROPERTY_SELECTED_ADDRESS);
-		if (selectedAddress == null)
-		{
-			if (getMemoryBlock() instanceof IMemoryBlockExtension) {
-				try {
-					selectedAddress = ((IMemoryBlockExtension) getMemoryBlock()).getBigBaseAddress();
-				} catch (DebugException e) {
-					selectedAddress = BigInteger.ZERO;
-				}
-				
-				if (selectedAddress == null) {
-					selectedAddress =BigInteger.ZERO;
-				}
-
-			} else {
-				long address = getMemoryBlock().getStartAddress();
-				selectedAddress = BigInteger.valueOf(address);
-			}
-		}
-		return selectedAddress;
-	}
-	
-	private void addListeners()
-	{
-		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-		addRenderingToSyncService();
-		JFaceResources.getFontRegistry().addListener(this);
-	}
-	
-	private void removeListeners()
-	{
-		DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		removeRenderingFromSyncService();
-		JFaceResources.getFontRegistry().removeListener(this);
-		
-		Iterator iter = fMenuListeners.iterator();
-		while (iter.hasNext())
-		{
-			fMenuMgr.removeMenuListener((IMenuListener)iter.next());
-		}
-		
-		fMenuListeners.clear();
-	}
-	
-	private void addRenderingToSyncService()
-	{	
-		IMemoryRenderingSynchronizationService syncService = getMemoryRenderingContainer().getMemoryRenderingSite().getSynchronizationService();
-		
-		if (syncService == null)
-			return;
-		
-		syncService.addPropertyChangeListener(this, null);
-	}
-	
-	private void removeRenderingFromSyncService()
-	{
-		IMemoryRenderingSynchronizationService syncService = getMemoryRenderingContainer().getMemoryRenderingSite().getSynchronizationService();
-		
-		if (syncService == null)
-			return;
-		
-		syncService.removePropertyChangeListener(this);		
-	}
-	
-	private void initAddressableSize()
-	{
-		// set up addressable size and figure out number of bytes required per line
-		fAddressableSize = -1;
-		try {
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-				fAddressableSize = ((IMemoryBlockExtension)getMemoryBlock()).getAddressableSize();
-			else
-				fAddressableSize = 1;
-		} catch (DebugException e1) {
-			DebugUIPlugin.log(e1);
-			// log error and default to 1
-			fAddressableSize = 1;
-			return;
-			
-		}
-		if (fAddressableSize < 1)
-		{
-			DebugUIPlugin.logErrorMessage("Invalid addressable size"); //$NON-NLS-1$
-			fAddressableSize = 1;
-		}
-	}
-	
-	private BigInteger getInitialTopVisibleAddress() {
-		BigInteger topVisibleAddress = (BigInteger) getSynchronizedProperty(AbstractAsyncTableRendering.PROPERTY_TOP_ADDRESS);
-		if (topVisibleAddress == null)
-		{
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				try {
-					topVisibleAddress = ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress();
-				} catch (DebugException e1) {
-					topVisibleAddress = new BigInteger("0"); //$NON-NLS-1$
-				}
-			}
-			else
-			{
-				topVisibleAddress = BigInteger.valueOf(getMemoryBlock().getStartAddress());
-			}
-		}
-		return topVisibleAddress;
-	}
-	
-	private void setupInitialFormat() {
-		
-		boolean validated = validateInitialFormat();
-		
-		if (!validated)
-		{
-			// pop up dialog to ask user for default values
-			StringBuffer msgBuffer = new StringBuffer(DebugUIMessages.AbstractTableRendering_20);
-			msgBuffer.append(" "); //$NON-NLS-1$
-			msgBuffer.append(this.getLabel());
-			msgBuffer.append("\n\n"); //$NON-NLS-1$
-			msgBuffer.append(DebugUIMessages.AbstractTableRendering_16);
-			msgBuffer.append("\n"); //$NON-NLS-1$
-			msgBuffer.append(DebugUIMessages.AbstractTableRendering_18);
-			msgBuffer.append("\n\n"); //$NON-NLS-1$
-			
-			int bytePerLine = fBytePerLine;
-			int columnSize = fColumnSize;
-			
-			// initialize this value to populate the dialog properly
-			fBytePerLine = getDefaultRowSize() / getAddressableSize();
-			fColumnSize = getDefaultColumnSize() / getAddressableSize();
-
-			FormatTableRenderingDialog dialog = new FormatTableRenderingDialog(this, DebugUIPlugin.getShell());
-			dialog.openError(msgBuffer.toString());
-			
-			// restore to original value before formatting
-			fBytePerLine = bytePerLine;
-			fColumnSize = columnSize;
-			
-			bytePerLine = dialog.getRowSize() * getAddressableSize();
-			columnSize = dialog.getColumnSize() * getAddressableSize();
-			
-			format(bytePerLine, columnSize);
-		}
-		else
-		{
-			// Row size is stored as number of addressable units in preference store
-			int bytePerLine = getDefaultRowSize();
-			// column size is now stored as number of addressable units
-			int columnSize = getDefaultColumnSize();
-			
-			// format memory block with specified "bytesPerLine" and "columnSize"	
-			boolean ok = format(bytePerLine, columnSize);
-			
-			if (!ok)
-			{
-				// this is to ensure that the rest of the rendering can be created
-				// and we can recover from a format error
-				format(bytePerLine, bytePerLine);
-			}
-		}
-	}
-	
-	private boolean validateInitialFormat()
-	{
-		int rowSize = getDefaultRowSize();
-		int columnSize = getDefaultColumnSize();
-		
-		if (rowSize < columnSize || rowSize % columnSize != 0 || rowSize == 0 || columnSize == 0)
-		{
-			return false;
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#getControl()
-	 */
-	public Control getControl() {
-		return fPageBook.getParent();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (!fIsCreated)
-			return;
-		
-		// if memory view table font has changed
-		if (event.getProperty().equals(IInternalDebugUIConstants.FONT_NAME))
-		{
-			if (!fIsDisposed)
-			{			
-				Font memoryViewFont = JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME);
-				setFont(memoryViewFont);	
-			}
-			return;
-		}
-		
-		Object evtSrc = event.getSource();
-
-		// always update page size, only refresh if the table is visible
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE)) {
-			getPageSizeFromPreference();
-		}
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE))
-		{
-			getPreBufferSizeFromPreference();
-			fContentDescriptor.setPreBuffer(getPreBufferSize());
-		}
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE))
-		{
-			getPostBufferSizeFromPreference();
-			fContentDescriptor.setPostBuffer(getPostBufferSize());	
-		}
-		
-		// do not handle event if the rendering is displaying an error
-		// or if it's not visible
-		if (isDisplayingError() || !isVisible())
-		{
-			handlePropertiesChangeWhenHidden(event);
-			return;
-		}
-		
-		
-		if (event.getProperty().equals(IDebugUIConstants.PREF_PADDED_STR) || 
-			event.getProperty().equals(IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR) ||
-			event.getProperty().equals(IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR) ||
-			event.getProperty().equals(IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR))
-		{
-			if (!fIsDisposed)
-			{
-				fTableViewer.refresh(false);
-			}
-			return;
-		}
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE) ||
-			event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE))
-		{
-			if (!fIsDisposed)
-			{
-				fTableViewer.refresh(true);
-			}
-			return;
-		}
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM)) {
-			handleDyanicLoadChanged();
-			return;
-		}
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE)) {
-			if (!isDynamicLoad())
-			{
-				int pageSize = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE);
-				handlePageSizeChanged(pageSize);
-			}
-			return;
-		}
-		
-		if (evtSrc == this)
-			return;
-		
-		if (evtSrc instanceof IMemoryRendering)
-		{
-			IMemoryRendering rendering = (IMemoryRendering)evtSrc;
-			IMemoryBlock memoryBlock = rendering.getMemoryBlock();
-			
-			// do not handle event from renderings displaying other memory blocks
-			if (memoryBlock != getMemoryBlock())
-				return;
-		}
-	
-		String propertyName = event.getProperty();
-		Object value = event.getNewValue();
-		
-		if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_SELECTED_ADDRESS) && value instanceof BigInteger)
-		{
-			selectedAddressChanged((BigInteger)value);
-		}
-		else if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_COL_SIZE) && value instanceof Integer)
-		{
-			columnSizeChanged(((Integer)value).intValue());
-		}
-		else if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_ROW_SIZE) && value instanceof Integer)
-		{
-			rowSizeChanged(((Integer)value).intValue());
-		}
-		else if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_TOP_ADDRESS) && value instanceof BigInteger)
-		{
-			topVisibleAddressChanged((BigInteger)value);
-		}
-		else if (propertyName.equals(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS) && value instanceof BigInteger)
-		{
-			handlePageStartAddressChanged((BigInteger)value);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void handlePageSizeChanged(int pageSize) {
-		fPageSize = pageSize;
-		// only refresh if in non-auto-load mode
-		fContentDescriptor.setNumLines(pageSize);
-		refresh();
-	}	
-	
-	private void handlePropertiesChangeWhenHidden(PropertyChangeEvent event)
-	{
-		if (fPendingSyncProperties == null)
-			return;
-		
-		String propertyName = event.getProperty();
-		Object value = event.getNewValue();
-		
-		if (event.getSource() instanceof IMemoryRendering)
-		{
-			IMemoryRendering rendering = (IMemoryRendering)event.getSource();
-			if (rendering == this || rendering.getMemoryBlock() != getMemoryBlock())
-			{
-				return;
-			}
-		}
-		
-		if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_COL_SIZE) && value instanceof Integer)
-		{
-			fPendingSyncProperties.setColumnSize(((Integer)value).intValue());
-		}
-		else if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_ROW_SIZE) && value instanceof Integer)
-		{
-			fPendingSyncProperties.setRowSize(((Integer)value).intValue());
-		}
-		
-		else if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_SELECTED_ADDRESS) && value instanceof BigInteger)
-		{
-			fPendingSyncProperties.setSelectedAddress((BigInteger)value);
-		}
-		else if (propertyName.equals(AbstractAsyncTableRendering.PROPERTY_TOP_ADDRESS) && value instanceof BigInteger)
-		{
-			fPendingSyncProperties.setTopVisibleAddress((BigInteger)value);
-		}
-		else if (propertyName.equals(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS) && value instanceof BigInteger)
-		{
-			fPendingSyncProperties.setPageStartAddress((BigInteger)value);
-		}
-		else if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE)) {
-			int pageSize = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE);
-			fPendingSyncProperties.setPageSize(pageSize);
-		}
-	}
-	
-	private void topVisibleAddressChanged(final BigInteger address)
-	{
-		final Runnable runnable = new Runnable() {
-			public void run() {
-				if (fTableViewer.getTable().isDisposed())
-					return;
-				
-				doTopVisibleAddressChanged(address);
-			}};
-		runOnUIThread(runnable);
-	}
-	
-	/**
-	 * @param address
-	 */
-	private void doTopVisibleAddressChanged(final BigInteger address) {
-		if (fIsDisposed)
-			return;
-		
-		if (!isDynamicLoad())
-		{
-			fTableViewer.setTopIndex(address);
-			fTableViewer.topIndexChanged();
-			return;
-		}
-		
-		if (!isAtTopBuffer(address) && !isAtBottomBuffer(address))
-		{
-			fTableViewer.setTopIndex(address);
-			fTableViewer.topIndexChanged();
-		}
-		else
-		{
-			reloadTable(address);
-		}
-	}
-	
-	private boolean isAtBottomBuffer(BigInteger address)
-	{
-		int idx = fTableViewer.indexOf(address);
-		if (idx < 0)
-			return true;
-		
-		int bottomIdx = idx + getNumberOfVisibleLines();
-		int elementsCnt = fTableViewer.getVirtualContentModel().getElements().length;
-		int numLinesLeft = elementsCnt - bottomIdx;
-		
-		if (numLinesLeft < fViewerListener.getThreshold(IVirtualContentListener.BUFFER_END))
-			return true;
-		
-		return false;
-	}
-	
-	private boolean isAtTopBuffer(BigInteger address)
-	{
-		int topIdx = fTableViewer.indexOf(address);
-		if (topIdx < fViewerListener.getThreshold(IVirtualContentListener.BUFFER_START))
-			return true;
-		
-		return false;
-	}
-	
-	private void runOnUIThread(final Runnable runnable)
-	{
-		if (Display.getCurrent() != null)	
-		{
-			runnable.run();
-		}
-		else
-		{
-			UIJob job = new UIJob("Async Table Rendering UI Job"){ //$NON-NLS-1$
-	
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					runnable.run();
-					return Status.OK_STATUS;
-				}};
-			job.setSystem(true);
-			job.schedule();
-		}
-	}
-	
-	private void selectedAddressChanged(final BigInteger address)
-	{
-		Runnable runnable = new Runnable() {
-
-			public void run() {			
-				
-				if (fTableViewer.getTable().isDisposed())
-					return;
-						
-				// call this to make the table viewer to reload when needed
-				int i = fTableViewer.indexOf(address);
-				if (i < 0)
-				{
-					// the model may not have been populated yet,
-					// try to predict if the address will be in the buffer
-					boolean contained = isAddressBufferred(address);
-					if (!contained)
-						topVisibleAddressChanged(address);
-				}
-				fTableViewer.setSelection(address);
-			}
-		};
-		
-		runOnUIThread(runnable);
-	}
-	
-	private boolean isAddressBufferred(BigInteger address)
-	{
-		// figure out the buffer top address
-		BigInteger loadAddress = fContentDescriptor.getLoadAddress();
-		loadAddress = MemoryViewUtil.alignToBoundary(loadAddress, getAddressableUnitPerLine());
-		int unitPerLine = getAddressableUnitPerLine();
-		
-		loadAddress = loadAddress.subtract(BigInteger.valueOf(getPreBufferSize() * unitPerLine));
-		
-		// figure out the buffer end address
-		int numLines = fContentDescriptor.getNumLines();
-		BigInteger bufferEnd = loadAddress.add(BigInteger.valueOf(fContentDescriptor.getPostBuffer()*unitPerLine));
-		bufferEnd = bufferEnd.add(BigInteger.valueOf(numLines*unitPerLine + unitPerLine));
-		
-		// see if the address is contained based on current content descriptor
-		if (address.compareTo(loadAddress) >= 0 && address.compareTo(bufferEnd) <= 0)
-			return true;
-		
-		return false;
-	}
-	
-	private void setFont(Font font)
-	{	
-		// set font
-		fTableViewer.getTable().setFont(font);
-		fTableViewer.getCursor().setFont(font);		
-	}
-	
-	private int getDefaultColumnSize() {
-		
-		// default to global preference store
-		IPreferenceStore prefStore = DebugUITools.getPreferenceStore();
-		int columnSize = prefStore.getInt(IDebugPreferenceConstants.PREF_COLUMN_SIZE);
-		// actual column size is number of addressable units * size of the addressable unit
-		columnSize = columnSize * getAddressableSize();
-		
-		// check synchronized col size
-		Integer colSize = (Integer)getSynchronizedProperty(AbstractAsyncTableRendering.PROPERTY_COL_SIZE);
-		if (colSize != null)
-		{
-			// column size is stored as actual number of bytes in synchronizer
-			int syncColSize = colSize.intValue(); 
-			if (syncColSize > 0)
-			{
-				columnSize = syncColSize;
-			}	
-		}
-		else
-		{
-			IPersistableDebugElement elmt = (IPersistableDebugElement)getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			int defaultColSize = -1;
-			
-			if (elmt != null)
-			{
-				if (elmt.supportsProperty(this, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL))
-					defaultColSize = getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL);
-			}
-			
-			if (defaultColSize <= 0)
-			{
-				// if not provided, get default by model
-				defaultColSize = getDefaultColumnSizeByModel(getMemoryBlock().getModelIdentifier());
-			}
-			
-			if (defaultColSize > 0)
-				columnSize = defaultColSize * getAddressableSize();
-		}
-		return columnSize;
-	}
-
-	private int getDefaultRowSize() {
-		
-		int rowSize = DebugUITools.getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_ROW_SIZE);
-		int bytePerLine = rowSize * getAddressableSize();
-		
-		// check synchronized row size
-		Integer size = (Integer)getSynchronizedProperty(AbstractAsyncTableRendering.PROPERTY_ROW_SIZE);
-		if (size != null)
-		{
-			// row size is stored as actual number of bytes in synchronizer
-			int syncRowSize = size.intValue(); 
-			if (syncRowSize > 0)
-			{
-				bytePerLine = syncRowSize;
-			}	
-		}
-		else
-		{
-			int defaultRowSize = -1;
-			IPersistableDebugElement elmt = (IPersistableDebugElement)getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			if (elmt != null)
-			{
-				if (elmt.supportsProperty(this, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL))
-				{
-					defaultRowSize = getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL);
-					return defaultRowSize * getAddressableSize();
-				}
-			}
-			
-			if (defaultRowSize <= 0)
-				// no synchronized property, ask preference store by id
-				defaultRowSize = getDefaultRowSizeByModel(getMemoryBlock().getModelIdentifier());
-			
-			if (defaultRowSize > 0)
-				bytePerLine = defaultRowSize * getAddressableSize();
-		}
-		return bytePerLine;
-	}
-	
-	/**
-	 * Returns the addressable size of this rendering's memory block in bytes.
-	 * 
-	 * @return the addressable size of this rendering's memory block in bytes
-	 */
-	public int getAddressableSize() {
-		return fAddressableSize;
-	}
-	
-	private Object getSynchronizedProperty(String propertyId)
-	{
-		IMemoryRenderingSynchronizationService syncService = getMemoryRenderingContainer().getMemoryRenderingSite().getSynchronizationService();
-		
-		if (syncService == null)
-			return null;
-		
-		return syncService.getProperty(getMemoryBlock(), propertyId);	
-	}
-	
-	private int getDefaultFromPersistableElement(String propertyId) {
-		int defaultValue = -1;
-		IPersistableDebugElement elmt = (IPersistableDebugElement)getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-		if (elmt != null)
-		{
-			try {
-				Object valueMB = elmt.getProperty(this, propertyId);
-				if (valueMB != null && !(valueMB instanceof Integer))
-				{
-					IStatus status = DebugUIPlugin.newErrorStatus("Model returned invalid type on " + propertyId, null); //$NON-NLS-1$
-					DebugUIPlugin.log(status);
-				}
-				
-				if (valueMB != null)
-				{
-					Integer value = (Integer)valueMB;
-					defaultValue = value.intValue();
-				}
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-			}
-		}
-		return defaultValue;
-	}
-	
-	/**
-	 * @param modelId
-	 * @return default number of addressable units per line for the model
-	 */
-	private int getDefaultRowSizeByModel(String modelId)
-	{
-		int row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-		if (row == 0)
-		{
-			DebugUITools.getPreferenceStore().setValue(getRowPrefId(modelId), IDebugPreferenceConstants.PREF_ROW_SIZE_DEFAULT);
-		}
-		
-		row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-		return row;
-		
-	}
-	
-	/**
-	 * @param modelId
-	 * @return default number of addressable units per column for the model
-	 */
-	private int getDefaultColumnSizeByModel(String modelId)
-	{
-		int col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-		if (col == 0)
-		{
-			DebugUITools.getPreferenceStore().setValue(getColumnPrefId(modelId), IDebugPreferenceConstants.PREF_COLUMN_SIZE_DEFAULT);
-		}
-		
-		col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-		return col;
-	}
-	
-	
-	private String getRowPrefId(String modelId) {
-		String rowPrefId = IDebugPreferenceConstants.PREF_ROW_SIZE + ":" + modelId; //$NON-NLS-1$
-		return rowPrefId;
-	}
-
-	private String getColumnPrefId(String modelId) {
-		String colPrefId = IDebugPreferenceConstants.PREF_COLUMN_SIZE + ":" + modelId; //$NON-NLS-1$
-		return colPrefId;
-	}
-	
-	/**
-	 * Format view tab based on the bytes per line and column.
-	 * 
-	 * @param bytesPerLine - number of bytes per line, possible values: (1 / 2 / 4 / 8 / 16) * addressableSize
-	 * @param columnSize - number of bytes per column, possible values: (1 / 2 / 4 / 8 / 16) * addressableSize
-	 * @return true if format is successful, false, otherwise
-	 */
-	public boolean format(int bytesPerLine, int columnSize)
-	{	
-		
-		// bytes per cell must be divisible to bytesPerLine
-		if (bytesPerLine % columnSize != 0)
-		{
-			return false;
-		}
-		
-		if (bytesPerLine < columnSize)
-		{
-			return false;
-		}
-		
-		// do not format if the view tab is already in that format
-		if(fBytePerLine == bytesPerLine && fColumnSize == columnSize){
-			return false;
-		}
-		
-		fBytePerLine = bytesPerLine;
-		fColumnSize = columnSize;
-		formatViewer();
-
-		updateSyncRowSize();
-		updateSyncColSize();
-		
-		return true;
-	}
-		
-	
-	/**
-	 * Returns the number of addressable units per row.
-	 *  
-	 * @return number of addressable units per row
-	 */
-	public int getAddressableUnitPerLine() {
-		return fBytePerLine / getAddressableSize();
-	}
-	
-	/**
-	 * Returns the number of addressable units per column.
-	 * 
-	 * @return number of addressable units per column
-	 */
-	public int getAddressableUnitPerColumn() {
-		return fColumnSize / getAddressableSize();
-	}
-	
-	
-	/**
-	 * This method estimates the number of visible lines in the rendering
-	 * table.  
-	 * @return estimated number of visible lines in the table
-	 */
-	private int getNumberOfVisibleLines()
-	{
-		if(fTableViewer == null)
-			return -1;
-		
-		Table table = fTableViewer.getTable();
-		int height = fTableViewer.getTable().getSize().y;
-		
-		// when table is not yet created, height is zero
-		if (height == 0)
-		{
-			// make use of the table viewer to estimate table size
-			height = fTableViewer.getTable().getParent().getSize().y;
-		}
-		
-		if (height == 0)
-		{
-			return 0;
-		}
-		
-		// height of border
-		int border = fTableViewer.getTable().getHeaderHeight();
-		
-		// height of scroll bar
-		int scroll = fTableViewer.getTable().getHorizontalBar().getSize().y;
-
-		// height of table is table's area minus border and scroll bar height		
-		height = height-border-scroll;
-
-		// calculate number of visible lines
-		int lineHeight = getMinTableItemHeight(table);
-		
-		int numberOfLines = height/lineHeight;
-		
-		if (numberOfLines <= 0)
-			return 0;
-	
-		return numberOfLines;		
-	}
-	
-	private int getMinTableItemHeight(Table table){
-		
-		// Hack to get around Linux GTK problem.
-		// On Linux GTK, table items have variable item height as
-		// carriage returns are actually shown in a cell.  Some rows will be
-		// taller than others.  When calculating number of visible lines, we
-		// need to find the smallest table item height.  Otherwise, the rendering
-		// underestimates the number of visible lines.  As a result the rendering
-		// will not be able to get more memory as needed.
-		if (MemoryViewUtil.isLinuxGTK())
-		{
-			// check each of the items and find the minimum
-			TableItem[] items = table.getItems();
-			int minHeight = table.getItemHeight();
-			for (int i=0; i<items.length; i++)
-			{
-				if (items[i].getData() != null)
-					minHeight = Math.min(items[i].getBounds(0).height, minHeight);
-			}
-			
-			return minHeight;
-				
-		}
-		return table.getItemHeight();
-	}
-	
-	private BigInteger getMemoryBlockBaseAddress() throws DebugException
-	{
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			return ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress();
-		else
-			return BigInteger.valueOf(getMemoryBlock().getStartAddress());
-	}
-	
-	/**
-	 * Displays the given message on the error page
-	 * @param message - the message to display
-	 */
-	protected void showMessage(final String message)
-	{
-		fSwitchPageJob.setShowMessagePage(true);
-		fSwitchPageJob.setMessage(message);
-		fSwitchPageJob.schedule();
-	}
-	
-	/**
-	 * Returns the number of bytes displayed in a single column cell.
-	 * 
-	 * @return the number of bytes displayed in a single column cell
-	 */
-	public int getBytesPerColumn()
-	{
-		return fColumnSize;
-	}
-
-	/**
-	 * Returns the number of bytes displayed in a row.
-	 * 
-	 * @return the number of bytes displayed in a row
-	 */
-	public int getBytesPerLine()
-	{		
-		return fBytePerLine;
-	}
-	
-	/**
-	 * Returns whether the error page is displayed.
-	 * 
-	 * @return whether the error page is displayed
-	 */
-	public boolean isDisplayingError()
-	{
-		return fShowMessage;
-	}
-	
-	/**
-	 * Displays the content of the table viewer.
-	 */
-	public void showTable()
-	{
-		fSwitchPageJob.setShowMessagePage(false);
-		fSwitchPageJob.schedule();
-	}
-	
-	private BigInteger getTopVisibleAddress() {
-		
-		if (fTableViewer == null)
-			return BigInteger.valueOf(0);
-
-		Table table = fTableViewer.getTable();
-		int topIndex = table.getTopIndex();
-
-		if (topIndex < 0) { return null; }
-
-		if (table.getItemCount() > topIndex) 
-		{
-			MemorySegment topItem = (MemorySegment)table.getItem(topIndex).getData();
-			if (topItem != null)
-			{
-				return topItem.getAddress();
-			}
-		}
-		return null;
-	}
-	
-	private  synchronized void  reloadTable(final BigInteger topAddress) {
-		
-		if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-			System.out.println(this + " reload at: " + topAddress.toString(16)); //$NON-NLS-1$
-		
-		fContentDescriptor.setLoadAddress(topAddress);
-		fContentDescriptor.setNumLines(getNumLinesToLoad());
-		fTableViewer.setTopIndex(topAddress);
-		fTableViewer.refresh();
-
-	}
-	
-	private boolean isAtTopLimit()
-	{	
-		BigInteger startAddress = fContentDescriptor.getStartAddress();
-		startAddress = MemoryViewUtil.alignToBoundary(startAddress, getAddressableUnitPerLine());
-		AbstractVirtualContentTableModel model = fTableViewer.getVirtualContentModel();
-		
-		if (model != null)
-		{
-			Object key = model.getKey(0);
-			if (key instanceof BigInteger)
-			{
-				BigInteger startBufferAddress = (BigInteger)key;
-				startBufferAddress = MemoryViewUtil.alignToBoundary(startBufferAddress, getAddressableUnitPerLine());
-				
-				if (startAddress.compareTo(startBufferAddress) == 0)
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean isAtBottomLimit()
-	{
-		BigInteger endAddress = fContentDescriptor.getEndAddress();
-		endAddress = MemoryViewUtil.alignToBoundary(endAddress, getAddressableUnitPerLine());
-		
-		AbstractVirtualContentTableModel model = fTableViewer.getVirtualContentModel();
-		if (model != null)
-		{
-			int numElements = model.getElements().length;
-			Object key = model.getKey(numElements-1);
-			if (key instanceof BigInteger)
-			{
-				BigInteger endBufferAddress = (BigInteger)key;
-				endBufferAddress = MemoryViewUtil.alignToBoundary(endBufferAddress, getAddressableUnitPerLine());
-				
-				if (endAddress.compareTo(endBufferAddress) == 0)
-					return true;
-			}
-		}
-		
-		return false;		
-	}
-	
-	private void formatViewer() {
-		
-		fTableViewer.disposeColumns();
-		fTableViewer.disposeCellEditors();
-		doFormatTable();
-		fTableViewer.setColumnHeaders(getColumnProperties());
-		fTableViewer.showColumnHeader(true);
-		
-		Table table = fTableViewer.getTable();
-		int colCnt = table.getColumnCount();
-		CellEditor[] editors = new CellEditor[fTableViewer.getTable().getColumnCount()];
-		for (int i=0; i<colCnt; i++)
-		{
-			editors[i] = createCellEditor(table, i);
-		}
-		
-		fTableViewer.setCellEditors(editors);
-		
-		fTableViewer.formatViewer();
-		
-		// This resize needs to happen after the viewer has finished
-		// getting the labels.
-		// This fix is a hack to delay the resize until the viewer has a chance to get
-		// the setData event from the UI thread.  Otherwise, the columns will be
-		// squeezed together.
-		UIJob job = new UIJob("resize to fit"){ //$NON-NLS-1$
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				resizeColumnsToPreferredSize();
-				return Status.OK_STATUS;
-			}};
-		
-		job.setSystem(true);
-		job.schedule();
-	}
-
-	private void doFormatTable() {
-		int bytesPerLine = getBytesPerLine();
-		int columnSize = getBytesPerColumn();
-		int numColumns = bytesPerLine/columnSize;
-		
-		Table table = fTableViewer.getTable();
-		TableColumn column0 = new TableColumn(table,SWT.LEFT,0);
-		column0.setText(DebugUIMessages.AbstractTableRendering_2); 
-		
-		// create new byte columns
-		TableColumn [] byteColumns = new TableColumn[numColumns];		
-		for (int i=0;i<byteColumns.length; i++)
-		{
-			TableColumn column = new TableColumn(table, SWT.LEFT, i+1);
-			byteColumns[i] = column;
-		}
-		
-		//Empty column for cursor navigation
-		TableColumn emptyCol = new TableColumn(table,SWT.LEFT,byteColumns.length+1);
-		emptyCol.setText(" "); //$NON-NLS-1$
-		emptyCol.setWidth(1);
-		emptyCol.setResizable(false);
-	    table.setHeaderVisible(true);
-	    
-	    // allow clients to override column labels
-	   setColumnHeadings();
-	    
-	}
-	
-	private String[] getColumnProperties()
-	{
-		int numColumns = getAddressableUnitPerLine()/getAddressableUnitPerColumn();
-		// +2 to include properties for address and navigation column
-		String[] columnProperties = new String[numColumns+2];
-		columnProperties[0] = TableRenderingLine.P_ADDRESS;
-		
-		int addressableUnit = getAddressableUnitPerColumn();
-
-		// use column beginning offset to the row address as properties
-		for (int i=1; i<columnProperties.length-1; i++)
-		{
-			// column properties are stored as number of addressable units from the
-			// the line address
-			columnProperties[i] = Integer.toHexString((i-1)*addressableUnit);
-		}
-		
-		// Empty column for cursor navigation
-		columnProperties[columnProperties.length-1] = " "; //$NON-NLS-1$
-		return columnProperties;
-	}
-	
-   /**
-     * Create a cell editor from the specified composite and column.
-	 * @param composite parent composite that the cell editor is to be created from.
-	 * @param column the column where the cell editor is required
-	 * @return the cell editor for editing memory
-	 * 
-	 * @since 3.3
-     *
-	 */
-	protected CellEditor createCellEditor(Composite composite, int column) {
-	   
-	   return new TextCellEditor(composite);
-   }
-       
-   
-   private ICellModifier newInternalCellModifier()
-   {
-	   return new AsyncTableRenderingCellModifier(this, createCellModifier());
-   }
-   
-   	/**
-   	 * Create a custom cell modifier for this rendering.  Return null
-   	 * if the default cell modifier is to be used.
-   	 * @return the cell modifier for this rendering, or <code>null</code> if the 
-   	 * default cell modifier is to be used.
-   	 * 
-   	 * @since 3.3
-   	 * 
-   	 */
-   	protected ICellModifier createCellModifier() {
-       return null;
-   	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.AbstractMemoryRendering#dispose()
-	 */
-	public void dispose() {
-		
-		if (fIsDisposed)
-			return;
-		
-		fIsDisposed = true;
-		
-		removeListeners();
-		
-		if (fMenuMgr != null)
-		{
-			fMenuMgr.removeAll();
-			fMenuMgr.dispose();
-			fMenuMgr = null;
-		}
-		
-		if (fTableViewer != null)
-		{
-			if (fViewerListener != null)
-				fTableViewer.removeVirtualContentListener(fViewerListener);
-			
-			if (fPresentationErrorListener != null)
-				fTableViewer.removePresentationErrorListener(fPresentationErrorListener);
-			
-			fTableViewer.removeSelectionChangedListener(fViewerSelectionChangedListener);
-			fTableViewer.getTable().getVerticalBar().removeSelectionListener(fScrollBarSelectionListener);
-			
-			fTableViewer.dispose();
-		}
-		
-		fIsDisposed = true;
-		
-		super.dispose();
-	}
-	
-	/**
-	 * Updates the label of this rendering, optionally displaying the
-	 * base address of this rendering's memory block.
-	 * 
-	 * @param showAddress whether to display the base address of this
-	 *  rendering's memory block in this rendering's label
-	 */
-	protected void updateRenderingLabel(final boolean showAddress)
-	{
-		Job job = new Job("Update Rendering Label"){ //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				if (fIsDisposed)
-					return Status.OK_STATUS;
-				fLabel = buildLabel(showAddress);
-				firePropertyChangedEvent(new PropertyChangeEvent(AbstractAsyncTableRendering.this, IBasicPropertyConstants.P_TEXT, null, fLabel));
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.setRule(serialByRenderingRule);
-		job.schedule();
-	}
-	
-	private String buildLabel(boolean showAddress) {
-		String label = ""; //$NON-NLS-1$
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			label = ((IMemoryBlockExtension)getMemoryBlock()).getExpression();
-			
-			if (label.startsWith("&")) //$NON-NLS-1$
-				label = "&" + label; //$NON-NLS-1$
-			
-			if (label == null)
-			{
-				label = DebugUIMessages.AbstractTableRendering_8; 
-			}
-			
-			try {
-				if (showAddress && ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress() != null)
-				{	
-					label += " : 0x"; //$NON-NLS-1$
-					label += ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress().toString(16).toUpperCase();
-				}
-			} catch (DebugException e) {
-				// do nothing, the label will not show the address
-			}
-		}
-		else
-		{
-			long address = getMemoryBlock().getStartAddress();
-			label = Long.toHexString(address).toUpperCase();
-		}
-		
-		String preName = DebugUITools.getMemoryRenderingManager().getRenderingType(getRenderingId()).getLabel();
-		
-		if (preName != null)
-			label += " <" + preName + ">"; //$NON-NLS-1$ //$NON-NLS-2$
-		
-		return decorateLabel(label);
-	}
-	
-	/* Returns the label of this rendering.
-	 * 
-	 * @return label of this rendering
-	 */
-	public String getLabel() {
-		
-		if (fLabel == null)
-		{
-			fLabel = DebugUIMessages.AbstractAsyncTableRendering_1;
-			updateRenderingLabel(isVisible());
-		}
-		
-		return fLabel;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		
-		if (adapter == IColorProvider.class)
-			return getColorProviderAdapter();
-		
-		if (adapter == ILabelProvider.class)
-			return getLabelProviderAdapter();
-		
-		if (adapter == IFontProvider.class)
-			return getFontProviderAdapter();
-		
-		if (adapter == IModelChangedListener.class)
-		{
-			return fModelChangedListener;
-		}
-		
-		if (adapter == IWorkbenchAdapter.class)
-		{
-			// needed workbench adapter to fill the title of property page
-			if (fWorkbenchAdapter == null) {
-				fWorkbenchAdapter = new IWorkbenchAdapter() {
-					public Object[] getChildren(Object o) {
-						return new Object[0];
-					}
-	
-					public ImageDescriptor getImageDescriptor(Object object) {
-						return null;
-					}
-	
-					public String getLabel(Object o) {
-						return AbstractAsyncTableRendering.this.getLabel();
-					}
-	
-					public Object getParent(Object o) {
-						return null;
-					}
-				};
-			}
-			return fWorkbenchAdapter;
-		}
-		
-		if (adapter == TableRenderingContentDescriptor.class)
-			return getContentDescriptor();
-		
-		return super.getAdapter(adapter);
-	}
-	
-	/**
-	 * Returns the number of characters a byte will convert to
-	 * or -1 if unknown.
-	 * 
-	 * @return the number of characters a byte will convert to
-	 *  or -1 if unknown
-	 */
-	public int getNumCharsPerByte()
-	{
-		return -1;
-	}
-	
-	/**
-	 * Create actions for this rendering
-	 */
-	protected void createActions() {
-		
-		fCopyToClipboardAction = new AsyncCopyTableRenderingAction(this, fTableViewer);
-		fGoToAddressAction = new RenderingGoToAddressAction(this);
-		fResetMemoryBlockAction = new ResetToBaseAddressAction(this);
-		
-		fPrintViewTabAction = new AsyncPrintTableRenderingAction(this, fTableViewer);
-		
-		fFormatRenderingAction = new FormatTableRenderingAction(this);		
-		fReformatAction = new ReformatAction(this);
-		fToggleAddressColumnAction = new ToggleAddressColumnAction();
-		
-		IMemoryRenderingSite site = getMemoryRenderingContainer().getMemoryRenderingSite();
-		if (site.getSite().getSelectionProvider() != null)
-		{
-			fPropertiesDialogAction = new PropertyDialogAction(site.getSite(),site.getSite().getSelectionProvider()); 
-		}
-		
-		fNextAction = new NextPageAction();
-		fPrevAction = new PrevPageAction();
-	}
-	
-	/**
-	 * Returns the currently selected address in this rendering.
-	 * 
-	 * @return the currently selected address in this rendering
-	 */
-	public BigInteger getSelectedAddress() {
-		Object key = fTableViewer.getSelectionKey();
-		
-		if (key != null && key instanceof BigInteger)
-			return (BigInteger)key;
-		
-		return null;
-	}
-
-	/**
-	 * Returns the currently selected content in this rendering as MemoryByte.
-	 * 
-	 * @return the currently selected content in array of MemoryByte.  
-	 * Returns an empty array if the selected address is out of buffered range.
-	 */
-	public MemoryByte[] getSelectedAsBytes()
-	{
-		if (getSelectedAddress() == null)
-			return new MemoryByte[0];
-		
-		Object key = fTableViewer.getSelectionKey();
-		AbstractVirtualContentTableModel model = fTableViewer.getVirtualContentModel();
-		
-		if (model != null)
-		{
-			model = (AbstractVirtualContentTableModel)fTableViewer.getModel();
-			int row = model.indexOfKey(key);
-			Object element = model.getElement(row);
-			int col = model.columnOf(element, key);
-		
-			// check precondition
-			if (col <= 0 || col > getBytesPerLine()/getBytesPerColumn())
-			{
-				return new MemoryByte[0];
-			}
-			
-			if (!(element instanceof MemorySegment))
-				return new MemoryByte[0];
-			
-			MemorySegment line = (MemorySegment)element;
-			int offset = (col-1)*(getAddressableUnitPerColumn()*getAddressableSize());
-			
-			// make a copy of the bytes to ensure that data cannot be changed
-			// by caller
-			MemoryByte[] bytes = line.getBytes(offset, getAddressableUnitPerColumn()*getAddressableSize());
-			MemoryByte[] retBytes = new MemoryByte[bytes.length];
-			
-			System.arraycopy(bytes, 0, retBytes, 0, bytes.length);
-			return retBytes;
-		}
-		return new MemoryByte[0];
-	}
-
-	/**
-	 * Returns the currently selected content in this rendering as a String.
-	 * 
-	 * @return the currently selected content in this rendering
-	 */
-	public String getSelectedAsString() {
-
-		if (getSelectedAddress() == null)
-			return ""; //$NON-NLS-1$
-		
-		MemoryByte[] bytes = getSelectedAsBytes();
-		if (bytes.length > 0)
-		{
-			return getString(this.getRenderingId(), getSelectedAddress(), bytes);
-		}
-		else
-			return ""; //$NON-NLS-1$
-		
-	}
-
-	/**
-	 * Moves the cursor to the specified address.
-	 * Will load more memory if the address is not currently visible.
-	 * 
-	 * @param address address to position cursor at
-	 * @throws DebugException if an exception occurs
-	 */
-	public void goToAddress(BigInteger address) throws DebugException {
-		
-		if (fTableViewer.getVirtualContentModel() == null)
-			return;
-		
-		int i = fTableViewer.getVirtualContentModel().indexOfKey(address);
-
-		if (i >= 0)
-		{	
-			// address is within range, set cursor and reveal
-			fTableViewer.setSelection(address);
-			updateSyncTopAddress(getTopVisibleAddress());
-			updateSyncSelectedAddress(address);
-		}
-		else
-		{
-			// if not extended memory block
-			// do not allow user to go to an address that's out of range
-			if (!(getMemoryBlock() instanceof IMemoryBlockExtension))
-			{
-				Status stat = new Status(
-				 IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(),
-				 DebugException.NOT_SUPPORTED, DebugUIMessages.AbstractTableRendering_11, null  
-				);
-				DebugException e = new DebugException(stat);
-				throw e;
-			}
-
-			BigInteger startAdd = fContentDescriptor.getStartAddress();
-			BigInteger endAdd = fContentDescriptor.getEndAddress();
-			
-			if (address.compareTo(startAdd) < 0 ||
-				address.compareTo(endAdd) > 0)
-			{
-				Status stat = new Status(
-				 IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(),
-				 DebugException.NOT_SUPPORTED, DebugUIMessages.AbstractTableRendering_11, null  
-				);
-				DebugException e = new DebugException(stat);
-				throw e;
-			}
-	
-			// load at the address
-			fTableViewer.setSelection(address);
-			reloadTable(address);
-	
-			updateSyncSelectedAddress(address);
-
-			if (!isDynamicLoad())
-			{						
-				updateSyncPageStartAddress(address);
-			}
-			
-			updateSyncTopAddress(address);
-		}
-	}			
-	
-	/**
-	 * Refresh the table viewer with the current top visible address.
-	 * Update labels in the memory rendering.
-	 */
-	public void refresh() {
-		fTableViewer.refresh();
-	}
-
-	
-	/**
-	 * Resize column to the preferred size.
-	 */
-	public void resizeColumnsToPreferredSize() {
-		fTableViewer.resizeColumnsToPreferredSize();
-		if (!fIsShowAddressColumn)
-		{
-			final TableColumn column = fTableViewer.getTable().getColumn(0);
-			column.addControlListener(new ControlListener() {
-
-				public void controlMoved(ControlEvent e) {
-				}
-
-				public void controlResized(ControlEvent e) {
-					column.removeControlListener(this);
-					column.setWidth(0);
-				}});
-		}
-	}
-
-	/**
-	 * Updates labels of this rendering.
-	 */
-	public void updateLabels()
-	{
-		UIJob job = new UIJob("updateLabels"){ //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-							
-				// do not handle if the rendering is already disposed
-				if (fPageBook.isDisposed())
-					return Status.OK_STATUS;
-				
-				// update tab labels
-				updateRenderingLabel(true);
-				
-				if (fTableViewer != null)
-				{
-					// update column labels
-					setColumnHeadings();
-					
-					// rebuild cache and force labels to be refreshed
-					fTableViewer.formatViewer();
-				}
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-	
-	/**
-	 * Fills the context menu for this rendering
-	 * 
-	 * @param menu menu to fill
-	 */
-	protected void fillContextMenu(IMenuManager menu) {	
-		
-		menu.add(new Separator(EMPTY_MEMORY_GROUP));
-		menu.add(new Separator());
-		menu.add(fResetMemoryBlockAction);
-		menu.add(fGoToAddressAction);
-		menu.add(new Separator(EMPTY_NAVIGATION_GROUP));
-		
-		menu.add(new Separator());
-		menu.add(fFormatRenderingAction);
-
-		if (!isDynamicLoad() && getMemoryBlock() instanceof IMemoryBlockExtension)
-		{		
-			menu.add(new Separator());
-			menu.add(fPrevAction);
-			menu.add(fNextAction);
-			menu.add(new Separator(EMPTY_NON_AUTO_LOAD_GROUP));
-		}
-		
-		menu.add(new Separator());
-		menu.add(fReformatAction);
-		menu.add(fToggleAddressColumnAction);
-		menu.add(new Separator());
-		menu.add(fCopyToClipboardAction);
-		menu.add(fPrintViewTabAction);
-		if (fPropertiesDialogAction != null)
-		{
-			menu.add(new Separator());
-			menu.add(fPropertiesDialogAction);
-			menu.add(new Separator(EMPTY_PROPERTY_GROUP));
-		}
-		
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-	
-	private int getPageSizeInUnits()
-	{
-		return fPageSize * getAddressableUnitPerLine();
-	}
-	
-	private void getPageSizeFromPreference()
-	{
-		fPageSize = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE);
-	}
-	
-	private void getPreBufferSizeFromPreference()
-	{
-		fPreBufferSize = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE);
-	}
-	
-	private void getPostBufferSizeFromPreference()
-	{
-		fPostBufferSize = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE);
-	}
-	
-	private void updateDynamicLoadProperty() {
-		
-		boolean value = DebugUIPlugin
-				.getDefault()
-				.getPreferenceStore()
-				.getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-		
-		if (value != isDynamicLoad())
-		{
-			setDynamicLoad(value);
-		
-			if (!fIsDisposed) {
-				if (isDynamicLoad()) {
-					fContentDescriptor.setPostBuffer(getPostBufferSize());
-					fContentDescriptor.setPreBuffer(getPreBufferSize());
-					fContentDescriptor.setNumLines(getNumberOfVisibleLines());
-	
-				} else {
-					fContentDescriptor.setPostBuffer(0);
-					fContentDescriptor.setPreBuffer(0);
-					fContentDescriptor.setNumLines(fPageSize);
-				}	
-			}
-		}
-	}
-	
-	private void getDynamicLoadFromPreference()
-	{
-		setDynamicLoad(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM));
-	}
-	
-	private boolean isDynamicLoad()
-	{
-		return fContentDescriptor.isDynamicLoad();
-	}
-	
-	private int getPageSize()
-	{
-		return fPageSize;
-	}
-	
-	private int getNumLinesToLoad() {
-		int numberOfLines = -1;
-		
-		if (isDynamicLoad())
-			numberOfLines = getNumberOfVisibleLines();
-		else
-			numberOfLines = getPageSize();
-		
-		return numberOfLines;
-	}
-	
-	private void setDynamicLoad(boolean load)
-	{
-		fContentDescriptor.setDynamicLoad(load);
-	}
-	
-	private void handlePageStartAddressChanged(BigInteger address)
-	{
-		// do not handle if in dynamic mode
-		if (isDynamicLoad())
-			return;
-		
-		if (!(getMemoryBlock() instanceof IMemoryBlockExtension))
-			return;
-		
-		// do not handle event if the base address of the memory
-		// block has changed, wait for debug event to update to
-		// new location
-		if (isMemoryBlockBaseAddressChanged())
-			return;
-
-		if(fTableViewer.getKey(0).equals(address))
-			return;
-	
-		BigInteger start = fContentDescriptor.getStartAddress();
-		BigInteger end = fContentDescriptor.getEndAddress();
-		
-		// smaller than start address, load at start address
-		if (address.compareTo(start) < 0)
-		{
-			if (isAtTopLimit())
-				return;
-			
-			address = start;
-		}
-		
-		// bigger than end address, no need to load, already at top
-		if (address.compareTo(end) > 0)
-		{
-			if (isAtBottomLimit())
-				return;
-			
-			address = end.subtract(BigInteger.valueOf(getPageSizeInUnits()));
-		}
-		
-		fContentDescriptor.setLoadAddress(address);
-		final BigInteger finaladdress = address;
-		Runnable runnable = new Runnable() {
-			public void run() {
-				if (fTableViewer.getTable().isDisposed())
-					return;
-				
-				fTableViewer.setTopIndex(finaladdress);
-				refresh();
-			}};
-		
-		runOnUIThread(runnable);
-
-		updateSyncPageStartAddress(address);
-		updateSyncTopAddress(address);
-	}
-	private void handleDyanicLoadChanged() {
-		
-		// if currently in dynamic load mode, update page
-		// start address
-		BigInteger pageStart = getTopVisibleAddress();
-		updateSyncPageStartAddress(pageStart);
-		
-		updateDynamicLoadProperty();
-		if (isDynamicLoad())
-		{
-			refresh();
-			fTableViewer.setTopIndex(pageStart);
-		}
-		else
-		{
-			handlePageStartAddressChanged(pageStart);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#becomesHidden()
-	 */
-	public void becomesHidden() {		
-		// creates new object for storing potential changes in sync properties
-		fPendingSyncProperties = new PendingPropertyChanges();		
-		super.becomesHidden();
-		
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			updateRenderingLabel(false);	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#becomesVisible()
-	 */
-	public void becomesVisible() {
-		
-		if (!fIsCreated)
-		{
-			// label can still be constructed even though the rendering has not finished being
-			// initialized
-			updateRenderingLabel(true);
-			super.becomesVisible();
-			return;
-		}
-		
-		// do not do anything if already visible
-		if (isVisible() == true)
-		{
-			// super should always be called
-			super.becomesVisible();
-			return;
-		}
-		
-		super.becomesVisible();
-		
-		if (fPendingSyncProperties != null)
-		{
-			// deal with format
-			boolean format = false;
-			int rowSize = getBytesPerLine();
-			if (fPendingSyncProperties.getRowSize() > 0)
-			{
-				format = true;
-				rowSize = fPendingSyncProperties.getRowSize();
-			}
-			
-			int colSize = getBytesPerColumn();
-			if (fPendingSyncProperties.getColumnSize() > 0)
-			{
-				format = true;
-				colSize = fPendingSyncProperties.getColumnSize();
-			}
-			
-			if (format)
-				format(rowSize, colSize);
-			
-			BigInteger selectedAddress = fPendingSyncProperties.getSelectedAddress();
-			if (selectedAddress != null)
-				fTableViewer.setSelection(selectedAddress);
-			
-			updateDynamicLoadProperty();
-			
-			if (isDynamicLoad())
-			{
-				BigInteger topVisibleAddress = fPendingSyncProperties.getTopVisibleAddress();
-				if (topVisibleAddress != null)
-				{
-					fContentDescriptor.setLoadAddress(topVisibleAddress);
-					fTableViewer.setTopIndex(topVisibleAddress);
-				}
-			}
-			else if (!(getMemoryBlock() instanceof IMemoryBlockExtension))
-			{
-				BigInteger topVisibleAddress = fPendingSyncProperties.getTopVisibleAddress();
-				if (topVisibleAddress != null)
-					fTableViewer.setTopIndex(topVisibleAddress);
-			}
-			else
-			{
-				if (fPendingSyncProperties.getPageSize() > 0)
-				{
-					fPageSize = fPendingSyncProperties.getPageSize();
-					fContentDescriptor.setNumLines(fPageSize);
-				}
-				
-				BigInteger pageStartAddress = fPendingSyncProperties.getPageStartAddress();
-				if (pageStartAddress != null)
-					fContentDescriptor.setLoadAddress(pageStartAddress);
-				
-				fTableViewer.setTopIndex(pageStartAddress);
-			}
-			
-			showTable();
-			refresh();
-		}
-
-		updateRenderingLabel(true);
-		
-		Job job = new Job("becomesVisible") //$NON-NLS-1$
-		{
-			protected IStatus run(IProgressMonitor monitor) {
-				if (fIsDisposed)
-					return Status.OK_STATUS;
-				try {
-					fContentDescriptor.updateContentBaseAddress();
-				} catch (DebugException e) {
-					showMessage(e.getMessage());
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.schedule();
-		
-		// discard these properties
-		fPendingSyncProperties = null;
-	}
-	
-	/**
-	 * Handle column size changed event from synchronizer
-	 * @param newColumnSize
-	 */
-	private void columnSizeChanged(final int newColumnSize) {
-		// ignore event if rendering is not visible
-		if (!isVisible())
-			return;
-
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				int rowSize = getBytesPerLine();
-				if (rowSize < newColumnSize)
-					rowSize = newColumnSize;
-					
-				format(rowSize, newColumnSize);
-			}
-		});
-	}
-	
-	/**
-	 * @param newRowSize - new row size in number of bytes
-	 */
-	private void rowSizeChanged(final int newRowSize)
-	{
-		// ignore event if rendering is not visible
-		if (!isVisible())
-			return;
-		
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				int colSize = getBytesPerColumn();
-				if (newRowSize < colSize)
-					colSize = newRowSize;
-				
-				format(newRowSize, colSize);
-			}
-		});		
-	}
-	
-	/**
-	 * update selected address in synchronizer if update is true.
-	 */
-	private void updateSyncSelectedAddress(BigInteger address) {
-		
-		if (!fIsCreated)
-			return;
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractAsyncTableRendering.PROPERTY_SELECTED_ADDRESS, null, address);
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * update column size in synchronizer
-	 */
-	private void updateSyncColSize() {
-		
-		if (!fIsCreated)
-			return;
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractAsyncTableRendering.PROPERTY_COL_SIZE, null, new Integer(fColumnSize));
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * update column size in synchronizer
-	 */
-	private void updateSyncRowSize() {
-		
-		if (!fIsCreated)
-			return;
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractAsyncTableRendering.PROPERTY_ROW_SIZE, null, new Integer(fBytePerLine));
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * update top visible address in synchronizer
-	 */
-	private void updateSyncTopAddress(BigInteger address) {
-		
-		if (!fIsCreated)
-			return;
-
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractAsyncTableRendering.PROPERTY_TOP_ADDRESS, null, address);
-		firePropertyChangedEvent(event);
-	}
-	
-	private void updateSyncPageStartAddress(BigInteger address) {
-	
-		if (!fIsCreated)
-			return;
-		
-		if (isMemoryBlockBaseAddressChanged())
-			return;
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS, null, address);
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * Returns the color provider for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a color provider is obtained by asking this rendering's
-	 * memory block for its {@link IColorProvider} adapter. When the color
-	 * provider is queried for color information, it is provided with a
-	 * {@link MemoryRenderingElement} as an argument. 
-	 * </p>
-	 * @return the color provider for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected IColorProvider getColorProviderAdapter()
-	{
-		return (IColorProvider)getMemoryBlock().getAdapter(IColorProvider.class);
-	}
-	
-	/**
-	 * Returns the label provider for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a label provider is obtained by asking this rendering's
-	 * memory block for its {@link ILabelProvider} adapter. When the label
-	 * provider is queried for label information, it is provided with a
-	 * {@link MemoryRenderingElement} as an argument. 
-	 * </p>
-	 * @return the label provider for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected ILabelProvider getLabelProviderAdapter()
-	{
-		return (ILabelProvider)getMemoryBlock().getAdapter(ILabelProvider.class);
-	}
-	
-	/**
-	 * Returns the font provider for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a font provider is obtained by asking this rendering's
-	 * memory block for its {@link IFontProvider} adapter. When the font
-	 * provider is queried for font information, it is provided with a
-	 * {@link MemoryRenderingElement} as an argument. 
-	 * </p>
-	 * @return the font provider for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected IFontProvider getFontProviderAdapter()
-	{
-		return (IFontProvider)getMemoryBlock().getAdapter(IFontProvider.class);
-	}
-	
-	/**
-	 * Returns the table presentation for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a table presentation is obtained by asking this rendering's
-	 * memory block for its {@link IMemoryBlockTablePresentation} adapter.
-	 * </p>
-	 * @return the table presentation for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected IMemoryBlockTablePresentation getTablePresentationAdapter()
-	{
-		return (IMemoryBlockTablePresentation)getMemoryBlock().getAdapter(IMemoryBlockTablePresentation.class);
-	}
-	
-	/**
-	 * Setup the viewer so it supports hovers to show the offset of each field
-	 */
-	private void createToolTip() {
-		
-		fToolTipShell = new Shell(DebugUIPlugin.getShell(), SWT.ON_TOP | SWT.RESIZE );
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginWidth = 2;
-		gridLayout.marginHeight = 0;
-		fToolTipShell.setLayout(gridLayout);
-		fToolTipShell.setBackground(fTableViewer.getTable().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		
-		final Control toolTipControl = createToolTipControl(fToolTipShell);
-		
-		if (toolTipControl == null)
-		{
-			// if client decide not to use tooltip support
-			fToolTipShell.dispose();
-			return;
-		}
-		
-		MouseTrackAdapter listener = new MouseTrackAdapter(){
-			
-			private TableItem fTooltipItem = null;
-			private int fCol = -1;
-			
-			public void mouseExit(MouseEvent e){
-				
-				if (!fToolTipShell.isDisposed())
-					fToolTipShell.setVisible(false);
-				fTooltipItem = null;
-			}
-			
-			public void mouseHover(MouseEvent e){
-				
-				Point hoverPoint = new Point(e.x, e.y);
-				Control control = null;
-				
-				if (e.widget instanceof Control)
-					control = (Control)e.widget;
-				
-				if (control == null)
-					return;
-				
-				hoverPoint = control.toDisplay(hoverPoint);
-				TableItem item = getItem(hoverPoint);
-				int column = getColumn(hoverPoint);
-				
-				//Only if there is a change in hover
-				if(this.fTooltipItem != item || fCol != column){
-					
-					//Keep Track of the latest hover
-					fTooltipItem = item;
-					fCol = column;
-					
-					if(item != null){
-						toolTipAboutToShow(toolTipControl, fTooltipItem, column);
-						
-						//Setting location of the tooltip
-						Rectangle shellBounds = fToolTipShell.getBounds();
-						shellBounds.x = hoverPoint.x;
-						shellBounds.y = hoverPoint.y + item.getBounds(0).height;
-						
-						fToolTipShell.setBounds(shellBounds);
-						fToolTipShell.pack();
-						
-						fToolTipShell.setVisible(true);
-					}
-					else {
-						fToolTipShell.setVisible(false);
-					}
-				}
-			}
-		};
-		
-		fTableViewer.getTable().addMouseTrackListener(listener);
-		fTableViewer.getCursor().addMouseTrackListener(listener);
-	}
-	
-	/**
-	 * Creates the control used to display tool tips for cells in this table. By default
-	 * a label is used to display the address of the cell. Clients may override this
-	 * method to create custom tooltip controls.
-	 * <p>
-	 * Also see the methods <code>getToolTipText(...)</code> and 
-	 * <code>toolTipAboutToShow(...)</code>.
-	 * </p>
-	 * @param composite parent for the tooltip control
-	 * @return the tooltip control to be displayed
-	 * @since 3.2
-	 */
-	protected Control createToolTipControl(Composite composite) {
-		Control fToolTipLabel = new Label(composite, SWT.NONE);
-		fToolTipLabel.setForeground(fTableViewer.getTable().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-		fToolTipLabel.setBackground(fTableViewer.getTable().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		fToolTipLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL |
-				GridData.VERTICAL_ALIGN_CENTER));
-		return fToolTipLabel;
-	}
-	
-	/**
-	 * Bug with table widget,BUG 113015, the widget is not able to return the correct
-	 * table item if SWT.FULL_SELECTION is not on when the table is created.
-	 * Created the following function to work around the problem.
-	 * We can remove this method when the bug is fixed.
-	 * @param point
-	 * @return the table item where the point is located, return null if the item cannot be located.
-	 */
-	private TableItem getItem(Point point)
-	{
-		TableItem[] items = fTableViewer.getTable().getItems();
-		for (int i=0; i<items.length; i++)
-		{
-			TableItem item = items[i];
-			if (item.getData() != null)
-			{
-				Point start = new Point(item.getBounds(0).x, item.getBounds(0).y);
-				start = fTableViewer.getTable().toDisplay(start);
-				Point end = new Point(start.x + item.getBounds(0).width, start.y + item.getBounds(0).height);
-				
-				if (start.y < point.y && point.y < end.y)
-					return item;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Method for figuring out which column the point is located.
-	 * @param point
-	 * @return the column index where the point is located, return -1 if column is not found.
-	 */
-	private int getColumn(Point point)
-	{
-		int colCnt = fTableViewer.getTable().getColumnCount();
-		
-		TableItem item = null;
-		for (int i=0; i<fTableViewer.getTable().getItemCount(); i++)
-		{
-			item = fTableViewer.getTable().getItem(i);
-			if (item.getData() != null)
-				break;
-		}
-		
-		if (item != null)
-		{
-			for (int i=0; i<colCnt; i++)
-			{
-				Point start = new Point(item.getBounds(i).x, item.getBounds(i).y);
-				start = fTableViewer.getTable().toDisplay(start);
-				Point end = new Point(start.x + item.getBounds(i).width, start.y + item.getBounds(i).height);
-				
-				if (start.x < point.x && end.x > point.x)
-					return i;
-			}
-		}
-		return -1;
-	}
-	
-	/**
-	 * Called when the tool tip is about to show in this rendering.
-	 * Clients who overrides <code>createTooltipControl</code> may need to
-	 * also override this method to ensure that the tooltip shows up properly
-	 * in their customized control.
-	 * <p>
-	 * By default a text tooltip is displayed, and the contents for the tooltip
-	 * are generated by the <code>getToolTipText(...)</code> method.
-	 * </p>
-	 * @param toolTipControl - the control for displaying the tooltip
-	 * @param item - the table item where the mouse is pointing.
-	 * @param col - the column at which the mouse is pointing.
-	 * @since 3.2
-	 */
-	protected void toolTipAboutToShow(Control toolTipControl, TableItem item,
-			int col) {
-		if (toolTipControl instanceof Label) {
-			Object address = fTableViewer.getKey(fTableViewer.getTable().indexOf(item), col);
-			if (address != null  && address instanceof BigInteger) {
-				Object data = item.getData();
-				if (data instanceof MemorySegment) {
-					MemorySegment line = (MemorySegment) data;
-
-					if (col > 0) {
-						int start = (col - 1) * getBytesPerColumn();
-						int end = start + getBytesPerColumn();
-						MemoryByte[] bytes = line.getBytes(start, end);
-
-						String str = getToolTipText((BigInteger)address, bytes);
-
-						if (str != null)
-							((Label) toolTipControl).setText(str);
-					} else {
-						String str = getToolTipText((BigInteger)address,
-								new MemoryByte[] {});
-
-						if (str != null)
-							((Label) toolTipControl).setText(str);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Returns the text to display in a tool tip at the specified address
-	 * for the specified bytes. By default the address of the bytes is displayed.
-	 * Subclasses may override.
-	 * 
-	 * @param address address of cell that tool tip is displayed for 
-	 * @param bytes the bytes in the cell
-	 * @return the tooltip text for the memory bytes located at the specified
-	 *         address
-	 * @since 3.2
-	 */
-	protected String getToolTipText(BigInteger address, MemoryByte[] bytes)
-	{
-		StringBuffer buf = new StringBuffer("0x"); //$NON-NLS-1$
-		buf.append(address.toString(16).toUpperCase());
-		
-		return buf.toString();
-	}
-	
-	private void setColumnHeadings()
-	{
-		String[] columnLabels = new String[0];
-		
-		IMemoryBlockTablePresentation presentation = getTablePresentationAdapter();
-		if (presentation != null)
-		{
-			columnLabels = presentation.getColumnLabels(getMemoryBlock(), getBytesPerLine(), getBytesPerLine()/getBytesPerColumn());
-		}
-		
-		// check that column labels returned are not null
-		if (columnLabels == null)
-			columnLabels = new String[0];
-		
-		int numByteColumns = fBytePerLine/fColumnSize;
-		
-		TableColumn[] columns = fTableViewer.getTable().getColumns();
-		
-		int j=0;
-		for (int i=1; i<columns.length-1; i++)
-		{	
-			// if the number of column labels returned is correct
-			// use supplied column labels
-			if (columnLabels.length == numByteColumns)
-			{
-				columns[i].setText(columnLabels[j]);
-				j++;
-			}
-			else
-			{
-				// otherwise, use default
-				int addressableUnit = getAddressableUnitPerColumn();
-				if (addressableUnit >= 4)
-				{
-					columns[i].setText(Integer.toHexString(j*addressableUnit).toUpperCase() + 
-							" - " + Integer.toHexString(j*addressableUnit+addressableUnit-1).toUpperCase()); //$NON-NLS-1$
-				}
-				else
-				{
-					columns[i].setText(Integer.toHexString(j*addressableUnit).toUpperCase());
-				}
-				j++;
-			}
-		}
-	}
-	
-	/**
-	 * 
-	 * Return this rendering's viewer
-	 * @return this rendering's viewer
-	 */
-	public StructuredViewer getViewer()
-	{
-		return fTableViewer;
-	}
-	
-	private boolean isMemoryBlockBaseAddressChanged()
-	{
-		try {
-			BigInteger address = getMemoryBlockBaseAddress();
-			BigInteger oldBaseAddress = fContentDescriptor.getContentBaseAddress();
-			if (!oldBaseAddress.equals(address))
-				return true;
-		} catch (DebugException e) {
-			// fail silently
-		}
-		return false;
-	}
-	
-	/**
-	 * @param topVisibleAddress
-	 */
-	private void createContentDescriptor(final BigInteger topVisibleAddress) {
-		fContentDescriptor = new TableRenderingContentDescriptor(AbstractAsyncTableRendering.this);
-		fContentDescriptor.setPostBuffer(getPostBufferSize());
-		fContentDescriptor.setPreBuffer(getPreBufferSize());
-		fContentDescriptor.setLoadAddress(topVisibleAddress);
-		try {
-			fContentDescriptor.updateContentBaseAddress();
-			
-		} catch (DebugException e) {
-			fError = true;
-			showMessage(e.getMessage());
-		}
-		
-		fContentDescriptor.setAddressableSize(getAddressableSize());
-			
-		try {
-			int addressSize = 4;
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				IMemoryBlockExtension extMb = (IMemoryBlockExtension)getMemoryBlock();
-				addressSize = extMb.getAddressSize();
-				
-				if (addressSize <= 0)
-				{
-					DebugUIPlugin.logErrorMessage("Invalid address Size: " + addressSize); //$NON-NLS-1$
-					addressSize = 4;
-				}
-				fContentDescriptor.setAddressSize(addressSize);
-			}
-			fContentDescriptor.setAddressSize(addressSize);
-		} catch (DebugException e) {
-			fError = true;
-			showMessage(e.getMessage());
-		} finally {
-			if (fContentDescriptor.getAddressSize() <= 0)
-				fContentDescriptor.setAddressSize(4);
-		}
-	}
-	
-	/**
-	 * Return the number of lines to be bufferred before the top visible line of the memory rendering
-	 * @return number of lines to be buffered before the top visible line in the memory rendering
-	 */
-	private int getPreBufferSize()
-	{
-		if (fPreBufferSize < 0)
-			getPreBufferSizeFromPreference();
-		
-		return fPreBufferSize;
-	}
-	
-	/**
-	 * Returns the number of lines to be bufferred after the last visible line in the memory rendering
-	 * @return the number of lines to be bufferred after the last visible line in the memory rendering
-	 */
-	private int getPostBufferSize()
-	{
-		if (fPostBufferSize < 0)
-			getPostBufferSizeFromPreference();
-		
-		return fPostBufferSize;
-	}
-	
-	private TableRenderingContentDescriptor getContentDescriptor()
-	{
-		return fContentDescriptor;
-	}
-	
-	private void createGoToAddressComposite(Composite parent)
-	{
-		fGoToAddressComposite = new GoToAddressComposite();
-		fGoToAddressComposite.createControl(parent);
-		Button button = fGoToAddressComposite.getButton(IDialogConstants.OK_ID);
-		if (button != null)
-		{
-			button.addSelectionListener(new SelectionAdapter() {
-
-				public void widgetSelected(SelectionEvent e) {
-					doGoToAddress();
-				}
-			});
-			
-			button = fGoToAddressComposite.getButton(IDialogConstants.CANCEL_ID);
-			if (button != null)
-			{
-				button.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						hideGotoAddressComposite();
-					}});
-			}
-		}
-		
-		fGoToAddressComposite.getExpressionWidget().addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				doGoToAddress();
-			}});
-		
-		fGoToAddressComposite.getExpressionWidget().addKeyListener(new KeyAdapter() {
-
-			public void keyPressed(KeyEvent e) {
-				if (e.keyCode == SWT.ESC)
-					hideGotoAddressComposite();
-				super.keyPressed(e);
-			}});
-	}
-	
-	private void showGoToAddressComposite() {
-		
-		String selectedStr = getSelectedAsString();
-		Text text = fGoToAddressComposite.getExpressionWidget();
-		text.setText(selectedStr);
-		text.setSelection(0, text.getCharCount());
-	
-		double height = fGoToAddressComposite.getHeight();
-		double canvasHeight = fSashForm.getParent().getClientArea().height;
-		double tableHeight = canvasHeight - height;
-		
-		double tableWeight = (tableHeight/canvasHeight) * 100;
-		double textWeight = (height / canvasHeight) * 100;
-		fSashForm.setWeights(new int[]{(int)tableWeight, (int)textWeight});
-		fSashForm.setMaximizedControl(null);
-		
-		fGoToAddressComposite.getExpressionWidget().setFocus();
-	}
-	
-	private void hideGotoAddressComposite()
-	{
-		fSashForm.setMaximizedControl(fTableViewer.getControl());
-		if (isActivated())
-			fTableViewer.getControl().setFocus();
-	}
-	
-	/**
-	 * 
-	 */
-	private void doGoToAddress() {
-		try {
-			BigInteger address = fGoToAddressComposite.getGoToAddress(fContentDescriptor.getContentBaseAddress(), getSelectedAddress());
-			fGoToAddressAction.doGoToAddress(address.toString(16));
-			hideGotoAddressComposite();
-		} catch (DebugException e1) {
-			MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed, 
-					DebugUIMessages.GoToAddressAction_Go_to_address_failed, e1);
-		} catch (NumberFormatException e1)
-		{
-			MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed, 
-				DebugUIMessages.GoToAddressAction_Address_is_invalid, e1);
-		}
-	}
-	
-	public void activated() {
-		super.activated();
-		
-		fActivated = true;
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		ICommandService commandSupport = (ICommandService)workbench.getAdapter(ICommandService.class);
-		IContextService contextSupport = (IContextService)workbench.getAdapter(IContextService.class);
-		
-		if (commandSupport != null && contextSupport != null)
-		{
-			fContext.add(contextSupport.activateContext(ID_ASYNC_TABLE_RENDERING_CONTEXT));
-			Command gotoCommand = commandSupport.getCommand(ID_GO_TO_ADDRESS_COMMAND);
-
-			if (fGoToAddressHandler == null)
-			{
-				fGoToAddressHandler = new AbstractHandler() {
-					public Object execute(ExecutionEvent event) throws ExecutionException {
-						if (fSashForm.getMaximizedControl() != null)
-							fGoToAddressAction.run();
-						else
-							hideGotoAddressComposite();
-						return null;
-					}};
-			}
-			gotoCommand.setHandler(fGoToAddressHandler);
-			
-			// The page up and page down actions can only be activated if the rendering
-			// is in manual scrolling mode.  We are unable to determine the scrolling mode
-			// until the content descriptor is created.  When the rendering is activated, the content
-			// descriptor may not be created yet.  In that case, we cannot activate the shortcuts here.
-			// We will activate the shortcut after the rendering is created.
-			if (fContentDescriptor != null && !isDynamicLoad())
-			{
-				activatePageActions();
-			}
-		}		
-	}
-
-	private void activatePageActions() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		ICommandService commandSupport = (ICommandService)workbench.getAdapter(ICommandService.class);
-		if (commandSupport != null)
-		{
-			Command nextPage = commandSupport.getCommand(ID_NEXT_PAGE_COMMAND);
-			if (fNextPageHandler == null)
-			{
-				fNextPageHandler = new AbstractHandler() {
-	
-					public Object execute(ExecutionEvent arg0)
-							throws ExecutionException {
-						fNextAction.run();
-						return null;
-					}						
-				};
-			}
-			nextPage.setHandler(fNextPageHandler);
-			
-			Command prevPage = commandSupport.getCommand(ID_PREV_PAGE_COMMAND);
-			if (fPrevPageHandler == null)
-			{
-				fPrevPageHandler = new AbstractHandler() {
-	
-					public Object execute(ExecutionEvent arg0)
-							throws ExecutionException {
-						fPrevAction.run();
-						return null;
-					}						
-				};
-			}
-			prevPage.setHandler(fPrevPageHandler);
-		}
-	}
-
-	public void deactivated() {
-		
-		fActivated = false;
-    	IWorkbench workbench = PlatformUI.getWorkbench();
-		ICommandService commandSupport = (ICommandService)workbench.getAdapter(ICommandService.class);
-		IContextService contextSupport = (IContextService)workbench.getAdapter(IContextService.class);
-		
-		if (commandSupport != null && contextSupport != null)
-		{
-			// 	remove handler
-			Command command = commandSupport.getCommand(ID_GO_TO_ADDRESS_COMMAND);
-			command.setHandler(null);
-			
-			command = commandSupport.getCommand(ID_NEXT_PAGE_COMMAND);
-			command.setHandler(null);
-			
-			command = commandSupport.getCommand(ID_PREV_PAGE_COMMAND);
-			command.setHandler(null);
-
-			if (fContext != null)
-				contextSupport.deactivateContexts(fContext);
-		}
-		super.deactivated();
-	}
-	
-	private boolean isActivated()
-	{
-		return fActivated;
-	}
-	
-	/**
-	 * Returns text for the given memory bytes at the specified address for the specified
-	 * rendering type. This is called by the label provider for.
-	 * Subclasses must override.
-	 * 
-	 * @param renderingTypeId rendering type identifier
-	 * @param address address where the bytes belong to
-	 * @param data the bytes
-	 * @return a string to represent the memory. Cannot not return <code>null</code>.
-	 * 	Returns a string to pad the cell if the memory cannot be converted
-	 *  successfully.
-	 */
-	abstract public String getString(String renderingTypeId, BigInteger address, MemoryByte[] data);
-	
-	/**
-	 * Returns bytes for the given text corresponding to bytes at the given
-	 * address for the specified rendering type. This is called by the cell modifier
-	 * when modifying bytes in a memory block.
-	 * Subclasses must convert the string value to an array of bytes.  The bytes will
-	 * be passed to the debug adapter for memory block modification.
-	 * Returns <code>null</code> if the bytes cannot be formatted properly.
-	 * 
-	 * @param renderingTypeId rendering type identifier
-	 * @param address address the bytes begin at
-	 * @param currentValues current values of the data in bytes format
-	 * @param newValue the string to be converted to bytes
-	 * @return the bytes converted from a string
-	 */
-	abstract public byte[] getBytes(String renderingTypeId, BigInteger address, MemoryByte[] currentValues, String newValue);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTextRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTextRendering.java
deleted file mode 100644
index 83f2948..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTextRendering.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.memory.provisional;
-
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Abstract implementation of a rendering that translates memory into 
- * text, displayed in a table.
- * <p>
- * Clients should subclass from this class if they wish to provide a table
- * text rendering with a specific code page.
- * </p>
- * @since 3.2
- */
-abstract public class AbstractAsyncTextRendering extends AbstractAsyncTableRendering { 	
-	
-	private String fCodePage;
-
-	/**
-	 * Constructs a text rendering of the specified type.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 */
-	public AbstractAsyncTextRendering(String renderingId)
-	{
-		super(renderingId);
-	}
-	
-	/**
-	 * Constructs a text rendering of the specified type on the given
-	 * code page.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 * @param codePage the name of a supported
-     *  {@link java.nio.charset.Charset </code>charset<code>}, for
-     *  example <code>CP1252</code>
-	 */
-	public AbstractAsyncTextRendering(String renderingId, String codePage)
-	{
-		super(renderingId);
-		fCodePage = codePage;
-	}
-	
-	/**
-	 * Sets the code page for this rendering.  This does not cause
-	 * the rendering to be updated with the new code page.  Clients need
-	 * to update the rendering manually when the code page is changed.
-	 * 
-	 * @param codePage the name of a supported
-	 * {@link java.nio.charset.Charset </code>charset<code>}, for
-     *  example <code>CP1252</code>
-	 */
-	public void setCodePage(String codePage)
-	{
-		fCodePage = codePage;
-	}
-	
-	/**
-	 * Returns the current code page used by this rendering.  Returns null
-	 * if not set.
-	 * @return  Returns the current code page used by this rendering.  Returns null
-	 * if not set.
-	 */
-	public String getCodePage()
-	{
-		return fCodePage;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.provisional.AbstractAsyncTableRendering#getString(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[])
-	 */
-	public String getString(String dataType, BigInteger address,  MemoryByte[] data) {
-		try {
-			String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-			if(fCodePage == null)
-				return ""; //$NON-NLS-1$
-			
-			boolean[] invalid = new boolean[data.length];
-			boolean hasInvalid = false;
-			byte byteArray[] = new byte[data.length];
-			for (int i=0; i<data.length; i++)
-			{
-				if (!data[i].isReadable())
-				{
-					invalid[i] = true;
-					hasInvalid = true;
-				}
-				byteArray[i] = data[i].getValue();
-			}
-			
-			if (hasInvalid)
-			{
-				StringBuffer strBuf = new StringBuffer();
-				for (int i=0; i<data.length; i++)
-				{
-					if (invalid[i])
-						strBuf.append(paddedStr);
-					else
-						strBuf.append(new String(new byte[]{byteArray[i]}, fCodePage));
-				}
-				return strBuf.toString();
-			}
-
-			return new String(byteArray, fCodePage);
-
-		} catch (UnsupportedEncodingException e) {
-			return "-- error --"; //$NON-NLS-1$
-		}
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.provisional.AbstractAsyncTableRendering#getBytes(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public byte[] getBytes(String dataType, BigInteger address, MemoryByte[] currentValues, String data) {
-		try {
-			
-			if (fCodePage == null)
-				return new byte[0];
-			
-			byte[] bytes =  data.getBytes(fCodePage);
-			return bytes;
-			
-		} catch (UnsupportedEncodingException e) {
-			return new byte[0];
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/MemoryViewPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/MemoryViewPresentationContext.java
deleted file mode 100644
index ade9791..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/MemoryViewPresentationContext.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.debug.internal.ui.memory.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.PartPresentationContext;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-
-/**
- * Presentation context from the Memory View.  This presentation provides additional
- * information regarding the originator of the asynchronous request.
- * 
- * Clients may reference or subclass from this class.
- * 
- * @since 3.2
- *
- */
-public class MemoryViewPresentationContext extends PartPresentationContext  {
-
-	private IMemoryRenderingContainer fContainer;	
-	private IMemoryRendering fRendering;			
-	private IMemoryRenderingSite fMemoryView;
-	
-	/**
-	 * Constructs MemoryViewPresentationContext
-	 * @param site - the memory rendering site that this presentation context is for
-	 * @param container - the memory rendering container that this presentation context is for, may be <code>null</code>
-	 * @param rendering - - the memory rendering that this presentation context is for, may be <code>null</code>
-	 */
-	public MemoryViewPresentationContext(IMemoryRenderingSite site, IMemoryRenderingContainer container, IMemoryRendering rendering) {
-		super(site.getSite().getPart());
-		
-		fMemoryView = site;
-		fContainer = container;
-		fRendering = rendering;
-	}
-	
-	/**
-	 * Returns the memory rendering site that this presentation context is for
-	 * @return the memory rendering site that this presentation context is for
-	 */
-	public IMemoryRenderingSite getMemoryRenderingSite()
-	{
-		return fMemoryView;
-	}
-	
-	/**
-	 * Returns the memory rendering container that this presentation context is for
-	 * @return the memory rendering container that this presentation context is for, <code>null</code> if none.
-	 */
-	public IMemoryRenderingContainer getMemoryRenderingContainer()
-	{
-		return fContainer;
-	}
-	
-	/**
-	 * Returns the memory rendering that this presentation context is for
-	 * @return the memory rendering that this presentation context is for, <code>null</code> if none.
-	 */
-	public IMemoryRendering getRendering()
-	{
-		return fRendering;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/DebugElementLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/DebugElementLabelProvider.java
deleted file mode 100644
index 32f408a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/DebugElementLabelProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.views.DebugModelPresentationContext;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementHelper;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @since 3.3
- */
-public class DebugElementLabelProvider extends ElementLabelProvider {
-
-	protected String getLabel(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (presentationContext instanceof DebugModelPresentationContext) {
-			DebugModelPresentationContext debugContext = (DebugModelPresentationContext) presentationContext;
-			return debugContext.getModelPresentation().getText(element);
-		}
-		return DebugElementHelper.getLabel(element);
-	}
-
-	protected RGB getBackground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (presentationContext instanceof DebugModelPresentationContext) {
-			DebugModelPresentationContext debugContext = (DebugModelPresentationContext) presentationContext;
-			return DebugElementHelper.getBackground(element, debugContext.getModelPresentation());
-		}
-		return DebugElementHelper.getBackground(element);
-	}
-
-	protected FontData getFontData(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (presentationContext instanceof DebugModelPresentationContext) {
-			DebugModelPresentationContext debugContext = (DebugModelPresentationContext) presentationContext;
-			return DebugElementHelper.getFont(element, debugContext.getModelPresentation());
-			
-		}
-		return DebugElementHelper.getFont(element);
-	}
-
-	protected RGB getForeground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (presentationContext instanceof DebugModelPresentationContext) {
-			DebugModelPresentationContext debugContext = (DebugModelPresentationContext) presentationContext;
-			return DebugElementHelper.getForeground(element, debugContext.getModelPresentation());	
-		}
-		return DebugElementHelper.getForeground(element);
-	}
-
-	protected ImageDescriptor getImageDescriptor(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (presentationContext instanceof DebugModelPresentationContext) {
-			DebugModelPresentationContext debugContext = (DebugModelPresentationContext) presentationContext;
-			return DebugElementHelper.getImageDescriptor(element, debugContext.getModelPresentation());	
-		}
-		return DebugElementHelper.getImageDescriptor(element);
-	}
-	
-	/**
-	 * Returns the model presentation for the specified model, or <code>null</code> if none.
-	 * 
-	 * @param context presentation context
-	 * @param modelId debug model identifier
-	 * @return debug model presentation or <code>null</code> 
-	 */
-	protected IDebugModelPresentation getModelPresentation(IPresentationContext context, String modelId) {
-		if (context instanceof DebugModelPresentationContext) {
-			DebugModelPresentationContext debugContext = (DebugModelPresentationContext) context;
-			IDebugModelPresentation presentation = debugContext.getModelPresentation();
-			if (presentation instanceof DelegatingModelPresentation) {
-				return ((DelegatingModelPresentation)presentation).getPresentation(modelId);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/DebugTargetContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/DebugTargetContentProvider.java
deleted file mode 100644
index f0a0bf8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/DebugTargetContentProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class DebugTargetContentProvider extends ElementContentProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_DEBUG_VIEW))
-		{
-			return ((IDebugTarget)element).getThreads().length;
-		}
-		else if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-		{
-			return getAllChildren(element, context, monitor).length;
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return IDebugUIConstants.ID_DEBUG_VIEW.equals(id) || IDebugUIConstants.ID_MEMORY_VIEW.equals(id);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(getAllChildren(parent, context, monitor), index, length);
-	}
-
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_DEBUG_VIEW))
-		{
-			return ((IDebugTarget)element).hasThreads();
-		}
-		else if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-		{
-			return getAllChildren(element, context, monitor).length > 0;
-		}
-		return false;
-	}
-
-	protected Object[] getAllChildren(Object parent, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_DEBUG_VIEW))
-		{
-			return ((IDebugTarget)parent).getThreads();
-		}
-		else if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-        {
-			if (parent instanceof IMemoryBlockRetrieval)
-			{
-				if (((IMemoryBlockRetrieval)parent).supportsStorageRetrieval())
-        			return DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks((IMemoryBlockRetrieval)parent);
-			}
-        }
-        return EMPTY;
-	}
-	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementContentProvider.java
deleted file mode 100644
index d9c2166..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementContentProvider.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-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.Job;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-
-/**
- * @since 3.3
- */
-public abstract class ElementContentProvider implements IElementContentProvider {
-	
-	protected static final Object[] EMPTY = new Object[0];
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider#updateChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IElementRequestMonitor)
-	 */
-	public void update(final IChildrenUpdate[] updates) {
-		Job job = new Job("children update") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				for (int i = 0; i < updates.length; i++) {
-					IChildrenUpdate update = updates[i];
-					if (!update.isCanceled()) {
-						retrieveChildren(update);
-					}
-					update.done();					
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.setRule(getRule(updates));
-		job.schedule();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider#update(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate)
-	 */
-	public void update(final IChildrenCountUpdate[] updates) {
-		Job job = new Job("child count update") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				for (int i = 0; i < updates.length; i++) {
-					IChildrenCountUpdate update = updates[i];
-					if (!update.isCanceled()) {
-						retrieveChildCount(update);
-					}
-					update.done();
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.setRule(getRule(updates));
-		job.schedule();
-	}
-	    
-    /**
-     * Computes the children for the given parent in the specified context.
-     * 
-     * @param update update request
-     */
-    protected void retrieveChildren(IChildrenUpdate update) {
-		if (!update.isCanceled()) {
-			IStatus status = Status.OK_STATUS;
-			try {
-				IPresentationContext context = update.getPresentationContext();
-				if (supportsContext(context)) {
-					int offset = update.getOffset();
-					Object[] children = getChildren(update.getElement(), offset, update.getLength(), context, update);
-					if (!update.isCanceled() && children != null) {
-						for (int i = 0; i < children.length; i++) {
-							update.setChild(children[i], offset + i);
-						}
-					}
-				}
-			} catch (CoreException e) {
-				status = e.getStatus();
-			}
-			update.setStatus(status);
-		}    	
-    }
-    
-    /**
-     * Computes whether the given element is a container.
-     * 
-     * @param parent potential parent
-     * @param context presentation context
-     * @param monitor result to report to
-     */
-    protected void retrieveChildCount(IChildrenCountUpdate update) {
-		if (!update.isCanceled()) {
-			IStatus status = Status.OK_STATUS;
-			try {
-				IPresentationContext context = update.getPresentationContext();
-				if (supportsContext(context)) {
-					int childCount = getChildCount( update.getElement(), context, update);
-					if (!update.isCanceled()) {
-						update.setChildCount(childCount);
-					}
-				} else {
-					update.setChildCount(0);
-				}
-			} catch (CoreException e) {
-				status = e.getStatus();
-			}
-			update.setStatus(status);
-		}    	
-    }    
-        
-    /**
-     * Returns the children for the given parent at the specified index in the specified context
-     * or <code>null</code> if none.
-     * 
-     * @param parent element to retrieve children for
-     * @param index child index
-     * @param length number of children to retrieve
-     * @param context context children will be presented in
-     * @return child or <code>null</code>
-     * @throws CoreException if an exception occurs retrieving child
-     */
-    protected abstract Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException;
-    
-    /**
-     * Returns the number of children for the given element.
-     * 
-     * @param elementPath element that may have children
-     * @param context context element will be presented in
-     * @return number of children
-     * @throws CoreException if an exception occurs determining child count
-     */
-    protected abstract int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException;    
-
-    /**
-     * Returns whether this adapter supports the given context.
-     * 
-     * @param context
-     * @return whether this adapter supports the given context
-     */
-    protected boolean supportsContext(IPresentationContext context) {
-		return supportsContextId(context.getId());
-    }
-    
-    /**
-     * Returns whether this adapter provides content in the specified context id.
-     * 
-     * @param id part id
-     * @return whether this adapter provides content in the specified context id
-     */
-    protected abstract boolean supportsContextId(String id);	
-
-    /**
-     * Returns the range of elements from <code>index</code> to <code>index + length</code> 
-     * or <code>null</code> if the index and range is outside the bounds of the original element array.
-     * 
-     * @param elements the original element array
-     * @param index the initial index to start copying from 
-     * @param length the number of elements we want to copy into the returned array
-     * @return element or <code>null</code>
-     */
-    protected Object[] getElements(Object[] elements, int index, int length) {
-    	int max = elements.length;
-    	if (index < max && ((index + length) > max)) {
-    		length = max - index;
-    	}
-    	if ((index + length) <= elements.length) {
-    		Object[] sub = new Object[length];
-    		System.arraycopy(elements, index, sub, 0, length);
-    		return sub;
-    	}
-    	return null;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider#update(org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate[])
-	 */
-	public void update(final IHasChildrenUpdate[] updates) {
-		Job job = new Job("has children update") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				for (int i = 0; i < updates.length; i++) {
-					IHasChildrenUpdate update = updates[i];
-					if (!update.isCanceled()) {
-						updateHasChildren(update);
-					}
-					update.done();					
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.setRule(getRule(updates));
-		job.schedule();	
-	}
-
-	/**
-	 * Updates whether the given elements have children.
-	 * 
-	 * @param update specifies element and progress monitor
-	 */
-	protected void updateHasChildren(IHasChildrenUpdate update) {
-		if (!update.isCanceled()) {
-			IStatus status = Status.OK_STATUS;
-			try {
-				IPresentationContext context = update.getPresentationContext();
-				if (supportsContext(context)) {
-					boolean hasChildren = hasChildren(update.getElement(), context, update);
-					if (!update.isCanceled()) {
-						update.setHasChilren(hasChildren);
-					}
-				} else {
-					update.setHasChilren(false);
-				}
-			} catch (CoreException e) {
-				status = e.getStatus();
-			}
-			update.setStatus(status);
-		}    	
-		
-	}
-
-	/**
-	 * Returns whether the given element has children in the specified context.
-	 * Subclasses can override to be more efficient.
-	 * 
-	 * @param element
-	 * @param context
-	 * @param monitor
-	 * @return
-	 */
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getChildCount(element, context, monitor) > 0;
-	}
-	
-	/**
-	 * Returns a scheduling rule to use when performing the given updates or
-	 * <code>null</code> if none.
-	 * 
-	 * @param updates
-	 * @return scheduling rule or <code>null</code> if none
-	 */
-	protected ISchedulingRule getRule(IChildrenCountUpdate[] updates) {
-		return null;
-	}
-	
-	/**
-	 * Returns a scheduling rule to use when performing the given updates or
-	 * <code>null</code> if none.
-	 * 
-	 * @param updates
-	 * @return scheduling rule or <code>null</code> if none
-	 */
-	protected ISchedulingRule getRule(IChildrenUpdate[] updates) {
-		return null;
-	}	
-	
-	/**
-	 * Returns a scheduling rule to use when performing the given updates or
-	 * <code>null</code> if none.
-	 * 
-	 * @param updates
-	 * @return scheduling rule or <code>null</code> if none
-	 */
-	protected ISchedulingRule getRule(IHasChildrenUpdate[] updates) {
-		return null;
-	}	
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementLabelProvider.java
deleted file mode 100644
index a8cec38..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementLabelProvider.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.debug.internal.ui.model.elements;
-
-import java.util.LinkedList;
-import java.util.NoSuchElementException;
-
-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.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Implementation of a context sensitive label provider, which provides
- * base functionality for subclasses such as label jobs and a basic label updater. 
- * 
- * @since 3.3.0.qualifier
- */
-public abstract class ElementLabelProvider implements IElementLabelProvider {
-
-	private Job fLabelJob = null;
-	
-	/**
-	 * Describes a label job
-	 */
-	interface ILabelJob {
-		/**
-		 * Returns whether the updates were queued.
-		 * 
-		 * @param updates updates
-		 * @return whether the updates were queued
-		 */
-		public boolean queue(ILabelUpdate[] updates);
-	}
-	
-	/**
-	 * A <code>Job</code> to update labels. This <code>Job</code> can run
-	 * in a non-UI thread.
-	 */
-	class LabelJob extends Job implements ILabelJob {
-		
-		private LabelUpdater fUpdater = new LabelUpdater();
-
-		public LabelJob() {
-			super("Label Job"); //$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) {
-			fUpdater.run();
-			return Status.OK_STATUS;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider.ILabelJob#queue(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate)
-		 */
-		public boolean queue(ILabelUpdate[] updates) {
-			return fUpdater.queue(updates);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#shouldRun()
-		 */
-		public boolean shouldRun() {
-			return fUpdater.shouldRun();
-		}
-		
-	}
-	
-	/**
-	 * A <code>Job</code> to update labels. This <code>Job</code> runs
-	 * only in the UI thread.
-	 */
-	class UILabelJob extends UIJob implements ILabelJob {
-		
-		private LabelUpdater fUpdater = new LabelUpdater();
-
-		public UILabelJob() {
-			super("Label Job"); //$NON-NLS-1$
-			setSystem(true);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			fUpdater.run();
-			return Status.OK_STATUS;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider.ILabelJob#queue(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate)
-		 */
-		public boolean queue(ILabelUpdate[] updates) {
-			return fUpdater.queue(updates);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#shouldRun()
-		 */
-		public boolean shouldRun() {
-			return fUpdater.shouldRun();
-		}		
-	}
-	
-	/**
-	 * Queue of label updates
-	 */
-	class LabelUpdater implements Runnable {
-		
-		LinkedList fQueue = new LinkedList();
-		
-		public synchronized boolean queue(ILabelUpdate[] updates) {
-			if (fQueue == null) {
-				return false;
-			} else {
-				for (int i = 0; i < updates.length; i++) {
-					fQueue.addLast(updates[i]);
-				}
-				return true;
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			ILabelUpdate update = getNextUpdate();
-			while (update != null) {	
-				try {
-					retrieveLabel(update);
-				} catch (CoreException e) {
-					update.setStatus(e.getStatus());
-				}
-				update.done();
-				update = getNextUpdate();
-			}
-		}
-		
-		/**
-		 * Returns the next update to process, if there is one in the 
-		 * queue. If there are no queued items <code>null</code> is returned
-		 * @return the next queued item or <code>null</code> if the queue is empty.
-		 */
-		public synchronized ILabelUpdate getNextUpdate() {
-			if (fQueue == null) {
-				return null;
-			}
-			ILabelUpdate update = null;
-			try {
-				update = (ILabelUpdate) fQueue.removeFirst();
-			} catch (NoSuchElementException e) {
-				fQueue = null;
-			}
-			return update;
-		}
-		
-		public boolean shouldRun() {
-			return fQueue != null;
-		}
-	}
-	
-	/**
-	 * Retrieves label attributes for the specified update.
-	 * 
-	 * @param update
-	 */
-	protected void retrieveLabel(ILabelUpdate update) throws CoreException {
-		String[] columnIds = update.getColumnIds();
-		IPresentationContext presentationContext = update.getPresentationContext();
-		TreePath elementPath = update.getElementPath();
-		int numColumns = 1;
-		if (columnIds != null) {
-			numColumns = columnIds.length;
-		}
-		for (int i = 0; i < numColumns; i++) {
-			String columnId = null;
-			if (columnIds != null) {
-				columnId = columnIds[i];
-			}
-			update.setLabel(getLabel(elementPath, presentationContext, columnId), i);
-			update.setImageDescriptor(getImageDescriptor(elementPath, presentationContext, columnId), i);
-			update.setBackground(getBackground(elementPath, presentationContext, columnId), i);
-			update.setForeground(getForeground(elementPath, presentationContext, columnId), i);
-			update.setFontData(getFontData(elementPath, presentationContext, columnId), i);
-		}
-	}
-
-	/**
-	 * Returns the <code>FontData</code> for the path in the given column with the current presentation
-	 * @param element
-	 * @param presentationContext
-	 * @param columnId
-	 * @return font information or <code>null</code>
-	 */
-	protected FontData getFontData(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * Returns the <code>RGB</code> foreground colour for the path in the given column with the current presentation
-	 * @param element
-	 * @param presentationContext
-	 * @param columnId
-	 * @return color or <code>null</code>
-	 */
-	protected RGB getForeground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * Returns the <code>RGB</code> background colour for the path in the given column with the current presentation
-	 * @param element
-	 * @param presentationContext
-	 * @param columnId
-	 * @return color or <code>null</code>
-	 */
-	protected RGB getBackground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * Returns the <code>ImageDescriptor</code> for the path in the given column with the current presentation
-	 * @param element
-	 * @param presentationContext
-	 * @param columnId
-	 * @return image descriptor or <code>null</code>
-	 */
-	protected ImageDescriptor getImageDescriptor(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * Returns the label for the path in the given column with the current presentation
-	 * @param element
-	 * @param presentationContext
-	 * @param columnId
-	 * @return label
-	 */
-	protected abstract String getLabel(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException;	
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider#update(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate[])
-     */
-    public synchronized void update(ILabelUpdate[] updates) {
-		if (fLabelJob == null) {
-			fLabelJob = newLabelJob(updates);
-		}
-		if (!((ILabelJob)fLabelJob).queue(updates)) {
-			fLabelJob = newLabelJob(updates);
-			((ILabelJob)fLabelJob).queue(updates);
-		}
-		// TODO: rule
-		fLabelJob.schedule();
-	}
-    
-    /**
-     * Returns a new <code>Job</code> to update the specified labels. This method
-     * is used to determine if a UI job is needed or not, in the event the request for an update
-     * job has come from a non-UI thread.
-     * @param updates an array of pending label updates
-     * @return a new <code>Job</code> to update labels with.
-     */
-    private Job newLabelJob(ILabelUpdate[] updates) {
-    	if (requiresUIJob(updates)) {
-			return new UILabelJob();
-		} else {
-			return new LabelJob();
-		}
-    }
-    
-    /** 
-     * Returns whether a UI job should be used for updates versus a non-UI job.
-     * @param updates
-     * @return true if the array of updates requires a UI job to update the labels, false otherwise
-     */
-    protected boolean requiresUIJob(ILabelUpdate[] updates) {
-    	return false;
-    }
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementMementoProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementMementoProvider.java
deleted file mode 100644
index 536fb5b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ElementMementoProvider.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-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.debug.internal.ui.viewers.model.provisional.IElementCompareRequest;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.3
- */
-public abstract class ElementMementoProvider implements IElementMementoProvider {
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[])
-	 */
-	public void compareElements(final IElementCompareRequest[] requests) {
-		Job job = new Job("compare element") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				for (int i = 0; i < requests.length; i++) {
-					IElementCompareRequest request = requests[i];
-					try {
-						request.setEqual(isEqual(request.getElement(), request.getMemento(), request.getPresentationContext()));
-					} catch (CoreException e) {
-						request.setStatus(e.getStatus());
-					}
-					request.done();
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		// TODO: rule
-		job.schedule();
-	}
-
-	/**
-	 * Returns whether the memento represents the given element.
-	 * 
-	 * @param element the element to compare to the memento
-	 * @param memento memento
-	 * @param context the context the compare is in
-	 * @return whether the memento represents the given element
-	 */
-	protected abstract boolean isEqual(Object element, IMemento memento, IPresentationContext context) throws CoreException;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[])
-	 */
-	public void encodeElements(final IElementMementoRequest[] requests) {
-		Job job = new Job("encode element") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				for (int i = 0; i < requests.length; i++) {
-					IElementMementoRequest request = requests[i];
-					try {
-						if (!encodeElement(request.getElement(), request.getMemento(), request.getPresentationContext())) {
-							request.cancel();
-						}
-					} catch (CoreException e) {
-						request.setStatus(e.getStatus());
-					}
-					request.done();
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		// TODO: rule
-		job.schedule();
-	}
-	
-	/**
-	 * Encodes the specified element into the given memento.
-	 * Returns whether the element could be encoded
-	 * 
-	 * @param element the element to encode
-	 * @param memento the memento to write to 
-	 * @param context presentation context
-	 * @return false if cancelled/not supported
-	 * @throws CoreException
-	 */
-	protected abstract boolean encodeElement(Object element, IMemento memento, IPresentationContext context) throws CoreException;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionContentProvider.java
deleted file mode 100644
index 1ae488b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionContentProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import java.util.LinkedHashSet;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IErrorReportingExpression;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-
-/**
- * @since 3.3
- */
-public class ExpressionContentProvider extends VariableContentProvider {
-
-	protected Object[] getAllChildren(Object parent, IPresentationContext context) throws CoreException {
-       if (parent instanceof IErrorReportingExpression) {
-            IErrorReportingExpression expression = (IErrorReportingExpression) parent;
-            if (expression.hasErrors()) {
-                String[] messages = expression.getErrorMessages();
-                LinkedHashSet set = new LinkedHashSet(messages.length);
-                for (int i = 0; i < messages.length; i++) {
-					set.add(messages[i]);
-				}
-                return set.toArray();
-            }
-        }
-        if (parent instanceof IExpression) {
-            IExpression expression = (IExpression) parent;
-            IValue value = expression.getValue();
-            if (value != null) {
-                return getValueChildren(expression, value, context);
-            }
-        }
-        return EMPTY;	
-	}
-	
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		if (element instanceof IErrorReportingExpression) {
-			IErrorReportingExpression expression = (IErrorReportingExpression) element;
-			if (expression.hasErrors()) {
-				return true;
-			}
-		}
-		IValue value = ((IExpression)element).getValue();
-		if (value == null) {
-			return false;
-		}
-		return value.hasVariables();
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionLabelProvider.java
deleted file mode 100644
index 8788f0c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionLabelProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IErrorReportingExpression;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @since 3.3
- */
-public class ExpressionLabelProvider extends VariableLabelProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.VariableLabelProvider#getForeground(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected RGB getForeground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-        if (element instanceof IErrorReportingExpression) {
-            IErrorReportingExpression expression = (IErrorReportingExpression) element;
-            if (expression.hasErrors()) {
-                return new RGB(255, 0, 0);
-            }
-        }		
-		return super.getForeground(elementPath, presentationContext, columnId);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionManagerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionManagerContentProvider.java
deleted file mode 100644
index 94503f4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionManagerContentProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Default content provider for the expression manager.
- */
-public class ExpressionManagerContentProvider extends ElementContentProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IExpressionManager) element).getExpressions().length;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(((IExpressionManager) parent).getExpressions(), index, length);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return id.equals(IDebugUIConstants.ID_EXPRESSION_VIEW);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
-	 */
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IExpressionManager)element).hasExpressions();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionsViewMementoProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionsViewMementoProvider.java
deleted file mode 100644
index a2ba87e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ExpressionsViewMementoProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.ui.IMemento;
-
-/**
- * Memento provider for expressions view.
- * 
- * @since 3.3
- */
-public class ExpressionsViewMementoProvider extends ElementMementoProvider {
-
-	/**
-	 * memento attribute
-	 */
-	private static final String ELEMENT_NAME = "ELEMENT_NAME"; //$NON-NLS-1$
-	
-	private static final String EXP_MGR = "EXP_MGR"; //$NON-NLS-1$
-
-	protected boolean encodeElement(Object element, IMemento memento, IPresentationContext context) throws CoreException {
-		if (element instanceof IExpressionManager) {
-			memento.putString(ELEMENT_NAME, EXP_MGR);
-		} else if (element instanceof IExpression) {
-			memento.putString(ELEMENT_NAME, ((IExpression) element).getExpressionText());
-		} else if (element instanceof IVariable) {
-			memento.putString(ELEMENT_NAME, ((IVariable) element).getName());
-		} else {
-			return false;
-		}
-		return true;
-	}
-
-	protected boolean isEqual(Object element, IMemento memento, IPresentationContext context) throws CoreException {
-		String mementoName = memento.getString(ELEMENT_NAME);
-		if (mementoName != null) {
-			String elementName = null;
-			if (element instanceof IExpressionManager) {
-				elementName = EXP_MGR;
-			} else if (element instanceof IVariable) {
-				elementName = ((IVariable)element).getName();
-			} else if (element instanceof IExpression) {
-				elementName = ((IExpression)element).getExpressionText();
-			}
-			if (elementName != null) {
-				return elementName.equals(mementoName);
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/LaunchContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/LaunchContentProvider.java
deleted file mode 100644
index c350078..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/LaunchContentProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class LaunchContentProvider extends ElementContentProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((ILaunch)element).getChildren().length;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return IDebugUIConstants.ID_DEBUG_VIEW.equals(id);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(((ILaunch)parent).getChildren(), index, length);
-	}
-
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((ILaunch)element).hasChildren();
-	}
-
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/LaunchManagerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/LaunchManagerContentProvider.java
deleted file mode 100644
index 81883a3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/LaunchManagerContentProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class LaunchManagerContentProvider extends ElementContentProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((ILaunchManager)element).getLaunches().length;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return IDebugUIConstants.ID_DEBUG_VIEW.equals(id);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(((ILaunchManager)parent).getLaunches(),index, length);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryBlockContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryBlockContentProvider.java
deleted file mode 100644
index bb4008f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryBlockContentProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * This content provider is required in order to have selection maintained properly 
- * when swtiching between session.  The problem is, when swtich debug session, the memory view reset the input
- * to the viewer.
- * 
- * After the input is set, viewer's doInitialRestore is called.  At this time, the elemtns
- * are not mapped in the viewer yet, as a result, the selection cannot be maintained.
- * 
- * The viewer tries to restore selection again after elements are added to the view.  This is done
- * in the HasChildrenJob.  However, this job will not get scheduled unless the element provides a content
- * provider adapter.  As a result, the job is never scheduled and the selection cannot be maintained.
- *
- */
-public class MemoryBlockContentProvider extends ElementContentProvider {
-
-	protected int getChildCount(Object element, IPresentationContext context,
-			IViewerUpdate monitor) throws CoreException {
-		return 0;
-	}
-
-	protected Object[] getChildren(Object parent, int index, int length,
-			IPresentationContext context, IViewerUpdate monitor)
-			throws CoreException {
-		return EMPTY;
-	}
-
-	protected boolean supportsContextId(String id) {
-		if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-			return true;
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryBlockLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryBlockLabelProvider.java
deleted file mode 100644
index 91233a4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryBlockLabelProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TreePath;
-
-public class MemoryBlockLabelProvider extends DebugElementLabelProvider {
-	
-	protected String getLabel(TreePath elementPath,
-			IPresentationContext presentationContext, String columnId)
-			throws CoreException {
-		Object element = elementPath.getLastSegment();
-		
-		if (element instanceof IMemoryBlock)
-			return getLabel((IMemoryBlock)element);
-		
-		return super.getLabel(elementPath, presentationContext, columnId);
-	}
-	
-	protected ImageDescriptor getImageDescriptor(TreePath elementPath,
-			IPresentationContext presentationContext, String columnId)
-			throws CoreException {
-		
-		Object element = elementPath.getLastSegment();
-		
-		if (element instanceof IMemoryBlock)
-			return DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_OBJS_VARIABLE);
-		
-		return super.getImageDescriptor(elementPath, presentationContext, columnId);
-	}
-	
-	/**
-	 * @param memoryBlockLabel
-	 * @return
-	 */
-	private String getLabel(IMemoryBlock memoryBlock) {
-		
-		String memoryBlockLabel = " "; //$NON-NLS-1$
-		if (memoryBlock instanceof IMemoryBlockExtension)
-		{
-			// simply return the expression without the address
-			// do not want to keep track of changes in the address
-			if (((IMemoryBlockExtension)memoryBlock).getExpression() != null)
-			{
-				memoryBlockLabel += ((IMemoryBlockExtension)memoryBlock).getExpression();
-			}
-		}
-		else
-		{
-			long address = memoryBlock.getStartAddress();
-			memoryBlockLabel = Long.toHexString(address);
-		}
-		return memoryBlockLabel;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryRetrievalContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryRetrievalContentProvider.java
deleted file mode 100644
index 11d0ee3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryRetrievalContentProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-public class MemoryRetrievalContentProvider extends ElementContentProvider {
-
-	protected int getChildCount(Object element, IPresentationContext context,
-			IViewerUpdate monitor) throws CoreException {
-		return getAllChildren(element, context, monitor).length;
-	}
-
-	protected Object[] getChildren(Object parent, int index, int length,
-			IPresentationContext context, IViewerUpdate monitor)
-			throws CoreException {
-		
-		return getElements(getAllChildren(parent, context, monitor), index, length);
-		
-	}
-	
-	protected Object[] getAllChildren(Object parent, IPresentationContext context, IViewerUpdate monitor) {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-        {
-			if (parent instanceof IMemoryBlockRetrieval)
-			{
-				if (((IMemoryBlockRetrieval)parent).supportsStorageRetrieval())
-        			return DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks((IMemoryBlockRetrieval)parent);
-			}
-        }
-        return EMPTY;
-	}
-
-	protected boolean supportsContextId(String id) {
-		return id.equals(IDebugUIConstants.ID_MEMORY_VIEW);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryViewElementMementoProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryViewElementMementoProvider.java
deleted file mode 100644
index ca4727c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/MemoryViewElementMementoProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.ui.IMemento;
-
-public class MemoryViewElementMementoProvider extends ElementMementoProvider {
-	
-	private static final String OBJECT_ID = "OBJECT_ID"; //$NON-NLS-1$
-
-	protected boolean encodeElement(Object element, IMemento memento,
-			IPresentationContext context) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-		{
-			if (element instanceof IMemoryBlock || element instanceof IMemoryBlockRetrieval)
-			{
-				memento.putInteger(OBJECT_ID, element.hashCode());
-				return true;
-			}
-		}
-		return false;
-	}
-
-	protected boolean isEqual(Object element, IMemento memento,
-			IPresentationContext context) throws CoreException {
-		String id = context.getId();
-		if (id.equals(IDebugUIConstants.ID_MEMORY_VIEW))
-		{
-			if (element instanceof IMemoryBlock || element instanceof IMemoryBlockRetrieval)
-			{
-				Integer objectId = memento.getInteger(OBJECT_ID);
-				if (objectId != null && objectId.intValue() == element.hashCode())
-					return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/RegisterGroupContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/RegisterGroupContentProvider.java
deleted file mode 100644
index 8d30164..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/RegisterGroupContentProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IRegisterGroup;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Register group content provider.
- * 
- * @since 3.3 
- */
-public class RegisterGroupContentProvider extends ElementContentProvider {
-
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IRegisterGroup)element).getRegisters().length;
-	}
-
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(((IRegisterGroup)parent).getRegisters(), index, length);
-	}
-	
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IRegisterGroup)element).hasRegisters();
-	}
-
-	protected boolean supportsContextId(String id) {
-		return IDebugUIConstants.ID_REGISTER_VIEW.equals(id);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/RegisterGroupLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/RegisterGroupLabelProvider.java
deleted file mode 100644
index a269063..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/RegisterGroupLabelProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TreePath;
-
-/**
- * @since 3.3
- */
-public class RegisterGroupLabelProvider extends DebugElementLabelProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getImageDescriptor(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected ImageDescriptor getImageDescriptor(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		if (columnId == null || VariableColumnPresentation.COLUMN_VARIABLE_NAME.equals(columnId)) {
-			return super.getImageDescriptor(elementPath, presentationContext, columnId);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getLabel(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected String getLabel(TreePath elementPath, IPresentationContext context, String columnId) throws CoreException {
-		if (columnId == null || VariableColumnPresentation.COLUMN_VARIABLE_NAME.equals(columnId)) {
-			return super.getLabel(elementPath, context, columnId);
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/StackFrameContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/StackFrameContentProvider.java
deleted file mode 100644
index 61ce7ce..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/StackFrameContentProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class StackFrameContentProvider extends ElementContentProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getAllChildren(element, context, monitor).length;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(getAllChildren(parent, context, monitor), index, length);
-	}
-	
-	/**
-	 * This method retrieves all of the children for the specified parent given the current context
-	 * @param parent the parent ot get the children for
-	 * @param context the context for which to get the children for
-	 * @param monitor the monitor for progress
-	 * @return the collection of children, or an empty collection, never <code>null</code>
-	 * @throws CoreException
-	 */
-	protected Object[] getAllChildren(Object parent, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		if (parent instanceof IStackFrame) {
-	        String id = context.getId();
-	        IStackFrame frame = (IStackFrame) parent;
-	        if (id.equals(IDebugUIConstants.ID_VARIABLE_VIEW)) {
-	            return frame.getVariables();
-	        } else if (id.equals(IDebugUIConstants.ID_REGISTER_VIEW)) {
-	            return frame.getRegisterGroups();
-	        }
-		} else {
-			monitor.cancel();
-		}
-	    return EMPTY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return id.equals(IDebugUIConstants.ID_VARIABLE_VIEW) || id.equals(IDebugUIConstants.ID_REGISTER_VIEW);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		 String id = context.getId();
-        IStackFrame frame = (IStackFrame) element;
-        if (id.equals(IDebugUIConstants.ID_VARIABLE_VIEW)) {
-            return frame.hasVariables();
-        } else if (id.equals(IDebugUIConstants.ID_REGISTER_VIEW)) {
-            return frame.hasRegisterGroups();
-        }
-        return false;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ThreadContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ThreadContentProvider.java
deleted file mode 100644
index dd99e66..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/ThreadContentProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class ThreadContentProvider extends ElementContentProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IThread)element).getStackFrames().length;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return IDebugUIConstants.ID_DEBUG_VIEW.equals(id);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(((IThread)parent).getStackFrames(), index, length);
-	}
-
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IThread)element).hasStackFrames();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java
deleted file mode 100644
index 067807e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.ILogicalStructureType;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IIndexedValue;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.internal.ui.views.variables.IndexedVariablePartition;
-import org.eclipse.debug.internal.ui.views.variables.LogicalStructureCache;
-import org.eclipse.debug.internal.ui.views.variables.VariablesView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class VariableContentProvider extends ElementContentProvider {
-
-	/**
-	 * Cache of logical structures to avoid computing structures for different
-	 * subranges.
-	 */
-	private static LogicalStructureCache fgLogicalCache;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getAllChildren(element, context).length;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return getElements(getAllChildren(parent, context), index, length);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
-	 */
-	protected boolean hasChildren(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		return ((IVariable)element).getValue().hasVariables();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		 return id.equals(IDebugUIConstants.ID_EXPRESSION_VIEW) || id.equals(IDebugUIConstants.ID_VARIABLE_VIEW) || id.equals(IDebugUIConstants.ID_REGISTER_VIEW);
-	}
-	
-	/**
-	 * Gets all the children variables for the parent
-	 * @param parent the parent IVariable
-	 * @param context the context the children will be presented in
-	 * @return an array of all children or an empty array if none
-	 * @throws CoreException
-	 */
-	protected Object[] getAllChildren(Object parent, IPresentationContext context) throws CoreException {
-        IVariable variable = (IVariable) parent;
-        IValue value = variable.getValue();
-        if (value != null) {
-            return getValueChildren(variable, value, context);
-        }
-        return EMPTY;		
-	}
-
-    /**
-     * Return whether to show compute a logical structure or a raw structure
-     * in the specified context
-     * 
-     * @return whether to show compute a logical structure or a raw structure
-     * in the specified context
-     */
-    protected boolean isShowLogicalStructure(IPresentationContext context) {
-    	Boolean show = (Boolean) context.getProperty(VariablesView.PRESENTATION_SHOW_LOGICAL_STRUCTURES);
-    	return show != null && show.booleanValue();
-    }
-
-    /**
-     * Returns the number of entries that should be displayed in each partition
-     * of an indexed collection.
-     * 
-     * @return the number of entries that should be displayed in each partition
-     *         of an indexed collection
-     */
-    protected int getArrayPartitionSize() {
-        // TODO: should fix this with a user preference
-        return 100;
-    }	
-    
-    /**
-     * Returns any logical value for the raw value in the specified context
-     * 
-     * @param value
-     * @param context
-     * @return logical value for the raw value
-     */
-    protected IValue getLogicalValue(IValue value, IPresentationContext context) throws CoreException {
-        return getLogicalValue(value, new ArrayList(), context);
-    }
-    
-    /**
-     * Returns children for the given value, creating array partitions if
-     * required
-     * 
-     * @param parent expression or variable containing the given value
-     * @param value the value to retrieve children for
-     * @param context the context in which children have been requested
-     * @return children for the given value, creating array partitions if
-     *         required
-     * @throws CoreException
-     */
-    protected Object[] getValueChildren(IDebugElement parent, IValue value, IPresentationContext context) throws CoreException {
-        if (value == null) {
-            return EMPTY;
-        }
-        IValue logicalValue = getLogicalValue(value, context);
-        if (logicalValue instanceof IIndexedValue) {
-            IIndexedValue indexedValue = (IIndexedValue) logicalValue;
-            int partitionSize = computeParitionSize(indexedValue);
-            if (partitionSize > 1) {
-                int offset = indexedValue.getInitialOffset();
-                int length = indexedValue.getSize();
-                int numPartitions = length / partitionSize;
-                int remainder = length % partitionSize;
-                if (remainder > 0) {
-                    numPartitions++;
-                }
-                IVariable[] partitions = new IVariable[numPartitions];
-                for (int i = 0; i < (numPartitions - 1); i++) {
-                    partitions[i] = new IndexedVariablePartition(parent, indexedValue, offset, partitionSize);
-                    offset = offset + partitionSize;
-                }
-                if (remainder == 0) {
-                    remainder = partitionSize;
-                }
-                partitions[numPartitions - 1] = new IndexedVariablePartition(parent, indexedValue, offset, remainder);
-                return partitions;
-            }
-        }
-        if (logicalValue == null) {
-            // safeguard against an structure type returning null
-            logicalValue = value;
-        }
-        return logicalValue.getVariables();
-    }
-
-    /**
-     * Returns the partition size to use for the given indexed value. The
-     * partition size is computed by determining the number of levels that an
-     * indexed collection must be nested in order to partition the collection
-     * sub-collections of the preferred partition size.
-     * 
-     * @param value
-     *            indexed value
-     * @return size of partitions the value should be subdivided into
-     */
-    protected int computeParitionSize(IIndexedValue value) {
-        int partitionSize = 1;
-        try {
-            int length = value.getSize();
-            int partitionDepth = 0;
-            int preferredSize = getArrayPartitionSize();
-            int remainder = length % preferredSize;
-            length = length / preferredSize;
-            while (length > 0) {
-                if (remainder == 0 && length == 1) {
-                    break;
-                }
-                partitionDepth++;
-                remainder = length % preferredSize;
-                length = length / preferredSize;
-            }
-            for (int i = 0; i < partitionDepth; i++) {
-                partitionSize = partitionSize * preferredSize;
-            }
-        } catch (DebugException e) {
-        }
-        return partitionSize;
-    }    
-    
-    /**
-     * Returns any logical value for the raw value. This method will recurse
-     * over the returned value until the same structure is encountered again (to
-     * avoid infinite recursion).
-     * 
-     * @param value raw value to possibly be replaced by a logical value
-     * @param previousStructureIds
-     *            the list of logical structures that have already been applied
-     *            to the returned value during the recursion of this method.
-     *            Callers should always pass in a new, empty list.
-     * @return logical value if one is calculated, otherwise the raw value is returned
-     */
-    protected IValue getLogicalValue(IValue value, List previousStructureIds, IPresentationContext context) throws CoreException {
-        if (isShowLogicalStructure(context)) {
-            ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
-            if (types.length > 0) {
-                ILogicalStructureType type = DebugPlugin.getDefaultStructureType(types);
-                if (type != null && !previousStructureIds.contains(type.getId())) {
-                	IValue logicalValue = getLogicalStructureCache().getLogicalStructure(type, value);
-                	previousStructureIds.add(type.getId());
-                	return getLogicalValue(logicalValue, previousStructureIds, context);
-                }
-            }
-        }
-        return value;
-    }
-    
-    /**
-     * Returns the logical structure cache to use to store calculated structures.  If the cache does not
-     * exist yet, one is created and a debug event listener is added to clear the cache on RESUME and
-     * TERMINATE events.
-     * 
-     * @return the logical structure cache to use
-     */
-    protected synchronized LogicalStructureCache getLogicalStructureCache(){
-    	if (fgLogicalCache == null){
-    		fgLogicalCache = new LogicalStructureCache();
-    		// Add a listener to clear the cache when resuming or terminating
-    		DebugPlugin.getDefault().addDebugEventListener(new IDebugEventSetListener(){
-				public void handleDebugEvents(DebugEvent[] events) {
-					for (int i = 0; i < events.length; i++) {
-						if (events[i].getKind() == DebugEvent.TERMINATE){
-							fgLogicalCache.clear();
-							break;
-						} else if (events[i].getKind() == DebugEvent.RESUME && !events[i].isEvaluation()){
-							fgLogicalCache.clear();
-							break;
-						} else if (events[i].getKind() == DebugEvent.CHANGE && events[i].getDetail() == DebugEvent.CONTENT){
-							fgLogicalCache.clear();
-							break;
-						}
-					}
-				}
-    		});
-    	}
-    	return fgLogicalCache;
-    }
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableEditor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableEditor.java
deleted file mode 100644
index b886d20..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableEditor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @since 3.3
- */
-public class VariableEditor implements IElementEditor {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor#getCellEditor(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String, java.lang.Object, org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor getCellEditor(IPresentationContext context, String columnId, Object element, Composite parent) {
-		return new TextCellEditor(parent);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor#getCellModifier(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.Object)
-	 */
-	public ICellModifier getCellModifier(IPresentationContext context, Object element) {
-		return new DefaultVariableCellModifier();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableLabelProvider.java
deleted file mode 100644
index 896492b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableLabelProvider.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DefaultLabelProvider;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Provides context sensitive labels for debug variables.
- * 
- * @since 3.3
- */
-public class VariableLabelProvider extends DebugElementLabelProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getBackground(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected RGB getBackground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (columnId != null) {
-	        if (element instanceof IVariable) {
-	        	IVariable variable = (IVariable) element;
-				if (variable.hasValueChanged()) {
-					return DebugUIPlugin.getPreferenceColor(IInternalDebugUIConstants.PREF_CHANGED_VALUE_BACKGROUND).getRGB();
-				}
-	        }
-		}
-		return super.getBackground(elementPath, presentationContext, columnId);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getForeground(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected RGB getForeground(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		Object element = elementPath.getLastSegment();
-		if (columnId == null) {
-	        if (element instanceof IVariable) {
-	        	IVariable variable = (IVariable) element;
-				if (variable.hasValueChanged()) {
-					return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR).getRGB();
-				}
-	        }
-		}
-	    return super.getForeground(elementPath, presentationContext, columnId);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getImageDescriptor(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected ImageDescriptor getImageDescriptor(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
-		if (columnId == null || VariableColumnPresentation.COLUMN_VARIABLE_NAME.equals(columnId)) {
-			return super.getImageDescriptor(elementPath, presentationContext, columnId);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getFontData(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected FontData getFontData(TreePath elementPath, IPresentationContext presentationContext, String columnId)	throws CoreException {
-		return JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0];
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider#getLabel(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
-	 */
-	protected String getLabel(TreePath elementPath, IPresentationContext context, String columnId) throws CoreException {
-		if (columnId == null) {
-			return super.getLabel(elementPath, context, columnId);
-		} else {
-			IVariable variable = (IVariable) elementPath.getLastSegment();
-			IValue value = variable.getValue();		
-			return getColumnText(variable, value, context, columnId);
-		}
-	}
-	
-	/**
-	 * Returns text for a specific columns for the variable/value.
-	 * 
-	 * @param variable variable to retrieve text for
-	 * @param value the value associated with the variable
-	 * @param context presentation context specifying how to display the text
-	 * @param columnId the column to get the text for
-	 * @return the label text
-	 * @throws CoreException
-	 */
-	protected String getColumnText(IVariable variable, IValue value, IPresentationContext context, String columnId) throws CoreException {
-		if (VariableColumnPresentation.COLUMN_VARIABLE_NAME.equals(columnId)) {
-			return getVariableName(variable, context);
-		} else if (VariableColumnPresentation.COLUMN_VARIABLE_TYPE.equals(columnId)) {
-			return getVariableTypeName(variable, context);
-		} else if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(columnId)) {
-			return getValueText(variable, value, context);
-		} else if (VariableColumnPresentation.COLUMN_VALUE_TYPE.equals(columnId)) {
-			return getValueTypeName(variable, value, context);
-		}	
-		return null;
-	}
-
-	/**
-	 * Returns the name of the given variable to display in <code>COLUMN_VARIABLE_NAME</code>.
-	 * 
-	 * @param variable
-	 * @return variable name
-	 * @throws CoreException
-	 */
-	protected String getVariableName(IVariable variable, IPresentationContext context) throws CoreException {
-		return variable.getName();
-	}
-	
-	/**
-	 * Returns the type name of the given variable to display in <code>COLUMN_VARIABLE_TYPE</code>.
-	 * 
-	 * @param variable
-	 * @return variable type name
-	 * @throws CoreException
-	 */
-	protected String getVariableTypeName(IVariable variable, IPresentationContext context) throws CoreException {
-		return variable.getReferenceTypeName();
-	}
-	
-	/**
-	 * Returns the label for the given value's type to display in <code>COLUMN_VARIABLE_VALUE</code>
-	 * 
-	 * @param variable
-	 * @param value
-	 * @return value label
-	 * @throws CoreException
-	 */
-	protected String getValueTypeName(IVariable variable, IValue value, IPresentationContext context) throws CoreException {
-		return value.getReferenceTypeName();
-	}
-	
-	/**
-	 * Returns the label for the given value to display in <code>COLUMN_VALUE_TYPE</code>
-	 * 
-	 * @param variable
-	 * @param value
-	 * @return value label
-	 * @throws CoreException
-	 */
-	protected String getValueText(IVariable variable, IValue value, IPresentationContext context) throws CoreException {
-		return escapeSpecialChars(value.getValueString());
-	}
-	
-	/**
-	 * Escapes special characters using the default label provider
-	 * 
-	 * @param label the text to escape
-	 * @return the string with special characters escaped
-	 */
-	protected String escapeSpecialChars(String label) {
-		return DefaultLabelProvider.escapeSpecialChars(label);
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariablesViewElementMementoProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariablesViewElementMementoProvider.java
deleted file mode 100644
index e9d5cd1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariablesViewElementMementoProvider.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.debug.internal.ui.model.elements;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IRegisterGroup;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.3
- */
-public class VariablesViewElementMementoProvider extends ElementMementoProvider {
-
-	/**
-	 * memento attribute
-	 */
-	private static final String ELEMENT_NAME = "ELEMENT_NAME"; //$NON-NLS-1$
-
-	protected boolean encodeElement(Object element, IMemento memento, IPresentationContext context) throws CoreException {
-		if (element instanceof IStackFrame) {
-			IStackFrame frame = (IStackFrame) element;
-			if (IDebugUIConstants.ID_REGISTER_VIEW.equals(context.getId())) {
-				// for registers view attempt to maintain expansion for target rather than each frame
-				memento.putString(ELEMENT_NAME, frame.getModelIdentifier());
-			} else {
-				memento.putString(ELEMENT_NAME, frame.getName());
-			}
-		} else if (element instanceof IVariable) {
-			memento.putString(ELEMENT_NAME, ((IVariable) element).getName());
-		} else if (element instanceof IRegisterGroup) {
-			memento.putString(ELEMENT_NAME, ((IRegisterGroup) element).getName());
-		} else {
-			return false;
-		}
-		return true;
-	}
-
-	protected boolean isEqual(Object element, IMemento memento, IPresentationContext context) throws CoreException {
-		String mementoName = memento.getString(ELEMENT_NAME);
-		if (mementoName != null) {
-			String elementName = null;
-			if (element instanceof IStackFrame) {
-				IStackFrame frame = (IStackFrame) element;
-				if (IDebugUIConstants.ID_REGISTER_VIEW.equals(context.getId())) {
-					// for registers view attempt to maintain expansion for target rather than each frame
-					elementName = frame.getModelIdentifier();
-				} else {
-					elementName = frame.getName();
-				}
-			} else if (element instanceof IVariable) {
-				elementName = ((IVariable)element).getName();
-			} else if (element instanceof IRegisterGroup) {
-				elementName = ((IRegisterGroup)element).getName();
-			}
-			if (elementName != null) {
-				return elementName.equals(mementoName);
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/BooleanFieldEditor2.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/BooleanFieldEditor2.java
deleted file mode 100644
index 91e4342..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/BooleanFieldEditor2.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.debug.internal.ui.preferences;
-
- 
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A boolean field editor that provides access to this editors boolean
- * button.
- */
-public class BooleanFieldEditor2 extends BooleanFieldEditor {
-	
-	private  Button fChangeControl;
-
-	/**
-	 * @see BooleanFieldEditor#BooleanFieldEditor(java.lang.String, java.lang.String, int, org.eclipse.swt.widgets.Composite)
-	 */
-	public BooleanFieldEditor2(
-		String name,
-		String labelText,
-		int style,
-		Composite parent) {
-		super(name, labelText, style, parent);
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.BooleanFieldEditor#getChangeControl(Composite)
-	 */
-	public Button getChangeControl(Composite parent) {
-		if (fChangeControl == null) {
-			fChangeControl = super.getChangeControl(parent);
-		} 
-		return fChangeControl;
-	}
-
-
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ConsolePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ConsolePreferencePage.java
deleted file mode 100644
index 5a4b725..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ConsolePreferencePage.java
+++ /dev/null
@@ -1,237 +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.debug.internal.ui.preferences;
-
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.util.PropertyChangeEvent;
-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.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A page to set the preferences for the console
- */
-public class ConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-	
-	/**
-	 * This class exists to provide visibility to the
-	 * <code>refreshValidState</code> method and to perform more intelligent
-	 * clearing of the error message.
-	 */
-	protected class ConsoleIntegerFieldEditor extends IntegerFieldEditor {						
-		
-		public ConsoleIntegerFieldEditor(String name, String labelText, Composite parent) {
-			super(name, labelText, parent);
-		}
-		
-		/**
-		 * @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
-		 */
-		protected void refreshValidState() {
-			super.refreshValidState();
-		}
-		
-		/**
-		 * Clears the error message from the message line if the error
-		 * message is the error message from this field editor.
-		 */
-		protected void clearErrorMessage() {
-			if (canClearErrorMessage()) {
-				super.clearErrorMessage();
-			}
-		}
-	}
-	
-	private BooleanFieldEditor2 fWrapEditor = null;
-	private ConsoleIntegerFieldEditor fWidthEditor = null;
-	
-	private BooleanFieldEditor2 fUseBufferSize = null;
-	private ConsoleIntegerFieldEditor fBufferSizeEditor = null;
-	
-	private ConsoleIntegerFieldEditor fTabSizeEditor = null;
-	
-	/**
-	 * Create the console page.
-	 */
-	public ConsolePreferencePage() {
-		super(GRID);
-		setDescription(DebugPreferencesMessages.ConsolePreferencePage_Console_settings); 
-		setPreferenceStore(DebugUIPlugin.getDefault().getPreferenceStore());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-			getControl(),
-			IDebugHelpContextIds.CONSOLE_PREFERENCE_PAGE );
-	}
-	
-	/**
-	 * Create all field editors for this page
-	 */
-	public void createFieldEditors() {
-		
-		fWrapEditor = new BooleanFieldEditor2(IDebugPreferenceConstants.CONSOLE_WRAP, DebugPreferencesMessages.ConsolePreferencePage_Wrap_text_1, SWT.NONE, getFieldEditorParent()); 
-		addField(fWrapEditor);
-		
-		fWidthEditor = new ConsoleIntegerFieldEditor(IDebugPreferenceConstants.CONSOLE_WIDTH, DebugPreferencesMessages.ConsolePreferencePage_Console_width, getFieldEditorParent()); 
-		addField(fWidthEditor);
-		fWidthEditor.setValidRange(80, 1000);
-		fWidthEditor.setErrorMessage(DebugPreferencesMessages.ConsolePreferencePage_console_width); 
-		
-		fWrapEditor.getChangeControl(getFieldEditorParent()).addSelectionListener(
-			new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					updateWidthEditor();
-				}
-			}
-		);
-		
-		fUseBufferSize = new BooleanFieldEditor2(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT, DebugPreferencesMessages.ConsolePreferencePage_Limit_console_output_1, SWT.NONE, getFieldEditorParent()); 
-		addField(fUseBufferSize);
-		
-		fBufferSizeEditor = new ConsoleIntegerFieldEditor(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK, DebugPreferencesMessages.ConsolePreferencePage_Console_buffer_size__characters___2, getFieldEditorParent()); 
-		addField(fBufferSizeEditor);
-		fBufferSizeEditor.setValidRange(1000, 1000000);
-		fBufferSizeEditor.setErrorMessage(DebugPreferencesMessages.ConsolePreferencePage_The_console_buffer_size_must_be_at_least_1000_characters__1); 
-		
-		fUseBufferSize.getChangeControl(getFieldEditorParent()).addSelectionListener(
-			new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					updateBufferSizeEditor();
-				}
-			}
-		);
-		
-		fTabSizeEditor = new ConsoleIntegerFieldEditor(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH, DebugPreferencesMessages.ConsolePreferencePage_12, getFieldEditorParent()); 
-		addField(fTabSizeEditor);
-		fTabSizeEditor.setValidRange(1,100);
-		fTabSizeEditor.setErrorMessage(DebugPreferencesMessages.ConsolePreferencePage_13); 
-		
-		addField(new BooleanFieldEditor(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT, DebugPreferencesMessages.ConsolePreferencePage_Show__Console_View_when_there_is_program_output_3, SWT.NONE, getFieldEditorParent())); 
-		addField(new BooleanFieldEditor(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR, DebugPreferencesMessages.ConsolePreferencePage_Show__Console_View_when_there_is_program_error_3, SWT.NONE, getFieldEditorParent())); 
-
-		ColorFieldEditor sysout= new ColorFieldEditor(IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR, DebugPreferencesMessages.ConsolePreferencePage_Standard_Out__2, getFieldEditorParent()); 
-		ColorFieldEditor syserr= new ColorFieldEditor(IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR, DebugPreferencesMessages.ConsolePreferencePage_Standard_Error__3, getFieldEditorParent()); 
-		ColorFieldEditor sysin= new ColorFieldEditor(IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR, DebugPreferencesMessages.ConsolePreferencePage_Standard_In__4, getFieldEditorParent());
-		ColorFieldEditor background= new ColorFieldEditor(IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR, DebugPreferencesMessages.ConsolePreferencePage_11, getFieldEditorParent());
-		
-		addField(sysout);
-		addField(syserr);
-		addField(sysin);
-		addField(background);
-	}
-	
-	/**
-	 * @see IWorkbenchPreferencePage#init(IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		boolean ok= super.performOk();
-		// update high water mark to be (about) 100 lines (100 * 80 chars) greater than low water mark
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-		int low = store.getInt(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK);
-		int high = low + 8000;
-		store.setValue(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK, high);
-		return ok;
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#initialize()
-	 */
-	protected void initialize() {
-		super.initialize();
-		updateWidthEditor();
-		updateBufferSizeEditor();
-	}
-	
-	/**
-	 * Update enablement of width editor based on enablement of 'fixed width' editor.
-	 */
-	protected void updateWidthEditor() {
-		Button b = fWrapEditor.getChangeControl(getFieldEditorParent());
-		fWidthEditor.getTextControl(getFieldEditorParent()).setEnabled(b.getSelection());
-		fWidthEditor.getLabelControl(getFieldEditorParent()).setEnabled(b.getSelection());				
-	}
-
-	/**
-	 * Update enablement of buffer size editor based on enablement of 'limit
-	 * console output' editor.
-	 */
-	protected void updateBufferSizeEditor() {
-		Button b = fUseBufferSize.getChangeControl(getFieldEditorParent());
-		fBufferSizeEditor.getTextControl(getFieldEditorParent()).setEnabled(b.getSelection());
-		fBufferSizeEditor.getLabelControl(getFieldEditorParent()).setEnabled(b.getSelection());
-	}
-	
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		updateWidthEditor();
-		updateBufferSizeEditor();
-	}
-	
-	protected boolean canClearErrorMessage() {
-		if (fWidthEditor.isValid() && fBufferSizeEditor.isValid()) {
-			return true;
-		}
-		return false;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-
-		if (event.getProperty().equals(FieldEditor.IS_VALID)) {
-			boolean newValue = ((Boolean) event.getNewValue()).booleanValue();
-			// If the new value is true then we must check all field editors.
-			// If it is false, then the page is invalid in any case.
-			if (newValue) {
-				if (fWidthEditor != null && event.getSource() != fWidthEditor) {
-					fWidthEditor.refreshValidState();
-				} 
-				if (fBufferSizeEditor != null && event.getSource() != fBufferSizeEditor) {
-					fBufferSizeEditor.refreshValidState();
-				}
-				checkState();
-			} else {
-				super.propertyChange(event);
-			}
-
-		} else {
-			super.propertyChange(event);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencePage.java
deleted file mode 100644
index f7f96d5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencePage.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.preferences;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The page for setting debugger preferences.  Built on the 'field editor' infrastructure.
- */
-public class DebugPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IDebugPreferenceConstants {
-	
-	public DebugPreferencePage() {
-		super(GRID);
-
-		IPreferenceStore store= DebugUIPlugin.getDefault().getPreferenceStore();
-		setPreferenceStore(store);
-		setDescription(DebugPreferencesMessages.DebugPreferencePage_1); 
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.DEBUG_PREFERENCE_PAGE);
-	}
-	
-	/**
-	 * @see FieldEditorPreferencePage#createFieldEditors
-	 */
-	protected void createFieldEditors() {
-		addField(new BooleanFieldEditor(IDebugUIConstants.PREF_REUSE_EDITOR, DebugPreferencesMessages.DebugPreferencePage_2, SWT.NONE, getFieldEditorParent())); 
-		
-		SWTFactory.createHorizontalSpacer(getFieldEditorParent(), 2);
-		
-		addField(new BooleanFieldEditor(IDebugUIConstants.PREF_ACTIVATE_WORKBENCH, DebugPreferencesMessages.DebugPreferencePage_3, SWT.NONE, getFieldEditorParent())); 
-		addField(new BooleanFieldEditor(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, DebugPreferencesMessages.DebugPreferencePage_26, SWT.NONE, getFieldEditorParent())); 
-
-		SWTFactory.createHorizontalSpacer(getFieldEditorParent(), 2);
-		
-		addField(new BooleanFieldEditor(IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE, DebugPreferencesMessages.DebugPreferencePage_25, SWT.NONE, getFieldEditorParent()));
-		addField(new BooleanFieldEditor(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_ALL_BREAKPOINTS, DebugPreferencesMessages.DebugPreferencePage_29, SWT.NONE, getFieldEditorParent()));
-		addField(new BooleanFieldEditor(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, DebugPreferencesMessages.DebugPreferencePage_30, SWT.NONE, getFieldEditorParent()));
-		
-		SWTFactory.createHorizontalSpacer(getFieldEditorParent(), 2);
-		ColorFieldEditor mem= new ColorFieldEditor(IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR, DebugPreferencesMessages.DebugPreferencePage_4, getFieldEditorParent()); 
-		addField(mem);
-		mem = new ColorFieldEditor(IInternalDebugUIConstants.PREF_CHANGED_VALUE_BACKGROUND, DebugPreferencesMessages.DebugPreferencePage_28, getFieldEditorParent());
-		addField(mem);
-		mem= new ColorFieldEditor(IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR, DebugPreferencesMessages.DebugPreferencePage_0, getFieldEditorParent()); 
-		addField(mem);
-		mem= new ColorFieldEditor(IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR, DebugPreferencesMessages.DebugPreferencePage_27, getFieldEditorParent()); 
-		addField(mem);
-	}
-
-	/**
-	 * @see IWorkbenchPreferencePage#init(IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {}
-				
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.java
deleted file mode 100644
index 8cbed24..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-public class DebugPreferencesMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.preferences.DebugPreferencesMessages";//$NON-NLS-1$
-
-	public static String ConsolePreferencePage_11;
-
-	public static String ConsolePreferencePage_Console_settings;
-	public static String ConsolePreferencePage_Show__Console_View_when_there_is_program_error_3;
-	public static String ConsolePreferencePage_Show__Console_View_when_there_is_program_output_3;
-	public static String ConsolePreferencePage_Standard_Error__3;
-	public static String ConsolePreferencePage_Standard_In__4;
-	public static String ConsolePreferencePage_Standard_Out__2;
-	public static String ConsolePreferencePage_Wrap_text_1;
-	public static String ConsolePreferencePage_Console_width;
-	public static String ConsolePreferencePage_Limit_console_output_1;
-	public static String ConsolePreferencePage_Console_buffer_size__characters___2;
-	public static String ConsolePreferencePage_The_console_buffer_size_must_be_at_least_1000_characters__1;
-	public static String ConsolePreferencePage_console_width;
-	public static String ConsolePreferencePage_12;
-	public static String ConsolePreferencePage_13;
-
-	public static String DebugPreferencePage_1;
-	public static String DebugPreferencePage_2;
-
-	public static String DebugPreferencePage_29;
-	public static String DebugPreferencePage_3;
-	public static String DebugPreferencePage_0;
-
-	public static String DebugPreferencePage_30;
-	public static String DebugPreferencePage_4;
-	public static String DebugPreferencePage_10;
-	public static String DebugPreferencePage_11;
-	public static String DebugPreferencePage_21;
-	public static String DebugPreferencePage_22;
-	public static String DebugPreferencePage_23;
-	public static String DebugPreferencePage_24;
-	public static String DebugPreferencePage_25;
-	public static String DebugPreferencePage_26;
-	public static String DebugPreferencePage_27;
-
-	public static String DefaultLaunchConfigurationsPropertiesPage_0;
-
-	public static String DefaultLaunchConfigurationsPropertiesPage_1;
-	public static String DefaultLaunchConfigurationsPropertiesPage_11;
-	public static String DefaultLaunchConfigurationsPropertiesPage_12;
-	public static String DefaultLaunchConfigurationsPropertiesPage_2;
-	public static String DefaultLaunchConfigurationsPropertiesPage_3;
-	public static String DefaultLaunchConfigurationsPropertiesPage_4;
-	public static String DefaultLaunchConfigurationsPropertiesPage_5;
-	public static String DefaultLaunchConfigurationsPropertiesPage_6;
-	public static String DefaultLaunchConfigurationsPropertiesPage_7;
-	public static String DefaultLaunchConfigurationsPropertiesPage_8;
-	public static String DefaultLaunchConfigurationsPropertiesPage_9;
-
-	public static String LaunchDelegatesPreferencePage_0;
-
-	public static String LaunchDelegatesPreferencePage_1;
-	public static String LaunchDelegatesPreferencePage_2;
-	public static String LaunchDelegatesPreferencePage_3;
-
-	public static String LaunchDelegatesPreferencePage_4;
-
-	public static String LaunchersPreferencePage_0;
-
-	public static String LaunchingPreferencePage_40;
-	public static String LaunchingPreferencePage_1;
-	public static String LaunchingPreferencePage_2;
-	public static String LaunchingPreferencePage_3;
-	public static String LaunchingPreferencePage_37;
-	public static String LaunchingPreferencePage_38;
-	public static String LaunchingPreferencePage_39;
-	public static String LaunchingPreferencePage_4;
-
-	public static String LaunchingPreferencePage_41;
-	public static String LaunchingPreferencePage_5;
-	public static String LaunchingPreferencePage_6;
-	public static String LaunchingPreferencePage_7;
-	public static String LaunchingPreferencePage_8;
-	public static String LaunchingPreferencePage_9;
-	public static String LaunchingPreferencePage_10;
-	public static String LaunchingPreferencePage_11;
-	public static String LaunchingPreferencePage_12;
-	public static String LaunchingPreferencePage_13;
-	public static String LaunchingPreferencePage_14;
-	public static String LaunchingPreferencePage_15;
-	public static String LaunchingPreferencePage_16;
-	public static String LaunchingPreferencePage_17;
-	public static String LaunchingPreferencePage_18;
-	public static String LaunchingPreferencePage_21;
-	public static String LaunchingPreferencePage_22;
-	public static String LaunchingPreferencePage_23;
-	public static String LaunchingPreferencePage_26;
-	public static String LaunchingPreferencePage_27;
-	public static String LaunchingPreferencePage_0;
-	public static String LaunchingPreferencePage_28;
-	public static String LaunchingPreferencePage_29;
-	public static String LaunchingPreferencePage_30;
-	public static String LaunchingPreferencePage_31;
-	public static String LaunchingPreferencePage_32;
-	public static String LaunchingPreferencePage_33;
-	public static String LaunchingPreferencePage_34;
-	public static String LaunchingPreferencePage_35;
-	public static String LaunchingPreferencePage_36;
-
-	public static String LaunchPerspectivePreferencePage_0;
-
-	public static String LaunchPerspectivePreferencePage_1;
-	
-	public static String PerspectivePreferencePage_0;
-	public static String PerspectivePreferencePage_1;
-	public static String PerspectivePreferencePage_2;
-	public static String PerspectivePreferencePage_4;
-	public static String PerspectivePreferencePage_5;
-	
-	public static String LaunchConfigurationsPreferencePage_1;
-	public static String LaunchConfigurationsPreferencePage_0;
-	
-	public static String ProcessPropertyPage_Command_Line__1;
-
-	public static String SimpleVariablePreferencePage_3;
-	public static String SimpleVariablePreferencePage_4;
-	public static String SimpleVariablePreferencePage_5;
-	public static String SimpleVariablePreferencePage_6;
-	public static String SimpleVariablePreferencePage_7;
-	public static String SimpleVariablePreferencePage_8;
-	public static String SimpleVariablePreferencePage_9;
-	public static String SimpleVariablePreferencePage_10;
-	public static String SimpleVariablePreferencePage_11;
-	public static String SimpleVariablePreferencePage_12;
-	public static String SimpleVariablePreferencePage_13;
-	public static String SimpleVariablePreferencePage_14;
-	public static String SimpleVariablePreferencePage_15;
-	public static String SimpleVariablePreferencePage_16;
-	public static String SimpleLaunchVariablePreferencePage_21;
-	public static String SimpleLaunchVariablePreferencePage_22;
-	public static String SimpleLaunchVariablePreferencePage_23;
-
-	public static String StringVariablePreferencePage_20;
-	public static String StringVariablePreferencePage_21;
-	public static String StringVariablePreferencePage_22;
-	public static String StringVariablePreferencePage_23;
-	public static String StringVariablePreferencePage_24;
-	public static String StringVariablePreferencePage_25;
-	public static String StringVariablePreferencePage_26;
-	public static String StringVariablePreferencePage_27;
-	
-	public static String ViewManagementPreferencePage_0;
-	public static String ViewManagementPreferencePage_1;
-	public static String ViewManagementPreferencePage_2;
-	public static String ViewManagementPreferencePage_3;
-	public static String ViewManagementPreferencePage_4;
-	public static String ViewManagementPreferencePage_5;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, DebugPreferencesMessages.class);
-	}
-
-	public static String LaunchConfigurationsPreferencePage_2;
-
-	public static String LaunchConfigurationsPreferencePage_3;
-
-	public static String ProcessPropertyPage_0;
-
-	public static String ProcessPropertyPage_1;
-
-	public static String ProcessPropertyPage_2;
-
-	public static String ProcessPropertyPage_3;
-
-	public static String ProcessPropertyPage_4;
-
-	public static String ProcessPropertyPage_5;
-
-	public static String DebugPreferencePage_28;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties
deleted file mode 100644
index 15cb838..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties
+++ /dev/null
@@ -1,152 +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
-###############################################################################
-
-ConsolePreferencePage_Console_settings=Debug Console Settings.
-ConsolePreferencePage_Show__Console_View_when_there_is_program_error_3=Show when &program writes to standard error
-ConsolePreferencePage_Show__Console_View_when_there_is_program_output_3=&Show when program writes to standard out
-ConsolePreferencePage_Standard_Error__3=Standard &Error text color:
-ConsolePreferencePage_Standard_In__4=Standard &In text color:
-ConsolePreferencePage_Standard_Out__2=Standard &Out text color:
-ConsolePreferencePage_Wrap_text_1=Fixed &width console
-ConsolePreferencePage_Console_width=&Maximum character width:
-ConsolePreferencePage_Limit_console_output_1=&Limit console output
-ConsolePreferencePage_Console_buffer_size__characters___2=Console &buffer size (characters):
-ConsolePreferencePage_The_console_buffer_size_must_be_at_least_1000_characters__1=Buffer size must be between 1000 and 1000000 inclusive.
-ConsolePreferencePage_console_width=Character width must be between 80 and 1000 inclusive.
-ConsolePreferencePage_12=Displayed &tab width:
-ConsolePreferencePage_13=Tab width must be between 1 and 100 inclusive.
-ConsolePreferencePage_11=Back&ground color:
-
-DebugPreferencePage_1=General Settings for Running and Debugging.
-DebugPreferencePage_2=Re&use editor when displaying source code
-DebugPreferencePage_3=Activate the workbenc&h when a breakpoint is hit
-DebugPreferencePage_0=&Memory unbuffered color:
-DebugPreferencePage_4=&Changed value color:
-DebugPreferencePage_10=Si&ze of recently launched applications list:
-DebugPreferencePage_11=The size of recently launched applications should be between {0} and {1}
-DebugPreferencePage_21=Open the associated perspective when an application suspends
-DebugPreferencePage_22=A&lways
-DebugPreferencePage_23=&Never
-DebugPreferencePage_24=&Prompt
-DebugPreferencePage_25=Skip &breakpoints during a 'Run to Line' operation.
-DebugPreferencePage_26=A&ctivate the debug view when a breakpoint is hit
-DebugPreferencePage_27=Memor&y buffered color:
-DebugPreferencePage_28=Changed value bac&kground color:
-DebugPreferencePage_29=&Prompt for confirmation when deleting all breakpoints.
-DebugPreferencePage_30=Prompt for confirmation when deleting breakpoint con&tainers.
-
-LaunchingPreferencePage_1=&Build (if required) before launching
-LaunchingPreferencePage_2=Save required dirty editors before launching
-LaunchingPreferencePage_3=Alwa&ys
-LaunchingPreferencePage_4=&Never
-LaunchingPreferencePage_5=&Prompt
-LaunchingPreferencePage_6=Wait for ongoing build to complete before launching
-LaunchingPreferencePage_7=A&lways
-LaunchingPreferencePage_8=N&ever
-LaunchingPreferencePage_9=Pro&mpt
-LaunchingPreferencePage_0=Select the launch configurations to &migrate:
-LaunchersPreferencePage_0=Currently there are no conflicting launchers.
-LaunchingPreferencePage_10=Remove term&inated launches when a new launch is created
-LaunchingPreferencePage_11=Open the associated perspective when launching
-LaunchingPreferencePage_12=Al&ways
-LaunchingPreferencePage_13=Ne&ver
-LaunchingPreferencePage_14=Pr&ompt
-LaunchingPreferencePage_15=Launch in debug mode when workspace contains breakpoints
-LaunchingPreferencePage_16=Alway&s
-LaunchingPreferencePage_17=Neve&r
-LaunchingPreferencePage_18=Promp&t
-LaunchingPreferencePage_21=Continue launch if project contains errors
-LaunchingPreferencePage_22=Al&ways
-LaunchingPreferencePage_23=Pr&ompt
-LaunchingPreferencePage_26=Search for, select, and upgrade launch configurations to be compatible with current tooling.
-LaunchingPreferencePage_27=Mi&grate...
-LaunchingPreferencePage_28=Select Launch Configurations
-LaunchingPreferencePage_29=No Candidates
-LaunchingPreferencePage_30=None of the available launch configurations require migration.
-LaunchingPreferencePage_31=Migrating launch configurations...
-LaunchingPreferencePage_32=Launch Configuration Filters
-LaunchingPreferencePage_33=&Filter configurations in closed projects
-LaunchingPreferencePage_34=Filter configurations in dele&ted or missing projects
-LaunchingPreferencePage_35=Migration
-LaunchingPreferencePage_36=General Options
-LaunchingPreferencePage_37=Always launch the previously launched appli&cation
-LaunchingPreferencePage_38=Launch t&he selected resource or active editor. If not launchable:
-LaunchingPreferencePage_39=Launch the associated pro&ject
-LaunchingPreferencePage_40=Launch Operation
-LaunchingPreferencePage_41=La&unch the previously launched application
-
-ProcessPropertyPage_Command_Line__1=Co&mmand Line:
-ProcessPropertyPage_0=Run-&at time:
-ProcessPropertyPage_1=&Path:
-ProcessPropertyPage_2=Process properties
-ProcessPropertyPage_3=No path information available
-ProcessPropertyPage_4=No time information available
-ProcessPropertyPage_5=No command line information provided
-
-SimpleVariablePreferencePage_3=Variable
-SimpleVariablePreferencePage_4=Value
-SimpleVariablePreferencePage_5=Description
-SimpleVariablePreferencePage_6=&Create and configure string substitution variables.
-SimpleVariablePreferencePage_7=&New...
-SimpleVariablePreferencePage_8=&Edit...
-SimpleVariablePreferencePage_9=&Remove
-SimpleVariablePreferencePage_10=&Name:
-SimpleVariablePreferencePage_11=&Value:
-SimpleVariablePreferencePage_12=&Description:
-SimpleVariablePreferencePage_13=New String Substitution Variable
-SimpleVariablePreferencePage_14=Edit Variable: {0}
-SimpleVariablePreferencePage_15=Overwrite variable?
-SimpleVariablePreferencePage_16=A variable named {0} already exists. Overwrite?
-SimpleLaunchVariablePreferencePage_21=Remove Contributed Variables
-SimpleLaunchVariablePreferencePage_22=The following variables were contributed by plug-ins. Removing them may cause unknown problems.\n{0}\nProceed?
-SimpleLaunchVariablePreferencePage_23=\ [contributed]
-StringVariablePreferencePage_24=Error
-StringVariablePreferencePage_25=Unable to save changes
-StringVariablePreferencePage_26=\ [read only]
-StringVariablePreferencePage_27=Contributed By
-StringVariablePreferencePage_23=Cannot overwrite read only variable
-StringVariablePreferencePage_22=A read only variable named {0} already exists.  Read only variables can not be overwritten.
-StringVariablePreferencePage_21=Problem creating variable
-StringVariablePreferencePage_20=Variables cannot have an empty name.
-ViewManagementPreferencePage_0=The Debug View can automatically open and close views based on selection. Choose in which perspectives this feature should be enabled:
-ViewManagementPreferencePage_1=View Management
-ViewManagementPreferencePage_2=&Perspectives:
-ViewManagementPreferencePage_3=Do &not automatically open/close views which have been manually closed/opened.
-ViewManagementPreferencePage_4=The list of views that have been manually opened/closed is persisted between sessions.
-ViewManagementPreferencePage_5=&Reset
-PerspectivePreferencePage_0=These settings control perspectives for running and debugging. A perspective can automatically open when launching or when an application suspends.
-PerspectivePreferencePage_1=Appli&cation Types/Launchers:
-PerspectivePreferencePage_2=Modes/Perspec&tives:
-PerspectivePreferencePage_4=None
-PerspectivePreferencePage_5=These settings assign perspectives to each application type or launcher and launch mode set. Select "None" to indicate that a perspective should not be opened.
-LaunchConfigurationsPreferencePage_0=Filter checked launch configuration type&s:
-LaunchConfigurationsPreferencePage_1=Launch Configurations
-LaunchConfigurationsPreferencePage_2=Delete &configurations when associated resource is deleted
-LaunchConfigurationsPreferencePage_3=Apply window &working set(s)
-LaunchDelegatesPreferencePage_1=The settings on this page specify which launcher to use when multiple launchers are available for a configuration and launch mode.
-LaunchDelegatesPreferencePage_2=Launch &Type/Mode:
-LaunchDelegatesPreferencePage_3=P&referred Launcher:
-LaunchDelegatesPreferencePage_0=Default Launcher
-LaunchDelegatesPreferencePage_4=Launcher Description
-LaunchPerspectivePreferencePage_0=There is no perspective information available to change.
-LaunchPerspectivePreferencePage_1=The selected types/launchers do not have any common mode sets.
-DefaultLaunchConfigurationsPropertiesPage_0=This page allows you to manage launch configurations associated with the currently selected resource.
-DefaultLaunchConfigurationsPropertiesPage_1=Launch con&figurations for ''{0}'':
-DefaultLaunchConfigurationsPropertiesPage_2=&New...
-DefaultLaunchConfigurationsPropertiesPage_3=Create new launch configuration
-DefaultLaunchConfigurationsPropertiesPage_4=Du&plicate
-DefaultLaunchConfigurationsPropertiesPage_5=Duplicate selected launch configuration
-DefaultLaunchConfigurationsPropertiesPage_6=&Edit...
-DefaultLaunchConfigurationsPropertiesPage_7=Edit selected launch configuration
-DefaultLaunchConfigurationsPropertiesPage_8=De&lete
-DefaultLaunchConfigurationsPropertiesPage_9=Delete selected launch configuration
-DefaultLaunchConfigurationsPropertiesPage_11=Select Configuration Type
-DefaultLaunchConfigurationsPropertiesPage_12=&Select the type of configuration to create:
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/IDebugPreferenceConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/IDebugPreferenceConstants.java
deleted file mode 100644
index c65679c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/IDebugPreferenceConstants.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.preferences;
-
-
-import org.eclipse.debug.ui.IDebugUIConstants;
- 
-/**
- * Constants defining the keys to be used for accessing preferences
- * inside the debug ui plugin's preference bundle.
- *
- * In descriptions (of the keys) below describe the preference 
- * stored at the given key. The type indicates type of the stored preferences
- *
- * The preference store is loaded by the plugin (DebugUIPlugin).
- * @see DebugUIPlugin.initializeDefaultPreferences(IPreferenceStore) - for initialization of the store
- */
-public interface IDebugPreferenceConstants {
-
-	/**
-	 * The symbolic names for colors for displaying the content in the Console
-	 * @see org.eclipse.jface.resource.ColorRegistry
-	 */
-	public static final String CONSOLE_SYS_ERR_COLOR= "org.eclipse.debug.ui.errorColor"; //$NON-NLS-1$
-	public static final String CONSOLE_SYS_OUT_COLOR= "org.eclipse.debug.ui.outColor"; //$NON-NLS-1$
-	public static final String CONSOLE_SYS_IN_COLOR= "org.eclipse.debug.ui.inColor"; //$NON-NLS-1$
-	public static final String CONSOLE_BAKGROUND_COLOR= "org.eclipse.debug.ui.consoleBackground"; //$NON-NLS-1$
-	
-	/**
-	 * @deprecated use IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR instead
-	 */
-	public static final String MEMORY_VIEW_UNBUFFERED_LINE_COLOR = IDebugUIConstants.PLUGIN_ID + ".MemoryViewLineColor"; //$NON-NLS-1$
-	
-	/**
-	 * @deprecated use IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR instead
-	 */
-	public static final String MEMORY_VIEW_BUFFERED_LINE_COLOR = IDebugUIConstants.PLUGIN_ID + ".MemoryViewBufferedLineColor"; //$NON-NLS-1$
-	
-	/**
-	 * (boolean) Whether or not the text in the console will wrap
-	 */
-	public static final String CONSOLE_WRAP= "Console.wrap"; //$NON-NLS-1$
-	
-	/**
-	 * (int) The maximum console character width, if wrapping. 
-	 */ 
-	public static final String CONSOLE_WIDTH = "Console.width"; //$NON-NLS-1$
-	
-	/**
-	 * (boolean) Whether or not the console view is shown 
-	 * when there is program output.
-  	 */
-	public static final String CONSOLE_OPEN_ON_OUT= "DEBUG.consoleOpenOnOut"; //$NON-NLS-1$
-	/**
-	 * (boolean) Whether or not the console view is shown 
-	 * when there is program error.
-  	 */
-	public static final String CONSOLE_OPEN_ON_ERR= "DEBUG.consoleOpenOnErr"; //$NON-NLS-1$
-	
-	/**
-	 * Console buffer high and low water marks
-	 */
-	public static final String CONSOLE_LIMIT_CONSOLE_OUTPUT = "Console.limitConsoleOutput"; //$NON-NLS-1$
-	public static final String CONSOLE_LOW_WATER_MARK = "Console.lowWaterMark"; //$NON-NLS-1$ 
-	public static final String CONSOLE_HIGH_WATER_MARK = "Console.highWaterMark"; //$NON-NLS-1$
-	
-	/**
-	 * Integer preference specifying the number of spaces composing a
-	 * tab in the console.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String CONSOLE_TAB_WIDTH= "Console.console_tab_width"; //$NON-NLS-1$
-	
-	
-	
-	/**
-	 * The orientation of the detail view in the VariablesView
-	 */
-	public static final String VARIABLES_DETAIL_PANE_ORIENTATION = "Variables.detail.orientation"; //$NON-NLS-1$
-	public static final String EXPRESSIONS_DETAIL_PANE_ORIENTATION = "Expressions.detail.orientation"; //$NON-NLS-1$
-	public static final String REGISTERS_DETAIL_PANE_ORIENTATION = "Registers.detail.orientation"; //$NON-NLS-1$
-	public static final String VARIABLES_DETAIL_PANE_RIGHT = "Variables.detail.orientation.right"; //$NON-NLS-1$
-	public static final String VARIABLES_DETAIL_PANE_UNDERNEATH = "Variables.detail.orientation.underneath"; //$NON-NLS-1$
-	public static final String VARIABLES_DETAIL_PANE_HIDDEN = "Variables.detail.orientation.hidden"; //$NON-NLS-1$
-	
-	/**
-	 * Memento for the last selected launch config in the
-	 * launch config dialog.
-	 * 
-	 * @deprecated no longer supported
-	 */
-	public static final String PREF_LAST_LAUNCH_CONFIGURATION_SELECTION = IDebugUIConstants.PLUGIN_ID + ".lastLaunchConfigSelection"; //$NON-NLS-1$
-		
-	/**
-	 * The maximum size of the launch history list
-	 */
-	public static int MAX_LAUNCH_HISTORY_SIZE= 40;
-
-	/**
-	 * Boolean preference controlling whether the text in the detail panes is
-	 * wrapped. When <code>true</code> the text in the detail panes will be
-	 * wrapped in new variable view.
-	 *
-	 * @since 2.1
-	 */
-	public static final String PREF_DETAIL_PANE_WORD_WRAP = IDebugUIConstants.PLUGIN_ID + ".detail_pane_word_wrap"; //$NON-NLS-1$
-	
-	/**
-	 * Column size preference for the Memory View
-	 * 
-	 * @since 3.0
-	 */
-	public static final String PREF_COLUMN_SIZE = "org.eclipse.debug.ui.memory.columnSize"; //$NON-NLS-1$
-	
-	/**
-	 * Default column size for the Memory View
-	 * 
-	 * @since 3.0
-	 */
-	public static final int PREF_COLUMN_SIZE_DEFAULT = 4;
-	
-	
-	/**
-	 * Row size preference for Memory View
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_ROW_SIZE = "org.eclipse.debug.ui.memory.rowSize"; //$NON-NLS-1$
-	
-	/**
-	 * Default row size for the Memory View
-	 * 
-	 * @since 3.2
-	 */
-	public static final int PREF_ROW_SIZE_DEFAULT = 16;
-	
-	/**
-	 * Stores the boolean preference of whether to prompt when removing all breakpoints.
-	 * @since 3.3
-	 */
-	public static final String PREF_PROMPT_REMOVE_ALL_BREAKPOINTS = IDebugUIConstants.PLUGIN_ID + ".remove_all_breakpoints_prompt"; //$NON-NLS-1$
-		
-	/**
-	 * stroes the boolean preference of whether or not to promtp wehen removing all of the breakpopints form a breakpoints
-	 * container.
-	 * @since 3.3 
-	 */
-	public static final String PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER = IDebugUIConstants.PLUGIN_ID + ".remove_breakpoints_from_container_prompt"; //$NON-NLS-1$
-	
-	/**
-	 * Default padded string for renderings
-	 * 
-	 * @since 3.1
-	 */
-	public static final String PREF_PADDED_STR_DEFAULT = "??"; //$NON-NLS-1$
-	
-	/**
-	 * Default ASCII code page if ASCII code page preference is not set.
-	 * @since 3.1
-	 */
-	public static final String DEFAULT_ASCII_CP = "CP1252"; //$NON-NLS-1$
-	
-	
-	/**
-	 * Default EBCDIC code page if EBCDIC code page preference is not set.
-	 * @since 3.1
-	 */
-	public static final String DEFAULT_EBCDIC_CP = "CP037"; //$NON-NLS-1$
-	
-	/**
-	 * Preference to determine if table rendering should dynamically load
-	 * memory as the user scrolls
-	 * 
-	 * @since 3.1
-	 */
-	public static final String PREF_DYNAMIC_LOAD_MEM = "org.eclpise.debug.ui.memory.dynamicLoad"; //$NON-NLS-1$
-	
-	
-	/**
-	 * Size of buffer in a table rendering when dynamic loading mode is off.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String PREF_TABLE_RENDERING_PAGE_SIZE = "org.eclispe.debug.ui.memory.pageSize"; //$NON-NLS-1$
-	
-	/**
-	 * Default page size when dynamic loading mode is off.  This preference is stored
-	 * in number of lines.
-	 * 
-	 * @since 3.1
-	 */
-	public static final int DEFAULT_PAGE_SIZE = 20;
-	/**
-	 * Preference for defining behavior when resetting a memory monitor.
-	 * Possible values:
-	 * - RESET_AL - reset all renderings regardless if they are visible or not
-	 * - RESET_VISIBLE - reset visible renderings
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_RESET_MEMORY_BLOCK = IDebugUIConstants.PLUGIN_ID + ".reset_memory_block"; //$NON-NLS-1$
-	
-	/**
-	 * Constant to indicate that the memory view will reset all memory renderings when the reset
-	 * memory monitor action is invoked.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String RESET_ALL = IDebugUIConstants.PLUGIN_ID + "resetMemoryBlock.all"; //$NON-NLS-1$
-	
-	
-	/**
-	 * Constant to indicate that the memory view will reset visible memory renderings when
-	 * the reset memory monitor action is invoked
-	 * 
-	 * @since 3.2
-	 */
-	public static final String RESET_VISIBLE = IDebugUIConstants.PLUGIN_ID + "resetMemoryBlock.visible"; //$NON-NLS-1$
-	
-	/**
-	 * Preference identifier for the row size in a table rendering.
-	 * This preference is expected to be saved by an </code>IPersistableDebugElement</code>.  
-	 * Memory Blocks can optionally provide and save this preference to customize
-	 * the initial format of a table rendering.
-	 * 
-	 * The value of this property is an Integer.  The value can be one of the
-	 * following values:  1, 2, 4, 8, 16.  This value must be greater than 
-	 * <code>PREF_COL_SIZE_BY_MODEL</code> and must also be divisible by <code>PREF_COL_SIZE_BY_MODEL</code>.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_ROW_SIZE_BY_MODEL = "org.eclipse.debug.ui.AbstractTableRendering.rowSize"; //$NON-NLS-1$
-	/**
-	 * Preference identifier for the column size in a table rendering.
-	 * This preference is expected to be saved by an <code>IPersistableDebugElement</code>.  
-	 * Memory Blocks can optionally provide and save this preference to customize
-	 * the initial format of a table rendering.
-	 * 
-	 * The value of this property is an Integer.  The value can be one of the
-	 * following values:  1, 2, 4, 8, 16.  This value must be smaller than
-	 * <code>PREF_ROW_SIZE_BY_MODEL</code>.  <code>PREF_ROW_SIZE_BY_MODEL</code> must be divisible by <code>PREF_COL_SIZE_BY_MODEL</code>.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_COL_SIZE_BY_MODEL = "org.eclipse.debug.ui.AbstractTableRendering.colSize"; //$NON-NLS-1$
-	
-	/**
-	 * Number of lines to preload before the visible region in the table rendering
-	 * 
-	 * @since 3.3
-	 */
-	public static final String PREF_TABLE_RENDERING_PRE_BUFFER_SIZE = "org.eclispe.debug.ui.memory.preBufferSize"; //$NON-NLS-1$
-	
-	/**
-	 * Number of lines to preload after the visible region in the table rendering
-	 * 
-	 * @since 3.3
-	 */
-	public static final String PREF_TABLE_RENDERING_POST_BUFFER_SIZE = "org.eclispe.debug.ui.memory.postBufferSize"; //$NON-NLS-1$
-
-}
-
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java
deleted file mode 100644
index 06a41c3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java
+++ /dev/null
@@ -1,412 +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.debug.internal.ui.preferences;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
-import org.eclipse.debug.internal.ui.launchConfigurations.MultiLaunchGroupFilter;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.wizard.ProgressMonitorPart;
-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.Control;
-import org.eclipse.swt.widgets.Group;
-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.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * Provides the Launch Configuration preference page to the Run/Debug preferences
- * 
- * This page allows users to set filtering options as well as perform migration tasks.
- * This class is not intended to be sub-classed 
- * @since 3.2
- */
-public class LaunchConfigurationsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	/**
-	 * Creates a dialog that allows users to select one or more projects to migrate.
-	 * @since 3.2
-	 */
-	class LaunchConfigurationMigrationSelectionDialog extends AbstractDebugCheckboxSelectionDialog {
-		
-		private Object fInput;
-		
-		public LaunchConfigurationMigrationSelectionDialog(Shell parentShell, Object input) {
-			super(parentShell);
-			fInput = input;
-			setShellStyle(getShellStyle() | SWT.RESIZE);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-		 */
-		protected String getDialogSettingsId() {
-			return IDebugUIConstants.PLUGIN_ID + ".MIGRATION_SELECTION_DIALOG"; //$NON-NLS-1$
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-		 */
-		protected String getHelpContextId() {
-			return IDebugHelpContextIds.SELECT_LAUNCH_CONFIGURATION_MIGRATION_DIALOG;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-		 */
-		protected Object getViewerInput() {
-			return fInput;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-		 */
-		protected String getViewerLabel() {
-			return DebugPreferencesMessages.LaunchingPreferencePage_0;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getContentProvider()
-		 */
-		protected IContentProvider getContentProvider() {
-			return new WorkbenchContentProvider();	
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getLabelProvider()
-		 */
-		protected IBaseLabelProvider getLabelProvider() {
-			return DebugUITools.newDebugModelPresentation();
-		}
-	}
-	
-	/**
-	 * Content provider for the launch configuration type table
-	 */
-	class TableContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return getLaunchConfigurationTypes();
-		}
-
-		public void dispose() {}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-	}
-	
-	/**
-	 * describes the debug launch group
-	 */
-	private static final String DEBUG_LAUNCH_GROUP = "org.eclipse.debug.ui.launchGroup.debug"; //$NON-NLS-1$
-	
-	/**
-	 * describes the external tools launch group
-	 */
-	private static final String EXT_BUILDER_GROUP = "org.eclipse.ui.externaltools.launchGroup"; //$NON-NLS-1$
-	
-	/**
-	 * to monitor the progress of the migration process
-	 */
-	private ProgressMonitorPart fMonitor;
-	
-	/**
-	 * the migrate now button
-	 */
-	private Button fMigrateNow;
-	
-	/**
-	 * a list of the field editors
-	 */
-	private List fFieldEditors;
-	
-	/**
-	 * Boolean editor for debug core plug-in preference
-	 */
-	private Button fDeleteConfigs;
-	
-	/**
-	 * The table for the launch configuration types
-	 */
-	private Table fTable;
-	
-	/**
-	 * Constructor
-	 */
-	public LaunchConfigurationsPreferencePage() {
-		super();
-		setPreferenceStore(DebugUIPlugin.getDefault().getPreferenceStore());
-		setTitle(DebugPreferencesMessages.LaunchConfigurationsPreferencePage_1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_PREFERENCE_PAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		fFieldEditors = new ArrayList();
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_HORIZONTAL);
-		//filtering options
-		Group group = SWTFactory.createGroup(comp, DebugPreferencesMessages.LaunchingPreferencePage_32, 1, 1, GridData.FILL_HORIZONTAL);
-		Composite spacer = SWTFactory.createComposite(group, group.getFont(), 1, 1, GridData.FILL_HORIZONTAL);
-		FieldEditor edit = new BooleanFieldEditor(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_CLOSED, DebugPreferencesMessages.LaunchingPreferencePage_33, SWT.NONE, spacer);
-		fFieldEditors.add(edit);
-		edit = new BooleanFieldEditor(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_DELETED, DebugPreferencesMessages.LaunchingPreferencePage_34, SWT.NONE, spacer);
-		fFieldEditors.add(edit);
-		edit = new BooleanFieldEditor(IInternalDebugUIConstants.PREF_FILTER_WORKING_SETS, DebugPreferencesMessages.LaunchConfigurationsPreferencePage_3, SWT.NONE, spacer);
-		fFieldEditors.add(edit);
-		fDeleteConfigs = SWTFactory.createCheckButton(comp, DebugPreferencesMessages.LaunchConfigurationsPreferencePage_2, null, false, 3);
-		
-		//add table options
-		createTypeFiltering(group);
-		
-		//migration
-		group = SWTFactory.createGroup(comp, DebugPreferencesMessages.LaunchingPreferencePage_35, 1, 1, GridData.FILL_HORIZONTAL);
-		Label label = new Label(group, SWT.LEFT | SWT.WRAP);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = 350;
-		label.setLayoutData(gd);
-		label.setText(DebugPreferencesMessages.LaunchingPreferencePage_26);
-		label.setFont(parent.getFont());
-		fMigrateNow = SWTFactory.createPushButton(group, DebugPreferencesMessages.LaunchingPreferencePage_27, null);
-		gd = new GridData(SWT.BEGINNING);
-
-		fMigrateNow.setLayoutData(gd);
-		fMigrateNow.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				handleMigrateNowSelected();
-			}			
-		});
-	
-		//init field editors
-		initFieldEditors();
-		fTable.setEnabled(getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES));
-		return comp;
-	}
-	
-	/**
-	 * @param parent the parent to add this composite to
-	 * @return the new composite with the type selection table in it
-	 */
-	private Composite createTypeFiltering(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_HORIZONTAL);
-		BooleanFieldEditor2 editor = new BooleanFieldEditor2(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES, DebugPreferencesMessages.LaunchConfigurationsPreferencePage_0, SWT.NONE, comp);
-		editor.setPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				boolean newvalue = false;
-				if(event.getNewValue() instanceof Boolean) {
-					newvalue = ((Boolean)event.getNewValue()).booleanValue();
-				}
-				else {
-					newvalue = Boolean.valueOf(event.getNewValue().toString()).booleanValue();
-				}
-				if(newvalue) {
-					fTable.setEnabled(true);
-				}
-				else {
-					fTable.setEnabled(false);
-				}
-			}	
-		});
-		fFieldEditors.add(editor);
-		fTable = new Table(comp, SWT.CHECK | SWT.BORDER);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.heightHint = 155;
-		fTable.setLayoutData(gd);
-		CheckboxTableViewer tviewer = new CheckboxTableViewer(fTable);
-		tviewer.setLabelProvider(DebugUITools.newDebugModelPresentation());
-		tviewer.setContentProvider(new TableContentProvider());
-		tviewer.setComparator(new WorkbenchViewerComparator());
-		ArrayList list  = new ArrayList();
-		LaunchGroupExtension ext = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(DEBUG_LAUNCH_GROUP);
-		if(ext != null) {
-			list.add(ext);
-		}
-		ext = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(EXT_BUILDER_GROUP);
-		if(ext != null) {
-			list.add(ext);
-		}
-		tviewer.addFilter(new MultiLaunchGroupFilter((LaunchGroupExtension[]) list.toArray(new LaunchGroupExtension[list.size()])));
-		list.clear();
-		tviewer.setInput(getLaunchConfigurationTypes());
-		fTable.setFont(parent.getFont());
-		return comp;
-	}
-	
-	/**
-	 * returns the launch configuration types
-	 * @return the launch configuration types
-	 */
-	private ILaunchConfigurationType[] getLaunchConfigurationTypes() {
-		return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
-	}
-	
-	/**
-	 * handles the Migrate button being clicked
-	 *
-	 * @since 3.2
-	 */
-	private void handleMigrateNowSelected() {
-		try {
-			ILaunchManager lmanager = DebugPlugin.getDefault().getLaunchManager();
-			ILaunchConfiguration[] configurations = lmanager.getMigrationCandidates();
-			//separate the private from the public 
-			List pub = new ArrayList();
-			for(int i = 0; i < configurations.length; i++) {
-				if(DebugUITools.isPrivate(configurations[i])) {
-					//auto-migrate private ones
-					configurations[i].migrate();
-				}
-				else {
-					pub.add(configurations[i]);
-				}
-			}
-			if(pub.size() == 0) {
-				MessageDialog.openInformation(getShell(), DebugPreferencesMessages.LaunchingPreferencePage_29, DebugPreferencesMessages.LaunchingPreferencePage_30);
-				return;
-			}
-			LaunchConfigurationMigrationSelectionDialog listd = new LaunchConfigurationMigrationSelectionDialog(getShell(),new AdaptableList(pub));
-			listd.setTitle(DebugPreferencesMessages.LaunchingPreferencePage_28);
-			listd.setInitialSelections(configurations);
-			if(listd.open() == IDialogConstants.OK_ID) {
-				fMonitor = new ProgressMonitorPart(fMigrateNow.getParent(), new GridLayout());
-				Object[] objs = listd.getResult();
-				fMonitor.beginTask(DebugPreferencesMessages.LaunchingPreferencePage_31, objs.length);
-				for(int i = 0; i < objs.length; i++) {
-					if(objs[i] instanceof ILaunchConfiguration) {
-						((ILaunchConfiguration)objs[i]).migrate();
-					}
-					fMonitor.worked(1);
-				}
-				fMonitor.done();
-				fMonitor.dispose();
-			}
-		}
-		catch (CoreException e) {DebugUIPlugin.log(e);}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {}
-
-	/**
-	 * Initializes the field editors to their values
-	 * @since 3.2
-	 */
-	private void initFieldEditors() {
-		FieldEditor editor;
-		for(int i = 0; i < fFieldEditors.size(); i++) {
-			editor = (FieldEditor)fFieldEditors.get(i);
-			editor.setPreferenceStore(getPreferenceStore());
-			editor.load();
-		}
-		fDeleteConfigs.setSelection(DebugPlugin.getDefault().getPluginPreferences().getBoolean(
-				LaunchManager.PREF_DELETE_CONFIGS_ON_PROJECT_DELETE));
-		//restore the tables' checked state
-		String[] types = getPreferenceStore().getString(IInternalDebugUIConstants.PREF_FILTER_TYPE_LIST).split("\\,"); //$NON-NLS-1$
-		TableItem[] items = fTable.getItems();
-		ILaunchConfigurationType type;
-		for(int i = 0; i < types.length; i++) {
-			for(int j = 0; j < items.length; j++) {
-				type = (ILaunchConfigurationType)items[j].getData();
-				if(type.getIdentifier().equals(types[i])) {
-					items[j].setChecked(true);
-				}
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		FieldEditor editor = null;
-		for(int i = 0; i < fFieldEditors.size(); i++) {
-			editor = (FieldEditor)fFieldEditors.get(i);
-			editor.loadDefault();
-			if(editor instanceof BooleanFieldEditor2) {
-				fTable.setEnabled(((BooleanFieldEditor2)editor).getBooleanValue());
-			}
-		}
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		//save field editors
-		for(int i = 0; i < fFieldEditors.size(); i++) {
-			((FieldEditor)fFieldEditors.get(i)).store();
-		}
-		DebugPlugin.getDefault().getPluginPreferences().setValue(
-				LaunchManager.PREF_DELETE_CONFIGS_ON_PROJECT_DELETE, fDeleteConfigs.getSelection());
-		//save table
-		String types = ""; //$NON-NLS-1$
-		TableItem[] items = fTable.getItems();
-		ILaunchConfigurationType type;
-		for(int i = 0; i < items.length; i++) {
-			if(items[i].getChecked()) {
-				type = (ILaunchConfigurationType)items[i].getData();
-				types += type.getIdentifier()+","; //$NON-NLS-1$
-			}
-		}
-		getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_FILTER_TYPE_LIST, types);
-		return super.performOk();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java
deleted file mode 100644
index 63d19f9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java
+++ /dev/null
@@ -1,628 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.preferences;
-
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.internal.core.LaunchDelegate;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
-import org.eclipse.debug.internal.ui.launchConfigurations.MultiLaunchGroupFilter;
-import org.eclipse.debug.internal.ui.launchConfigurations.PerspectiveManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-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.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.ActivityManagerEvent;
-import org.eclipse.ui.activities.IActivityManagerListener;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * The preference page for selecting and changing launch perspectives
- * 
- * @since 3.3
- */
-public class LaunchPerspectivePreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IActivityManagerListener {
-
-	/**
-	 * Represents a perspective delta for a given type, delegate and mode set combination.
-	 */
-	final class PerspectiveChange {
-		private ILaunchConfigurationType fType = null;
-		private ILaunchDelegate fDelegate = null;
-		private Set fModes = null;
-		private String fPid = null;
-		
-		public PerspectiveChange(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes, String perspectiveid) {
-			fType = type;
-			fDelegate = delegate;
-			fModes = modes;
-			fPid = perspectiveid;
-		}
-		
-		public ILaunchConfigurationType getType() {return fType;}
-		public ILaunchDelegate getDelegate() {return fDelegate;}
-		public String getPerspectiveId() {return fPid;}
-		public Set getModes() {return fModes;}
-		public boolean equals(Object o) {
-			if(o instanceof PerspectiveChange) {
-				PerspectiveChange change = (PerspectiveChange) o;
-				return change.getDelegate() == fDelegate &&
-						change.getType().equals(fType) &&
-						change.getModes().equals(fModes);
-			}
-			return super.equals(o);
-		}
-	}
-	
-	/**
-	 * Implementation to expose use of getFilteredChildren method
-	 */
-	final class PerspectivesTreeViewer extends TreeViewer {
-		public PerspectivesTreeViewer(Tree tree) {
-			super(tree);
-		}
-		public Object[] getFilteredChildren(Object o) {return super.getFilteredChildren(o);}
-	}
-	
-	/**
-	 * Provides content for the configuration tree viewer
-	 */
-	final class PerspectiveContentProvider implements ITreeContentProvider {
-		public Object[] getChildren(Object parentElement) {
-			if(parentElement instanceof ILaunchConfigurationType) {
-				ILaunchConfigurationType type = (ILaunchConfigurationType) parentElement;
-				return ((LaunchManager)DebugPlugin.getDefault().getLaunchManager()).getLaunchDelegates(type.getIdentifier());
-			}
-			return new Object[0];
-		}
-		public Object[] getElements(Object inputElement) {
-			return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
-		}
-		public boolean hasChildren(Object element) {return element instanceof ILaunchConfigurationType;}
-		public Object getParent(Object element) {return null;}
-		public void dispose() {}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-	}
-	
-	/**
-	 * Panel container that is reused to present series of combo boxes to users for perspective selections
-	 */
-	class PerspectivesPanel {
-		
-		private Composite fMainComposite = null;
-		private Label fMessage = null;
-		
-		public PerspectivesPanel(Composite parent, String heading) {
-			createPanel(parent, heading);
-		}
-		
-		protected void createPanel(Composite parent, String heading) {
-			fMainComposite = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_BOTH);
-			SWTFactory.createWrapLabel(fMainComposite, heading, 2);
-			fMessage = SWTFactory.createWrapLabel(fMainComposite, "", 2, 250); //$NON-NLS-1$
-		}
-		
-		public void setMessage(String msg) {
-			fMessage.setText((msg == null ? "" : msg)); //$NON-NLS-1$
-		}
-		
-		public void refreshPanel(IStructuredSelection selection) {
-			//get rid of any existing children, but leave the first two (the label for the control, and the message area)
-			Control[] children = fMainComposite.getChildren();
-			for(int i = 2; i < children.length; i++) {
-				children[i].dispose();
-			}
-			if(fgCurrentWorkingContext == null) {
-				fgCurrentWorkingContext = new HashSet();
-			}
-			fgCurrentWorkingContext.clear();
-			if(!selection.isEmpty()) {
-				Point pt = getShell().getSize();
-				createCombos(fMainComposite, selection.toArray());
-				fMainComposite.layout();
-				if(!fInitializing) {
-					Point pt2  = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-					if(pt2.x > pt.x) {
-						getShell().setSize(pt2);
-					}
-				}
-			}
-			else {
-				SWTFactory.createWrapLabel(fMainComposite, DebugPreferencesMessages.LaunchPerspectivePreferencePage_0, 2, 275);
-			}
-			fMainComposite.layout();
-		}
-	}
-	
-	/**
-	 * Widgets
-	 */
-	private RadioGroupFieldEditor fSwitchLaunch = null;
-	private RadioGroupFieldEditor fSwitchSuspend = null;
-	private Tree fTree = null;
-	private PerspectivesTreeViewer fTreeViewer = null;
-	private PerspectivesPanel fPerspectivesPanel = null;
-	
-	/**
-	 * Caches
-	 */
-	private static String[] fgPerspectiveLabels = null;
-	private static Map fgPerspectiveIdMap = null;
-	private static HashSet fgChangeSet = null;
-	private static HashSet fgCurrentWorkingContext = null;
-	
-	/**
-	 * fields
-	 */
-	private boolean fInitializing = false;
-	
-	/**
-	 * A default selection listener to be reused by all combo boxes presenting perspective data
-	 */
-	private SelectionListener fSelectionListener = new SelectionListener() {
-		public void widgetDefaultSelected(SelectionEvent e) {}
-		public void widgetSelected(SelectionEvent e) {
-			Object o = e.getSource();
-			if(o instanceof Combo) {
-				Combo combo = (Combo) o;
-				LaunchDelegate delegate = null;
-				ILaunchConfigurationType type = null;
-				PerspectiveChange change = null;
-				Set modes = null;
-				for(Iterator iter = fgCurrentWorkingContext.iterator(); iter.hasNext();) {
-					o = iter.next();
-					if(o instanceof ILaunchDelegate) {
-						delegate = (LaunchDelegate) o;
-						type = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(delegate.getLaunchConfigurationTypeId());
-					}
-					else if(o instanceof ILaunchConfigurationType) {
-						delegate = null;
-						type = (ILaunchConfigurationType) o;
-					}
-					modes = (Set) combo.getData();
-					change = findChange(type, delegate, modes);
-					if(change == null) {
-						change = new PerspectiveChange(type, delegate, modes, (String)fgPerspectiveIdMap.get(combo.getText()));
-						fgChangeSet.add(change);
-					}
-					else {
-						change.fPid = (String)fgPerspectiveIdMap.get(combo.getText());
-					}
-				}
-			}
-		}
-	};
-	
-	/**
-	 * Constructor
-	 */
-	public LaunchPerspectivePreferencePage() {}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
-	 */
-	public void dispose() {
-		PlatformUI.getWorkbench().getActivitySupport().getActivityManager().removeActivityManagerListener(this);
-		fgPerspectiveIdMap.clear();
-		fgPerspectiveIdMap = null;
-		fgPerspectiveLabels = null;
-		fgChangeSet.clear();
-		fgChangeSet = null;
-		if(fgCurrentWorkingContext != null) {
-			fgCurrentWorkingContext.clear();
-			fgCurrentWorkingContext = null;
-		}
-		super.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.PERSPECTIVE_PREFERENCE_PAGE);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		
-		SWTFactory.createWrapLabel(parent, DebugPreferencesMessages.PerspectivePreferencePage_0, 2, 300);
-		
-		SWTFactory.createVerticalSpacer(parent, 1);
-		
-		fSwitchLaunch = new RadioGroupFieldEditor(
-				IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE,
-				DebugPreferencesMessages.LaunchingPreferencePage_11, 3,
-				new String[][] {{DebugPreferencesMessages.LaunchingPreferencePage_12, MessageDialogWithToggle.ALWAYS },
-							{ DebugPreferencesMessages.LaunchingPreferencePage_13, MessageDialogWithToggle.NEVER },
-							{ DebugPreferencesMessages.LaunchingPreferencePage_14, MessageDialogWithToggle.PROMPT } }, 
-							SWTFactory.createComposite(parent, 1, 2, GridData.FILL_HORIZONTAL),
-							true);
-		fSwitchLaunch.setPreferenceName(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE);
-		fSwitchLaunch.setPreferenceStore(getPreferenceStore());
-		fSwitchSuspend = new RadioGroupFieldEditor(
-				IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND,
-				DebugPreferencesMessages.DebugPreferencePage_21, 3,
-				new String[][] {{ DebugPreferencesMessages.DebugPreferencePage_22, MessageDialogWithToggle.ALWAYS },
-								{ DebugPreferencesMessages.DebugPreferencePage_23, MessageDialogWithToggle.NEVER },
-								{ DebugPreferencesMessages.DebugPreferencePage_24, MessageDialogWithToggle.PROMPT } }, 
-								SWTFactory.createComposite(parent, 1, 2, GridData.FILL_HORIZONTAL),
-								true);
-		fSwitchSuspend.setPreferenceName(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND);
-		fSwitchSuspend.setPreferenceStore(getPreferenceStore());
-		
-		SWTFactory.createVerticalSpacer(parent, 1);
-		SWTFactory.createWrapLabel(parent, DebugPreferencesMessages.PerspectivePreferencePage_5, 2, 300);
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 2, 1, GridData.FILL_BOTH, 0, 0);
-		createTreeViewer(comp);
-		fPerspectivesPanel = new PerspectivesPanel(comp, DebugPreferencesMessages.PerspectivePreferencePage_2);
-		initializeControls();
-		PlatformUI.getWorkbench().getActivitySupport().getActivityManager().addActivityManagerListener(this);
-		Dialog.applyDialogFont(parent);
-		return parent;
-	}
-	
-	/**
-	 * Creates the <code>Tree</code> and <code>TreeViewer</code> widgets
-	 * @param parent the parent to add these components to
-	 */
-	protected void createTreeViewer(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_VERTICAL);
-		SWTFactory.createWrapLabel(comp, DebugPreferencesMessages.PerspectivePreferencePage_1, 1);
-		fTree = new Tree(comp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.MULTI);
-		GridData gd = new GridData(GridData.FILL_VERTICAL);
-		gd.widthHint = 220;
-		gd.heightHint = 250;
-		fTree.setLayoutData(gd);
-		fTreeViewer = new PerspectivesTreeViewer(fTree);
-		fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				fPerspectivesPanel.refreshPanel((IStructuredSelection) event.getSelection());
-			}
-		});
-		fTreeViewer.setLabelProvider(DebugUITools.newDebugModelPresentation());
-		fTreeViewer.setComparator(new WorkbenchViewerComparator());
-		fTreeViewer.setContentProvider(new PerspectiveContentProvider());
-		MultiLaunchGroupFilter filter = new MultiLaunchGroupFilter(new LaunchGroupExtension[] {
-				DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup("org.eclipse.debug.ui.launchGroup.debug"), //$NON-NLS-1$
-				DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup("org.eclipse.ui.externaltools.launchGroup") //$NON-NLS-1$
-		});
-		fTreeViewer.addFilter(filter);
-		fTreeViewer.setInput(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes());
-	}
-	
-	/**
-	 * Creates a set of combo boxes on a per-selection basis that display a listing of available perspectives to switch to
-	 * @param parent the parent to add the created combo boxes to
-	 * @param selection the selection in the tree viewer
-	 */
-	protected void createCombos(Composite parent, Object[] selection) {
-		Set modes = collectCommonModeSets(selection);
-		if(modes.isEmpty()) {
-			fPerspectivesPanel.setMessage(DebugPreferencesMessages.LaunchPerspectivePreferencePage_1);
-			return;
-		}
-		fPerspectivesPanel.setMessage(""); //$NON-NLS-1$
-		List fmodes = null;
-		Combo combo = null;
-		Set smodes = null;
-		for(Iterator iter = modes.iterator(); iter.hasNext();) {
-			smodes = (Set) iter.next();
-			fmodes = LaunchConfigurationPresentationManager.getDefault().getLaunchModeNames(smodes);
-			if(!fmodes.isEmpty()) {
-				//add the modeset and create a combo
-				SWTFactory.createLabel(parent, fmodes.toString()+":", 1); //$NON-NLS-1$
-				combo = SWTFactory.createCombo(parent, SWT.READ_ONLY, 1, fgPerspectiveLabels);
-				String text = getComboSelection(smodes);
-				if(text != null) {
-					combo.setText(text);
-				}
-				combo.setData(smodes);
-				combo.addSelectionListener(fSelectionListener);
-				GridData gd = (GridData)combo.getLayoutData();
-				gd.grabExcessHorizontalSpace = true;
-			}
-		}
-	}
-	
-	/**
-	 * Returns the text item to select for the current combo context given the current working set context
-	 * @param modes the set of modes 
-	 * @return the text to select in the current combo / current working set context, or "None" 
-	 */
-	private String getComboSelection(Set modes) {
-		String text = DebugPreferencesMessages.PerspectivePreferencePage_4;
-		IStructuredSelection ss = (IStructuredSelection) fTreeViewer.getSelection();
-		if(ss != null && !ss.isEmpty()) {
-			Object o = null;
-			Set tmp = new HashSet();
-			String id = null;
-			ILaunchConfigurationType type = null;
-			LaunchDelegate delegate = null;
-			PerspectiveChange change = null;
-			for(Iterator iter = ss.iterator(); iter.hasNext();) {
-				o = iter.next();
-				if(o instanceof LaunchDelegate) {
-					delegate = (LaunchDelegate) o;
-					type = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(delegate.getLaunchConfigurationTypeId());
-				}
-				else if(o instanceof ILaunchConfigurationType) {
-					type = (ILaunchConfigurationType) o;
-				}
-				change = findChange(type, delegate, modes);
-				if(change != null) {
-					id = change.getPerspectiveId();
-				}
-				else {
-					id = DebugUIPlugin.getDefault().getPerspectiveManager().getLaunchPerspective(type, modes, delegate);
-				}
-				if(id == null) {
-					id = IDebugUIConstants.PERSPECTIVE_NONE;
-				}
-				tmp.add(id);
-			}
-			if(tmp.size() == 1) {
-				id = (String) tmp.iterator().next();
-				if(!IDebugUIConstants.PERSPECTIVE_NONE.equals(id)) {
-					String label = null;
-					for(Iterator iter = fgPerspectiveIdMap.keySet().iterator(); iter.hasNext();) {
-						label = (String) iter.next();
-						if(id.equals(fgPerspectiveIdMap.get(label))) {
-							return label;
-						}
-					}
-				}
-			}
-		}
-			
-		return text;
-	}
-	
-	/**
-	 * Traverses the current change set to find a matching change. Matching in this context considers only the 
-	 * type, delegate and mode set, we do not compare perspective ids, as they can change many times.
-	 * @param type the type
-	 * @param delegate the delegate, possibly <code>null</code>
-	 * @param modes the current mode set
-	 * @return the existing <code>PerspectiveChange</code> if there is one, <code>null</code> otherwise
-	 */
-	private PerspectiveChange findChange(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes) {
-		PerspectiveChange change = new PerspectiveChange(type, delegate, modes, null);
-		Object o = null;
-		for(Iterator iter = fgChangeSet.iterator(); iter.hasNext();) {
-			o = iter.next();
-			if(change.equals(o)) {
-				return (PerspectiveChange) o;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Collects a list of mode sets that are common to the current selection context. It is possible
-	 * that there are no mode sets in comomon.
-	 * @param selection the current selection context
-	 * @param list the list to fill
-	 * @return a list of mode sets or an empty list, never <code>null</code>
-	 */
-	protected Set collectCommonModeSets(Object[] selection) {
-		HashSet common = new HashSet();
-	//prep selection context, remove types from the equation
-		HashSet delegates = new HashSet();
-		Object o = null;
-		Object[] kids = null;
-		for(int i = 0; i < selection.length; i++) {
-			o = selection[i];
-			if(o instanceof ILaunchDelegate) {
-				delegates.add(o);
-			}
-			else if(o instanceof ILaunchConfigurationType) {
-				fgCurrentWorkingContext.add(o);
-				kids = fTreeViewer.getFilteredChildren(o);
-				delegates.addAll(Arrays.asList(kids));
-			}
-		}
-	//compare the listing of delegates to find common mode sets
-		ILaunchDelegate delegate = null;
-		List modes = null;
-		HashSet pruned = new HashSet();
-		Set fmodes = null;
-		if(!delegates.isEmpty()) {
-			for(Iterator iter = delegates.iterator(); iter.hasNext();) {
-				delegate = (ILaunchDelegate) iter.next();
-				modes = delegate.getModes();
-				for(Iterator iter2 = modes.iterator(); iter2.hasNext();) {
-					fmodes = (Set) iter2.next();
-					if(isCommonModeset(fmodes, delegates, pruned)) {
-						common.add(fmodes);
-						fgCurrentWorkingContext.add(delegate);
-					}
-				}
-			}
-		}
-		return common;
-	}
-	
-	/**
-	 * Returns if the specified mode set is common to the listing of delegates, at the same time adding any not common 
-	 * mode sets to a listing used to prune the search as we go along
-	 * @param modeset the set to test for commonality
-	 * @param delegates the listing to test against
-	 * @param pruned the monotonic listing of pruned mode sets
-	 * @return true if the specified mode set is common to all members of the specified listing of launch delegates, false otherwise
-	 */
-	private boolean isCommonModeset(Set modeset, Set delegates, Set pruned) {
-		if(!pruned.contains(modeset)) {
-			ILaunchDelegate delegate = null;
-			boolean common = true;
-			for(Iterator iter = delegates.iterator(); iter.hasNext();) {
-				delegate = (ILaunchDelegate) iter.next();
-				common &= delegate.getModes().contains(modeset);
-			}
-			if(!common) {
-				pruned.add(modeset);
-			}
-			else {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Restores the widget state from the preference store, called after all of the widgets have been created and triggers
-	 * a selection changed event from the tree viewer
-	 */
-	protected void initializeControls() {
-		fInitializing = true;
-		if(fTree.getItemCount() > 0) {
-			TreeItem item = fTree.getItem(0);
-			fTreeViewer.setSelection(new StructuredSelection(item.getData()));
-			fTreeViewer.expandToLevel(item.getData(), 1);
-		}
-	//load the group selections
-		fSwitchLaunch.load();
-		fSwitchSuspend.load();
-		fInitializing = false;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		fgChangeSet.clear();
-		fSwitchLaunch.loadDefault();
-		fSwitchSuspend.loadDefault();
-		
-		PerspectiveManager pm = DebugUIPlugin.getDefault().getPerspectiveManager();
-		TreeItem[] items = fTree.getItems();
-		ILaunchConfigurationType type = null;
-		Set modes = null;
-		Set modeset = null;
-		Object[] delegates = null;
-		for(int i = 0; i < items.length; i++) {
-			//reset type
-			type = (ILaunchConfigurationType) items[i].getData();
-			modes = type.getSupportedModeCombinations();
-			delegates = fTreeViewer.getFilteredChildren(type);
-			for(Iterator iter = modes.iterator(); iter.hasNext();) {
-				modeset = (Set) iter.next();
-				fgChangeSet.add(new PerspectiveChange(type, null, modeset, pm.getDefaultLaunchPerspective(type, null, modeset)));
-			}
-			for(int j = 0; j < delegates.length; j++) {
-				modes = new HashSet(((ILaunchDelegate)delegates[j]).getModes());
-				for(Iterator iter = modes.iterator(); iter.hasNext();) {
-					modeset = (Set) iter.next();
-					fgChangeSet.add(new PerspectiveChange(type, (ILaunchDelegate) delegates[j], modeset, pm.getDefaultLaunchPerspective(type, (ILaunchDelegate) delegates[j], modeset)));
-				}
-			}
-		}
-		if(fTree.getItemCount() > 0) {
-			TreeItem item = fTree.getItem(0);
-			fTreeViewer.setSelection(new StructuredSelection(item.getData()));
-			fTreeViewer.expandToLevel(item.getData(), 1);
-		}
-		super.performDefaults();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		setPreferenceStore(DebugUIPlugin.getDefault().getPreferenceStore());
-		fgChangeSet = new HashSet();
-	//init the labels mapping and the list of labels
-		fgPerspectiveIdMap = new HashMap();
-		ArrayList labels = new ArrayList();
-		labels.add(DebugPreferencesMessages.PerspectivePreferencePage_4);
-		IPerspectiveRegistry registry = PlatformUI.getWorkbench().getPerspectiveRegistry();
-		IPerspectiveDescriptor[] descriptors = registry.getPerspectives();
-		String label = null;
-		for(int i = 0; i < descriptors.length; i++) {
-			if(!WorkbenchActivityHelper.filterItem(descriptors[i])) {
-				label = descriptors[i].getLabel();
-				labels.add(label);
-				fgPerspectiveIdMap.put(label, descriptors[i].getId());
-			}
-		}
-		fgPerspectiveLabels = (String[]) labels.toArray(new String[labels.size()]);
-	}
-
-	/**
-	 * @see org.eclipse.ui.activities.IActivityManagerListener#activityManagerChanged(org.eclipse.ui.activities.ActivityManagerEvent)
-	 */
-	public void activityManagerChanged(ActivityManagerEvent activityManagerEvent) {
-		if(!fTree.isDisposed()) {
-			fTreeViewer.refresh();
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		fSwitchLaunch.store();
-		fSwitchSuspend.store();
-		if(!fgChangeSet.isEmpty()) {
-			PerspectiveChange change = null;
-			PerspectiveManager mgr = DebugUIPlugin.getDefault().getPerspectiveManager();
-			for(Iterator iter = fgChangeSet.iterator(); iter.hasNext();) {
-				change = (PerspectiveChange) iter.next();
-				mgr.setLaunchPerspective(change.getType(), change.getModes(), change.getDelegate(), change.getPerspectiveId());
-			}
-		}
-		return super.performOk();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java
deleted file mode 100644
index 721b411..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.preferences;
-
-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.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DefaultLabelProvider;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-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.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-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.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * This class provides a preference page for selecting and changing preferred launch delegates for those of them
- * that have conflicting delegates.
- * 
- * Delegates are considered to be conflicting if they are for the same launc configuraiton type, and apply to the same 
- * mode sets.
- * 
- * @since 3.3
- * 
- * TODO create a help topic for this page....it needs a good description
- * 
- */
-public class LaunchersPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	/**
-	 * Class to collect and persist attributes to sufficiently describe a dupicate launch delegate
-	 */
-	class DuplicateDelegate {
-		private ILaunchConfigurationType fType = null;
-		private ILaunchDelegate[] fDelegates = null;
-		private Set fModes = null;
-		
-		public DuplicateDelegate(ILaunchConfigurationType type, ILaunchDelegate[] delegates, Set modes) {
-			fModes = modes;
-			fType = type;
-			fDelegates = delegates;
-		}
-		
-		public ILaunchConfigurationType getType() {
-			return fType;
-		}
-		public ILaunchDelegate[] getDelegates() {
-			return fDelegates;
-		}
-		public Set getModeSet() {
-			return fModes;
-		}
-	}
-	
-	/**
-	 * label provider to extend the default one, provides labels to both the tree and table of this page
-	 */
-	class LabelProvider extends DefaultLabelProvider {
-		public String getText(Object element) {
-			if(element instanceof ILaunchConfigurationType) {
-				return super.getText(element);
-			}
-			else if(element instanceof DuplicateDelegate) {
-				DuplicateDelegate dd = (DuplicateDelegate) element;
-				return LaunchConfigurationPresentationManager.getDefault().getLaunchModeNames(dd.getModeSet()).toString();
-			}
-			else if(element instanceof ILaunchDelegate){
-				return ((ILaunchDelegate) element).getName();
-			}
-			return element.toString();
-		}
-	}
-	
-	/**
-	 * This class is used to provide content to the tree
-	 */
-	class TreeProvider implements ITreeContentProvider {
-		public Object[] getChildren(Object parentElement) {
-			if(parentElement instanceof ILaunchConfigurationType) {
-				ILaunchConfigurationType type = (ILaunchConfigurationType) parentElement;
-				Set dupes = (Set) fDuplicates.get(type);
-				if(dupes != null) {
-					return dupes.toArray();
-				}
-				return null;
-			}
-			return null;
-		}
-		public boolean hasChildren(Object element) {
-			return element instanceof ILaunchConfigurationType;
-		}
-		public Object[] getElements(Object inputElement) {
-			if(inputElement instanceof Map) {
-				return ((Map)inputElement).keySet().toArray();
-			}
-			return null;
-		}
-		public Object getParent(Object element) {return null;}
-		public void dispose() {}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-	}
-	
-	private TreeViewer fTreeViewer = null;
-	private CheckboxTableViewer fTableViewer = null;
-	private Map fDuplicates = null;
-	private Map fDupeSelections = null;
-	private boolean fDirty = false;
-	private Text fDescription = null;
-	
-	/**
-	 * Constructor
-	 */
-	public LaunchersPreferencePage() {
-		setTitle(DebugPreferencesMessages.LaunchDelegatesPreferencePage_0);
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_DELEGATES_PREFERENCE_PAGE);
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_BOTH);
-		SWTFactory.createWrapLabel(comp, DebugPreferencesMessages.LaunchDelegatesPreferencePage_1, 2, 300);
-		
-		boolean enabled = fDuplicates.size() > 0;
-		if(!enabled) {
-			SWTFactory.createVerticalSpacer(comp, 1);
-			SWTFactory.createWrapLabel(comp, DebugPreferencesMessages.LaunchersPreferencePage_0, 2, 300);
-		}
-		
-		SWTFactory.createVerticalSpacer(comp, 1);
-	//tree
-		Composite comp1 = SWTFactory.createComposite(comp, 1, 1, GridData.FILL_VERTICAL);
-		SWTFactory.createLabel(comp1, DebugPreferencesMessages.LaunchDelegatesPreferencePage_2, 1);
-		Tree tree = new Tree(comp1, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE);
-		tree.setEnabled(enabled);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.grabExcessHorizontalSpace = false;
-		tree.setLayoutData(gd);
-		fTreeViewer = new TreeViewer(tree);
-		fTreeViewer.setComparator(new WorkbenchViewerComparator());
-		fTreeViewer.setContentProvider(new TreeProvider());
-		fTreeViewer.setLabelProvider(new LabelProvider());
-		fTreeViewer.setInput(fDuplicates);
-		fTreeViewer.expandToLevel(2);
-		fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				Object obj = ((IStructuredSelection) event.getSelection()).getFirstElement();
-				if(obj instanceof DuplicateDelegate) {
-					fTableViewer.setAllChecked(false);
-					DuplicateDelegate dd = (DuplicateDelegate) obj;
-					fTableViewer.setInput(dd.getDelegates());
-					obj = fDupeSelections.get(dd);
-					if(obj != null) {
-						fTableViewer.setChecked(obj, true);
-					}
-				}
-				else {
-					fTableViewer.setInput(null);
-				}
-			}
-		});
-		
-	//table
-		Composite comp2 = SWTFactory.createComposite(comp, comp.getFont(), 1, 1, GridData.FILL_BOTH);
-		SWTFactory.createLabel(comp2, DebugPreferencesMessages.LaunchDelegatesPreferencePage_3, 1);
-		Table table = new Table(comp2, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK | SWT.SINGLE);
-		table.setEnabled(enabled);
-		table.setLayoutData(new GridData(GridData.FILL_BOTH));
-		fTableViewer = new CheckboxTableViewer(table);
-		fTableViewer.setComparator(new WorkbenchViewerComparator());
-		fTableViewer.setLabelProvider(new LabelProvider());
-		fTableViewer.setContentProvider(new ArrayContentProvider());
-		fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection ss = (IStructuredSelection) event.getSelection();
-				if(ss != null && !ss.isEmpty()) {
-					fDescription.setText(((ILaunchDelegate)ss.getFirstElement()).getDescription());
-				}
-				else {
-					fDescription.setText(""); //$NON-NLS-1$
-				}
-			}
-		});
-		fTableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				fDirty = true;
-				Object element = event.getElement();
-				boolean checked = event.getChecked();
-				fTableViewer.setAllChecked(false);
-				//always set checked, this way users cannot 'undo' a change to selecting a preferred delegate
-				//The story for this is that on startup if there are dupes, the user is prompted to pick a delegate, after that they cannot 
-				//return to a state of not being able to launch something, but can pick a different delegate
-				fTableViewer.setChecked(element, true);
-				//persist the selection
-				Object obj = ((IStructuredSelection) fTreeViewer.getSelection()).getFirstElement();
-				if(obj instanceof DuplicateDelegate) {
-					fDupeSelections.remove(obj);
-					if(checked) {
-						fDupeSelections.put(obj, element);
-					}
-				}
-			}
-		});
-		Group group = SWTFactory.createGroup(comp, DebugPreferencesMessages.LaunchDelegatesPreferencePage_4, 1, 2, GridData.FILL_BOTH);
-		fDescription = SWTFactory.createText(group, SWT.WRAP | SWT.READ_ONLY, 1, GridData.FILL_BOTH);
-		fDescription.setEnabled(enabled);
-		fDescription.setBackground(group.getBackground());
-		return comp;
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		if(fDirty && fDupeSelections != null && fDupeSelections.size() > 0) {
-			fDirty = false;
-			DuplicateDelegate dd = null;
-			ILaunchDelegate delegate = null;
-			for(Iterator iter = fDupeSelections.keySet().iterator(); iter.hasNext();) {
-				dd = (DuplicateDelegate) iter.next();
-				delegate = (ILaunchDelegate) fDupeSelections.get(dd);
-				try {
-					dd.getType().setPreferredDelegate(dd.getModeSet(), delegate);
-				} 
-				catch (CoreException e) {DebugUIPlugin.log(e);}
-			}
-		}
-		return super.performOk();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		//init a listing of duplicate delegates arranged by type
-		try {
-			setPreferenceStore(DebugUIPlugin.getDefault().getPreferenceStore());
-			LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
-			ILaunchConfigurationType[] types = lm.getLaunchConfigurationTypes();
-			fDuplicates = new HashMap();
-			fDupeSelections = new HashMap();
-			Set modes = null;
-			ILaunchDelegate[] delegates = null;
-			Set modeset = null;
-			Set tmp = null;
-			ILaunchDelegate prefdelegate = null;
-			DuplicateDelegate dd = null;
-			for(int i = 0; i < types.length; i++) {
-				modes = types[i].getSupportedModeCombinations();
-				for(Iterator iter = modes.iterator(); iter.hasNext();) {
-					modeset = (Set) iter.next();
-					delegates = types[i].getDelegates(modeset);
-					if(delegates.length > 1) {
-						tmp = (Set) fDuplicates.get(types[i]);
-						if(tmp == null) {
-							tmp = new HashSet();
-						}
-						dd = new DuplicateDelegate(types[i], delegates, modeset);
-						tmp.add(dd);
-						fDuplicates.put(types[i], tmp);
-						prefdelegate = types[i].getPreferredDelegate(modeset);
-						if(prefdelegate != null) {
-							fDupeSelections.put(dd, prefdelegate);
-						}
-					}
-				}
-			}
-		}
-		catch(CoreException e) {DebugUIPlugin.log(e);}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchingPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchingPreferencePage.java
deleted file mode 100644
index 229023f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchingPreferencePage.java
+++ /dev/null
@@ -1,214 +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.debug.internal.ui.preferences;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-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.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.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * A preference page for configuring launching preferences.
- * 
- * @since 3.0.0
- */
-public class LaunchingPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-	
-	private Button fUseContextLaunching;
-	private Button fUseOldLaunching;
-	private Button fLaunchLastIfNotLaunchable;
-	private Button fCheckParent;
-	
-	/**
-	 * The default constructor
-	 */
-	public LaunchingPreferencePage() {
-		super();
-		setPreferenceStore(DebugUIPlugin.getDefault().getPreferenceStore());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCHING_PREFERENCE_PAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_HORIZONTAL);
-		//save dirty editors
-		FieldEditor edit = new RadioGroupFieldEditor(IInternalDebugUIConstants.PREF_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH, DebugPreferencesMessages.LaunchingPreferencePage_2, 3,  
-				 new String[][] {{DebugPreferencesMessages.LaunchingPreferencePage_3, MessageDialogWithToggle.ALWAYS}, 
-				 {DebugPreferencesMessages.LaunchingPreferencePage_4, MessageDialogWithToggle.NEVER},
-				 {DebugPreferencesMessages.LaunchingPreferencePage_5, MessageDialogWithToggle.PROMPT}}, 
-				 comp,
-				 true);	
-		addField(edit);
-		
-		//wait for build
-		edit = new RadioGroupFieldEditor(IInternalDebugUIConstants.PREF_WAIT_FOR_BUILD, 
-				 DebugPreferencesMessages.LaunchingPreferencePage_6, 3,
-				 new String[][] {{DebugPreferencesMessages.LaunchingPreferencePage_7, MessageDialogWithToggle.ALWAYS}, 
-				 {DebugPreferencesMessages.LaunchingPreferencePage_8, MessageDialogWithToggle.NEVER}, 
-				 {DebugPreferencesMessages.LaunchingPreferencePage_9, MessageDialogWithToggle.PROMPT}}, 
-				 comp,
-				 true);
-		addField(edit);
-		
-		//re-launch in debug mode
-		edit = new RadioGroupFieldEditor(IInternalDebugUIConstants.PREF_RELAUNCH_IN_DEBUG_MODE,
-				 DebugPreferencesMessages.LaunchingPreferencePage_15, 3, 
-				 new String[][] {{DebugPreferencesMessages.LaunchingPreferencePage_16, MessageDialogWithToggle.ALWAYS}, 
-				 {DebugPreferencesMessages.LaunchingPreferencePage_17, MessageDialogWithToggle.NEVER}, 
-				 {DebugPreferencesMessages.LaunchingPreferencePage_18, MessageDialogWithToggle.PROMPT}}, 
-				 comp,
-				 true);
-		addField(edit);
-		
-		//continue with compile errors
-		edit = new RadioGroupFieldEditor(IInternalDebugUIConstants.PREF_CONTINUE_WITH_COMPILE_ERROR,
-				 DebugPreferencesMessages.LaunchingPreferencePage_21, 2, 
-				 new String[][] {{DebugPreferencesMessages.LaunchingPreferencePage_22, MessageDialogWithToggle.ALWAYS},  
-				 {DebugPreferencesMessages.LaunchingPreferencePage_23, MessageDialogWithToggle.PROMPT}},  
-				 comp,
-				 true);
-		addField(edit);
-		
-		//filtering options
-		Group group = SWTFactory.createGroup(comp, DebugPreferencesMessages.LaunchingPreferencePage_36, 1, 1, GridData.FILL_HORIZONTAL);
-		Composite spacer = SWTFactory.createComposite(group, 1, 1, GridData.FILL_HORIZONTAL);
-		edit = new BooleanFieldEditor(IDebugUIConstants.PREF_BUILD_BEFORE_LAUNCH, DebugPreferencesMessages.LaunchingPreferencePage_1, SWT.NONE, spacer);
-		edit.fillIntoGrid(spacer, 2);
-		addField(edit);
-		edit = new BooleanFieldEditor(IDebugUIConstants.PREF_AUTO_REMOVE_OLD_LAUNCHES, DebugPreferencesMessages.LaunchingPreferencePage_10, SWT.NONE, spacer);
-		edit.fillIntoGrid(spacer, 2);
-		addField(edit);
-		
-		//history list size preference
-		IntegerFieldEditor editor = new IntegerFieldEditor(IDebugUIConstants.PREF_MAX_HISTORY_SIZE, DebugPreferencesMessages.DebugPreferencePage_10, spacer);
-		editor.fillIntoGrid(spacer, 2);
-		addField(editor);
-		int historyMax = IDebugPreferenceConstants.MAX_LAUNCH_HISTORY_SIZE;
-		editor.setTextLimit(Integer.toString(historyMax).length());
-		editor.setErrorMessage(MessageFormat.format(DebugPreferencesMessages.DebugPreferencePage_11, new Object[] { new Integer(1), new Integer(historyMax)})); 
-		editor.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
-		editor.setValidRange(1, historyMax);
-		editor.setEmptyStringAllowed(false);
-		
-		//CONTEXTLAUNCHING
-		createContextLaunchingControls(comp);
-		initialize();
-		checkState();
-		return comp;
-	}
-
-	/**
-	 * Creates the context launching portion of the page, which includes two radio buttons and 
-	 * a nested check box
-	 * @param parent the parent to add this control to
-	 * 
-	 * @since 3.3.0
-	 * CONTEXTLAUNCHING
-	 */
-	private void createContextLaunchingControls(Composite parent) {
-		Group group = SWTFactory.createGroup(parent, DebugPreferencesMessages.LaunchingPreferencePage_40, 1, 1, GridData.FILL_HORIZONTAL);
-		fUseOldLaunching = SWTFactory.createRadioButton(group, DebugPreferencesMessages.LaunchingPreferencePage_37);
-		fUseContextLaunching = SWTFactory.createRadioButton(group, DebugPreferencesMessages.LaunchingPreferencePage_38);
-		fUseContextLaunching.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				boolean enabled = ((Button)e.widget).getSelection();
-				fCheckParent.setEnabled(enabled);
-				fLaunchLastIfNotLaunchable.setEnabled(enabled);
-			}
-		});
-		Composite space = SWTFactory.createComposite(group, 1, 1, GridData.FILL_HORIZONTAL);
-		GridData gd = (GridData) space.getLayoutData();
-		gd.horizontalIndent = 10;
-		GridLayout layout = (GridLayout) space.getLayout();
-		layout.marginHeight = 0;
-		fCheckParent = SWTFactory.createRadioButton(space, DebugPreferencesMessages.LaunchingPreferencePage_39);
-		fLaunchLastIfNotLaunchable = SWTFactory.createRadioButton(space, DebugPreferencesMessages.LaunchingPreferencePage_41);
-		
-		//initialize the buttons
-		boolean value = getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH);
-		fUseOldLaunching.setSelection(!value);
-		fUseContextLaunching.setSelection(value);
-		boolean enable = getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_LAUNCH_PARENT_PROJECT);
-		fCheckParent.setSelection(enable);
-		fCheckParent.setEnabled(value);
-		fLaunchLastIfNotLaunchable.setSelection(!enable);
-		fLaunchLastIfNotLaunchable.setEnabled(value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		boolean value = getPreferenceStore().getDefaultBoolean(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH);
-		fUseOldLaunching.setSelection(!value);
-		fUseContextLaunching.setSelection(value);
-		boolean parent = getPreferenceStore().getDefaultBoolean(IInternalDebugUIConstants.PREF_LAUNCH_PARENT_PROJECT);
-		fCheckParent.setSelection(parent);
-		fCheckParent.setEnabled(value);
-		fLaunchLastIfNotLaunchable.setSelection(!parent);
-		fLaunchLastIfNotLaunchable.setEnabled(value);
-		super.performDefaults();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_USE_CONTEXTUAL_LAUNCH, fUseContextLaunching.getSelection());
-		getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_LAUNCH_PARENT_PROJECT, fCheckParent.getSelection());
-		getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_LAUNCH_LAST_IF_NOT_LAUNCHABLE, fLaunchLastIfNotLaunchable.getSelection());
-		return super.performOk();
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
-	 */
-	protected void createFieldEditors() {
-		//do nothing we overload the create contents method
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java
deleted file mode 100644
index 2cde86c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java
+++ /dev/null
@@ -1,169 +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.debug.internal.ui.preferences;
-
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.GridData;
-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.dialogs.PropertyPage;
-
-public class ProcessPropertyPage extends PropertyPage {
-
-	private static Font fHeadingFont = JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);
-	
-	/**
-	 * Constructor for ProcessPropertyPage
-	 */
-	public ProcessPropertyPage() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite ancestor) {
-		noDefaultAndApplyButton();
-		Composite parent = SWTFactory.createComposite(ancestor, ancestor.getFont(), 1, 1, GridData.FILL_BOTH);
-		
-		IProcess proc = getProcess();
-		
-	//create the process time section
-		SWTFactory.createLabel(parent, DebugPreferencesMessages.ProcessPropertyPage_0, fHeadingFont, 1);
-		Text text = SWTFactory.createText(parent, SWT.READ_ONLY, 1);
-		((GridData)text.getLayoutData()).horizontalIndent = 10;
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(text, IDebugHelpContextIds.PROCESS_PAGE_RUN_AT);
-		text.setText(getTimeText(proc));
-		text.setBackground(parent.getBackground());
-		SWTFactory.createVerticalSpacer(parent, 2);
-		
-	//create the path name section
-		SWTFactory.createLabel(parent, DebugPreferencesMessages.ProcessPropertyPage_1, fHeadingFont, 1);		
-		text = SWTFactory.createText(parent, SWT.WRAP | SWT.READ_ONLY, 1);
-		((GridData)text.getLayoutData()).horizontalIndent = 10;
-		text.setText(getPathText(proc));
-		text.setBackground(parent.getBackground());
-		SWTFactory.createVerticalSpacer(parent, 2);
-		
-	//create commandline section
-		SWTFactory.createLabel(parent, DebugPreferencesMessages.ProcessPropertyPage_Command_Line__1, fHeadingFont, 1);
-		text = SWTFactory.createText(parent, 
-				SWT.WRAP | SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL, 
-				1, 
-				convertWidthInCharsToPixels(80),
-				convertHeightInCharsToPixels(15),
-				GridData.FILL_BOTH);
-		text.setBackground(parent.getBackground());
-		((GridData)text.getLayoutData()).horizontalIndent = 10;
-		String commandLineText = getCommandLineText(proc);
-		if (commandLineText != null) {
-			text.setText(commandLineText);
-		}
-		
-		setTitle(DebugPreferencesMessages.ProcessPropertyPage_2);
-		return parent;
-	}
-	
-	/**
-	 * Gets the process from the selected element
-	 * @return the process or null if the element is not a process
-	 * 
-	 * @since 3.2
-	 */
-	private IProcess getProcess() {
-		IProcess proc = null;
-		Object obj = getElement();
-		if (obj instanceof IDebugElement) {
-			obj = ((IDebugElement)obj).getDebugTarget().getProcess();
-		}
-		if (obj instanceof IProcess) {
-			proc = ((IProcess)obj);
-		}
-		return proc;
-	}
-	
-	/**
-	 * returns the path text
-	 * @param proc the process to extract the path text from
-	 * @return the path text or a message indicating no path text available
-	 * 
-	 * @since 3.2
-	 */
-	private String getPathText(IProcess proc) {
-		String text = DebugPreferencesMessages.ProcessPropertyPage_3;
-		if(proc != null) {
-			String tmp = proc.getLabel();
-			int idx = tmp.lastIndexOf("("); //$NON-NLS-1$
-			if(idx < 0) {
-				idx = tmp.length();
-			}
-			text = tmp.substring(0, idx); 
-		}
-		return text;
-	}
-	
-	/**
-	 * gets the pattern of text from the process label specified by regex
-	 * @param proc the process to compile the regex against
-	 * @param deftext the default text to return if the process is null
-	 * @param regex the regex to match in the process label
-	 * @return the regex matched text or the default supplied text if the process is null
-	 * 
-	 * @since 3.2
-	 */
-	private String getTimeText(IProcess proc) {
-		String text = DebugPreferencesMessages.ProcessPropertyPage_4;
-		if(proc != null) {
-			Pattern pattern = Pattern.compile("\\(.*\\)"); //$NON-NLS-1$
-			Matcher matcher = pattern.matcher(proc.getLabel());
-			if(matcher.find()) {
-				text = matcher.group(0);
-			}
-		}
-		return text;
-	}
-	
-	/** 
-	 * Initializes the text to be displayed in the commandline text widget
-	 * @param proc the process to compile the label fragment from
-	 * @return the commandline text or the empty string
-	 * 
-	 * @since 3.2
-	 */
-	private String getCommandLineText(IProcess proc) {
-		String cmdline = DebugPreferencesMessages.ProcessPropertyPage_5;
-		if(proc != null) {
-			cmdline = proc.getAttribute(IProcess.ATTR_CMDLINE);
-		}
-		return cmdline;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),	IDebugHelpContextIds.PROCESS_PROPERTY_PAGE);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java
deleted file mode 100644
index 77937c1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.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.debug.internal.ui.preferences;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.AbstractDebugListSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DefaultLabelProvider;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationComparator;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-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.TableViewer;
-import org.eclipse.jface.window.Window;
-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.Control;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.eclipse.ui.dialogs.SelectionDialog;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Displays default launch configuration settings for a selected resource - associated launch configurations.
- * 
- * @see {@link PropertyPage}
- * @see {@link ILaunchConfiguration}
- * @see {@link org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog}
- * @see {@link IDebugHelpContextIds#DEFAULT_LAUNCHCONFIGURATION_PROPERTY_PAGE}
- * 
- * CONTEXTLAUNCHING
- * 
- * @since 3.3.0
- */
-public class RunDebugPropertiesPage extends PropertyPage {
-	/**
-	 * Set of configurations to be deleted
-	 */
-	private Set fDeletedConfigurations = new HashSet();
-	
-	/**
-	 * Set of original default candidates for the resource
-	 */
-	private Set fOriginalCandidates;
-	
-	/**
-	 * Holds configurations that need to be saved when the page closes
-	 */
-	private Set fChangedConfigurations = new HashSet();
-	
-	/**
-	 * List of the applicable launch config types for the backing resource
-	 */
-	private List fTypeCandidates = null;
-	
-	//widgets
-	private TableViewer fViewer;
-	private Button fNewButton = null;
-	private Button fEditButton = null;
-	private Button fDuplicateButton = null;
-	private Button fDeleteButton = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugHelpContextIds.RUN_DEBUG_RESOURCE_PROPERTY_PAGE);
-		collectConfigCandidates(getResource());
-		Composite topComposite = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_BOTH);
-		
-		SWTFactory.createWrapLabel(topComposite, DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_0, 2, 300);
-		SWTFactory.createVerticalSpacer(topComposite, 2);
-		SWTFactory.createWrapLabel(topComposite, MessageFormat.format(DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_1, new String[]{getResource().getName()}), 2, 300);
-		fViewer = createViewer(topComposite);
-		
-		Composite buttonComp = SWTFactory.createComposite(topComposite, 1, 1, GridData.FILL_VERTICAL);
-		GridLayout layout = (GridLayout) buttonComp.getLayout();
-		layout.marginHeight = 0;
-		fNewButton = SWTFactory.createPushButton(buttonComp, DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_2, null);
-		fNewButton.setToolTipText(DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_3);
-		fNewButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				handleNew();
-			}
-		});
-		
-		fDuplicateButton = SWTFactory.createPushButton(buttonComp, DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_4, null);
-		fDuplicateButton.setToolTipText(DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_5);
-		fDuplicateButton.setEnabled(false);
-		fDuplicateButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				handleCopy();
-			}
-		});
-		fEditButton = SWTFactory.createPushButton(buttonComp, DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_6, null);
-		fEditButton.setToolTipText(DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_7);
-		fEditButton.setEnabled(false);
-		fEditButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				handleEdit();
-			}
-		});
-		fDeleteButton = SWTFactory.createPushButton(buttonComp, DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_8, null);
-		fDeleteButton.setToolTipText(DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_9);
-		fDeleteButton.setEnabled(false);
-		fDeleteButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {}
-			public void widgetSelected(SelectionEvent e) {
-				handleDelete();
-			}
-		});
-		
-		fViewer.setSelection(new StructuredSelection());
-		applyDialogFont(topComposite);
-		return topComposite;
-	}
-
-	/**
-	 * Creates and returns the viewer that will display the possible default configurations.
-	 * 
-	 * @param parent parent composite to create the viewer in
-	 * @return viewer viewer that will display possible default configurations
-	 */
-	protected TableViewer createViewer(Composite parent){
-		TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
-		viewer.setLabelProvider(new DefaultLabelProvider());
-		viewer.setContentProvider(new ArrayContentProvider());
-		viewer.setComparator(new LaunchConfigurationComparator());
-		Table builderTable = viewer.getTable();
-		GridData tableGridData = new GridData(GridData.FILL_BOTH);
-		tableGridData.heightHint = 300;
-		builderTable.setLayoutData(tableGridData);
-		IResource resource = getResource();
-		viewer.setInput(collectConfigCandidates(resource));
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection sel = event.getSelection();
-				if(sel instanceof IStructuredSelection) {
-					IStructuredSelection ss = (IStructuredSelection) sel;
-					boolean empty = ss.isEmpty();
-					int size = ss.size();
-					fEditButton.setEnabled(!empty && size == 1);
-					fDuplicateButton.setEnabled(!empty && size == 1);
-					fDeleteButton.setEnabled(!empty);
-				}
-			}
-		});
-		return viewer;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
-	 */
-	public void dispose() {
-		if(fOriginalCandidates != null) {
-			fOriginalCandidates.clear();
-			fOriginalCandidates = null;
-		}
-		if(fChangedConfigurations != null) {
-			fChangedConfigurations.clear();
-			fChangedConfigurations = null;
-		}
-		super.dispose();
-	}
-
-	/**
-	 * Returns the viewer displaying possible default configurations.
-	 * 
-	 * @return viewer
-	 */
-	protected TableViewer getViewer() {
-		return fViewer;
-	}
-		
-	/**
-	 * Returns the launch manager
-	 * @return the launch manager
-	 */
-	protected LaunchManager getLaunchManager() {
-		return (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
-	}
-	
-	/**
-	 * Collects the applicable launch configuration types for the backing resource.
-	 * Default implementation uses the launch shortcut evaluation expressions and leverages the 
-	 * mapping of launch shortcut to config type id to derive the applicable types.
-	 * @return the listing of applicable launch configuration types for the backing resource
-	 */
-	protected List collectTypeCandidates() {
-		if(fTypeCandidates == null) {
-			fTypeCandidates = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getApplicableConfigurationTypes(getResource());
-			Collections.sort(fTypeCandidates, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					ILaunchConfigurationType t1 = (ILaunchConfigurationType) o1;
-					ILaunchConfigurationType t2 = (ILaunchConfigurationType) o2;
-					return t1.getName().compareTo(t2.getName());
-				}
-			});
-		}
-		return fTypeCandidates;
-	}
-	
-	/**
-	 * Returns a set of potential default configurations candidates for the given
-	 * resource. The configurations are working copies.
-	 *  
-	 * @param resource resource
-	 * @return list of default candidates
-	 */
-	protected Set collectConfigCandidates(IResource resource) {
-		if(fOriginalCandidates == null) {
-			fOriginalCandidates = new HashSet();
-			try {
-				List configs = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getApplicableLaunchConfigurations(resource);
-				for(Iterator iter = configs.iterator(); iter.hasNext();) {
-					fOriginalCandidates.add(((ILaunchConfiguration)iter.next()).getWorkingCopy());
-				}
-			}
-			catch(CoreException ce) {DebugUIPlugin.log(ce);}
-		}
-		return fOriginalCandidates;
-	}
-	
-	
-	
-	/**
-	 * Returns the resource this property page is open on.
-	 * 
-	 * @return resource
-	 */
-	protected IResource getResource() {
-		Object element = getElement();
-		IResource resource = null;
-		if (element instanceof IResource) {
-			resource = (IResource) element;
-		} else if (element instanceof IAdaptable) {
-			resource = (IResource) ((IAdaptable)element).getAdapter(IResource.class);
-		}
-		return resource;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-	//delete 
-		Iterator iter = fDeletedConfigurations.iterator();
-		while (iter.hasNext()) {
-			ILaunchConfigurationWorkingCopy currentConfig = (ILaunchConfigurationWorkingCopy) iter.next();
-			try{			
-				if (currentConfig.getOriginal() != null){
-					currentConfig.getOriginal().delete();
-				}
-			} catch (CoreException e) {
-				DebugPlugin.logMessage("Problem deleting configuration " + currentConfig.getName(), e); //$NON-NLS-1$
-			}
-		}
-	//add
-		iter = fChangedConfigurations.iterator();
-		while (iter.hasNext()) {
-			ILaunchConfigurationWorkingCopy currentConfig = (ILaunchConfigurationWorkingCopy) iter.next();
-			try{
-				currentConfig.doSave();
-			} catch (CoreException e) {
-				DebugPlugin.logMessage("Problem saving changes to configuration " + currentConfig.getName(), e); //$NON-NLS-1$
-			}
-		}
-		
-		return super.performOk();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		setErrorMessage(null);
-		setValid(true);
-		fOriginalCandidates.clear();
-		fOriginalCandidates = null;
-		getViewer().setInput(collectConfigCandidates(getResource()));
-		fChangedConfigurations.clear();
-		fDeletedConfigurations.clear();
-		fViewer.refresh(true, true);
-		super.performDefaults();
-	}
-	
-	/**
-	 * Returns the names of the launch configurations passed in as original input to the tree viewer
-	 * @return the names of the original launch configurations
-	 */
-	private Set getConfigurationNames() {
-		Set names = new HashSet();
-		Iterator iter = fOriginalCandidates.iterator();
-		while (iter.hasNext()) {
-			names.add(((ILaunchConfiguration)iter.next()).getName());
-		}
-		iter = fChangedConfigurations.iterator();
-		while (iter.hasNext()) {
-			names.add(((ILaunchConfiguration)iter.next()).getName());
-		}
-		return names;
-	}
-	
-	/**
-	 * Returns selected configurations.
-	 * 
-	 * @return selected configurations
-	 */
-	private ILaunchConfigurationWorkingCopy[] getSelectedConfigurations() {
-		IStructuredSelection ss = (IStructuredSelection) fViewer.getSelection();
-		return (ILaunchConfigurationWorkingCopy[]) ss.toList().toArray(new ILaunchConfigurationWorkingCopy[ss.size()]);
-	}
-
-	/**
-	 * Copy the selection
-	 */
-	private void handleCopy() {
-		ILaunchConfigurationWorkingCopy configuration = getSelectedConfigurations()[0];
-		try {
-			ILaunchConfigurationWorkingCopy copy = configuration.copy(
-					((LaunchManager)DebugPlugin.getDefault().getLaunchManager()).generateUniqueLaunchConfigurationNameFrom(configuration.getName(), getConfigurationNames()));
-			copy.setAttributes(configuration.getAttributes());
-			fChangedConfigurations.add(copy);
-			fViewer.add(copy);
-			fViewer.setSelection(new StructuredSelection(copy));
-		} catch (CoreException e) {
-			setErrorMessage(e.getMessage());
-		}
-	}
-
-	/**
-	 * Delete the selection
-	 */
-	private void handleDelete() {
-		Table table = fViewer.getTable();
-		int[] indices = table.getSelectionIndices();
-		Arrays.sort(indices);
-		ILaunchConfiguration[] configurations = getSelectedConfigurations();
-		for (int i = 0; i < configurations.length; i++) {
-			fDeletedConfigurations.add(configurations[i]);
-			fChangedConfigurations.remove(configurations[i]);
-			fViewer.remove(configurations[i]);
-		}
-		if (indices[0] < table.getItemCount()) {
-			fViewer.setSelection(new StructuredSelection(table.getItem(indices[0]).getData()));
-		} else if (table.getItemCount() > 0) {
-			fViewer.setSelection(new StructuredSelection(table.getItem(table.getItemCount() - 1).getData()));
-		}
-	}
-
-	/**
-	 * Edit the selection
-	 */
-	private void handleEdit() {
-		ILaunchConfigurationWorkingCopy config = getSelectedConfigurations()[0]; 
-		if(edit(config, false) == IDialogConstants.OK_ID) {
-			fChangedConfigurations.add(config);
-			fViewer.refresh(config, true, true);
-		}
-	}
-
-	/**
-	 * Edits the given configuration as a nested working copy.
-	 * Returns the code from the dialog used to edit the configuration.
-	 * 
-	 * @param configuration
-	 * @param setDefaults whether to set default values in the config
-	 * @return dialog return code - OK or CANCEL
-	 */
-	private int edit(ILaunchConfigurationWorkingCopy configuration, boolean setDefaults) {
-		return DebugUIPlugin.openLaunchConfigurationPropertiesDialog(getShell(), configuration, IDebugUIConstants.ID_RUN_LAUNCH_GROUP, getConfigurationNames(), null, setDefaults);
-	}
-
-	/**
-	 * Create a new configuration
-	 */
-	private void handleNew() {
-		
-		final List typeCandidates = collectTypeCandidates();
-		
-		SelectionDialog dialog = new AbstractDebugListSelectionDialog(getShell()){
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-			 */
-			protected String getDialogSettingsId() {
-				return DebugUIPlugin.getUniqueIdentifier() + ".SELECT_CONFIGURATION_TYPE_DIALOG"; //$NON-NLS-1$
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-			 */
-			protected Object getViewerInput() {
-				return typeCandidates;
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-			 */
-			protected String getHelpContextId() {
-				return IDebugHelpContextIds.SELECT_CONFIGURATION_TYPE_DIALOG;
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-			 */
-			protected String getViewerLabel() {
-				return DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_12;
-			}
-				
-		};
-		dialog.setTitle(DebugPreferencesMessages.DefaultLaunchConfigurationsPropertiesPage_11);
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			if (result.length == 1) {
-				ILaunchConfigurationType type = (ILaunchConfigurationType) result[0];
-				try {
-					ILaunchConfigurationWorkingCopy wc = type.newInstance(null, 
-							((LaunchManager)DebugPlugin.getDefault().getLaunchManager()).
-							generateUniqueLaunchConfigurationNameFrom("New_configuration", getConfigurationNames())); //$NON-NLS-1$
-					if (edit(wc, true) == Window.OK) {
-						fChangedConfigurations.add(wc);
-						fViewer.add(wc);
-						fViewer.setSelection(new StructuredSelection(wc));
-					}
-				} catch (CoreException e) {
-					setErrorMessage(e.getMessage());
-				}
-			}
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java
deleted file mode 100644
index ea5ac77..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java
+++ /dev/null
@@ -1,714 +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.debug.internal.ui.preferences;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.MultipleInputDialog;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-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.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Preference page for creating and configuring simple
- * launch variables.
- * 
- * @see org.eclipse.debug.core.variables.IValueVariable
- * @see org.eclipse.debug.core.variables.ISimpleVariableRegistry
- */
-public class StringVariablePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-	
-	private TableViewer variableTable;
-	protected Button envAddButton;
-	protected Button envEditButton;
-	protected Button envRemoveButton;
-	
-	protected SimpleVariableContentProvider variableContentProvider= new SimpleVariableContentProvider();
-	
-	protected static final String NAME_LABEL= DebugPreferencesMessages.SimpleVariablePreferencePage_10; 
-	protected static final String VALUE_LABEL = DebugPreferencesMessages.SimpleVariablePreferencePage_11; 
-	protected static final String DESCRIPTION_LABEL = DebugPreferencesMessages.SimpleVariablePreferencePage_12; 
-	
-	protected static final String STRING_VARIABLE_PREFERENCE_KEY = "StringVariablePreferencePage"; //$NON-NLS-1$
-	
-	protected static String[] variableTableColumnProperties= {
-		"variable", //$NON-NLS-1$
-		"value", //$NON-NLS-1$
-		"description" //$NON-NLS-1$
-	};
-	protected String[] variableTableColumnHeaders= {
-		DebugPreferencesMessages.SimpleVariablePreferencePage_3, 
-		DebugPreferencesMessages.SimpleVariablePreferencePage_4, 
-		DebugPreferencesMessages.SimpleVariablePreferencePage_5,
-		DebugPreferencesMessages.StringVariablePreferencePage_27
-	};
-	protected ColumnLayoutData[] variableTableColumnLayouts= {
-		new ColumnWeightData(30),
-		new ColumnWeightData(25),
-		new ColumnWeightData(25),
-		new ColumnWeightData(20)
-	};
-	
-	public StringVariablePreferencePage() {
-		setDescription(DebugPreferencesMessages.SimpleVariablePreferencePage_6); 
-	}
-
-	/**
-	 * @see PreferencePage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.SIMPLE_VARIABLE_PREFERENCE_PAGE);
-	}
-
-	protected Control createContents(Composite parent) {
-		noDefaultAndApplyButton();
-		Font font= parent.getFont();
-		//The main composite
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight=0;
-		layout.marginWidth=0;
-		layout.numColumns= 2;
-		composite.setLayout(layout);
-		composite.setFont(font);
-		
-		createTable(composite);
-		createButtons(composite);
-				
-		return composite;
-	}
-	
-	/**
-	 * Creates and configures the table containing launch configuration variables
-	 * and their associated value.
-	 */
-	private void createTable(Composite parent) {
-		Font font= parent.getFont();
-		// Create table composite
-		Composite tableComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.numColumns = 1;
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.heightHint = 150;
-		gridData.widthHint = 400;
-		tableComposite.setLayout(layout);
-		tableComposite.setLayoutData(gridData);
-		tableComposite.setFont(font);
-		// Create table
-		variableTable = new TableViewer(tableComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
-		Table table = variableTable.getTable();
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		table.setFont(font);
-		gridData = new GridData(GridData.FILL_BOTH);
-		variableTable.getControl().setLayoutData(gridData);
-		variableTable.setContentProvider(variableContentProvider);
-		variableTable.setColumnProperties(variableTableColumnProperties);
-		variableTable.addFilter(new VariableFilter());
-		variableTable.setComparator(new ViewerComparator() {
-			public int compare(Viewer iViewer, Object e1, Object e2) {
-				if (e1 == null) {
-					return -1;
-				} else if (e2 == null) {
-					return 1;
-				} else {
-					return ((VariableWrapper)e1).getName().compareToIgnoreCase(((VariableWrapper)e2).getName());
-				}
-			}
-		});
-		
-		variableTable.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				handleTableSelectionChanged(event);
-			}
-		});
-		
-		variableTable.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				if (!variableTable.getSelection().isEmpty()) {
-					handleEditButtonPressed();
-				}
-			}
-		});
-		variableTable.getTable().addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent event) {
-				if (event.character == SWT.DEL && event.stateMask == 0) {
-					handleRemoveButtonPressed();
-				}
-			}
-		});
-	
-		for (int i = 0; i < variableTableColumnHeaders.length; i++) {
-			TableColumn tc = new TableColumn(table, SWT.NONE, i);
-			tc.setResizable(variableTableColumnLayouts[i].resizable);
-			tc.setText(variableTableColumnHeaders[i]);
-		}
-		
-		// Try restoring column widths from preferences, if widths aren't stored, init columns to default
-		if (!restoreColumnWidths()){
-			restoreDefaultColumnWidths();
-		}
-		
-		variableTable.setInput(getVariableManager());
-		variableTable.setLabelProvider(new SimpleVariableLabelProvider());
-	}
-	
-	/**
-	 * Creates the new/edit/remove buttons for the variable table
-	 * @param parent the composite in which the buttons should be created
-	 */
-	private void createButtons(Composite parent) {
-		// Create button composite
-		Composite buttonComposite = new Composite(parent, SWT.NONE);
-		GridLayout glayout = new GridLayout();
-		glayout.marginHeight = 0;
-		glayout.marginWidth = 0;
-		glayout.numColumns = 1;
-		GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		buttonComposite.setLayout(glayout);
-		buttonComposite.setLayoutData(gdata);
-		buttonComposite.setFont(parent.getFont());
-		
-		// Create buttons
-		envAddButton = SWTFactory.createPushButton(buttonComposite, DebugPreferencesMessages.SimpleVariablePreferencePage_7, null); 
-		envAddButton.addSelectionListener(new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent event) {
-				handleAddButtonPressed();
-			}
-		});
-		envEditButton = SWTFactory.createPushButton(buttonComposite, DebugPreferencesMessages.SimpleVariablePreferencePage_8, null); 
-		envEditButton.addSelectionListener(new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent event) {
-				handleEditButtonPressed();
-			}
-		});
-		envEditButton.setEnabled(false);
-		envRemoveButton = SWTFactory.createPushButton(buttonComposite, DebugPreferencesMessages.SimpleVariablePreferencePage_9, null); 
-		envRemoveButton.addSelectionListener(new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent event) {
-				handleRemoveButtonPressed();
-			}
-		});
-		envRemoveButton.setEnabled(false);
-	}
-	
-	private void handleAddButtonPressed() {
-		boolean done = false;
-		String name = null;
-		String description = null;
-		String value = null;
-		while (!done){
-			
-			MultipleInputDialog dialog= new MultipleInputDialog(getShell(), DebugPreferencesMessages.SimpleVariablePreferencePage_13); 
-			dialog.addTextField(NAME_LABEL, name, false);
-			dialog.addBrowseField(VALUE_LABEL, value, true);
-			dialog.addTextField(DESCRIPTION_LABEL, description, true);
-	
-			if (dialog.open() != Window.OK) {
-				done = true;
-			}
-			else {
-				name= dialog.getStringValue(NAME_LABEL).trim();
-				value = dialog.getStringValue(VALUE_LABEL);
-				description= dialog.getStringValue(DESCRIPTION_LABEL);
-				done = addVariable(name, description, value);
-			}
-		}
-	}
-
-	/**
-	 * Attempts to create and add a new variable with the given properties.  Returns
-	 * whether the operation completed successfully (either the variable was added
-	 * successfully, or the user cancelled the operation).  Returns false if the name
-	 * is null or the user chooses not to overwrite an existing variable.
-	 *  
-	 * @param name name of the variable, cannot be <code>null</code> or empty.
-	 * @param description description of the variable or <code>null</code> 
-	 * @param value value of the variable or <code>null</code>
-	 * @return whether the operation completed successfully
-	 */
-	private boolean addVariable(String name, String description, String value) {
-		if (name == null || name.length() == 0){
-			MessageDialog.openError(getShell(),DebugPreferencesMessages.StringVariablePreferencePage_21, DebugPreferencesMessages.StringVariablePreferencePage_20);
-			return false;
-		}
-		List editedVariables= variableContentProvider.getWorkingSetVariables();
-		Iterator iter= editedVariables.iterator();
-		while (iter.hasNext()) {
-			VariableWrapper currentVariable = (VariableWrapper) iter.next();
-			if (!currentVariable.isRemoved()) {
-				String currentName = currentVariable.getName();
-				if (currentName.equals(name)) {
-					if (currentVariable.isReadOnly()){
-						MessageDialog.openError(getShell(),DebugPreferencesMessages.StringVariablePreferencePage_23, MessageFormat.format(DebugPreferencesMessages.StringVariablePreferencePage_22, new String[] {name}));
-						return false;
-					}
-					else {
-						MessageDialog dialog = new MessageDialog(getShell(), DebugPreferencesMessages.SimpleVariablePreferencePage_15, null, MessageFormat.format(DebugPreferencesMessages.SimpleVariablePreferencePage_16, new String[] {name}), MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL }, 0);
-						int overWrite= dialog.open(); 
-						if (overWrite == 0) {
-							currentVariable.setValue(value);
-							currentVariable.setDescription(description);
-							variableTable.update(currentVariable, null);
-							return true;
-						} else if(overWrite == 1){
-							return false;
-						} else {
-							return true;  // Cancel was pressed, return true so operation is ended
-						}
-					}
-				}
-			}
-		}
-		VariableWrapper newVariable = new VariableWrapper(name, description, value);
-		variableContentProvider.addVariable(newVariable);
-		variableTable.refresh();
-		return true;
-	}
-	
-	private void handleEditButtonPressed() {
-		IStructuredSelection selection= (IStructuredSelection) variableTable.getSelection();
-		VariableWrapper variable= (VariableWrapper) selection.getFirstElement();
-		if (variable == null || variable.isReadOnly()) {
-			return;
-		}
-		String value= variable.getValue();
-		String description= variable.getDescription();
-		String name= variable.getName();
-		MultipleInputDialog dialog= new MultipleInputDialog(getShell(), MessageFormat.format(DebugPreferencesMessages.SimpleVariablePreferencePage_14, new String[] {name})); 
-		dialog.addBrowseField(VALUE_LABEL, value, true);
-		dialog.addTextField(DESCRIPTION_LABEL, description, true);
-	
-		if (dialog.open() == Window.OK) {
-			value= dialog.getStringValue(VALUE_LABEL);
-			description= dialog.getStringValue(DESCRIPTION_LABEL);
-			if (value != null) {
-				variable.setValue(value);
-			}
-			if (description != null) {
-				variable.setDescription(description);
-			}
-			variableTable.update(variable, null);
-		}
-	}
-	
-	/**
-	 * Remove the selection variables.
-	 */
-	private void handleRemoveButtonPressed() {
-		IStructuredSelection selection= (IStructuredSelection) variableTable.getSelection();
-		List variablesToRemove= selection.toList();
-		StringBuffer contributedVariablesToRemove= new StringBuffer();
-		Iterator iter= variablesToRemove.iterator();
-		while (iter.hasNext()) {
-			VariableWrapper variable = (VariableWrapper) iter.next();
-			if (variable.isContributed()) {
-				contributedVariablesToRemove.append('\t').append(variable.getName()).append('\n');
-			}
-		}
-		if (contributedVariablesToRemove.length() > 0) {
-			boolean remove= MessageDialog.openQuestion(getShell(), DebugPreferencesMessages.SimpleLaunchVariablePreferencePage_21, MessageFormat.format(DebugPreferencesMessages.SimpleLaunchVariablePreferencePage_22, new String[] {contributedVariablesToRemove.toString()})); // 
-			if (!remove) {
-				return;
-			}
-		}
-		VariableWrapper[] variables= (VariableWrapper[]) variablesToRemove.toArray(new VariableWrapper[0]);
-		for (int i = 0; i < variables.length; i++) {
-			variables[i].setRemoved(true);
-		} 
-		variableTable.refresh();
-	}
-	
-	/**
-	 * Responds to a selection changed event in the variable table
-	 * @param event the selection change event
-	 */
-	protected void handleTableSelectionChanged(SelectionChangedEvent event) {
-		IStructuredSelection selection = ((IStructuredSelection)event.getSelection());
-		VariableWrapper variable= (VariableWrapper) selection.getFirstElement();
-		if (variable == null || variable.isReadOnly()) {
-			envEditButton.setEnabled(false);
-			envRemoveButton.setEnabled(false);
-		}
-		else {
-			envEditButton.setEnabled(selection.size() == 1);
-			envRemoveButton.setEnabled(selection.size() > 0);
-		}
-	}
-
-	public void init(IWorkbench workbench) {
-	}
-
-	/**
-	 * Clear the variables.
-	 */
-	protected void performDefaults() {
-		variableContentProvider.init();
-		variableTable.refresh();
-		super.performDefaults();
-	}
-	
-	/**
-	 * Sets the saved state for reversion.
-	 */
-	public boolean performOk() {
-		variableContentProvider.saveChanges();
-		saveColumnWidths();
-		return super.performOk();
-	}
-
-	/**
-	 * Returns the DebugPlugin's singleton instance of the
-	 * launch variable manager
-	 * @return the singleton instance of the simple variable registry.
-	 */
-	private IStringVariableManager getVariableManager() {
-		return VariablesPlugin.getDefault().getStringVariableManager();
-	}
-	
-	public void saveColumnWidths() {
-		StringBuffer widthPreference = new StringBuffer();
-		for (int i = 0; i < variableTable.getTable().getColumnCount(); i++) {
-			widthPreference.append(variableTable.getTable().getColumn(i).getWidth());
-			widthPreference.append(',');
-		}
-		if (widthPreference.length() > 0){
-			DebugUIPlugin.getDefault().getPreferenceStore().setValue(STRING_VARIABLE_PREFERENCE_KEY, widthPreference.toString());
-		}
-	}
-	
-	private boolean restoreColumnWidths() {
-		String[] columnWidthStrings = DebugUIPlugin.getDefault().getPreferenceStore().getString(STRING_VARIABLE_PREFERENCE_KEY).split(","); //$NON-NLS-1$
-		int columnCount = variableTable.getTable().getColumnCount();
-		if (columnWidthStrings.length != columnCount){
-			return false; // Preferred column sizes not stored correctly.
-		}
-		for (int i = 0; i < columnCount; i++) {
-			try{
-				int columnWidth = Integer.parseInt(columnWidthStrings[i]);
-				variableTable.getTable().getColumn(i).setWidth(columnWidth);
-			} catch (NumberFormatException e){
-				DebugUIPlugin.log(new Throwable("Problem loading persisted column sizes for StringVariablePreferencesPage",e)); //$NON-NLS-1$
-			}
-        }
-		return true;
-	}
-	
-	private void restoreDefaultColumnWidths(){
-		TableLayout layout = new TableLayout();
-		for (int i = 0; i < variableTableColumnLayouts.length; i++) {
-			layout.addColumnData(variableTableColumnLayouts[i]);
-		}
-		variableTable.getTable().setLayout(layout);
-	}
-	
-	private class SimpleVariableContentProvider implements IStructuredContentProvider {
-		/**
-		 * The content provider stores variable wrappers for use during editing.
-		 */
-		private List fWorkingSet = new ArrayList();
-		
-		public Object[] getElements(Object inputElement) {
-			return fWorkingSet.toArray();
-		}
-				
-		/**
-		 * Adds the given variable to the 'wrappers'
-		 * 
-		 * @param variable variable to add
-		 */
-		public void addVariable(VariableWrapper variable) {
-			fWorkingSet.add(variable);
-		}		
-
-		public void dispose() {
-		}
-		
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null || !(newInput instanceof IStringVariableManager)){
-				return;
-			}
-			init();
-		}
-
-		/**
-		 * Saves the edited variable state to the variable manager.
-		 */
-		public void saveChanges() {
-			IStringVariableManager manager = getVariableManager();
-			Iterator iterator = fWorkingSet.iterator();
-			List remove = new ArrayList();
-			List add = new ArrayList();
-			while (iterator.hasNext()) {
-				VariableWrapper variable = (VariableWrapper) iterator.next();
-				if (!variable.isReadOnly()) {
-					IValueVariable underlyingVariable = variable.getUnderlyingVariable();
-					if (variable.isRemoved()) {
-						if (underlyingVariable != null) {
-							// if added and removed there is no underlying variable
-							remove.add(underlyingVariable);
-						}
-					} else if (variable.isAdded()) {
-						IValueVariable vv = manager.newValueVariable(variable.getName(), variable.getDescription());
-						vv.setValue(variable.getValue());
-						add.add(vv);
-					} else if (variable.isChanged()) {
-						underlyingVariable.setValue(variable.getValue());
-						underlyingVariable.setDescription(variable.getDescription());
-					}
-				}
-			}
-			// remove
-			if (!remove.isEmpty()) {
-				manager.removeVariables((IValueVariable[]) remove.toArray(new IValueVariable[remove.size()]));
-			}
-			// add
-			if (!add.isEmpty()) {
-				try {
-					manager.addVariables((IValueVariable[]) add.toArray(new IValueVariable[add.size()]));
-				} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(getShell(), DebugPreferencesMessages.StringVariablePreferencePage_24, DebugPreferencesMessages.StringVariablePreferencePage_25, e.getStatus()); // 
-				}
-			}
-		}
-		
-		/**
-		 * Re-initializes to the variables currently stored in the manager.
-		 */
-		public void init() {
-			fWorkingSet.clear();
-			IStringVariableManager manager = getVariableManager();
-			IValueVariable[] variables = manager.getValueVariables();
-			for (int i = 0; i < variables.length; i++) {
-				fWorkingSet.add(new VariableWrapper(variables[i]));
-			}			
-		}
-		
-		/**
-		 * Returns the 'working set' of variables
-		 * 
-		 * @return the working set of variables (not yet saved)
-		 */
-		public List getWorkingSetVariables() {
-			return fWorkingSet;
-		}
-		
-	}
-	
-	class VariableWrapper {
-		
-		protected IValueVariable fVariable;
-		protected String fNewName = null;
-		protected String fNewDesc = null;
-		protected String fNewValue = null;
-		boolean fRemoved = false;
-		boolean fAdded = false;
-		
-		public VariableWrapper(IValueVariable variable) {
-			fVariable = variable;
-		}
-		
-		public VariableWrapper(String name, String desc, String value) {
-			fNewName = name;
-			fNewDesc = desc;
-			fNewValue = value;
-			fAdded = true;
-		}
-		
-		public boolean isAdded() {
-			return fAdded;
-		}
-		
-		public String getName() {
-			if (fNewName == null) {
-				return fVariable.getName();
-			}
-			return fNewName;
-		}
-		
-		public void setName(String name) {
-			fNewName = name;
-		}
-		
-		public String getDescription() {
-			if (fNewDesc == null) {
-				return fVariable.getDescription();
-			}
-			return fNewDesc;
-		}
-		
-		public String getValue() {
-			if (fNewValue == null) {
-				return fVariable.getValue();
-			}
-			return fNewValue;
-		}
-		
-		public void setValue(String value) {
-			fNewValue = value;
-		}
-		
-		public void setDescription(String desc) {
-			fNewDesc = desc;
-		}
-		
-		public boolean isChanged() {
-			return !fAdded && !fRemoved && (fNewValue != null || fNewDesc != null);
-		}
-		
-		public boolean isReadOnly() {
-			if (fVariable == null) {
-				return false;
-			}
-			return fVariable.isReadOnly();
-		}
-		
-		public boolean isContributed() {
-			if (fVariable == null) {
-				return false;
-			}
-			return fVariable.isContributed();
-		}
-		
-		public IValueVariable getUnderlyingVariable() {
-			return fVariable;
-		}
-		
-		public boolean isRemoved() {
-			return fRemoved;
-		}
-		
-		public void setRemoved(boolean removed) {
-			fRemoved = removed;
-		}
-	}
-	
-	private class SimpleVariableLabelProvider extends LabelProvider implements ITableLabelProvider, IColorProvider {
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-		public String getColumnText(Object element, int columnIndex) {
-			if (element instanceof VariableWrapper) {
-				VariableWrapper variable= (VariableWrapper) element;
-				switch (columnIndex) {
-					case 0 :
-						StringBuffer name = new StringBuffer();
-						name.append(variable.getName());
-						if (variable.isReadOnly()){
-							name.append(DebugPreferencesMessages.StringVariablePreferencePage_26);
-						}
-						return name.toString();
-					case 1:
-						String value= variable.getValue(); 
-						if (value == null) {
-							value= ""; //$NON-NLS-1$
-						}
-						return value;
-					case 2:
-						String description= variable.getDescription();
-						if (description == null) {
-							description= ""; //$NON-NLS-1$
-						}
-						return description;
-					case 3:
-						String contribution = ""; //$NON-NLS-1$
-						if (variable.isContributed()) {
-                            String pluginId = getVariableManager().getContributingPluginId(variable.getUnderlyingVariable());
-                            if (pluginId != null) {
-                                contribution = pluginId; 
-                            } else {
-                                contribution = DebugPreferencesMessages.SimpleLaunchVariablePreferencePage_23; 
-                            }
-						}
-						return contribution;
-						
-				}
-			}
-			return null;
-		}
-		public Color getForeground(Object element) {
-			return null;
-		}
-		public Color getBackground(Object element) {
-			if (element instanceof VariableWrapper) {
-				if (((VariableWrapper) element).isReadOnly()) {
-					Display display= Display.getCurrent();
-					return display.getSystemColor(SWT.COLOR_INFO_BACKGROUND);		
-				}
-			}
-			return null;
-		}
-	}
-
-	class VariableFilter 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) {
-			return !((VariableWrapper)element).isRemoved();
-		}
-		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ViewManagementPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ViewManagementPreferencePage.java
deleted file mode 100644
index faa9bad..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ViewManagementPreferencePage.java
+++ /dev/null
@@ -1,251 +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.debug.internal.ui.preferences;
-
-import java.util.Iterator;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.views.ViewContextService;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-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.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.Table;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.PerspectiveLabelProvider;
-
-/**
- * Preference page for configuring the debugger's automatic
- * view management.
- */
-public class ViewManagementPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	private CheckboxTableViewer fPerspectiveViewer;
-	private Button fTrackViewsButton;
-	private Button fResetViewsButton;
-    // This flag indicates whether or not the user has pressed the reset button
-	private boolean fResetPressed= false;
-	private PerspectiveLabelProvider fLabelProvider= null;
-    private SelectionListener fSelectionListener= new SelectionAdapter() {
-    
-        public void widgetSelected(SelectionEvent e) {
-            Object source = e.getSource();
-            if (source == fResetViewsButton) {
-                handleResetPressed();
-            } else if (source == fTrackViewsButton) {
-                handleTrackViewsToggled();
-            }
-        }
-    
-    };
-	
-	public ViewManagementPreferencePage() {
-		super();
-		setTitle(DebugPreferencesMessages.ViewManagementPreferencePage_1); 
-		setDescription(DebugPreferencesMessages.ViewManagementPreferencePage_0); 
-		setPreferenceStore(DebugUITools.getPreferenceStore());
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.VIEW_MANAGEMENT_PREFERENCE_PAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite composite= new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		composite.setFont(parent.getFont());
-		
-		createPerspectiveViewer(composite);
-		
-		createViewTrackingOptions(composite);
-		
-		Dialog.applyDialogFont(composite);
-		
-		return composite;
-	}
-
-	/**
-	 * @param composite
-	 */
-	private void createViewTrackingOptions(Composite composite) {
-		fTrackViewsButton= new Button(composite, SWT.CHECK);
-		fTrackViewsButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		fTrackViewsButton.setText(DebugPreferencesMessages.ViewManagementPreferencePage_3); 
-		fTrackViewsButton.setSelection(DebugUITools.getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_TRACK_VIEWS));
-        fTrackViewsButton.addSelectionListener(fSelectionListener);
-		
-		Label label= new Label(composite, SWT.WRAP);
-		label.setText(DebugPreferencesMessages.ViewManagementPreferencePage_4); 
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		fResetViewsButton= SWTFactory.createPushButton(composite, DebugPreferencesMessages.ViewManagementPreferencePage_5, null); 
-		((GridData) fResetViewsButton.getLayoutData()).horizontalAlignment= GridData.BEGINNING;
-		fResetViewsButton.addSelectionListener(fSelectionListener);
-		updateResetButton();
-	}
-    
-    private void handleResetPressed() {
-        fResetPressed= true;
-        fResetViewsButton.setEnabled(false);
-    }
-    
-    protected void handleTrackViewsToggled() {
-        if (fTrackViewsButton.getSelection()) {
-            // When toggled on, possibly re-enable the reset button
-            updateResetButton();
-        } else {
-            // When toggled off, disable the reset button
-            fResetViewsButton.setEnabled(false);
-        }
-    }
-
-	/**
-	 * @param parent
-	 */
-	private void createPerspectiveViewer(Composite parent) {
-		Label label= new Label(parent, SWT.WRAP);
-		label.setText(DebugPreferencesMessages.ViewManagementPreferencePage_2); 
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
-		table.setLayout(new GridLayout());
-		table.setLayoutData(new GridData(GridData.FILL_BOTH));
-		
-		fPerspectiveViewer= new CheckboxTableViewer(table);
-		PerspectiveProvider provider= new PerspectiveProvider();
-		fPerspectiveViewer.setContentProvider(provider);
-		fLabelProvider= new PerspectiveLabelProvider();
-		fPerspectiveViewer.setLabelProvider(fLabelProvider);
-		fPerspectiveViewer.setInput(this);
-		
-		checkPerspectives(getPreferenceStore().getString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES));
-	}
-	
-	private void checkPerspectives(String perspectiveList) {
-		fPerspectiveViewer.setAllChecked(false);
-		IPerspectiveRegistry registry= PlatformUI.getWorkbench().getPerspectiveRegistry();
-		Iterator perspectiveIds= ViewContextService.parseList(perspectiveList).iterator();
-		while (perspectiveIds.hasNext()) {
-			IPerspectiveDescriptor descriptor = registry.findPerspectiveWithId((String) perspectiveIds.next());
-            if (descriptor != null) {
-                fPerspectiveViewer.setChecked(descriptor, true);
-            }
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		StringBuffer buffer= new StringBuffer();
-		Object[] descriptors = fPerspectiveViewer.getCheckedElements();
-		for (int i = 0; i < descriptors.length; i++) {
-			buffer.append(((IPerspectiveDescriptor) descriptors[i]).getId()).append(',');
-		}
-		
-		getPreferenceStore().setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, buffer.toString());
-		boolean trackViews = fTrackViewsButton.getSelection();
-        getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_TRACK_VIEWS, trackViews);
-		if (fResetPressed || !trackViews) {
-            // Reset if the user has pressed reset or chosen to no longer track views
-			getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, ""); //$NON-NLS-1$
-		}
-		return super.performOk();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		checkPerspectives(getPreferenceStore().getDefaultString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES));
-		fTrackViewsButton.setSelection(getPreferenceStore().getDefaultBoolean(IInternalDebugUIConstants.PREF_TRACK_VIEWS));
-		fResetPressed= false;
-		updateResetButton();
-		super.performDefaults();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}
-	
-	/**
-	 * Updates enablement of the reset button.
-	 * Enable if either persisted view collection is not empty.
-     * Always disable if "track views" is turned off.
-	 */
-	private void updateResetButton() {
-		boolean enableReset= !"".equals(getPreferenceStore().getString(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS)); //$NON-NLS-1$
-        // Only enable the button if there are views to clear, the user hasn't pressed the reset
-        // button, and the option to "track views" is turned on.
-		fResetViewsButton.setEnabled(enableReset && !fResetPressed && fTrackViewsButton.getSelection());
-	}
-
-	private static class PerspectiveProvider implements IStructuredContentProvider {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return PlatformUI.getWorkbench().getPerspectiveRegistry().getPerspectives();
-		}
-		
-		/* (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.IContentProvider#dispose()
-         */
-        public void dispose() {
-        }
-		
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (fLabelProvider != null) {
-			fLabelProvider.dispose();
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddContainerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddContainerAction.java
deleted file mode 100644
index e3f1ff3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddContainerAction.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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * The action to add a new source container.
- * Used by the CommonSourceNotFoundEditor, the launch configuration source tab,
- * and the EditSourceLookupPathDialog.
- */
-public class AddContainerAction extends SourceContainerAction {
-	
-	private ISourceLookupDirector fDirector;
-	
-	public AddContainerAction() {
-		super(SourceLookupUIMessages.sourceTab_addButton); 
-	}
-	
-	/**
-	 * Prompts for a project to add.
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */	
-	public void run() {
-		AddSourceContainerDialog dialog = new AddSourceContainerDialog(getShell(), getViewer(), fDirector);
-		dialog.open();			
-	}
-	
-	public void setSourceLookupDirector(ISourceLookupDirector director) {
-		fDirector = director;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		if(selection == null || selection.isEmpty()) {
-			return true;
-		} 
-		return getViewer().getTree().getSelection()[0].getParentItem()==null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
deleted file mode 100644
index 5bb6193..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
+++ /dev/null
@@ -1,160 +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.debug.internal.ui.sourcelookup;
-
-import java.util.ArrayList;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-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.TableViewer;
-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.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The dialog for adding new source containers. Presents the user with a list of
- * source container types and allows them to select one.
- * 
- * @since 3.0
- */
-public class AddSourceContainerDialog extends TitleAreaDialog {
-	
-	private TableViewer fViewer;
-	private SourceContainerViewer fSourceContainerViewer;
-	private boolean fDoubleClickSelects = true;
-	private ISourceLookupDirector fDirector;
-	
-	/**
-	 * Constructor
-	 */
-	public AddSourceContainerDialog(Shell shell, SourceContainerViewer viewer, ISourceLookupDirector director) {		
-		super(shell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fSourceContainerViewer=viewer;		
-		fDirector = director;
-	}
-	
-	/**
-	 * Creates the dialog area to display source container types that are "browseable"
-	 */
-	protected Control createDialogArea(Composite ancestor) {			
-		
-		getShell().setText(SourceLookupUIMessages.addSourceLocation_title); 
-		setTitle(SourceLookupUIMessages.addSourceLocation_description); 
-		setTitleImage(DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_ADD_SRC_LOC_WIZ));
-		
-		Composite parent = new Composite(ancestor, SWT.NULL);
-		GridData gd= new GridData(GridData.FILL_BOTH);
-		GridLayout topLayout = new GridLayout();
-		topLayout.numColumns = 1;
-		parent.setLayout(topLayout);
-		parent.setLayoutData(gd);	
-				
-		ISourceContainerType[] types = filterTypes(DebugPlugin.getDefault().getLaunchManager().getSourceContainerTypes());
-		
-		fViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE);
-		final Table table = fViewer.getTable();
-		gd = new GridData(GridData.FILL_BOTH);
-		table.setLayoutData(gd);
-
-		if (fDoubleClickSelects) {
-			table.addSelectionListener(new SelectionAdapter() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					if (table.getSelectionCount() == 1)
-						okPressed();
-				}
-			});
-		}
-		
-		fViewer.setLabelProvider(new SourceContainerLabelProvider());
-		fViewer.setContentProvider(new ArrayContentProvider());			
-		fViewer.setComparator(new ViewerComparator());
-		fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection selection = event.getSelection();
-				String desc = null;
-				if (!selection.isEmpty()) {
-					ISourceContainerType type = (ISourceContainerType) ((IStructuredSelection)selection).getFirstElement();
-					desc = type.getDescription();
-				}
-				setMessage(desc);
-			}
-		});
-		if(types.length != 0) {	
-			fViewer.setInput(types);
-		}
-		Dialog.applyDialogFont(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getShell(), IDebugHelpContextIds.ADD_SOURCE_CONTAINER_DIALOG);
-		return parent;
-	}	
-	
-	/**
-	 * Removes types without browsers from the provided list of types.
-	 * @param types the complete list of source container types
-	 * @return the list of source container types that have browsers
-	 */
-	private ISourceContainerType[] filterTypes(ISourceContainerType[] types){
-		ArrayList validTypes = new ArrayList();
-		for (int i=0; i< types.length; i++) {
-			ISourceContainerType type = types[i];
-			if (fDirector.supportsSourceContainerType(type)) {
-				ISourceContainerBrowser sourceContainerBrowser = DebugUITools.getSourceContainerBrowser(type.getId());
-				if(sourceContainerBrowser != null && sourceContainerBrowser.canAddSourceContainers(fDirector)) {
-					validTypes.add(type);
-				}
-			}
-		}	
-		return (ISourceContainerType[]) validTypes.toArray(new ISourceContainerType[validTypes.size()]);
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		//single selection dialog, so take first item in array
-		//there will always be a selected item since we set it with viewer.setSelection
-		ISourceContainerType type = (ISourceContainerType) ((IStructuredSelection) fViewer.getSelection()).getFirstElement();
-        if (type != null) {
-            ISourceContainerBrowser browser = DebugUITools.getSourceContainerBrowser(type.getId());
-            if (browser != null) {
-                ISourceContainer[] results = browser.addSourceContainers(getShell(), fDirector);
-                if (results != null && results.length > 0) {
-                    fSourceContainerViewer.addEntries(results);
-                }
-            }
-        }
-		super.okPressed();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/BasicContainerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/BasicContainerContentProvider.java
deleted file mode 100644
index b629d96..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/BasicContainerContentProvider.java
+++ /dev/null
@@ -1,90 +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.debug.internal.ui.sourcelookup;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-/**
- * Provides content for a tree viewer that shows only containers.
- * 
- * @since 3.0
- */
-public class BasicContainerContentProvider implements ITreeContentProvider {
-
-	private boolean fShowClosedProjects = true;
-	/**
-	 * Creates a new ResourceContentProvider.
-	 */
-	public BasicContainerContentProvider() {
-	}
-	/**
-	 * The visual part that is using this content provider is about
-	 * to be disposed. Deallocate all allocated SWT resources.
-	 */
-	public void dispose() {
-	}
-	
-	/**
-	 * @see ITreeContentProvider#getChildren
-	 */
-	public Object[] getChildren(Object element) {
-		if (element instanceof IWorkspaceRoot) {
-			// check if closed projects should be shown
-			IProject[] allProjects = ((IWorkspaceRoot) element).getProjects();
-			if (fShowClosedProjects)
-				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();
-		}
-		return new Object[0];
-	}
-	
-	/**
-	 * @see ITreeContentProvider#getElements
-	 */
-	public Object[] getElements(Object element) {
-		return getChildren(element);
-	}
-	
-	/**
-	 * @see ITreeContentProvider#getParent
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof IResource)
-			return ((IResource) element).getParent();
-		return null;
-	}
-	
-	/**
-	 * @see ITreeContentProvider#hasChildren
-	 */
-	public boolean hasChildren(Object element) {
-		return getChildren(element).length > 0;
-	}
-	
-	/**
-	 * @see IContentProvider#inputChanged
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/DownAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/DownAction.java
deleted file mode 100644
index 673b78b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/DownAction.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.debug.internal.ui.sourcelookup;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * The action for sorting the order of source containers in the dialog.
- * 
- */
-public class DownAction	extends SourceContainerAction {
-	
-	public DownAction() {
-		super(SourceLookupUIMessages.sourceTab_downButton);  
-	}
-	/**
-	 * @see IAction#run()
-	 */
-	public void run() {
-		List targets = getOrderedSelection();
-		if (targets.isEmpty()) {
-			return;
-		}
-		List list = getEntriesAsList();
-		int bottom = list.size() - 1;
-		int index = 0;
-		for (int i = targets.size() - 1; i >= 0; i--) {
-			Object target = targets.get(i);
-			index = list.indexOf(target);
-			if (index < bottom) {
-				bottom = index + 1;
-				Object temp = list.get(bottom);
-				list.set(bottom, target);
-				list.set(index, temp);
-			}
-			bottom = index;
-		} 
-		setEntries(list);
-	}
-	
-	/**
-	 * @see SelectionListenerAction#updateSelection(IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		return !selection.isEmpty() && !isIndexSelected(selection, getEntriesAsList().size() - 1) && getViewer().getTree().getSelection()[0].getParentItem()==null;	
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/EditContainerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/EditContainerAction.java
deleted file mode 100644
index 9eadd34..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/EditContainerAction.java
+++ /dev/null
@@ -1,90 +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.debug.internal.ui.sourcelookup;
-
-import java.util.Iterator;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Action used to edit source containers on a source lookup path
- */
-public class EditContainerAction extends SourceContainerAction {
-	
-	private ISourceLookupDirector fDirector;
-	private ISourceContainer[] fContainers;
-	private ISourceContainerBrowser fBrowser;
-	
-	public EditContainerAction() {
-		super(SourceLookupUIMessages.EditContainerAction_0); 
-	}
-	
-	/**
-	 * Prompts for a project to add.
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */	
-	public void run() {
-		ISourceContainer[] replacements = fBrowser.editSourceContainers(getShell(), fDirector, fContainers);
-		int j = 0;
-		ISourceContainer[] existing = getViewer().getEntries();
-		for (int i = 0; i < existing.length && j < replacements.length; i++) {
-			ISourceContainer toBeReplaced = fContainers[j];
-			ISourceContainer container = existing[i];
-			if (container.equals(toBeReplaced)) {
-				existing[i] = replacements[j];
-				j++;
-			}
-		}
-		getViewer().setEntries(existing);
-	}
-	
-	public void setSourceLookupDirector(ISourceLookupDirector director) {
-		fDirector = director;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		if(selection == null || selection.isEmpty()) {
-			return false;
-		}
-		if (getViewer().getTree().getSelection()[0].getParentItem()==null) {
-			// can only edit top level items of same type
-			fContainers = new ISourceContainer[selection.size()];
-			Iterator iterator = selection.iterator();
-			ISourceContainer container = (ISourceContainer) iterator.next();
-			ISourceContainerType type = container.getType();
-			fContainers[0] = container;
-			int i = 1;
-			while (iterator.hasNext()) {
-				container = (ISourceContainer) iterator.next();
-				fContainers[i] = container;
-				i++;
-				if (!container.getType().equals(type)) {
-					return false;
-				}
-			}
-			// all the same type, see if editing is supported
-			fBrowser = DebugUITools.getSourceContainerBrowser(type.getId());
-			if (fBrowser != null) {
-				return fBrowser.canEditSourceContainers(fDirector, fContainers);
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/EditSourceLookupPathAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/EditSourceLookupPathAction.java
deleted file mode 100644
index 641b014..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/EditSourceLookupPathAction.java
+++ /dev/null
@@ -1,86 +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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.views.launch.LaunchView;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.sourcelookup.SourceLookupDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * The action for editing the source lookup path. Brings up the 
- * EditSourceLookupPathDialog.
- * 
- * @since 3.0
- */
-public class EditSourceLookupPathAction extends SelectionListenerAction {
-	
-	private ISourceLookupDirector director = null;
-	private LaunchView fView = null;
-	
-	public EditSourceLookupPathAction(LaunchView view) {
-		super(SourceLookupUIMessages.EditSourceLookupPathAction_0); 
-		setEnabled(false);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.EDIT_SOURCELOOKUP_ACTION);
-		setImageDescriptor(DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_SRC_LOOKUP_MENU));
-		fView = view;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		director = null;
-		if (selection.size() == 1) {
-			Object object = selection.getFirstElement();
-			ILaunch launch = null;
-			if (object instanceof IDebugElement) {
-				launch = ((IDebugElement)object).getLaunch();
-			} else if (object instanceof ILaunch) {
-				launch = (ILaunch)object;
-			}
-			if (launch != null && launch.getLaunchConfiguration() != null &&
-					launch.getSourceLocator() instanceof ISourceLookupDirector) {
-				director = (ISourceLookupDirector) launch.getSourceLocator();
-			}
-		}
-		return director != null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		Shell shell = DebugUIPlugin.getShell();		
-		SourceLookupDialog dialog = new SourceLookupDialog(shell, director);
-		if (dialog.open() == Window.OK) {
-			ISelection selection = fView.getViewer().getSelection();
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection) selection;
-				if (ss.size() == 1) {
-					IWorkbenchPage page = fView.getSite().getPage();
-					SourceLookupManager.getDefault().displaySource(ss.getFirstElement(), page, true);
-				}
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/LookupSourceAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/LookupSourceAction.java
deleted file mode 100644
index 8d13d4e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/LookupSourceAction.java
+++ /dev/null
@@ -1,74 +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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.views.launch.LaunchView;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * Does source lookup for the selected stack frame again.
- * 
- * @since 3.0
- */
-public class LookupSourceAction extends SelectionListenerAction {
-	
-	private ISourceLookupDirector director = null;
-	private LaunchView fView = null;
-	private IStackFrame frame = null;
-	
-	public LookupSourceAction(LaunchView view) {
-		super(SourceLookupUIMessages.LookupSourceAction_0); 
-		setEnabled(false);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.LOOKUP_SOURCE_ACTION);
-		fView = view;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		director = null;
-		frame = null;
-		if (selection.size() == 1) {
-			Object object = selection.getFirstElement();
-			if (object instanceof IStackFrame) {
-				frame = (IStackFrame)object;
-				ILaunch launch = frame.getLaunch();
-				if (launch != null && launch.getLaunchConfiguration() != null &&
-						launch.getSourceLocator() instanceof ISourceLookupDirector) {
-					director = (ISourceLookupDirector) launch.getSourceLocator();
-				}
-			}
-		}
-		return director != null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		ISelection selection = fView.getViewer().getSelection();
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			if (ss.size() == 1) {
-				IWorkbenchPage page = fView.getSite().getPage();
-				SourceLookupManager.getDefault().displaySource(ss.getFirstElement(), page, true);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/Prompter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/Prompter.java
deleted file mode 100644
index 6be4e45..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/Prompter.java
+++ /dev/null
@@ -1,86 +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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Prompts the user in the UI (asynchronously), on behalf of a non-UI client,
- * blocking the calling thread until a response is received.
- * <p>
- * This status handler is registered for for the debug UI plug-in,
- * with a status code of <code>STATUS_HANDLER_PROMPT</code>.
- * </p>
- * @since 3.0
- */
-public class Prompter implements IStatusHandler {
-	/**
-	 * Prompts the user for input based on the given status and source
-	 * object, blocking the calling thread until the status is resolved.
-	 * 
-	 * @param status client status code for which a status handler must
-	 *  be registered
-	 * @param source object requesting the status to be resolved
-	 * @return result of resolving the given status
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(final IStatus status, final Object source) throws CoreException {
-		DebugPlugin dp = DebugPlugin.getDefault();
-		// on shutdown the debug plug-in can be null
-		if (dp == null) {
-			throw new CoreException(new Status(IStatus.INFO,
-					IDebugUIConstants.PLUGIN_ID,
-					IStatus.OK,
-					SourceLookupUIMessages.Prompter_0,
-					null));
-		}
-		final IStatusHandler handler = dp.getStatusHandler(status);
-		if (handler == null) {
-			throw new CoreException(new Status(IStatus.ERROR,
-									IDebugUIConstants.PLUGIN_ID,
-									IStatus.OK,
-									SourceLookupUIMessages.Prompter_0,
-									null));
-		}
-		Display display = DebugUIPlugin.getStandardDisplay();
-		if (display.getThread().equals(Thread.currentThread())) {
-			return handler.handleStatus(status, source);
-		}
-		final Object[] result = new Object[1];
-		final CoreException[] exception = new CoreException[1];
-		final Object lock = this;		
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					result[0] = handler.handleStatus(status, source);
-				} catch (CoreException e) {
-					exception[0] = e;
-				}
-				synchronized (lock) {
-					lock.notifyAll();
-				}
-			}
-		};
-		DebugUIPlugin.getStandardDisplay().syncExec(r);
-		
-		if (exception[0] != null ) {
-			throw exception[0];
-		}
-		return result[0];
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/RemoveAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/RemoveAction.java
deleted file mode 100644
index 7d0efb2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/RemoveAction.java
+++ /dev/null
@@ -1,45 +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.debug.internal.ui.sourcelookup;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * The action used to remove source containers in the source location dialog/tab.
- * 
- */
-public class RemoveAction extends SourceContainerAction {
-	public RemoveAction() {
-		super(SourceLookupUIMessages.sourceTab_removeButton); 
-	}
-	/**
-	 * Removes all selected entries.
-	 * 
-	 * @see IAction#run()
-	 */
-	public void run() {
-		List targets = getOrderedSelection();
-		List list = getEntriesAsList();
-		list.removeAll(targets);
-		setEntries(list);
-	}
-	
-	/**
-	 * @see SelectionListenerAction#updateSelection(IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		//check that something is selected and it is a root tree node.
-		return !selection.isEmpty() && getViewer().getTree().getSelection()[0].getParentItem()==null;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/ResolveDuplicatesHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/ResolveDuplicatesHandler.java
deleted file mode 100644
index 51174e7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/ResolveDuplicatesHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-
-/**
- * Status handler to prompt for dupicate source element resolution.
- * 
- * @since 3.0
- */
-public class ResolveDuplicatesHandler implements IStatusHandler {
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-	 */
-	public Object handleStatus(IStatus status, Object source) throws CoreException {
-		Object[] args = (Object[])source;
-		List sources = (List) args[1];
-		return resolveSourceElement(sources);
-	}
-	
-	public Object resolveSourceElement(List sources) {
-		Object file = null;
-		sources = removeSourceNotFoundEditors(sources);
-		if(sources.size() == 1) {
-			return sources.get(0);
-		} else if(sources.size() == 0) {
-			return null;
-		}
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(DebugUIPlugin.getShell(), new SourceElementLabelProvider());
-		dialog.setMultipleSelection(false);
-		dialog.setTitle(SourceLookupUIMessages.ResolveDuplicatesHandler_0); 
-		dialog.setMessage(SourceLookupUIMessages.ResolveDuplicatesHandler_1); 
-		dialog.setElements(sources.toArray());
-		dialog.open();											
-		if(dialog.getReturnCode() == Window.OK) {
-			file = dialog.getFirstResult();		
-		}
-		return file;
-	}
-	
-	/**
-	 * Remove extra source not found editors, if any.
-	 * If multiple source not found editors and no "real" source inputs,
-	 * return the first source not found editor.
-	 * @param sources the list to be filtered
-	 * @return the filtered list, may be empty
-	 */
-	private List removeSourceNotFoundEditors(List sources){
-		Iterator iterator = sources.iterator();
-		List filteredList = new ArrayList();
-		Object next;
-		while(iterator.hasNext()) {
-			next = iterator.next();
-			if (!(next instanceof CommonSourceNotFoundEditor)) {
-				filteredList.add(next);
-			}
-		}
-		if (filteredList.isEmpty() && sources.get(0) != null) {
-			filteredList.add(sources.get(0));
-		}
-		return filteredList;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/RestoreDefaultAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/RestoreDefaultAction.java
deleted file mode 100644
index 5020eb6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/RestoreDefaultAction.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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * The action for adding the default container to the list.
- * 
- * @since 3.0
- */
-public class RestoreDefaultAction extends SourceContainerAction {
-	
-	private ISourceLookupDirector fDirector;
-
-	public RestoreDefaultAction() {
-		super(SourceLookupUIMessages.sourceTab_defaultButton); 
-	}
-	/**
-	 * @see IAction#run()
-	 */
-	public void run() {		
-		ISourceContainer[] containers = new ISourceContainer[1];
-		containers[0] = new DefaultSourceContainer();
-		containers[0].init(fDirector);
-		getViewer().setEntries(containers);
-		setEnabled(false);
-	}
-
-	public void setSourceLookupDirector(ISourceLookupDirector director) {
-		fDirector = director;
-	}
-
-	/**
-	 * @see SelectionListenerAction#updateSelection(IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		//disable if selection is empty, default already present, or non-root node selected
-		ISourceContainer[] containers = getViewer().getEntries();
-		if(containers != null && containers.length == 1) {
-			if(containers[0] instanceof DefaultSourceContainer) {
-				return false;
-			}
-		}		
-		return true;	
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerAction.java
deleted file mode 100644
index e9acaf1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerAction.java
+++ /dev/null
@@ -1,180 +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.debug.internal.ui.sourcelookup;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.SelectionListenerAction;
-
-/**
- * The abstract class for all source lookup actions.
- * 
- * @since 3.0
- */
-public abstract class SourceContainerAction extends SelectionListenerAction {
-	//the viewer that the action is operating on
-	private SourceContainerViewer fViewer;
-	//the button that is used to invoke the action
-	private Button fButton;
-	//the shell used to realize this action's dialog (if any)
-	private Shell fShell;
-	
-	/**
-	 * The constructor for the action
-	 * @param label the label for the action's button
-	 */
-	public SourceContainerAction(String label) {
-		super(label);		
-	}
-	
-	/**
-	 * Sets the viewer on which this action operates.
-	 * 
-	 * @param viewer the viewer on which this action operates
-	 */
-	public void setViewer(SourceContainerViewer viewer) {
-		if (fViewer != null) {
-			fViewer.removeSelectionChangedListener(this);
-		}
-		fViewer = viewer;
-		if (fViewer != null) {
-			fViewer.addSelectionChangedListener(this);
-			update();
-		}
-	}
-	
-	/**
-	 * Returns the viewer on which this action operates.
-	 * 
-	 * @return the viewer on which this action operates
-	 */
-	protected SourceContainerViewer getViewer() {
-		return fViewer;
-	}
-	
-	/**
-	 * Returns the selected items in the list, in the order they are
-	 * displayed.
-	 * 
-	 * @return targets for an action
-	 */
-	protected List getOrderedSelection() {
-		List targets = new ArrayList();
-		List selection =
-			((IStructuredSelection) getViewer().getSelection()).toList();
-		ISourceContainer[] entries = getViewer().getEntries();
-		for (int i = 0; i < entries.length; i++) {
-			ISourceContainer target = entries[i];
-			if (selection.contains(target)) {
-				targets.add(target);
-			}
-		}
-		return targets;
-	}
-	
-	/**
-	 * Returns a list (copy) of the entries in the viewer
-	 */
-	protected List getEntriesAsList() {
-		ISourceContainer[] entries = getViewer().getEntries();
-		List list = new ArrayList(entries.length);
-		for (int i = 0; i < entries.length; i++) {
-			list.add(entries[i]);
-		}
-		return list;
-	}
-	
-	/**
-	 * Updates the entries to the entries in the given list
-	 */
-	protected void setEntries(List list) {
-		getViewer().setEntries(
-				(ISourceContainer[]) list.toArray(new ISourceContainer[list.size()]));
-		// update all selection listeners
-		getViewer().setSelection(getViewer().getSelection());
-	}
-	
-	/**
-	 * Returns whether the item at the given index in the list
-	 * (visually) is selected.
-	 */
-	protected boolean isIndexSelected(
-			IStructuredSelection selection,
-			int index) {
-		if (selection.isEmpty()) {
-			return false;
-		}
-		Iterator entries = selection.iterator();
-		List list = getEntriesAsList();
-		while (entries.hasNext()) {
-			Object next = entries.next();
-			if (list.indexOf(next) == index) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Sets the button that invokes this action
-	 */
-	public void setButton(Button button) {
-		fButton = button;
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				run();
-			}
-		});
-	}
-	
-	/**
-	 * @see IAction#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		if (fButton != null) {
-			fButton.setEnabled(enabled);
-		}
-	}
-	
-	/**
-	 * Updates the enabled state.
-	 */
-	protected void update() {
-		selectionChanged((IStructuredSelection) getViewer().getSelection());
-	}
-	
-	/**
-	 * Returns the shell used to realize this action's dialog (if any).
-	 */
-	protected Shell getShell() {
-		if (fShell == null) {
-			fShell = getViewer().getControl().getShell();
-		}
-		return fShell;
-	}
-	
-	/**
-	 * Sets the shell used to realize this action's dialog (if any).
-	 */
-	public void setShell(Shell shell) {
-		fShell = shell;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerAdapterFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerAdapterFactory.java
deleted file mode 100644
index cc690aa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerAdapterFactory.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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Adapter factory for standard source containers.
- * 
- * @since 3.0
- */
-public class SourceContainerAdapterFactory 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 (adapterType.equals(IWorkbenchAdapter.class)) {
-			return new SourceContainerWorkbenchAdapter();
-		}
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] {IWorkbenchAdapter.class};
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java
deleted file mode 100644
index 83b09cc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java
+++ /dev/null
@@ -1,88 +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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Label provider for source containers and source container types.
- * 
- * @since 3.0
- */
-public class SourceContainerLabelProvider extends LabelProvider {
-	
-	private ILabelProvider fLabelProvider = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		// first allow workbench adapter to provide image
-		Image image = getWorkbenchLabelProvider().getImage(element);
-		if (image == null) {
-			ISourceContainerType type = null;
-			if (element instanceof ISourceContainer) {
-				type = ((ISourceContainer)element).getType();
-			} else if (element instanceof ISourceContainerType) {
-				type = (ISourceContainerType) element;
-			}
-			if (type != null) {
-				// next consult contributed image
-				image = DebugUITools.getSourceContainerImage(type.getId());
-			}
-		}		
-		if (image != null) {
-			return image;
-		}
-		return super.getImage(element);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		// first, allo workbench adapter to provide label
-		String label = getWorkbenchLabelProvider().getText(element);
-		if (label == null || label.length() == 0) {
-			if (element instanceof ISourceContainer) {
-				return ((ISourceContainer) element).getName(); 
-			} else if (element instanceof ISourceContainerType) {
-				return ((ISourceContainerType)element).getName();
-			}
-		} else {
-			return label;
-		}
-		return super.getText(element);
-	}
-	
-	private ILabelProvider getWorkbenchLabelProvider() {
-		if (fLabelProvider == null) {
-			fLabelProvider = new WorkbenchLabelProvider();
-		}
-		return fLabelProvider;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (fLabelProvider != null) {
-			fLabelProvider.dispose();
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerViewer.java
deleted file mode 100644
index 001c09c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerViewer.java
+++ /dev/null
@@ -1,210 +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
- *     Pawel Piech - Bug 173306: When editing source lookup, new source
- *     					containers should be added at the top of the list
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The viewer containing the source containers in the 
- * SourceContainerLookupTab and the EditSourceLookupPathDialog.
- * It is a tree viewer since the containers are represented in tree form.
- * 
- * @since 3.0
- */
-public class SourceContainerViewer extends TreeViewer {
-	
-	/**
-	 * Whether enabled/editable.
-	 */
-	private boolean fEnabled = true;
-	/**
-	 * The parent panel
-	 */
-	private SourceLookupPanel fPanel;	
-	/**
-	 * The source container entries displayed in this viewer
-	 */
-	protected List fEntries = new ArrayList();
-	
-	class ContentProvider implements ITreeContentProvider {
-		
-		/**
-		 * @see IStructuredContentProvider#getElements(Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return getEntries();
-		}
-		
-		/**
-		 * @see IContentProvider#dispose()
-		 */
-		public void dispose() {
-		}
-		
-		/**
-		 * @see IContentProvider#inputChanged(Viewer, Object, Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-		
-		/** 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			try {
-				return ((ISourceContainer)parentElement).getSourceContainers();
-			} catch (CoreException e) {
-				return new Object[0];
-			}
-		}
-		
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			return null;
-		}
-		
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((ISourceContainer)element).isComposite();				
-		}
-		
-	}
-	
-	/**
-	 * Creates a runtime classpath viewer with the given parent.
-	 *
-	 * @param parent the parent control
-	 * @param panel the panel hosting this viewer
-	 */
-	public SourceContainerViewer(Composite parent, SourceLookupPanel panel) {
-		super(parent);
-		setContentProvider(new ContentProvider());
-		SourceContainerLabelProvider lp = new SourceContainerLabelProvider();
-		setLabelProvider(lp);		
-		fPanel = panel;
-	}	
-	
-	/**
-	 * Sets the entries in this viewer 
-	 * 
-	 * @param entries source container entries
-	 */
-	public void setEntries(ISourceContainer[] entries) {
-		fEntries.clear();
-		for (int i = 0; i < entries.length; i++) {
-			if(entries[i] != null)
-				fEntries.add(entries[i]);
-		}
-		if (getInput() == null) {
-			setInput(fEntries);
-			//select first item in list
-			if(!fEntries.isEmpty() && fEntries.get(0)!=null)
-				setSelection(new StructuredSelection(fEntries.get(0)));			
-		} else {
-			refresh();
-		}
-		fPanel.setDirty(true);
-		fPanel.updateLaunchConfigurationDialog(); 
-	}
-	
-	/**
-	 * Returns the entries in this viewer
-	 * 
-	 * @return the entries in this viewer
-	 */
-	public ISourceContainer[] getEntries() {
-		return (ISourceContainer[])fEntries.toArray(new ISourceContainer[fEntries.size()]);
-	}
-	
-	/**
-	 * Adds the given entries to the list. If there is no selection
-	 * in the list, the entries are added at the end of the list, 
-	 * otherwise the new entries are added before the (first) selected
-	 * entry. The new entries are selected.
-	 * 
-	 * @param entries additions
-	 */
-	public void addEntries(ISourceContainer[] entries) {
-        int index = 0;
-		IStructuredSelection sel = (IStructuredSelection)getSelection();
-		if (!sel.isEmpty()) {
-            index = fEntries.indexOf(sel.getFirstElement());
-        }
-		for (int i = 0; i < entries.length; i++) {
-			if (!fEntries.contains(entries[i])) {
-				fEntries.add(index, entries[i]);
-				index++;
-			}
-		}
-		
-		refresh();
-		if(entries.length > 0)
-			setSelection(new StructuredSelection(entries));
-		fPanel.setDirty(true);
-		fPanel.updateLaunchConfigurationDialog();
-	}	
-	
-	/**
-	 * Enables/disables this viewer. Note the control is not disabled, since
-	 * we still want the user to be able to scroll if required to see the
-	 * existing entries. Just actions should be disabled.
-	 */
-	public void setEnabled(boolean enabled) {
-		fEnabled = enabled;
-		// fire selection change to upate actions
-		setSelection(getSelection());
-	}	
-	
-	/**
-	 * Returns whether this viewer is enabled
-	 */
-	public boolean isEnabled() {
-		return fEnabled;
-	}	
-		
-	/**
-	 * Returns the index of an equivalent entry, or -1 if none.
-	 * 
-	 * @return the index of an equivalent entry, or -1 if none
-	 */
-	public int indexOf(ISourceContainer entry) {
-		return fEntries.indexOf(entry);
-	}
-	
-	/**
-	 * Returns the source locator associated with the parent panel.
-	 * 
-	 * @return the source locator
-	 */
-	public ISourceLookupDirector getSourceLocator()
-	{
-		return fPanel.fLocator;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
deleted file mode 100644
index 7190bd5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
+++ /dev/null
@@ -1,73 +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.debug.internal.ui.sourcelookup;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.containers.ArchiveSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Workbench adapter for standard source containers.
- * 
- * @since 3.0
- */
-public class SourceContainerWorkbenchAdapter implements IWorkbenchAdapter {
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object o) {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-	 */
-	public ImageDescriptor getImageDescriptor(Object object) {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-	 */
-	public String getLabel(Object o) {
-		if (o instanceof DirectorySourceContainer) {
-			DirectorySourceContainer container = (DirectorySourceContainer) o;
-			File file = container.getDirectory();
-			IPath path = new Path(file.getAbsolutePath());
-			return SourceElementWorkbenchAdapter.getQualifiedName(path);
-		}
-		if (o instanceof FolderSourceContainer) {
-			FolderSourceContainer container = (FolderSourceContainer) o;
-			return SourceElementWorkbenchAdapter.getQualifiedName(container.getContainer().getFullPath());
-		}
-		if (o instanceof ArchiveSourceContainer) {
-			ArchiveSourceContainer container = (ArchiveSourceContainer)o;
-			return SourceElementWorkbenchAdapter.getQualifiedName(container.getFile().getFullPath());
-		}		
-		if (o instanceof ExternalArchiveSourceContainer) {
-			ExternalArchiveSourceContainer container = (ExternalArchiveSourceContainer)o;
-			IPath path = new Path(container.getName());
-			return SourceElementWorkbenchAdapter.getQualifiedName(path);
-		}		
-		return ""; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object o) {
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementAdapterFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementAdapterFactory.java
deleted file mode 100644
index 6c76f83..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementAdapterFactory.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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Adapter factory for source elements.
- * 
- * @since 3.0
- */
-public class SourceElementAdapterFactory 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 (adapterType.equals(IWorkbenchAdapter.class)) {
-			return new SourceElementWorkbenchAdapter();
-		}
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] {IWorkbenchAdapter.class};
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementLabelProvider.java
deleted file mode 100644
index ea9c105..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementLabelProvider.java
+++ /dev/null
@@ -1,61 +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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * A label provider for source elements.
- * 
- * @since 3.0
- */
-public class SourceElementLabelProvider extends LabelProvider {
-	
-	private ILabelProvider fLabelProvider = null;
-	
-	
-	
-	private ILabelProvider getWorkbenchLabelProvider() {
-		if (fLabelProvider == null) {
-			fLabelProvider = new WorkbenchLabelProvider();
-		}
-		return fLabelProvider;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (fLabelProvider != null) {
-			fLabelProvider.dispose();
-		}
-	}	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		return getWorkbenchLabelProvider().getImage(element);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		if (element instanceof IResource) {
-			return SourceElementWorkbenchAdapter.getQualifiedName(((IResource)element).getFullPath());
-		}
-		return getWorkbenchLabelProvider().getText(element);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementWorkbenchAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementWorkbenchAdapter.java
deleted file mode 100644
index f993e2f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceElementWorkbenchAdapter.java
+++ /dev/null
@@ -1,89 +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.debug.internal.ui.sourcelookup;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
-import org.eclipse.debug.core.sourcelookup.containers.ZipEntryStorage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Workbench adapter for source elements.
- * 
- * @since 3.0
- */
-public class SourceElementWorkbenchAdapter implements IWorkbenchAdapter {
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object o) {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-	 */
-	public ImageDescriptor getImageDescriptor(Object o) {
-		if (o instanceof LocalFileStorage || o instanceof ZipEntryStorage) {
-			return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE);
-		}
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-	 */
-	public String getLabel(Object o) {
-		if (o instanceof LocalFileStorage) {
-			LocalFileStorage storage = (LocalFileStorage) o;
-			IPath path = storage.getFullPath();
-			return getQualifiedName(path);
-		}
-		if (o instanceof ZipEntryStorage) {
-			ZipEntryStorage storage = (ZipEntryStorage)o;
-			StringBuffer buffer = new StringBuffer();
-			buffer.append(storage.getZipEntry().getName());
-			buffer.append(" - "); //$NON-NLS-1$
-			buffer.append(storage.getArchive().getName());
-			return buffer.toString();
-		}
-		return ""; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object o) {
-		return null;
-	}
-	
-	public static String getQualifiedName(IPath path) {
-		StringBuffer buffer = new StringBuffer();
-		String[] segments = path.segments();
-		if (segments.length > 0) {
-			buffer.append(path.lastSegment());
-			if (segments.length > 1) {
-				buffer.append(" - "); //$NON-NLS-1$
-				if (path.getDevice() != null) {
-					buffer.append(path.getDevice());	
-				}
-				for (int i = 0; i < segments.length - 1; i++) {
-					buffer.append(File.separatorChar);
-					buffer.append(segments[i]);
-				}
-			}
-			return buffer.toString();
-		}
-		return ""; //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupFacility.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupFacility.java
deleted file mode 100644
index 2f9a85f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupFacility.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.InstructionPointerManager;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.internal.ui.views.launch.Decoration;
-import org.eclipse.debug.internal.ui.views.launch.DecorationManager;
-import org.eclipse.debug.internal.ui.views.launch.SourceNotFoundEditorInput;
-import org.eclipse.debug.internal.ui.views.launch.StandardDecoration;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugEditorPresentation;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IInstructionPointerPresentation;
-import org.eclipse.debug.ui.ISourcePresentation;
-import org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditorInput;
-import org.eclipse.debug.ui.sourcelookup.ISourceLookupResult;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IReusableEditor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Utility methods for looking up and displaying source.
- * 
- * @since 3.1
- */
-public class SourceLookupFacility implements IPageListener, IPartListener2, IPropertyChangeListener {
-    
-    /**
-     * Singleton source lookup facility
-     */
-    private static SourceLookupFacility fgDefault;
-    
-    /**
-     * Contains a map of the editor to use for each workbench
-     * page, when the 'reuse editor' preference is on. 
-     */
-    private Map fEditorsByPage;
-    
-    /**
-     * Used to generate annotations for stack frames
-     */
-    private IInstructionPointerPresentation fPresentation = (IInstructionPointerPresentation) DebugUITools.newDebugModelPresentation();
-    
-    /**
-     * Whether to re-use editors when displaying source.
-     */
-    private boolean fReuseEditor = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_REUSE_EDITOR);
-	
-    /**
-     * Returns the source lookup facility
-     * @return
-     */
-    public static SourceLookupFacility getDefault() {
-        if (fgDefault == null) {
-            fgDefault = new SourceLookupFacility();
-        }
-        return fgDefault;
-    }
-    
-    /**
-     * Performs cleanup
-     */
-    public static void shutdown() {
-        if (fgDefault != null) {
-            fgDefault.dispose();
-        }
-    }
-    
-    /**
-     * Constructs a source lookup facility.
-     */
-    private SourceLookupFacility() {
-        fEditorsByPage = new HashMap();
-        DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-    }
-    
-    /**
-     * Performs source lookup for the given artifact and returns the result.
-     *  
-     * @param artifact object for which source is to be resolved
-     * @param locator the source locator to use, or <code>null</code>. When <code>null</code>
-     *   a source locator is determined from the artifact, if possible. If the artifact
-     *   is a debug element, the source locator from its associated launch is used. 
-     * @return a source lookup result
-     */
-    public SourceLookupResult lookup(Object artifact, ISourceLocator locator) {
-        SourceLookupResult result = new SourceLookupResult(artifact, null, null, null);
-        IDebugElement debugElement = null;
-        if (artifact instanceof IDebugElement) {
-            debugElement = (IDebugElement)artifact;
-        }
-		if (locator == null) {
-		    ILaunch launch = null;
-		    if (debugElement != null) {
-		        launch = debugElement.getLaunch();
-		    }
-		    if (launch != null) {
-		        locator = launch.getSourceLocator();
-		    }
-		}
-		if (locator != null) {
-			String editorId =null;
-			IEditorInput editorInput = null;
-			Object sourceElement = null;
-			if (locator instanceof ISourceLookupDirector) {
-			    ISourceLookupDirector director = (ISourceLookupDirector)locator;
-			    sourceElement = director.getSourceElement(artifact);
-			} else {
-			    if (artifact instanceof IStackFrame) {
-			        sourceElement = locator.getSourceElement((IStackFrame)artifact);
-			    }
-			}
-			if (sourceElement == null) {
-				if (locator instanceof AbstractSourceLookupDirector) {
-				    editorInput = new CommonSourceNotFoundEditorInput(artifact);
-					editorId = IDebugUIConstants.ID_COMMON_SOURCE_NOT_FOUND_EDITOR;
-				} else {
-				    if (artifact instanceof IStackFrame) {
-				        IStackFrame frame = (IStackFrame)artifact;
-					    editorInput = new SourceNotFoundEditorInput(frame);
-						editorId = IInternalDebugUIConstants.ID_SOURCE_NOT_FOUND_EDITOR;
-				    }
-				}
-			} else {
-				ISourcePresentation presentation= null;
-				if (locator instanceof ISourcePresentation) {
-					presentation= (ISourcePresentation) locator;
-				} else {
-				    if (debugElement != null) {
-				        presentation= getPresentation(debugElement.getModelIdentifier());
-				    }
-				}
-				if (presentation != null) {
-					editorInput= presentation.getEditorInput(sourceElement);
-				}
-				if (editorInput != null) {
-					editorId= presentation.getEditorId(editorInput, sourceElement);
-				}				
-			}
-			result.setEditorInput(editorInput);
-			result.setEditorId(editorId);
-			result.setSourceElement(sourceElement);
-		}
-		return result;
-    }
-    
-    /**
-     * Returns the model presentation for the given debug model, or <code>null</code>
-     * if none.
-     * 
-     * @param id debug model id
-     * @return presentation for the model, or <code>null</code> if none.
-     */
-	protected IDebugModelPresentation getPresentation(String id) {
-		return ((DelegatingModelPresentation)DebugUIPlugin.getModelPresentation()).getPresentation(id);
-	}   
-	
-	/**
-	 * Returns an editor presentation.
-	 * 
-	 * @return an editor presentation
-	 */
-	protected IDebugEditorPresentation getEditorPresentation() {
-	    return (DelegatingModelPresentation)DebugUIPlugin.getModelPresentation();
-	}
-    
-    /**
-     * Opens an editor in the given workbench page for the given source lookup
-     * result. Has no effect if the result has an unknown editor id or editor input.
-     * The editor is opened, positioned, and annotated.
-     * <p>
-     * Honor's the user preference of whether to re-use editors when displaying source.
-     * </p> 
-     * @param result source lookup result to display
-     * @param page the page to display the result in
-     */
-    public void display(ISourceLookupResult result, IWorkbenchPage page) {
-		IEditorPart editor= openEditor(result, page);
-		if (editor == null) {
-			return;
-		}
-		IStackFrame frame = null;
-        if (result.getArtifact() instanceof IStackFrame) {
-            frame = (IStackFrame) result.getArtifact();
-        }		
-		// position and annotate editor for stack frame
-        if (frame != null) {
-			IDebugEditorPresentation editorPresentation = getEditorPresentation();
-            if (editorPresentation.addAnnotations(editor, frame)) {
-				Decoration decoration = new StandardDecoration(editorPresentation, editor, frame.getThread());
-				DecorationManager.addDecoration(decoration);				
-			} else {
-				// perform standard positioning and annotations
-				ITextEditor textEditor = null;
-				if (editor instanceof ITextEditor) {					
-					textEditor = (ITextEditor)editor;
-				} else {
-					textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
-				}
-				if (textEditor != null) {
-					positionEditor(textEditor, frame);
-					Annotation annotation = fPresentation.getInstructionPointerAnnotation(textEditor, frame);
-					InstructionPointerManager.getDefault().addAnnotation(textEditor, frame, annotation);
-				}
-			}
-		}        
-    }
-    
-	/**
-	 * Opens the editor used to display the source for an element selected in
-	 * this view and returns the editor that was opened or <code>null</code> if
-	 * no editor could be opened.
-	 */
-	private IEditorPart openEditor(ISourceLookupResult result, IWorkbenchPage page) {
-		IEditorPart editor = null;
-		IEditorInput input= result.getEditorInput();
-		String id= result.getEditorId();
-		if (input == null || id == null) {
-			return null;
-		}
-		
-		if (fReuseEditor) {
-			IEditorReference[] references = page.findEditors(input, id, IWorkbenchPage.MATCH_ID | IWorkbenchPage.MATCH_INPUT);
-			if (references.length > 0) {
-				// activate the editor we want to reuse
-				IEditorPart refEditor= references[0].getEditor(false);
-				editor = refEditor;
-				page.bringToTop(editor);	
-			}
-			if (editor == null) {
-			    IEditorPart editorForPage = getEditor(page);
-				if (editorForPage == null || editorForPage.isDirty() || page.isEditorPinned(editorForPage)) {
-				    // open a new editor
-					editor = openEditor(page, input, id);
-					editorForPage = editor;
-				} else if (editorForPage instanceof IReusableEditor && editorForPage.getSite().getId().equals(id)) {
-				    // re-use editor
-					page.reuseEditor((IReusableEditor)editorForPage, input);
-					editor = editorForPage;
-                    if(!page.isPartVisible(editor)) {
-                        page.bringToTop(editor);
-                    }
-				} else {
-				    // close editor, open a new one
-					editor = openEditor(page, input, id);
-					page.closeEditor(editorForPage, false);
-					editorForPage = editor;
-				}
-				setEditor(page, editorForPage);
-			}
-		} else {
-			// Open a new editor
-			editor = openEditor(page, input, id);
-		}
-		return editor;
-	}   
-	
-	/**
-	 * Positions the text editor for the given stack frame
-	 */
-	private void positionEditor(ITextEditor editor, IStackFrame frame) {
-		try {
-			int charStart = frame.getCharStart();
-			if (charStart > 0) {
-				int length = 0;
-				int charEnd = frame.getCharEnd();
-				if (charEnd > 0) {
-					length = charEnd - charStart;
-				}
-				editor.selectAndReveal(charStart, length);
-				return;
-			}
-			int lineNumber = frame.getLineNumber();
-			lineNumber--; // Document line numbers are 0-based. Debug line numbers are 1-based.
-			IRegion region= getLineInformation(editor, lineNumber);
-			if (region != null) {
-				editor.selectAndReveal(region.getOffset(), 0);
-			}
-		} catch (DebugException e) {
-		}
-	}
-	
-	/**
-	 * Returns the line information for the given line in the given editor
-	 */
-	private IRegion getLineInformation(ITextEditor editor, int lineNumber) {
-		IDocumentProvider provider= editor.getDocumentProvider();
-		IEditorInput input= editor.getEditorInput();
-		try {
-			provider.connect(input);
-		} catch (CoreException e) {
-			return null;
-		}
-		try {
-			IDocument document= provider.getDocument(input);
-			if (document != null)
-				return document.getLineInformation(lineNumber);
-		} catch (BadLocationException e) {
-		} finally {
-			provider.disconnect(input);
-		}
-		return null;
-	}	
-	/**
-	 * Opens an editor in the workbench and returns the editor that was opened
-	 * or <code>null</code> if an error occurred while attempting to open the
-	 * editor.
-	 */
-	private IEditorPart openEditor(final IWorkbenchPage page, final IEditorInput input, final String id) {
-		final IEditorPart[] editor = new IEditorPart[] {null};
-		Runnable r = new Runnable() {
-			public void run() {
-				if (!page.getWorkbenchWindow().getWorkbench().isClosing()) {
-					try {
-						editor[0] = page.openEditor(input, id, false, IWorkbenchPage.MATCH_ID|IWorkbenchPage.MATCH_INPUT);
-					} catch (PartInitException e) {
-						DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), 
-							DebugUIViewsMessages.LaunchView_Error_1,  
-							DebugUIViewsMessages.LaunchView_Exception_occurred_opening_editor_for_debugger__2,  
-							e);
-					}
-				}
-			}
-		}; 
-		BusyIndicator.showWhile(DebugUIPlugin.getStandardDisplay(), r);
-		return editor[0];
-	}	
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPageListener#pageActivated(org.eclipse.ui.IWorkbenchPage)
-     */
-    public void pageActivated(IWorkbenchPage page) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPageListener#pageClosed(org.eclipse.ui.IWorkbenchPage)
-     */
-    public void pageClosed(IWorkbenchPage page) {
-        fEditorsByPage.remove(page);
-        page.removePartListener(this);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPageListener#pageOpened(org.eclipse.ui.IWorkbenchPage)
-     */
-    public void pageOpened(IWorkbenchPage page) {
-    	page.addPartListener(this);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partActivated(IWorkbenchPartReference partRef) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partBroughtToTop(IWorkbenchPartReference partRef) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partClosed(IWorkbenchPartReference partRef) {
-        // clear the cached editor for the page if it has been closed
-        IWorkbenchPage page = partRef.getPage();
-        IEditorPart editor = getEditor(page);
-        IWorkbenchPart part = partRef.getPart(false);
-		if (part != null && part.equals(editor)) {
-			fEditorsByPage.remove(page);
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partDeactivated(IWorkbenchPartReference partRef) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partOpened(IWorkbenchPartReference partRef) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partHidden(IWorkbenchPartReference partRef) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partVisible(IWorkbenchPartReference partRef) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-     */
-    public void partInputChanged(IWorkbenchPartReference partRef) {
-    }
-
-    /* (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(IDebugUIConstants.PREF_REUSE_EDITOR)) {
-			fReuseEditor = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_REUSE_EDITOR);
-		}
-    }
-    
-    /**
-     * Returns the editor to use to display source in the given page, or
-     * <code>null</code> if a new editor should be opened.
-     * 
-     * @param page workbench page
-     * @return the editor to use to display source in the given page, or
-     * <code>null</code> if a new editor should be opened
-     */
-    protected IEditorPart getEditor(IWorkbenchPage page) {
-        return (IEditorPart) fEditorsByPage.get(page);
-    }
-    
-    /**
-     * Sets the editor to use to display source in the given page, or
-     * <code>null</code> if a new editor should be opened.
-     * 
-     * @param page workbench page
-     * @return the editor to use to display source in the given page, or
-     * <code>null</code> if a new editor should be opened
-     */
-    protected void setEditor(IWorkbenchPage page, IEditorPart editorPart) {
-        if (editorPart == null) {
-            fEditorsByPage.remove(page);
-        } else {
-            fEditorsByPage.put(page, editorPart);
-        }
-        page.addPartListener(this);
-        page.getWorkbenchWindow().addPageListener(this);
-    } 
-  
-    /**
-     * Performs cleanup.
-     */
-    protected void dispose() {
-        DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-        fEditorsByPage.clear();
-        fPresentation.dispose();
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupManager.java
deleted file mode 100644
index 50dc8a3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupManager.java
+++ /dev/null
@@ -1,98 +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.debug.internal.ui.sourcelookup;
-
-import java.util.HashMap;
-import java.util.Map;
-
-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;
-
-/**
- * Starts a source lookup service in each workbench window.
- * 
- * @since 3.2
- */
-public class SourceLookupManager implements IWindowListener {
-
-	private static SourceLookupManager fgDefault;
-	
-	/**
-	 * Services per window
-	 */
-	private Map fServices = new HashMap();
-	
-	private SourceLookupManager() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow[] workbenchWindows = workbench.getWorkbenchWindows();
-		for (int i = 0; i < workbenchWindows.length; i++) {
-			IWorkbenchWindow window = workbenchWindows[i];
-			windowOpened(window);
-		}
-		workbench.addWindowListener(this);
-	}
-		
-	/**
-	 * Returns the default source lookup manager.
-	 * 
-	 * @return
-	 */
-	public static SourceLookupManager getDefault() {
-		if (fgDefault == null) {
-			fgDefault = new SourceLookupManager();
-		}
-		return fgDefault;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowActivated(IWorkbenchWindow window) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowDeactivated(IWorkbenchWindow window) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowClosed(IWorkbenchWindow window) {
-		SourceLookupService service = (SourceLookupService) fServices.get(window);
-		if (service != null) {
-			service.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowOpened(IWorkbenchWindow window) {
-		SourceLookupService service = new SourceLookupService(window);
-		fServices.put(window, service);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.ISourceDisplayAdapter#displaySource(java.lang.Object, org.eclipse.ui.IWorkbenchPage, boolean)
-	 */
-	public void displaySource(Object context, IWorkbenchPage page, boolean forceSourceLookup) {
-		IWorkbenchWindow window = page.getWorkbenchWindow();
-		SourceLookupService service = (SourceLookupService) fServices.get(window);
-		if (service != null) {
-			service.displaySource(context, page, forceSourceLookup);
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupPanel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupPanel.java
deleted file mode 100644
index 9e5184b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupPanel.java
+++ /dev/null
@@ -1,392 +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
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 89748
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.debug.ui.sourcelookup.WorkingSetSourceContainer;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-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.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-
-/**
- * The panel that contains the list of source containers.
- * 
- * @since 3.0
- */
-public class SourceLookupPanel extends AbstractLaunchConfigurationTab implements IPropertyChangeListener {
-	//the configuration being edited
-	protected ILaunchConfiguration fConfig;
-	//the viewer displaying the containers
-	protected SourceContainerViewer fPathViewer;
-	//the duplicates checkbox
-	protected Button fDuplicatesButton;
-	//the source actions - up, down, add, remove, restore
-	protected List fActions = new ArrayList(6);
-	//the director that will be used by the tab to manage/store the containers
-	protected ISourceLookupDirector fLocator;
-	
-	protected AddContainerAction fAddAction; 
-	protected EditContainerAction fEditAction;
-	protected RestoreDefaultAction fRestoreDefaultAction;
-	
-	/**
-	 * Creates and returns the source lookup control.
-	 * 
-	 * @param parent the parent widget of this control
-	 */
-	public void createControl(Composite parent) {
-		Font font = parent.getFont();
-		Composite comp = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_BOTH);
-		SWTFactory.createLabel(comp, SourceLookupUIMessages.sourceTab_lookupLabel, 2);
-		
-		fPathViewer = new SourceContainerViewer(comp, this);
-		fPathViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-		fPathViewer.getControl().setFont(font);
-		
-		Composite pathButtonComp = SWTFactory.createComposite(comp, comp.getFont(), 1, 1, GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL, 0, 0);
-		
-		SWTFactory.createVerticalSpacer(comp, 2);
-		
-		fDuplicatesButton = SWTFactory.createCheckButton(comp, SourceLookupUIMessages.sourceTab_searchDuplicateLabel, null, false, 2);
-		fDuplicatesButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				setDirty(true);
-				updateLaunchConfigurationDialog();
-			}
-		});
-		
-		fAddAction = new AddContainerAction();
-		Button button = SWTFactory.createPushButton(pathButtonComp, fAddAction.getText(), null);
-		fAddAction.setButton(button);
-		addAction(fAddAction);
-		
-		fEditAction = new EditContainerAction();
-		button = SWTFactory.createPushButton(pathButtonComp, fEditAction.getText(), null);
-		fEditAction.setButton(button);
-		addAction(fEditAction);
-		
-		SourceContainerAction action = new RemoveAction();
-		button = SWTFactory.createPushButton(pathButtonComp, action.getText(), null);
-		action.setButton(button);
-		addAction(action);
-		
-		action = new UpAction();
-		button = SWTFactory.createPushButton(pathButtonComp, action.getText(), null);
-		action.setButton(button);
-		addAction(action);
-		
-		action = new DownAction();
-		button = SWTFactory.createPushButton(pathButtonComp, action.getText(), null);
-		action.setButton(button);
-		addAction(action);		
-		
-		fRestoreDefaultAction = new RestoreDefaultAction();
-		button = SWTFactory.createPushButton(pathButtonComp, fRestoreDefaultAction.getText(), null);
-		fRestoreDefaultAction.setButton(button);
-		addAction(fRestoreDefaultAction);
-		
-		retargetActions(fPathViewer);
-		
-		//listen to changes user made to the working sets, if a working set is being removed
-		//check current list to validate working sets  
-		IWorkingSetManager workingSetMgr = DebugUIPlugin.getDefault().getWorkbench().getWorkingSetManager();
-		workingSetMgr.addPropertyChangeListener(this);
-		/*Dialog.applyDialogFont(comp);*/
-		setControl(comp);
-	}	
-	
-	/**
-	 * Adds the given action to the action collection in this tab
-	 */
-	protected void addAction(SourceContainerAction action) {
-		fActions.add(action);
-	}
-	
-	/**
-	 * Re-targets actions to the given viewer
-	 */
-	protected void retargetActions(SourceContainerViewer viewer) {
-		Iterator actions = fActions.iterator();
-		while (actions.hasNext()) {
-			SourceContainerAction action = (SourceContainerAction) actions.next();
-			action.setViewer(viewer);
-		}
-	}
-	
-	/**
-	 * Initializes this control based on the settings in the given
-	 * launch configuration.
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		if (fLocator != null) {
-			fLocator.dispose();
-			fLocator = null;
-		}
-		setErrorMessage(null);
-		setMessage(null);
-		String memento = null;	
-		String type = null;
-		try{
-			memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null);
-			type = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null);
-			if (type == null) {
-				type = configuration.getType().getSourceLocatorId();
-			}
-		} catch(CoreException e){
-			setErrorMessage(e.getMessage());
-			return;
-		}	
-		
-		if(type == null) {
-			setErrorMessage(SourceLookupUIMessages.sourceLookupPanel_2); 
-			return;
-		}
-		
-		boolean migration = false;
-		try {
-			ISourceLocator locator = getLaunchManager().newSourceLocator(type);
-			if(!(locator instanceof AbstractSourceLookupDirector)) {
-				// migrate to the new source lookup infrastructure
-				memento = null; // don't use old memento
-				type = configuration.getType().getSourceLocatorId();
-				if(type == null) {
-					setErrorMessage(SourceLookupUIMessages.sourceLookupPanel_2); 
-					return;
-				}
-				locator = getLaunchManager().newSourceLocator(type);
-				if (!(locator instanceof AbstractSourceLookupDirector)) {
-					setErrorMessage(SourceLookupUIMessages.sourceLookupPanel_2); 
-					return;
-				}
-				migration = true;
-			}
-			fLocator = (AbstractSourceLookupDirector)locator;			
-			if (memento == null) {
-				fLocator.initializeDefaults(configuration);
-			} else {				
-				fLocator.initializeFromMemento(memento, configuration);				 
-			}			
-		} catch (CoreException e) {
-			setErrorMessage(e.getMessage());
-			return;
-		}	
-		initializeFrom(fLocator);
-		if (migration && configuration.isWorkingCopy()) {
-			// ensure perform apply actual updates the config
-			setDirty(true);
-			performApply((ILaunchConfigurationWorkingCopy)configuration);
-		}
-	}
-	
-	/**
-	 * Initializes this control based on the settings in the given
-	 * AbstractSourceLookupDirector
-	 */
-	public void initializeFrom(ISourceLookupDirector locator) {
-		if(fConfig == null) {
-			fConfig = locator.getLaunchConfiguration();
-		}
-		fPathViewer.setEntries(locator.getSourceContainers());		
-		fDuplicatesButton.setSelection(locator.isFindDuplicates());
-		fLocator = locator;
-		fAddAction.setSourceLookupDirector(locator);
-		fEditAction.setSourceLookupDirector(locator);
-		fRestoreDefaultAction.setSourceLookupDirector(locator);
-		setDirty(false);
-	}
-	
-	/**
-	 * Saves the containers and duplicate policy into the given working copy of the configuration.  
-	 * Saving the configuration will result in a change event, which will be picked up by the director 
-	 * and used to refresh its internal list.
-	 * 
-	 * @param workingCopy the working copy of the configuration that these values should be stored in, may be null.
-	 * 	If null, will be written into a working copy of the configuration referenced by the director.
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {		
-		if (isDirty()) {
-			if (fLocator == null) {
-				configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null);
-				configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null);
-				return;
-			}
-			ILaunchConfigurationWorkingCopy workingCopy = configuration;			
-			if(configuration == null) {
-				try {
-					ILaunchConfiguration config = fLocator.getLaunchConfiguration();
-					if(config != null) {
-						workingCopy = config.getWorkingCopy();
-					}
-				}
-				catch(CoreException e) { 
-					DebugUIPlugin.log(e);
-					setErrorMessage(SourceLookupUIMessages.sourceLookupPanel_1); 
-					return;
-				}
-			}
-			if(workingCopy == null) {
-				DebugUIPlugin.logErrorMessage("Error occurred - a working copy could not be acquired, therefore source lookup path changes will not be applied.");  //$NON-NLS-1$
-				return;
-			}
-			//set new values in director so memento returned is correct
-			fLocator.setSourceContainers(fPathViewer.getEntries());
-			fLocator.setFindDuplicates(fDuplicatesButton.getSelection());
-						
-			//writing to the file will cause a change event and the listeners will be updated
-			try {			
-				if (isDefault()) {
-					workingCopy.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null);
-					workingCopy.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null);
-				} else {
-					workingCopy.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, fLocator.getMemento());
-					workingCopy.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, fLocator.getId());
-				}
-			}
-			catch(CoreException e) {
-				DebugUIPlugin.log(e);
-				setErrorMessage(SourceLookupUIMessages.sourceLookupPanel_1); 
-			}
-			
-		}			
-	}
-	
-	/**
-	 * determines of the current source lookup path is the default path
-	 * @param configuration
-	 * @return
-	 */
-	protected boolean isDefault() {
-		ISourceContainer[] current = getEntries();
-		return !fDuplicatesButton.getSelection() && current.length == 1 && current[0] instanceof DefaultSourceContainer;
-	}
-
-	/**
-	 * Returns the entries visible in the viewer
-	 */
-	public ISourceContainer[] getEntries() {
-		return fPathViewer.getEntries();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#setDirty(boolean)
-	 */
-	public void setDirty(boolean dirty) {
-		super.setDirty(dirty);
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return SourceLookupUIMessages.sourceTab_tabTitle; 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog()
-	 */
-	protected void updateLaunchConfigurationDialog() {
-		if (getLaunchConfigurationDialog() != null) {
-			super.updateLaunchConfigurationDialog();
-		}
-	}
-		
-	/**
-	 * This is called whenever a working set has been removed. Loops through the original list
-	 * of working sets the user stores in the configuration. If the one being removed is in the
-	 * list, remove it from the list
-	 * @param affectedWorkingSet - the working set being removed
-	 */
-	private void validateWorkingSetSourceContainers(IWorkingSet affectedWorkingSet) {
-		List sourceContainers = (List) fPathViewer.getInput();
-		if (sourceContainers != null) {
-			for (int i = 0; i < sourceContainers.size(); i++) {
-				if (sourceContainers.get(i) instanceof WorkingSetSourceContainer) {
-					WorkingSetSourceContainer wsSrcContainer = (WorkingSetSourceContainer) sourceContainers.get(i);
-					if (wsSrcContainer.getName().equals(affectedWorkingSet.getName())) {
-						sourceContainers.remove(i);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Listen to working set changes
-	 * @param event
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		//if the PropertyChangeEvent has changeId CHANGE_WORKING_SET_REMOVE, 
-		//validate the list to make sure all working sets are valid 
-		//if the PropertyChangeEvent has changeId CHANGE_WORKING_SET_NAME_CHANGE,
-		//do nothing because the event only has newValue, since oldValue is not provided
-		//there is no way to identify which working set does the newValue corresponds to		
-		if (event.getProperty().equals(IWorkingSetManager.CHANGE_WORKING_SET_REMOVE))
-			validateWorkingSetSourceContainers((IWorkingSet) event.getOldValue());							
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
-		initializeFrom(workingCopy);
-	}
-	
-	/**
-	 * Returns the source lookup director associated with this
-	 * panel, or <code>null</code> if none.
-	 * 
-	 * @return the source lookup director associated with this
-	 * panel, or <code>null</code> if none
-	 */
-	public ISourceLookupDirector getDirector() {
-		return fLocator;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		//listen to changes user made to the working sets, if a working set is being removed
-		//check current list to validate working sets  
-		IWorkingSetManager workingSetMgr = DebugUIPlugin.getDefault().getWorkbench().getWorkingSetManager();
-		workingSetMgr.removePropertyChangeListener(this);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupResult.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupResult.java
deleted file mode 100644
index 940dc92..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupResult.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.debug.internal.ui.sourcelookup;
-
-import org.eclipse.debug.ui.sourcelookup.ISourceLookupResult;
-import org.eclipse.ui.IEditorInput;
-
-/**
- * The result of a source lookup contains the source element, editor id, and 
- * editor input resolved for a debug artifact.
- * 
- * @since 3.1
- */
-public class SourceLookupResult implements ISourceLookupResult {
-    
-    /** 
-     * Element that source was resolved for.
-     */
-    private Object fArtifact;
-    /**
-     * Corresponding source element, or <code>null</code>
-     * if unknown.
-     */
-    private Object fSourceElement;
-    /**
-     * Associated editor id, used to display the source element,
-     * or <code>null</code> if unknown.
-     */
-    private String fEditorId;
-    /**
-     * Associated editor input, used to display the source element,
-     * or <code>null</code> if unknown.
-     */
-    private IEditorInput fEditorInput;
-
-    /**
-     * Creates a source lookup result on the given artifact, source element, 
-     * editor id, and editor input.
-     */
-    public SourceLookupResult(Object artifact, Object sourceElement, String editorId, IEditorInput editorInput) {
-        fArtifact = artifact;
-        setSourceElement(sourceElement);
-        setEditorId(editorId);
-        setEditorInput(editorInput);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.sourcelookup.ISourceLookupResult#getArtifact()
-     */
-    public Object getArtifact() {
-        return fArtifact;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.sourcelookup.ISourceLookupResult#getSourceElement()
-     */
-    public Object getSourceElement() {
-        return fSourceElement;
-    }
-    
-    /**
-     * Sets the source element resolved for the artifact that source
-     * lookup was performed for, or <code>null</code> if a source element
-     * was not resolved.
-     * 
-     * @param element resolved source element or <code>null</code> if unknown
-     */    
-    protected void setSourceElement(Object element) {
-        fSourceElement = element;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.sourcelookup.ISourceLookupResult#getEditorId()
-     */
-    public String getEditorId() {
-        return fEditorId;
-    }
-    
-    /**
-     * Sets the identifier of the editor used to display this source
-     * lookup result's source element, or <code>null</code> if unknown.
-     * 
-     * @param id the identifier of the editor used to display this source
-     * lookup result's source element, or <code>null</code> if unknown
-     */
-    protected void setEditorId(String id) {
-        fEditorId = id;
-    }    
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.sourcelookup.ISourceLookupResult#getEditorInput()
-     */
-    public IEditorInput getEditorInput() {
-        return fEditorInput;
-    }
-    
-    /**
-     * Sets the editor input used to display this source lookup
-     * result's source element, or <code>null</code> if unknown.
-     * 
-     * @param input the editor input used to display this source lookup
-     * result's source element, or <code>null</code> if unknown
-     */
-    protected void setEditorInput(IEditorInput input) {
-        fEditorInput = input;
-    }    
-	
-	/**
-	 * Updates the artifact to refer to the given artifact
-	 * if equal. For example, when a source lookup result is reused
-	 * for the same stack frame, we still need to update in case
-	 * the stack frame is not identical.
-	 * 
-	 * @param artifact new artifact state
-	 */
-	public void updateArtifact(Object artifact) {
-		if (fArtifact.equals(artifact)) {
-			fArtifact = artifact;
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupService.java
deleted file mode 100644
index cef0572..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupService.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Performs source lookup in a window.
- * 
- * @since 3.2
- */
-public class SourceLookupService implements IDebugContextListener, ISourceDisplay {
-	
-	private IWorkbenchWindow fWindow;
-	
-	public SourceLookupService(IWorkbenchWindow window) {
-		fWindow = window;
-		DebugUITools.getDebugContextManager().getContextService(window).addDebugContextListener(this);
-	}
-	
-	public void dispose() {
-		DebugUITools.getDebugContextManager().getContextService(fWindow).removeDebugContextListener(this);
-	}
-
-	public synchronized void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			displaySource(event.getContext(), event.getDebugContextProvider().getPart(), false);
-		}
-	}
-		
-	/**
-	 * Displays source for the given selection and part, optionally forcing
-	 * a source lookup.
-	 * 
-	 * @param selection
-	 * @param part
-	 * @param force
-	 */
-	protected synchronized void displaySource(ISelection selection, IWorkbenchPart part, boolean force) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection)selection;
-			if (structuredSelection.size() == 1) {
-				Object context = (structuredSelection).getFirstElement();
-				IWorkbenchPage page = null;
-				if (part == null) {
-					page = fWindow.getActivePage();
-				} else {
-					page = part.getSite().getPage();
-				} 
-				displaySource(context, page, force);
-			}
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.ISourceDisplayAdapter#displaySource(java.lang.Object, org.eclipse.ui.IWorkbenchPage, boolean)
-	 */
-	public void displaySource(Object context, IWorkbenchPage page, boolean forceSourceLookup) {
-		if (context instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) context;
-			ISourceDisplay adapter = (ISourceDisplay) adaptable.getAdapter(ISourceDisplay.class);
-			if (adapter == null && !(context instanceof PlatformObject)) {
-	        	// for objects that don't properly subclass PlatformObject to inherit default
-	        	// adapters, just delegate to the adapter factory
-	        	adapter = (ISourceDisplay) new DebugElementAdapterFactory().getAdapter(context, ISourceDisplay.class);
-	        }
-			if (adapter != null) {						
-				adapter.displaySource(context, page, forceSourceLookup);
-			}
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
deleted file mode 100644
index 3e3470a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
+++ /dev/null
@@ -1,88 +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 - Initial API and implementation
- * QNX Software Systems - Mikhail Khodjaiants - Bug 114664
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup;
-
-import org.eclipse.osgi.util.NLS;
-
-public class SourceLookupUIMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages";//$NON-NLS-1$
-
-	public static String CommonSourceNotFoundEditor_0;
-
-	public static String CommonSourceNotFoundEditor_1;
-
-	// Source search launch configuration tab/errors/dialogs
-	public static String EditContainerAction_0;
-
-	public static String SourceLookupDialog_0;
-
-	public static String SourceLookupDialog_1;
-	public static String sourceTab_lookupLabel;
-	public static String sourceTab_searchDuplicateLabel;
-	public static String sourceTab_upButton;
-	public static String sourceTab_downButton;
-	public static String sourceTab_removeButton;
-	public static String sourceTab_addButton;
-	public static String sourceTab_tabTitle;
-	public static String sourceTab_defaultButton;
-
-	public static String addSourceLocation_title;
-	public static String addSourceLocation_description;
-
-	public static String addSourceLocation_addButton2;
-	public static String addSourceLocation_editorMessage;
-
-	public static String sourceSearch_folderSelectionError;
-	public static String sourceSearch_initError;
-
-	public static String projectSelection_chooseLabel;
-	public static String projectSelection_requiredLabel;
-
-	public static String folderSelection_title;
-	public static String folderSelection_label;
-
-	public static String manageSourceDialog_title;
-	public static String manageSourceDialog_description;
-
-	public static String sourceLookupPanel_1;
-	public static String sourceLookupPanel_2;
-	public static String ResolveDuplicatesHandler_0;
-	public static String ResolveDuplicatesHandler_1;
-	public static String EditSourceLookupPathAction_0;
-	public static String LookupSourceAction_0;
-	public static String ExternalArchiveSourceContainerBrowser_2;
-	public static String ArchiveSourceContainerBrowser_3;
-	public static String ArchiveSourceContainerBrowser_4;
-	public static String DirectorySourceContainerDialog_0;
-	public static String DirectorySourceContainerDialog_1;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, SourceLookupUIMessages.class);
-	}
-
-	public static String DirectorySourceContainerDialog_2;
-
-	public static String DirectorySourceContainerDialog_3;
-
-	public static String DirectorySourceContainerDialog_4;
-
-	public static String DirectorySourceContainerDialog_5;
-
-	public static String DirectorySourceContainerDialog_6;
-
-	public static String DirectorySourceContainerDialog_7;
-
-	public static String DirectorySourceContainerDialog_8;
-
-	public static String Prompter_0;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
deleted file mode 100644
index ab28335..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
+++ /dev/null
@@ -1,64 +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
-#     QNX Software Systems - Mikhail Khodjaiants - Bug 114664
-###############################################################################
-
-# Source search launch configuration tab/errors/dialogs
-EditContainerAction_0=&Edit...
-sourceTab_lookupLabel = S&ource Lookup Path:
-sourceTab_searchDuplicateLabel = Searc&h for duplicate source files on the path
-sourceTab_upButton = U&p
-sourceTab_downButton = &Down
-sourceTab_removeButton = Re&move
-sourceTab_addButton = &Add...
-sourceTab_tabTitle = Source
-sourceTab_defaultButton = Restore Defa&ult
-
-addSourceLocation_title = Add Source
-addSourceLocation_description = Select the type of source to add to the source lookup path
-
-addSourceLocation_addButton2 = &Edit Source Lookup Path...
-addSourceLocation_editorMessage = Source not found.
-
-sourceSearch_folderSelectionError = Selection must be a folder.
-sourceSearch_initError = Unable to initialize source container.
-
-projectSelection_chooseLabel = Choose &project(s) to add:
-projectSelection_requiredLabel = Add &required projects of selected projects
-
-folderSelection_title=Folder Selection
-folderSelection_label=&Choose folders to add:
-
-manageSourceDialog_title = Edit Source Lookup Path
-manageSourceDialog_description = Edit the path used to locate source files.
-
-sourceLookupPanel_1 = Unable to apply source lookup path changes.
-sourceLookupPanel_2 = Launch configuration does not support source lookup
-ResolveDuplicatesHandler_0=Select Source File
-ResolveDuplicatesHandler_1=Choose a source file (? = any character, * = any string)
-EditSourceLookupPathAction_0=Edit Source Loo&kup...
-LookupSourceAction_0=Lookup &Source
-ExternalArchiveSourceContainerBrowser_2=Select Source Archive
-ArchiveSourceContainerBrowser_3=Archive Selection
-ArchiveSourceContainerBrowser_4=Choose archives to add:
-DirectorySourceContainerDialog_0=Directory Selection
-DirectorySourceContainerDialog_1=Choose directory to add:
-DirectorySourceContainerDialog_2=File system folder
-DirectorySourceContainerDialog_3=Specify folder and whether subfolders should be searched
-DirectorySourceContainerDialog_4=&Directory:
-DirectorySourceContainerDialog_5=&Browse...
-DirectorySourceContainerDialog_6=Search sub&folders
-DirectorySourceContainerDialog_7=Add File System Directory
-DirectorySourceContainerDialog_8=Edit File System Directory
-Prompter_0=Failed to get the root status handler.
-CommonSourceNotFoundEditor_0=Select a Context
-CommonSourceNotFoundEditor_1=You must select an item in the debug view to use as context for source lookup path changes.\n\nFor example: the launch or one of the threads in the view.
-SourceLookupDialog_0=Launch configuration 
-SourceLookupDialog_1=\ is read only, no source lookup path changes will be saved
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIUtils.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIUtils.java
deleted file mode 100644
index 4039d38..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/SourceLookupUIUtils.java
+++ /dev/null
@@ -1,111 +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.debug.internal.ui.sourcelookup;
-
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Utility methods for the UI portion of the source lookup solution.
- * 
- * @since 3.0
- */
-public class SourceLookupUIUtils {
-	/**
-	 * Constant for the container presentation extension id.
-	 * @since 3.0
-	 */
-	public static final String CONTAINER_PRESENTATION_EXTENSION = "sourceContainerPresentations"; //$NON-NLS-1$
-	/**
-	 * Constant for the container presentation icon attribute.
-	 * @since 3.0
-	 */
-	public static final String ICON_ATTRIBUTE = "icon";	 //$NON-NLS-1$
-	/**
-	 * Constant for the container presentation browser attribute.
-	 * @since 3.0
-	 */
-	public static final String BROWSER_CLASS_ATTRIBUTE = "browserClass"; //$NON-NLS-1$
-	/**
-	 * Constant for the container presentation type id attribute.
-	 * @since 3.0
-	 */
-	public static final String CONTAINER_ID_ATTRIBUTE = "containerTypeID";	//$NON-NLS-1$
-	
-	private static Hashtable fSourceContainerPresentationHashtable;
-	
-	/**
-	 * Constructor. Reads in Source Container Presentation extension implementations.
-	 */
-	public SourceLookupUIUtils(){
-		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), CONTAINER_PRESENTATION_EXTENSION);		
-		//read in SourceContainer presentation extensions
-		IConfigurationElement[] sourceContainerPresentationExtensions =extensionPoint.getConfigurationElements();
-		fSourceContainerPresentationHashtable = new Hashtable();
-		for (int i = 0; i < sourceContainerPresentationExtensions.length; i++) {
-			fSourceContainerPresentationHashtable.put(
-					sourceContainerPresentationExtensions[i].getAttribute(CONTAINER_ID_ATTRIBUTE),
-					sourceContainerPresentationExtensions[i]);
-			registerContainerImages(sourceContainerPresentationExtensions[i]);			
-		}		
-	}	
-	
-	
-	/**
-	 * Retrieves the icon associated with a source container type.
-	 * @param id the container type id
-	 * @return the image for the type specified
-	 */
-	public static Image getSourceContainerImage(String id){
-		if(fSourceContainerPresentationHashtable == null)
-			new SourceLookupUIUtils();
-		return DebugPluginImages.getImage(id);
-	}
-	
-	/**
-	 * Retrieves the browser class associated with the source container type specified.
-	 * @param typeID the source container type id
-	 * @return the browser class
-	 */
-	public static ISourceContainerBrowser getSourceContainerBrowser(String typeID)
-	{
-		if(fSourceContainerPresentationHashtable == null)
-			new SourceLookupUIUtils();
-		IConfigurationElement element = (IConfigurationElement)fSourceContainerPresentationHashtable.get(typeID);
-		ISourceContainerBrowser browser = null;
-		try{
-			if(element!= null && element.getAttribute(BROWSER_CLASS_ATTRIBUTE) != null)
-				browser = (ISourceContainerBrowser) element.createExecutableExtension(BROWSER_CLASS_ATTRIBUTE);
-		}catch(CoreException e){}
-		return browser;
-	}
-	
-	private void registerContainerImages(IConfigurationElement configElement){
-		ImageDescriptor imageDescriptor = DebugUIPlugin.getImageDescriptor(configElement, ICON_ATTRIBUTE);
-		if (imageDescriptor == null) {
-			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-		}
-		String configTypeID = configElement.getAttribute(CONTAINER_ID_ATTRIBUTE);
-		ImageRegistry imageRegistry = DebugPluginImages.getImageRegistry();
-		imageRegistry.put(configTypeID, imageDescriptor);		
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/UpAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/UpAction.java
deleted file mode 100644
index 94110d3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/UpAction.java
+++ /dev/null
@@ -1,62 +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.debug.internal.ui.sourcelookup;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * The action used to move source containers up in the list 
- */
-public class UpAction extends SourceContainerAction {
-	
-	public UpAction() {
-		super(SourceLookupUIMessages.sourceTab_upButton);  
-	}
-	/**
-	 * Moves all selected entries up one position (if possible).
-	 * 
-	 * @see IAction#run()
-	 */
-	public void run() {
-		List targets = getOrderedSelection();
-		if (targets.isEmpty()) {
-			return;
-		}
-		int top = 0;
-		int index = 0;
-		List list = getEntriesAsList();
-		Iterator entries = targets.iterator();
-		while (entries.hasNext()) {
-			Object target = entries.next();
-			index = list.indexOf(target);
-			if (index > top) {
-				top = index - 1;
-				Object temp = list.get(top);
-				list.set(top, target);
-				list.set(index, temp);
-			}
-			top = index;
-		} 
-		setEntries(list);
-	}
-	
-	/**
-	 * @see SelectionListenerAction#updateSelection(IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		//check that something is selected, it's not first in the list, and it is a root tree node.
-		return !selection.isEmpty() && !isIndexSelected(selection, 0) && getViewer().getTree().getSelection()[0].getParentItem()==null;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/WorkingSetSourceContainerType.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/WorkingSetSourceContainerType.java
deleted file mode 100644
index 2356bd1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/WorkingSetSourceContainerType.java
+++ /dev/null
@@ -1,94 +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.debug.internal.ui.sourcelookup;
-
-import java.io.IOException;
-import java.io.StringReader;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
-import org.eclipse.debug.ui.sourcelookup.WorkingSetSourceContainer;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * The factory for creating/restoring working set source containers.
- * 
- * @since 3.0
- */
-public class WorkingSetSourceContainerType extends AbstractSourceContainerTypeDelegate {
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerTypeDelegate#getMemento(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
-	 */	
-	public String getMemento(ISourceContainer container) throws CoreException {
-		WorkingSetSourceContainer workingSet = (WorkingSetSourceContainer) container;
-		Document doc = newDocument();		
-		Element node = doc.createElement("workingSet"); //$NON-NLS-1$
-		node.setAttribute("name", workingSet.getName()); //$NON-NLS-1$
-		doc.appendChild(node);
-		return serializeDocument(doc);	 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#createSourceContainer(java.lang.String)
-	 */
-	public ISourceContainer createSourceContainer(String memento)throws CoreException {
-		IWorkingSet workingSet = null;
-		Exception ex = null;
-		try {
-			Element root = null;
-			DocumentBuilder parser =
-				DocumentBuilderFactory.newInstance().newDocumentBuilder();
-			parser.setErrorHandler(new DefaultHandler());
-			StringReader reader = new StringReader(memento);
-			InputSource source = new InputSource(reader);
-			root = parser.parse(source).getDocumentElement();
-			
-			String name = root.getAttribute("name");//$NON-NLS-1$
-			
-			if (isEmpty(name)) {
-				abort(SourceLookupUIMessages.sourceSearch_initError,null);
-			}
-			workingSet = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(name);
-			//check that set still exists
-			if (workingSet == null) {				
-				abort(SourceLookupUIMessages.sourceSearch_initError, null); 
-			}				
-			return new WorkingSetSourceContainer(workingSet);	
-			
-		} catch (ParserConfigurationException e) {
-			ex = e;
-		} catch (SAXException e) {
-			ex = e;
-		} catch (IOException e) {
-			ex = e;
-		}
-		
-		abort(SourceLookupUIMessages.sourceSearch_initError, ex);	
-		return null;	
-	}
-
-	private boolean isEmpty(String string) {
-		return string == null || string.length() == 0;
-	}
-	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveFilter.java
deleted file mode 100644
index c5d5565..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveFilter.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.debug.internal.ui.sourcelookup.browsers;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-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.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.custom.BusyIndicator;
-
-/**
- * ArchiveFilter
- */
-public class ArchiveFilter extends ViewerFilter {
-	
-	/**
-	 * Collection of archives and containers to display
-	 */
-	private Set fArchives;
-	
-	/**
-	 * Collection of already existing archives
-	 */
-	private List fExisting;
-
-	/* (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 fArchives.contains(element) && !fExisting.contains(element);
-	}
-
-	/**
-	 * Constructs a new filter to display archives and their containers,
-	 * excluding the resources in the given list.
-	 * 
-	 * @param objects resources to exclude
-	 */
-	public ArchiveFilter(List objects) {
-		fExisting = objects;
-		init();
-	}
-	
-	/**
-	 * Search for all archives in the workspace.
-	 */
-	private void init() {
-		BusyIndicator.showWhile(DebugUIPlugin.getStandardDisplay(), new Runnable() {
-			public void run() {
-				fArchives = new HashSet();
-				traverse(ResourcesPlugin.getWorkspace().getRoot(), fArchives);
-			}
-		});
-	}
-
-	/**
-	 * Traverse the given container, adding archives to the given set.
-	 * Returns whether any files were added
-	 * 
-	 * @param root
-	 */
-	private boolean traverse(IContainer container, Set set) {
-		boolean added = false;
-		try {	
-			IResource[] resources = container.members();
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
-				if (resource instanceof IFile) {
-					IFile file = (IFile)resource;
-					String ext = file.getFileExtension();
-					if (ext != null && (ext.equalsIgnoreCase("jar") || ext.equalsIgnoreCase("zip"))) { //$NON-NLS-1$ //$NON-NLS-2$
-						set.add(file);
-						added = true;
-					}
-				} else if (resource instanceof IContainer) {
-					if (traverse((IContainer)resource, set)) {
-						set.add(resource);	
-						added = true;
-					}
-				}
-			}
-		} catch (CoreException e) {
-		}
-		return added;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java
deleted file mode 100644
index 17f7ad9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.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.debug.internal.ui.sourcelookup.browsers;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.ArchiveSourceContainer;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.views.navigator.ResourceComparator;
-
-/**
- * Adds an internal jar to the runtime class path.
- */
-public class ArchiveSourceContainerBrowser extends AbstractSourceContainerBrowser {
-
-	private ISelectionStatusValidator validator= new ISelectionStatusValidator() {
-		public IStatus validate(Object[] selection) {
-			if (selection.length == 0) {
-				return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
-			}
-			for (int i= 0; i < selection.length; i++) {
-				if (!(selection[i] instanceof IFile)) {
-					return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
-				}					
-			}
-			return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
-		}			
-	};
-
-	/**
-	 * Returns internal jars (source containers) currently used by the
-	 * given source lookup director.
-	 * 
-	 * @param director source lookup director jars are being added to
-	 */
-	protected List getSelectedJars(ISourceLookupDirector director) {
-		ISourceContainer[] containers = director.getSourceContainers();
-		List jars = new ArrayList();
-		for (int i = 0; i < containers.length; i++) {
-			ISourceContainer container = containers[i];
-			if (container.getType().getId().equals(ArchiveSourceContainer.TYPE_ID)) {
-				jars.add(container);
-			}
-		}
-		return jars;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.internal.core.sourcelookup.ISourceLookupDirector)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		ViewerFilter filter= new ArchiveFilter(getSelectedJars(director));
-		
-		ILabelProvider lp= new WorkbenchLabelProvider();
-		ITreeContentProvider cp= new WorkbenchContentProvider();
-
-		ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(shell, lp, cp);
-		dialog.setValidator(validator);
-		dialog.setTitle(SourceLookupUIMessages.ArchiveSourceContainerBrowser_3); 
-		dialog.setMessage(SourceLookupUIMessages.ArchiveSourceContainerBrowser_4); 
-		dialog.addFilter(filter);
-		dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());	
-		dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			ISourceContainer[] containers = new ISourceContainer[result.length];
-			for (int i = 0; i < containers.length; i++) {
-				containers[i] = new ArchiveSourceContainer((IFile)result[i], true);
-			}
-			return containers;
-		}	
-		return new ISourceContainer[0];
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerBrowser.java
deleted file mode 100644
index b3cbbba..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerBrowser.java
+++ /dev/null
@@ -1,69 +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
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 114664
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup.browsers;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The browser for adding an external folder source container.
- * @since 3.0
- */
-public class DirectorySourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		ISourceContainer[] containers = new ISourceContainer[1];
-		DirectorySourceContainerDialog dialog = new DirectorySourceContainerDialog(shell);
-		if (dialog.open() == Window.OK) {
-			String directory = dialog.getDirectory();
-			if(directory !=null) {
-				containers[0] = new DirectorySourceContainer(new Path(directory), dialog.isSearchSubfolders());			
-				return containers;			
-			}
-		}		
-		return new ISourceContainer[0];
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#canEditSourceContainers(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
-	 */
-	public boolean canEditSourceContainers(ISourceLookupDirector director, ISourceContainer[] containers) {
-		return containers.length == 1 && DirectorySourceContainer.TYPE_ID.equals(containers[0].getType().getId());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#editSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
-	 */
-	public ISourceContainer[] editSourceContainers(Shell shell, ISourceLookupDirector director, ISourceContainer[] containers) {
-		if (containers.length == 1 && DirectorySourceContainer.TYPE_ID.equals(containers[0].getType().getId()) ) {
-			DirectorySourceContainer c = (DirectorySourceContainer)containers[0];
-			DirectorySourceContainerDialog dialog = new DirectorySourceContainerDialog(shell, c.getDirectory().getPath(), c.isComposite());
-			if (dialog.open() == Window.OK) {
-				String directory = dialog.getDirectory();
-				if(directory !=null) {
-					containers[0].dispose();
-					return new ISourceContainer[]{ new DirectorySourceContainer(new Path(directory), dialog.isSearchSubfolders())};			
-				}
-			}
-		}
-		return containers;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java
deleted file mode 100644
index 66fddc1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java
+++ /dev/null
@@ -1,229 +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
- *     QNX Software Systems - Mikhail Khodjaiants - Bug 114664
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.sourcelookup.browsers;
-
-import java.io.File;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.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.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The dialog for selecting the external folder for which a source container will be created.
- * 
- * @since 3.0
- */
-public class DirectorySourceContainerDialog extends TitleAreaDialog {
-
-	private static final String LAST_PATH_SETTING = "EXT_FOLDER_LAST_PATH_SETTING"; //$NON-NLS-1$
-	private static final String LAST_SUBDIR_SETTING = "EXT_FOLDER_LAST_SUBDIR_SETTING"; //$NON-NLS-1$
-
-	private String fDirectory;
-	private boolean fSearchSubfolders = true;
-	
-	private Text fDirText;
-	private Button fSubfoldersButton;
-	
-	private boolean fNewContainer = true;
-
-	/**
-	 * Creates a dialog to select a new file system folder.
-	 * 
-	 * @param shell shell
-	 */
-	public DirectorySourceContainerDialog(Shell shell) {
-		this(shell, "", DebugUIPlugin.getDefault().getDialogSettings().getBoolean(LAST_SUBDIR_SETTING)); //$NON-NLS-1$
-		fNewContainer = true;
-	}
-
-	/**
-	 * Creates a dialog to edit file system folder.
-	 *  
-	 * @param shell shell
-	 * @param directory directory to edit or empty string
-	 * @param searchSubfolders whether the search subfolders button should be checked
-	 * @param newContainer 
-	 */
-	public DirectorySourceContainerDialog(Shell shell, String directory, boolean searchSubfolders) {
-		super(shell);
-		setShellStyle(getShellStyle() | SWT.RESIZE );
-		fDirectory = directory;
-		fSearchSubfolders = searchSubfolders;
-		fNewContainer = false;
-	}
-	
-	/**
-	 * Returns the result of the dialog.open() operation
-	 * @return the dialog.open() result
-	 */
-	public String getDirectory() {
-		return fDirectory;
-	}
-
-	/**
-	 * Returns whether the 'search subfolders' option is selected.
-	 * 
-	 * @return whether the 'search subfolders' option is selected
-	 */
-	public boolean isSearchSubfolders() {
-		return fSearchSubfolders;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Image image = (fNewContainer) ? DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_ADD_SRC_DIR_WIZ) : 
-			DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_EDIT_SRC_DIR_WIZ);
-		setTitle(SourceLookupUIMessages.DirectorySourceContainerDialog_2);
-		setMessage(SourceLookupUIMessages.DirectorySourceContainerDialog_3);
-		setTitleImage(image);
-		Composite parentComposite = (Composite)super.createDialogArea(parent);
-		Font font = parentComposite.getFont();
-		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(font);
-
-        Composite dirComposite = new Composite(composite, SWT.NONE);
-        layout = new GridLayout(2, false);
-		dirComposite.setLayout(layout);
-		dirComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		dirComposite.setFont(font);
-
-        Label label = new Label(dirComposite, SWT.NONE);
-        label.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_4);
-        GridData data = new GridData(GridData.FILL_HORIZONTAL);
-        data.horizontalSpan = 2;
-        label.setLayoutData(data);
-        label.setFont(font);
-        
-        fDirText = new Text(dirComposite, SWT.BORDER);
-        data = new GridData(GridData.FILL_HORIZONTAL);
-        data.horizontalSpan = 1;
-        fDirText.setLayoutData(data);
-        fDirText.setFont(font);
-        fDirText.addModifyListener(new ModifyListener() {
-			public void modifyText( ModifyEvent e ) {
-				validate();
-			}        	
-        });
-
-        Button button = new Button(dirComposite, SWT.PUSH);
-        button.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_5);
-        data = new GridData();
-        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-        Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-        data.widthHint = Math.max(widthHint, minSize.x);
-        button.setLayoutData(data);
-        button.setFont(JFaceResources.getDialogFont());
-        button.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-            	browse();
-            }
-        });
-
-        fSubfoldersButton = new Button(composite, SWT.CHECK);
-        fSubfoldersButton.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_6);
-
-        return parentComposite;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		String title = null;
-		if (fNewContainer) {
-			title = SourceLookupUIMessages.DirectorySourceContainerDialog_7;
-		} else {
-			title = SourceLookupUIMessages.DirectorySourceContainerDialog_8;
-		}
-		newShell.setText(title);
-		super.configureShell( newShell );
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control c = super.createContents(parent);
-		fDirText.setText(fDirectory);
-		fSubfoldersButton.setSelection(fSearchSubfolders);
-		validate();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(c, IDebugHelpContextIds.SELECT_DIRECTORY_SOURCE_CONTAINER_DIALOG);
-		return c;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		fDirectory = fDirText.getText().trim();
-		fSearchSubfolders = fSubfoldersButton.getSelection();
-		DebugUIPlugin.getDefault().getDialogSettings().put(LAST_PATH_SETTING, fDirectory);
-		DebugUIPlugin.getDefault().getDialogSettings().put(LAST_SUBDIR_SETTING, fSearchSubfolders);	
-		super.okPressed();
-	}
-
-	private void browse() {
-		String last = fDirText.getText().trim();
-		if (last.length() == 0) {
-			last = DebugUIPlugin.getDefault().getDialogSettings().get(LAST_PATH_SETTING);
-		}
-		if (last == null) {
-			last = "";  //$NON-NLS-1$
-		}
-		DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SINGLE);
-		dialog.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_0); 
-		dialog.setMessage(SourceLookupUIMessages.DirectorySourceContainerDialog_1); 
-		dialog.setFilterPath(last);
-		String result = dialog.open();
-		if (result == null) {
-			return;
-		}
-		fDirText.setText(result);
-	}
-
-	private void validate() {
-		File file = new File(fDirText.getText().trim());
-		getButton(IDialogConstants.OK_ID).setEnabled(file.isDirectory() && file.exists());
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ExternalArchiveSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ExternalArchiveSourceContainerBrowser.java
deleted file mode 100644
index a5e2f03..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ExternalArchiveSourceContainerBrowser.java
+++ /dev/null
@@ -1,62 +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.debug.internal.ui.sourcelookup.browsers;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The browser for adding an external archive.
- * @since 3.0
- */
-public class ExternalArchiveSourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
-	private static final String ROOT_DIR = ExternalArchiveSourceContainerBrowser.class.getName() + ".rootDir";   //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		FileDialog dialog = new FileDialog(shell, SWT.OPEN | SWT.MULTI);
-		String rootDir = DebugUIPlugin.getDefault().getDialogSettings().get(ROOT_DIR);
-		dialog.setText(SourceLookupUIMessages.ExternalArchiveSourceContainerBrowser_2); 
-		dialog.setFilterExtensions(new String[]{"*.jar;*.zip"});  //$NON-NLS-1$
-		if (rootDir != null) {
-			dialog.setFilterPath(rootDir);
-		}
-		dialog.open();
-		String[] fileNames= dialog.getFileNames();
-		int nChosen= fileNames.length;			
-		if (nChosen > 0) {
-			rootDir = dialog.getFilterPath();
-			IPath filterPath= new Path(rootDir);
-			ISourceContainer[] containers= new ISourceContainer[nChosen];
-			for (int i= 0; i < nChosen; i++) {
-				IPath path= filterPath.append(fileNames[i]).makeAbsolute();	
-				// TODO: configure auto-detect
-				containers[i]= new ExternalArchiveSourceContainer(path.toOSString(), true);
-			}
-			DebugUIPlugin.getDefault().getDialogSettings().put(ROOT_DIR, rootDir);
-			return containers;
-		}
-		return new ISourceContainer[0];
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerBrowser.java
deleted file mode 100644
index d040e54..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerBrowser.java
+++ /dev/null
@@ -1,83 +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.debug.internal.ui.sourcelookup.browsers;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * The browser for adding a folder source container.
- * 
- * @since 3.0
- */
-public class FolderSourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		FolderSourceContainerDialog dialog = new FolderSourceContainerDialog(shell,  new WorkbenchLabelProvider(), new WorkbenchContentProvider());
-		
-		if (dialog.open() == Window.OK) {
-			Object[] selection= ((ElementTreeSelectionDialog)dialog).getResult();
-			ArrayList containers = new ArrayList();			
-			for (int i= 0; i < selection.length; i++) {
-				if(selection[i] instanceof IFolder) {
-					containers.add(new FolderSourceContainer((IFolder)selection[i], dialog.isSearchSubfolders()));
-				}
-			}
-			return (ISourceContainer[])containers.toArray(new ISourceContainer[containers.size()]);	
-		}			
-		return new ISourceContainer[0];
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#canEditSourceContainers(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
-	 */
-	public boolean canEditSourceContainers(ISourceLookupDirector director, ISourceContainer[] containers) {
-		return containers.length == 1 && containers[0].getType().getId().equals(FolderSourceContainer.TYPE_ID);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#editSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
-	 */
-	public ISourceContainer[] editSourceContainers(Shell shell, ISourceLookupDirector director, ISourceContainer[] containers) {
-		FolderSourceContainerDialog dialog = new FolderSourceContainerDialog(shell,  new WorkbenchLabelProvider(), new WorkbenchContentProvider());
-		FolderSourceContainer container = (FolderSourceContainer) containers[0];
-		dialog.setSearchSubfolders(container.isComposite());
-		dialog.setInitialSelection(container.getContainer());
-		if (dialog.open() == Window.OK) {
-			container.dispose();
-			Object[] selection= ((ElementTreeSelectionDialog)dialog).getResult();
-			ArrayList list = new ArrayList();			
-			for (int i= 0; i < selection.length; i++) {
-				if(selection[i] instanceof IFolder) {
-					list.add(new FolderSourceContainer((IFolder)selection[i], dialog.isSearchSubfolders()));
-				}
-			}
-			return (ISourceContainer[])list.toArray(new ISourceContainer[list.size()]);	
-		}			
-		return new ISourceContainer[0];
-	}
-	
-	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java
deleted file mode 100644
index 82281a4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java
+++ /dev/null
@@ -1,145 +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.debug.internal.ui.sourcelookup.browsers;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.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.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.views.navigator.ResourceComparator;
-
-/**
- * The dialog for selecting the folder for which a source container will be created.
- * 
- * @since 3.0
- */
-public class FolderSourceContainerDialog extends ElementTreeSelectionDialog { 
-	
-	/**
-	 * Constant to persist the state of the search subfolders button
-	 * 
-	 * @since 3.2
-	 */
-	private static final String LAST_SUBDIR_SETTING = "EXT_FOLDER_SOURCE_LAST_SUBDIR_SETTING"; //$NON-NLS-1$
-	
-	/**
-	 * Lets us control searching subfolders
-	 * 
-	 * @since 3.2
-	 */
-	private Button fSubfoldersButton;
-	
-	/**
-	 * stored value whether to search subfolders or not
-	 * 
-	 * @since 3.2
-	 */
-	private boolean fSearchSubfolders = false;
-	
-	/**
-	 * We need to add in the new control for indicating whether to search sub folders or not
-	 * 
-	 * @since 3.2
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite parentc = (Composite)super.createDialogArea(parent);
-		fSubfoldersButton = new Button(parentc, SWT.CHECK);
-        fSubfoldersButton.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_6);
-        fSubfoldersButton.setSelection(fSearchSubfolders);
-		return parentc;
-	}
-
-	/**
-	 * Sets the dialog values for its construction
-	 * @param parent the parent of the dialog
-	 * @param labelProvider the label provider for the content of the tree in the dialog
-	 * @param contentProvider the provider of the tree content for the dialog
-	 */
-	public FolderSourceContainerDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
-		super(parent, labelProvider, contentProvider);
-		setTitle(SourceLookupUIMessages.folderSelection_title);	//	
-		setInput(ResourcesPlugin.getWorkspace().getRoot());
-        setComparator(new ResourceComparator(ResourceComparator.NAME));
-		ISelectionStatusValidator validator= new ISelectionStatusValidator() {
-			public IStatus validate(Object[] selection) {
-				for (int i= 0; i < selection.length; i++) {
-					if (!(selection[i] instanceof IFolder)) {
-						return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), -1, SourceLookupUIMessages.sourceSearch_folderSelectionError, null); // 
-					} 				
-				}
-				return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
-			}			
-		};
-		setValidator(validator);	
-		setDoubleClickSelects(true);
-		setAllowMultiple(true);
-		setMessage(SourceLookupUIMessages.folderSelection_label); 
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,  IDebugHelpContextIds.ADD_FOLDER_CONTAINER_DIALOG);
-		setSearchSubfolders(DebugUIPlugin.getDefault().getDialogSettings().getBoolean(LAST_SUBDIR_SETTING));
-		addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement, Object element) {
-				if(!(element instanceof IFolder)) {
-					if(element instanceof IProject) {
-						return ((IProject)element).isAccessible();
-					}
-					return false;
-				}
-				return true;
-			}
-		});
-	}
-	
-	/**
-	 * Returns whether the 'search subfolders' option is selected.
-	 * 
-	 * @since 3.2
-	 * @return true if the search subfolders button is selected, false otherwise.
-	 */
-	public boolean isSearchSubfolders() {
-		return fSearchSubfolders;
-	}
-	
-	/**
-	 * Sets whether the 'search subfolders' option is selected.
-	 * 
-	 * @param subfolders
-	 * @since 3.2
-	 */
-	public void setSearchSubfolders(boolean subfolders) {
-		fSearchSubfolders = subfolders;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionStatusDialog#okPressed()
-	 */
-	protected void okPressed() {
-		fSearchSubfolders = fSubfoldersButton.getSelection();
-		DebugUIPlugin.getDefault().getDialogSettings().put(LAST_SUBDIR_SETTING, fSearchSubfolders);
-		super.okPressed();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ProjectSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ProjectSourceContainerBrowser.java
deleted file mode 100644
index a5c0e8c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ProjectSourceContainerBrowser.java
+++ /dev/null
@@ -1,59 +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.debug.internal.ui.sourcelookup.browsers;
-
-import java.util.ArrayList;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
-import org.eclipse.debug.internal.ui.sourcelookup.BasicContainerContentProvider;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * The browser for creating project source containers.
- * 
- * @since 3.0
- */
-public class ProjectSourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell,org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		Object input = ResourcesPlugin.getWorkspace().getRoot();
-		IStructuredContentProvider contentProvider=new BasicContainerContentProvider();
-		ILabelProvider labelProvider = new WorkbenchLabelProvider();
-		Dialog dialog = new ProjectSourceContainerDialog(shell,input, contentProvider, labelProvider,
-				SourceLookupUIMessages.projectSelection_chooseLabel); 
-		if(dialog.open() == Window.OK){		
-			Object[] elements= ((ListSelectionDialog)dialog).getResult();
-			ArrayList res= new ArrayList();
-			for (int i= 0; i < elements.length; i++) {
-				if(!(elements[i] instanceof IProject))
-					continue;				
-				res.add(new ProjectSourceContainer((IProject)elements[i], ((ProjectSourceContainerDialog)dialog).isAddRequiredProjects()));				
-			}
-			return (ISourceContainer[])res.toArray(new ISourceContainer[res.size()]);	
-		}	
-		return new ISourceContainer[0];
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ProjectSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ProjectSourceContainerDialog.java
deleted file mode 100644
index 3467f1b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ProjectSourceContainerDialog.java
+++ /dev/null
@@ -1,78 +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.debug.internal.ui.sourcelookup.browsers;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-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.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.dialogs.ListSelectionDialog;
-
-/**
- * The dialog for selecting the project for which a source container will be created.
- * 
- * @since 3.0
- */
-public class ProjectSourceContainerDialog extends ListSelectionDialog {
-	
-	private boolean fAddRequiredProjects = false;
-	
-	public ProjectSourceContainerDialog(
-			Shell parentShell,
-			Object input,
-			IStructuredContentProvider contentProvider,
-			ILabelProvider labelProvider,
-			String message) {
-		super(parentShell, input, contentProvider, labelProvider, message);
-	}
-	
-	
-	/**
-	 * @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);
-		
-		final Button addRequired = new Button(composite, SWT.CHECK);
-		addRequired.setText(SourceLookupUIMessages.projectSelection_requiredLabel);  
-		addRequired.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				fAddRequiredProjects = addRequired.getSelection();
-			}
-		});
-		addRequired.setSelection(fAddRequiredProjects);
-		addRequired.setFont(font);		
-		
-		applyDialogFont(composite);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getShell(),  IDebugHelpContextIds.ADD_PROJECT_CONTAINER_DIALOG);
-		return composite;
-	}
-	
-	
-	/**
-	 * Returns whether the user has selected to add required projects.
-	 * 
-	 * @return whether the user has selected to add required projects
-	 */
-	public boolean isAddRequiredProjects() {
-		return fAddRequiredProjects;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/WorkingSetSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/WorkingSetSourceContainerBrowser.java
deleted file mode 100644
index ea7a914..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/WorkingSetSourceContainerBrowser.java
+++ /dev/null
@@ -1,54 +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.debug.internal.ui.sourcelookup.browsers;
-
-import java.util.ArrayList;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.debug.ui.sourcelookup.WorkingSetSourceContainer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-
-/**
- * The browser for creating working set source containers.
- * 
- * @since 3.0
- */
-public class WorkingSetSourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		ArrayList containers = new ArrayList();		
-		IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetSelectionDialog(shell,true);
-		
-		if(dialog.open() == Window.OK)
-		{
-			IWorkingSet[] selections = dialog.getSelection();
-			if(selections != null)
-			{				
-				for(int i=0; i<selections.length; i++)
-				{
-					containers.add(new WorkingSetSourceContainer(selections[i]));					
-				}	
-			}		
-		}
-		
-		return (ISourceContainer[])containers.toArray(new ISourceContainer[containers.size()]);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/WorkspaceSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/WorkspaceSourceContainerBrowser.java
deleted file mode 100644
index 6375892..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/WorkspaceSourceContainerBrowser.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.debug.internal.ui.sourcelookup.browsers;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.containers.WorkspaceSourceContainer;
-import org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The browser for creating workspace source containers.
- * 
- * @since 3.0
- */
-public class WorkspaceSourceContainerBrowser extends AbstractSourceContainerBrowser {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#createSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		ISourceContainer[] containers = new ISourceContainer[1];
-		
-		containers[0] = new WorkspaceSourceContainer();
-		
-		return containers;		
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ContainerResolver.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ContainerResolver.java
deleted file mode 100644
index fa14d10..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ContainerResolver.java
+++ /dev/null
@@ -1,30 +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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * Resolver for the <code>${container_*}</code> variables. Accepts an optional
- * argument that is interpretted as a full path to a container in the workspace.  
- * 
- * @since 3.0
- */
-public class ContainerResolver extends ResourceResolver {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.stringsubstitution.ResourceResolver#translateSelectedResource(org.eclipse.core.resources.IResource)
-	 */
-	protected IResource translateSelectedResource(IResource resource) {
-		return resource.getParent();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/FilePrompt.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/FilePrompt.java
deleted file mode 100644
index 418c69f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/FilePrompt.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 Matt Conway and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms 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 Conway - initial implementation
- *     IBM Corporation - integration and code cleanup
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.swt.widgets.FileDialog;
-
-/**
- * Prompts the user to choose a file and expands the selection
- */
-public class FilePrompt extends PromptingResolver {
-
-	/**
-	 * Prompts the user to choose a file
-	 * @see PromptExpanderBase#prompt()
-	 */
-	public void prompt() {
-		FileDialog dialog = new FileDialog(getShell());
-		dialog.setText(dialogMessage);
-		dialog.setFileName(lastValue == null ? defaultValue : lastValue);
-		dialogResultString = dialog.open();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/FolderPrompt.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/FolderPrompt.java
deleted file mode 100644
index 861fceb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/FolderPrompt.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 Matt Conway and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms 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 Conway - initial implementation
- *     IBM Corporation - integration and code cleanup
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.swt.widgets.DirectoryDialog;
-
-/**
- * Prompts the user to choose a folder and expands the selection
- */
-public class FolderPrompt extends PromptingResolver {
-
-	/**
-	 * Prompts the user to choose a folder.
-	 * @see PromptExpanderBase#prompt()
-	 */
-	public void prompt() {
-		DirectoryDialog dialog = new DirectoryDialog(getShell());
-		dialog.setText(dialogMessage);
-		dialog.setFilterPath(lastValue == null ? defaultValue : lastValue);
-		dialogResultString = dialog.open();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/IArgumentSelector.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/IArgumentSelector.java
deleted file mode 100644
index 025697c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/IArgumentSelector.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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * A variable presentation extension can contribute an argument selector
- * which is use to configure the argument for a string substitution 
- * variable.
- * 
- * @since 3.0
- */
-public interface IArgumentSelector {
-
-	/**
-	 * Selects and returns an argument for the given variable, 
-	 * or <code>null</code> if none.
-	 * 
-	 * @param variable the variable an arugment is being seleted for
-	 * @param the shell to create any dialogs on, or <code>null</code> if none
-	 * @return argument for the given variable or <code>null</code>
-	 *  if none
-	 */
-	public String selectArgument(IStringVariable variable, Shell shell);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ProjectResolver.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ProjectResolver.java
deleted file mode 100644
index 7291661..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ProjectResolver.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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * Resolver for the <code>${project_*}</code> variables. Accepts an optional argument
- * that is interpretted as the name of a project.  
- * 
- * @since 3.0
- */
-public class ProjectResolver extends ResourceResolver {
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.stringsubstitution.ResourceResolver#translateSelectedResource(org.eclipse.core.resources.IResource)
-	 */
-	protected IResource translateSelectedResource(IResource resource) {
-		return resource.getProject();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/PromptingResolver.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/PromptingResolver.java
deleted file mode 100644
index d1c3bb4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/PromptingResolver.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 Matt Conway and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms 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 Conway - initial implementation
- *     IBM Corporation - integration and code cleanup
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Base implementation for variable resolvers that prompt the user
- * for their value.
- */
-abstract class PromptingResolver implements IDynamicVariableResolver {
-
-	/**
-	 * A hint that helps the user choose their input. If a prompt
-	 * hint is provider the user will be prompted:
-	 * 	Please input a value for <code>promptHint</code>
-	 */
-	protected String promptHint = null;
-	/**
-	 * The prompt displayed to the user.
-	 */
-	protected String dialogMessage = null;
-	/**
-	 * The default value selected when the prompt is displayed
-	 */
-	protected String defaultValue = null;
-	/**
-	 * The last value chosen by the user for this variable 
-	 */
-	protected String lastValue = null;
-	/**
-	 * The result returned from the prompt dialog
-	 */
-	protected String dialogResultString = null;
-	
-	/**
-	 * Presents the user with the appropriate prompt for the variable to be expanded
-	 * and sets the <code>dialogResultString</code> based on the user's selection.
-	 */
-	public abstract void prompt();
-
-	/**
-	 * Initializes values displayed when the user is prompted. If
-	 * a prompt hint and default value are supplied in the given
-	 * variable value, these are extracted for presentation
-	 * 
-	 * @param varValue the value of the variable from which the prompt
-	 * hint and default value will be extracted
-	 */
-	protected void setupDialog(String varValue) {
-		promptHint = null;
-		defaultValue = null;
-		dialogResultString = null;
-		if (varValue != null) {
-			int idx = varValue.indexOf(':');
-			if (idx != -1) {
-				promptHint = varValue.substring(0, idx);
-				defaultValue = varValue.substring(idx + 1);
-			} else {
-				promptHint = varValue;
-			}
-		}
-
-		if (promptHint != null) {
-			dialogMessage = MessageFormat.format(StringSubstitutionMessages.PromptExpanderBase_0, new String[] {promptHint}); 
-		} else {
-			dialogMessage = StringSubstitutionMessages.PromptExpanderBase_1; 
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IContextVariableResolver#resolveValue(org.eclipse.debug.internal.core.stringsubstitution.IContextVariable, java.lang.String)
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		String value = null;
-		setupDialog(argument);
-
-		DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-			public void run() {
-				prompt();
-			}
-		});
-		if (dialogResultString != null) {
-			value = dialogResultString;
-			lastValue = dialogResultString;
-		} else {
-			// dialogResultString == null means prompt was cancelled
-			throw new DebugException(new Status(IStatus.CANCEL, DebugUIPlugin.getUniqueIdentifier(), IStatus.CANCEL, MessageFormat.format(StringSubstitutionMessages.PromptingResolver_0, new String[] { variable.getName() }), null)); 
-		}
-		return value;
-	}
-	
-	protected Shell getShell() {
-		return DebugUIPlugin.getShell();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ResourceResolver.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ResourceResolver.java
deleted file mode 100644
index 9afa755..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ResourceResolver.java
+++ /dev/null
@@ -1,157 +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.debug.internal.ui.stringsubstitution;
-
-import java.net.URI;
-
-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.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Common function of variable resolvers.
- * 
- * @since 3.0
- */
-public class ResourceResolver implements IDynamicVariableResolver {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.stringsubstitution.IContextVariableResolver#resolveValue(org.eclipse.debug.internal.core.stringsubstitution.IContextVariable, java.lang.String)
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		IResource resource = null;
-		if (argument == null) {
-			resource = getSelectedResource(variable);
-		} else {
-			resource = getWorkspaceRoot().findMember(new Path(argument));
-		}
-		if (resource != null && resource.exists()) {
-			resource = translateSelectedResource(resource);
-			if (resource != null && resource.exists()) {
-				return translateToValue(resource, variable);
-			}
-		}
-		abort(MessageFormat.format(StringSubstitutionMessages.ResourceResolver_6, new String[]{getReferenceExpression(variable, argument)}), null);				 
-		return null;
-	}
-	
-	/**
-	 * Returns the resource applicable to this resolver, relative to the selected
-	 * resource. This method is called when no argument is present in a variable
-	 * expression. For, example, this method might return the project for the
-	 * selected resource.
-	 * 
-	 * @param resource selected resource
-	 * @return resource applicable to this variable resolver
-	 */
-	protected IResource translateSelectedResource(IResource resource) {
-		return resource;
-	}
-	
-	/**
-	 * Returns the workspace root
-	 * 
-	 * @return workspace root
-	 */
-	protected IWorkspaceRoot getWorkspaceRoot() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-
-	/**
-	 * Returns an expression used to reference the given variable and optional argument.
-	 * For example, <code>${var_name:arg}</code>.
-	 * 
-	 * @param variable referenced variable
-	 * @param argument referenced argument or <code>null</code>
-	 * @return variable reference expression
-	 */
-	protected String getReferenceExpression(IDynamicVariable variable, String argument) {
-		StringBuffer reference = new StringBuffer();
-		reference.append("${"); //$NON-NLS-1$
-		reference.append(variable.getName());
-		if (argument != null) {
-			reference.append(":"); //$NON-NLS-1$
-			reference.append(argument);
-		}
-		reference.append("}"); //$NON-NLS-1$
-		return reference.toString();
-	}
-	
-	/**
-	 * Throws an exception with the given message and underlying exception.
-	 *  
-	 * @param message exception message
-	 * @param exception underlying exception or <code>null</code> 
-	 * @throws CoreException
-	 */
-	protected void abort(String message, Throwable exception) throws CoreException {
-		throw new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR, message, exception));
-	}
-	
-	/**
-	 * Returns the selected resource.
-	 * 
-	 * @param variable variable referencing a resource
-	 * @return selected resource
-	 * @throws CoreException if there is no selection
-	 */
-	protected IResource getSelectedResource(IDynamicVariable variable) throws CoreException {
-		IResource resource = SelectedResourceManager.getDefault().getSelectedResource();
-		if (resource == null) {
-			abort(MessageFormat.format(StringSubstitutionMessages.ResourceResolver_7, new String[]{getReferenceExpression(variable, null)}), null); 
-		}
-		return resource;	
-	}
-
-	/**
-	 * Translates the given resource into a value for this variable resolver.
-	 * 
-	 * @param resource the resource applicable to this resolver's variable
-	 * @param variable the variable being resolved
-	 * @return variable value
-	 * @throws CoreException if the variable name is not recognized
-	 */
-	protected String translateToValue(IResource resource, IDynamicVariable variable) throws CoreException {
-		String name = variable.getName();
-		IPath path = null;
-		URI uri = null;
-		if (name.endsWith("_loc")) { //$NON-NLS-1$
-			uri = resource.getLocationURI();
-			if(uri != null) {
-				path = new Path(uri.getPath());
-				if(path != null) {
-					return path.toOSString();
-				}
-			}
-		} else if (name.endsWith("_path")) { //$NON-NLS-1$
-			path = resource.getFullPath();
-			if(path != null) {
-				return path.toOSString();
-			}
-		} else if (name.endsWith("_name")) { //$NON-NLS-1$
-			return resource.getName();
-		}
-		abort(MessageFormat.format(StringSubstitutionMessages.ResourceResolver_8, new String[]{getReferenceExpression(variable, null)}), null); 
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ResourceSelector.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ResourceSelector.java
deleted file mode 100644
index d6e0f6a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/ResourceSelector.java
+++ /dev/null
@@ -1,40 +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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ResourceListSelectionDialog;
-
-/**
- * Selects a resource argument for a string substitution variable
- */
-public class ResourceSelector implements IArgumentSelector {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.stringsubstitution.IArgumentSelector#selectArgument(org.eclipse.debug.internal.core.stringsubstitution.IStringVariable)
-	 */
-	public String selectArgument(IStringVariable variable, Shell shell) {
-		ResourceListSelectionDialog dialog = new ResourceListSelectionDialog(shell, ResourcesPlugin.getWorkspace().getRoot(), IResource.FILE | IResource.FOLDER | IResource.PROJECT);
-		dialog.setTitle(StringSubstitutionMessages.ResourceSelector_0); 
-		if (dialog.open() == Window.OK) {
-			Object[] objects = dialog.getResult();
-			if (objects.length == 1) {
-				return ((IResource)objects[0]).getFullPath().toString();
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SelectedResourceManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SelectedResourceManager.java
deleted file mode 100644
index 97471e3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SelectedResourceManager.java
+++ /dev/null
@@ -1,233 +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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.text.ITextSelection;
-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.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Maintains the context used to expand variables. The context is based on
- * the selected resource.
- */
-public class SelectedResourceManager  {
-
-	// singleton
-	private static SelectedResourceManager fgDefault;
-	
-	/**
-	 * Returns the singleton resource selection manager
-	 * 
-	 * @return VariableContextManager
-	 */
-	public static SelectedResourceManager getDefault() {
-		if (fgDefault == null) {
-			fgDefault = new SelectedResourceManager(); 
-		}
-		return fgDefault;
-	}
-	
-	/**
-	 * Returns the selection from the currently active part. If the active part is an
-	 * editor a new selection of the editor input is made, otherwise the selection 
-	 * from the parts' selection provider is returned if it is a structured selection. Otherwise
-	 * and empty selection is returned, never <code>null</code>
-	 * 
-	 * This method is intended to be called from the UI thread.
-	 * 
-	 * @return the <code>IStructuredSelection</code> from the current parts' selection provider, or
-	 * a new <code>IStructuredSelection</code> of the current editor input, depending on what the current part
-	 * is.
-	 * 
-	 * @since 3.3
-	 */
-	public IStructuredSelection getCurrentSelection() {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if(window != null) {
-			IWorkbenchPage page  = window.getActivePage();
-			if(page != null) {
-				IWorkbenchPart part = page.getActivePart();
-				if(part instanceof IEditorPart) {
-					return new StructuredSelection(((IEditorPart)part).getEditorInput());
-				}
-				else if(part != null) {
-					IWorkbenchSite site = part.getSite();
-					if(site != null) {
-						ISelectionProvider provider = site.getSelectionProvider();
-						if(provider != null) {
-							ISelection selection = provider.getSelection();
-							if(selection instanceof IStructuredSelection) {
-								return (IStructuredSelection) provider.getSelection();
-							}
-						}
-					}
-				}
-			}
-		}
-		return StructuredSelection.EMPTY;
-	}
-	
-	/**
-	 * Returns the currently selected resource in the active workbench window,
-	 * or <code>null</code> if none. If an editor is active, the resource adapter
-	 * associated with the editor is returned.
-	 * 
-	 * @return selected resource or <code>null</code>
-	 */
-	public IResource getSelectedResource() {
-		if(DebugUIPlugin.getStandardDisplay().getThread().equals(Thread.currentThread())) {
-			return getSelectedResource0();
-		}
-		else {
-			final IResource[] resource = new IResource[1];
-			DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-				public void run() {
-					resource[0] = getSelectedResource0();
-				}
-			});
-			return resource[0];
-		}
-	}
-	
-	/**
-	 * Returns the currently selected resource from the active part, or <code>null</code> if one cannot be
-	 * resolved.
-	 * @return the currently selected <code>IResource</code>, or <code>null</code> if none.
-	 * @since 3.3
-	 */
-	protected IResource getSelectedResource0() {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		IResource resource = null;
-		if(window != null) {
-			IWorkbenchPage page  = window.getActivePage();
-			if(page != null) {
-				IWorkbenchPart part = page.getActivePart();
-				if(part instanceof IEditorPart) {
-					IEditorPart epart = (IEditorPart) part;
-					resource = (IResource) epart.getEditorInput().getAdapter(IResource.class);
-				}
-				else if(part != null) {
-					IWorkbenchPartSite site = part.getSite();
-					if(site != null) {
-						ISelectionProvider provider = site.getSelectionProvider();
-						if(provider != null) {
-							ISelection selection = provider.getSelection();
-							if(selection instanceof IStructuredSelection) {
-								IStructuredSelection ss = (IStructuredSelection) selection;
-								if(!ss.isEmpty()) {
-									Object o = ss.getFirstElement();
-									if(o instanceof IAdaptable) {
-										resource = (IResource) ((IAdaptable)o).getAdapter(IResource.class);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return resource;
-	}
-	
-	/**
-	 * Returns the current text selection as a <code>String</code>, or <code>null</code> if
-	 * none.
-	 * 
-	 * @return the current text selection as a <code>String</code> or <code>null</code>
-	 */
-	public String getSelectedText() {
-		if(DebugUIPlugin.getStandardDisplay().getThread().equals(Thread.currentThread())) {
-			return getSelectedText0();
-		}
-		else {
-			final String[] text = new String[1];
-			DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-				public void run() {
-					text[0] = getSelectedText0();
-				}
-			});
-			return text[0];
-		}
-	}
-	
-	/**
-	 * Returns the selected text from the most currently active editor. The editor does not have to 
-	 * have focus at the time this method is called.
-	 * @return the currently selected text in the most recent active editor.
-	 * 
-	 * @since 3.3
-	 */
-	protected String getSelectedText0() {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if(window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if(page != null) {
-				IEditorPart epart = page.getActiveEditor();
-				if(epart != null) {
-					IEditorSite esite = epart.getEditorSite();
-					if(esite != null) {
-						ISelectionProvider sprovider = esite.getSelectionProvider();
-						if(sprovider != null) {
-							ISelection selection = sprovider.getSelection();
-							if(selection instanceof ITextSelection) {
-								return ((ITextSelection)selection).getText();
-							}
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the currently active workbench window
-	 * @return the currently active workbench window
-	 * @since 3.3
-	 */
-	public IWorkbenchWindow getActiveWindow0() {
-		return DebugUIPlugin.getActiveWorkbenchWindow();
-	}
-	
-	/**
-	 * Returns the active workbench window, or <code>null</code> if none.
-	 * 
-	 * @return the active workbench window, or <code>null</code> if none
-	 * @since 3.2
-	 */
-	public IWorkbenchWindow getActiveWindow() {
-		if(DebugUIPlugin.getStandardDisplay().getThread().equals(Thread.currentThread())) {
-			return getActiveWindow0();
-		}
-		else {
-			final IWorkbenchWindow[] window = new IWorkbenchWindow[1];
-			DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-				public void run() {
-					window[0] = getActiveWindow0();
-				}
-			});
-			return window[0];
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SelectedTextResolver.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SelectedTextResolver.java
deleted file mode 100644
index e2726b8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SelectedTextResolver.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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-
-public class SelectedTextResolver implements IDynamicVariableResolver {
-	private SelectedResourceManager selectedResourceManager;
-	
-	public SelectedTextResolver() {
-		selectedResourceManager = SelectedResourceManager.getDefault();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.variables.IDynamicVariableResolver#resolveValue(org.eclipse.core.variables.IDynamicVariable, java.lang.String)
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) {
-		String selection = selectedResourceManager.getSelectedText();
-		String selectedText = argument;
-		if (selection != null && selection.length() > 0) {
-			selectedText = selection;
-		}
-		return selectedText;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringPrompt.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringPrompt.java
deleted file mode 100644
index da44ec5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringPrompt.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 Matt Conway and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms 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 Conway - initial implementation
- *     IBM Corporation - integration and code cleanup
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-
-/**
- * Prompts the user to input a string and expands to the value entered
- */
-public class StringPrompt extends PromptingResolver {
-	
-	/**
-	 * Prompts the user to input a string.
-	 * @see PromptExpanderBase#prompt()
-	 */
-	public void prompt() {
-		InputDialog dialog = new InputDialog(null, StringSubstitutionMessages.StringPromptExpander_0, dialogMessage, defaultValue == null ? lastValue : defaultValue, null); 
-		int dialogResult = dialog.open();
-		if (dialogResult == Window.OK) {
-			dialogResultString = dialog.getValue();
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringSubstitutionMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringSubstitutionMessages.java
deleted file mode 100644
index cbd0de2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringSubstitutionMessages.java
+++ /dev/null
@@ -1,63 +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 - Initial API and implementation
- **********************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.osgi.util.NLS;
-
-public class StringSubstitutionMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.stringsubstitution.StringSubstitutionMessages";//$NON-NLS-1$
-
-	public static String PromptExpanderBase_0;
-	public static String PromptExpanderBase_1;
-	public static String PromptingResolver_0;
-
-	public static String RefreshTab_0;
-
-	public static String RefreshTab_43;
-
-	public static String RefreshTab_44;
-	public static String RefreshTab_6;
-	public static String RefreshTab_7;
-	public static String RefreshTab_8;
-	public static String RefreshTab_31;
-	public static String RefreshTab_32;
-	public static String RefreshTab_33;
-	public static String RefreshTab_34;
-	public static String RefreshTab_35;
-	public static String RefreshTab_36;
-	public static String RefreshTab_37;
-	public static String RefreshTab_40;
-	public static String RefreshTab_42;
-
-	public static String ResourceResolver_6;
-	public static String ResourceResolver_7;
-	public static String ResourceResolver_8;
-
-	public static String ResourceSelector_0;
-
-	public static String StringPromptExpander_0;
-
-	public static String StringVariableSelectionDialog_2;
-	public static String StringVariableSelectionDialog_3;
-	public static String StringVariableSelectionDialog_6;
-	public static String StringVariableSelectionDialog_7;
-	public static String StringVariableSelectionDialog_8;
-	public static String StringVariableSelectionDialog_0;
-	public static String StringVariableSelectionDialog_1;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, StringSubstitutionMessages.class);
-	}
-
-	public static String SystemPropertyArgumentSelector_0;
-
-	public static String SystemPropertyArgumentSelector_1;
-}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringSubstitutionMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringSubstitutionMessages.properties
deleted file mode 100644
index 7989f28..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringSubstitutionMessages.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
-###############################################################################
-
-PromptExpanderBase_0=Please input a value for {0}
-PromptExpanderBase_1=Please input a value
-PromptingResolver_0=Failed to expand {0}. Input was cancelled.
-
-RefreshTab_0=Recursively &include sub-folders
-RefreshTab_6=Refresh
-RefreshTab_7=Refresh resources...
-RefreshTab_8=Exception(s) occurred during refresh.
-RefreshTab_31=Refresh resources &upon completion.
-RefreshTab_32=The &entire workspace
-RefreshTab_33=The se&lected resource
-RefreshTab_34=The &project containing the selected resource
-RefreshTab_35=The f&older containing the selected resource
-RefreshTab_36=&Specific resources
-RefreshTab_37=Specify &Resources...
-RefreshTab_40=working set
-RefreshTab_42=Must select resources to refresh.
-RefreshTab_43=Refresh scope refers to non-existent resource {0}
-RefreshTab_44=Refresh scope invalid
-
-ResourceResolver_6=Variable references non-existent resource : {0}
-ResourceResolver_7=Variable references empty selection: {0}
-ResourceResolver_8=Variable not recognized: {0}
-
-ResourceSelector_0=Select Resource
-
-StringPromptExpander_0=Variable input
-
-StringVariableSelectionDialog_2=Select Variable
-StringVariableSelectionDialog_3=&Choose a variable (? = any character, * = any string):
-StringVariableSelectionDialog_6=&Argument:
-StringVariableSelectionDialog_7=C&onfigure...
-StringVariableSelectionDialog_8=&Variable Description:
-StringVariableSelectionDialog_0=&Edit Variables...
-StringVariableSelectionDialog_1=String Substitution
-SystemPropertyArgumentSelector_0=Select System Property
-SystemPropertyArgumentSelector_1=Select a system property (? = any character, * = any String):
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringVariableLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringVariableLabelProvider.java
deleted file mode 100644
index ca12e41..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringVariableLabelProvider.java
+++ /dev/null
@@ -1,30 +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.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.jface.viewers.LabelProvider;
-
-
-public class StringVariableLabelProvider extends LabelProvider {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			if (element instanceof IStringVariable) {
-				IStringVariable variable = (IStringVariable)element;
-				return variable.getName();
-			}
-			return super.getText(element);
-		}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringVariablePresentationManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringVariablePresentationManager.java
deleted file mode 100644
index 5832140..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/StringVariablePresentationManager.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.debug.internal.ui.stringsubstitution;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * Manages argument selectors (choosers) for string variables.
- * 
- * @since 3.0
- */
-public class StringVariablePresentationManager {
-	
-	/**
-	 * String variable presentation extension point identifier
-	 * (value <code>"stringVariablePresentations"</code>).
-	 * 
-	 * @since 3.0
-	 */
-	public static final String EXTENSION_POINT_STRING_VARIABLE_PRESENTATIONS = "stringVariablePresentations"; //$NON-NLS-1$
-	
-	// default manager
-	private static StringVariablePresentationManager fgManager;
-	
-	// extension point attributes
-	public static final String ATTR_NAME = "variableName"; //$NON-NLS-1$
-	public static final String ATTR_ARGUMENT_SELECTOR = "argumentSelector"; //$NON-NLS-1$
-	
-	/**
-	 * Table of configuration elements for variable presentations,
-	 * keyed by variable name.
-	 */
-	private Map fConfigurations;
-	
-	/**
-	 * Returns the singleton string variable presentation manager.
-	 * 
-	 * @return the singleton string variable presentation manager
-	 */
-	public static StringVariablePresentationManager getDefault() {
-		if (fgManager == null) {
-			fgManager = new StringVariablePresentationManager();
-		}
-		return fgManager;
-	}
-	
-	/**
-	 * Returns an argument selector contributed for the given
-	 * variable, or <code>null</code> if none.
-	 * 
-	 * @param variable string substitution variable
-	 * @return argument selector or <code>null</code>
-	 */
-	public IArgumentSelector getArgumentSelector(IStringVariable variable) {
-		IConfigurationElement element = (IConfigurationElement) fConfigurations.get(variable.getName());
-		if (element != null) {
-			try {
-				return (IArgumentSelector)element.createExecutableExtension(ATTR_ARGUMENT_SELECTOR);
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Constructs the manager, loading extensions.
-	 */
-	private StringVariablePresentationManager() {
-		initialize();
-	}
-
-	/**
-	 * Load extensions 
-	 */
-	private void initialize() {
-		fConfigurations = new HashMap();
-		IExtensionPoint point= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), EXTENSION_POINT_STRING_VARIABLE_PRESENTATIONS);
-		IConfigurationElement elements[]= point.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			String name= element.getAttribute(ATTR_NAME);
-			if (name == null) {
-				DebugUIPlugin.logErrorMessage(MessageFormat.format("String variable presentation extension missing required 'variableName' attribute: {0}", new String[] {element.getDeclaringExtension().getLabel()})); //$NON-NLS-1$
-				continue;
-			}
-			fConfigurations.put(name, element);
-		}		
-	}
-	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SystemPropertyArgumentSelector.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SystemPropertyArgumentSelector.java
deleted file mode 100644
index b633cac..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/SystemPropertyArgumentSelector.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-
-/**
- * Argument selector for system properties.
- * 
- * @since 3.2
- */
-public class SystemPropertyArgumentSelector implements IArgumentSelector {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.stringsubstitution.IArgumentSelector#selectArgument(org.eclipse.core.variables.IStringVariable, org.eclipse.swt.widgets.Shell)
-	 */
-	public String selectArgument(IStringVariable variable, Shell shell) {
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(shell, new LabelProvider());
-		dialog.setElements(System.getProperties().keySet().toArray());
-		dialog.setTitle(StringSubstitutionMessages.SystemPropertyArgumentSelector_0);
-		dialog.setMessage(StringSubstitutionMessages.SystemPropertyArgumentSelector_1);
-		if (dialog.open() == Window.OK) {
-			return (String) dialog.getResult()[0];
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/WorkspaceResolver.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/WorkspaceResolver.java
deleted file mode 100644
index 79d24fd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/stringsubstitution/WorkspaceResolver.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.stringsubstitution;
-
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.variables.IDynamicVariable;
-
-/**
- * Resolves the <code>${workspace_loc}</code> variable. The variable resolves to the
- * location of the workspace. If an argument is provided, it is interpretted as a
- * workspace relative path to a specific resource.
- * 
- * @since 3.0
- */
-public class WorkspaceResolver extends ResourceResolver {
-
-	/**
-	 * The <code>${workspace_loc}</code> variable does not use the selected resource.
-	 * 
-	 * @see org.eclipse.debug.internal.ui.stringsubstitution.ResourceResolver#getSelectedResource(org.eclipse.debug.internal.core.stringsubstitution.IContextVariable)
-	 */
-	protected IResource getSelectedResource(IDynamicVariable variable) {
-		return getWorkspaceRoot();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AbstractUpdatePolicy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AbstractUpdatePolicy.java
deleted file mode 100644
index c8bec41..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AbstractUpdatePolicy.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.debug.internal.ui.viewers;
-
-
-/**
- * An update policy updates a viewer based on deltas reported by a model proxy.
- *  
- * @since 3.2
- *
- */
-public abstract class AbstractUpdatePolicy {
-
-	private AsynchronousViewer fViewer = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.IUpdatePolicy#init(org.eclipse.debug.ui.viewers.update.IPresentation)
-	 */
-	public void init(AsynchronousViewer viewer) {
-		fViewer = viewer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.IUpdatePolicy#dispose()
-	 */
-	public synchronized void dispose() {
-		fViewer = null;
-	}
-
-	/**
-	 * Returns the viewer this policy is installed on or <code>null</code>
-	 * if disposed.
-	 * 
-	 * @return presentation to update
-	 */
-	public AsynchronousViewer getViewer() {
-		return fViewer;
-	}
-	
-	protected synchronized boolean isDisposed() {
-		return fViewer == null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java
deleted file mode 100644
index b1225ca..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousModel.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.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.core.runtime.jobs.Job;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.elements.adapters.AsynchronousDebugLabelAdapter;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-import org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter;
-import org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter;
-import org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousLabelAdapter;
-import org.eclipse.debug.internal.ui.viewers.provisional.IChildrenRequestMonitor;
-import org.eclipse.debug.internal.ui.viewers.provisional.ILabelRequestMonitor;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * Model for an asynchronous viewer
- * 
- * @since 3.2
- */
-public abstract class AsynchronousModel {
-	
-	private ModelNode fRoot; // root node
-	private Map fElementToNodes = new HashMap(); // map of element to corresponding tree nodes (list)
-	private Map fModelProxies = new HashMap(); // map of installed model proxies, by element
-	private AsynchronousViewer fViewer; // viewer this model works for
-    private boolean fDisposed = false; // whether disposed
-    
-    // debug flags
-	public static boolean DEBUG_MODEL = false;
-	
-	static {
-		DEBUG_MODEL = DebugUIPlugin.DEBUG && "true".equals( //$NON-NLS-1$
-		 Platform.getDebugOption("org.eclipse.debug.ui/debug/viewers/model")); //$NON-NLS-1$
-	}  
-	
-	class EmptyContentAdapter extends AsynchronousContentAdapter {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter#getChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-		 */
-		protected Object[] getChildren(Object parent, IPresentationContext context) throws CoreException {
-			return EMPTY;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-		 */
-		protected boolean hasChildren(Object element, IPresentationContext context) throws CoreException {
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.provisional.AsynchronousContentAdapter#supportsPartId(java.lang.String)
-		 */
-		protected boolean supportsPartId(String id) {
-			return true;
-		}
-	}
-	
-	protected IAsynchronousContentAdapter fEmptyContentAdapter = new EmptyContentAdapter();
-	
-	/**
-	 * List of requests currently being performed.
-	 */
-	private List fPendingUpdates = new ArrayList();
-	
-	/**
-	 * List of pending viewer udpates
-	 */
-	private List fViewerUpdates = new ArrayList();
-
-	/**
-	 * Constructs a new empty tree model
-	 * 
-	 * @param viewer associated viewer
-	 */
-	public AsynchronousModel(AsynchronousViewer viewer) {
-		fViewer = viewer;
-		if (DEBUG_MODEL) {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append("MODEL CREATED for: "); //$NON-NLS-1$
-			buffer.append(fViewer);
-			buffer.append(" ("); //$NON-NLS-1$
-			buffer.append(this);
-			buffer.append(")"); //$NON-NLS-1$
-			DebugUIPlugin.debug(buffer.toString());
-		}
-	}
-	
-	/**
-	 * Initializes this model. Called once after creation.
-	 * 
-	 * @param root root element or <code>null</code>
-	 * @param widget root widget/control
-	 */
-	public void init(Object root) {
-		if (root != null) {
-			fRoot = new ModelNode(null, root);
-			mapElement(root, fRoot);
-		}		
-	}
-	
-	protected AsynchronousViewer getViewer() {
-		return fViewer;
-	}
-	
-	/**
-	 * Disposes this model
-	 */
-	public synchronized void dispose() {
-		if (DEBUG_MODEL) {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append("MODEL DISPOSED for: "); //$NON-NLS-1$
-			buffer.append(fViewer);
-			buffer.append(" ("); //$NON-NLS-1$
-			buffer.append(this);
-			buffer.append(")"); //$NON-NLS-1$
-			DebugUIPlugin.debug(buffer.toString());
-		}
-        fDisposed = true;
-        cancelPendingUpdates();
-		disposeAllModelProxies();
-		ModelNode rootNode = getRootNode();
-		if (rootNode != null) {
-			rootNode.dispose();
-		}
-		fElementToNodes.clear();
-	}
-    
-    /**
-     * Returns whether this model has been disposed
-     */
-    public synchronized boolean isDisposed() {
-        return fDisposed;
-    }
-    
-    /**
-     * Cancels all pending update requests.
-     */
-    protected synchronized void cancelPendingUpdates() {
-        Iterator updates = fPendingUpdates.iterator();
-        while (updates.hasNext()) {
-            IStatusMonitor update = (IStatusMonitor) updates.next();
-            updates.remove();
-            update.setCanceled(true);
-        }
-        fPendingUpdates.clear();
-    }    
-	
-	/**
-	 * Installs the model proxy for the given element into this viewer
-	 * if not already installed.
-	 * 
-	 * @param element element to install an update policy for
-	 */
-	public synchronized void installModelProxy(Object element) {
-		if (!fModelProxies.containsKey(element)) {
-			IModelProxyFactory modelProxyFactory = getModelProxyFactoryAdapter(element);
-			if (modelProxyFactory != null) {
-				final IModelProxy proxy = modelProxyFactory.createModelProxy(element, getPresentationContext());
-				if (proxy != null) {
-					fModelProxies.put(element, proxy);
-					Job job = new Job("Model Proxy installed notification job") {//$NON-NLS-1$
-						protected IStatus run(IProgressMonitor monitor) {
-							if (!monitor.isCanceled()) {
-								proxy.init(getPresentationContext());
-								getViewer().modelProxyAdded(proxy);
-								proxy.installed(getViewer());
-							}
-							return Status.OK_STATUS;
-						} 
-					};
-					job.setSystem(true);
-					job.schedule();
-				}
-			}
-		}
-	}	
-	
-	/**
-	 * Uninstalls the model proxy installed for the given element, if any.
-	 * 
-	 * @param element
-	 */
-	protected synchronized void disposeModelProxy(Object element) {
-		IModelProxy proxy = (IModelProxy) fModelProxies.remove(element);
-		if (proxy != null) {
-			getViewer().modelProxyRemoved(proxy);
-			proxy.dispose();
-		}
-	}	
-	
-	/**
-	 * Unintalls all model proxies installed for this model
-	 */
-	private void disposeAllModelProxies() {
-	    synchronized(fModelProxies) {
-	        Iterator updatePolicies = fModelProxies.values().iterator();
-	        while (updatePolicies.hasNext()) {
-	            IModelProxy proxy = (IModelProxy)updatePolicies.next();
-	            getViewer().modelProxyRemoved(proxy);	            
-	            proxy.dispose();
-	        }
-	        
-	        fModelProxies.clear();
-	    }
-	}	
-	
-	/**
-	 * Returns the presentation this model is installed in
-	 * 
-	 * @return
-	 */
-	protected IPresentationContext getPresentationContext() {
-		return fViewer.getPresentationContext();
-	}
-	
-	/**
-	 * Returns the model proxy factory for the given element of <code>null</code> if none.
-	 * 
-	 * @param element element to retrieve adapters for
-	 * @return model proxy factory adapter or <code>null</code>
-	 */
-	protected IModelProxyFactory getModelProxyFactoryAdapter(Object element) {
-		IModelProxyFactory adapter = null;
-		if (element instanceof IModelProxyFactory) {
-			adapter = (IModelProxyFactory) element;
-		} else if (element instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) element;
-			adapter = (IModelProxyFactory) adaptable.getAdapter(IModelProxyFactory.class);
-		}
-		return adapter;
-	}	
-	
-	/**
-	 * Maps the given element to the given node.
-	 * 
-	 * @param element
-	 * @param node
-	 */
-	protected synchronized void mapElement(Object element, ModelNode node) {
-		ModelNode[] nodes = getNodes(element);
-        node.remap(element);
-		if (nodes == null) {
-			fElementToNodes.put(element, new ModelNode[] { node});
-		} else {
-			for (int i = 0; i < nodes.length; i++) {
-				if (nodes[i] == node) {
-					return;
-				}
-			}
-			ModelNode[] old = nodes;
-			ModelNode[] newNodes = new ModelNode[old.length + 1];
-			System.arraycopy(old, 0, newNodes, 0, old.length);
-			newNodes[old.length] = node;
-			fElementToNodes.put(element, newNodes);
-		}
-        installModelProxy(element);
-	}
-    
-    /**
-     * Unmaps the given node from its element and widget.
-     * 
-     * @param node
-     */
-    protected synchronized void unmapNode(ModelNode node) {
-        Object element = node.getElement();
-        ModelNode[] nodes = (ModelNode[]) fElementToNodes.get(element);
-        if (nodes == null) {
-            return;
-        }
-        if (nodes.length == 1) {
-            fElementToNodes.remove(element);
-            disposeModelProxy(element);
-        } else {
-            for (int i = 0; i < nodes.length; i++) {
-                ModelNode node2 = nodes[i];
-                if (node2 == node) {
-                    ModelNode[] newNodes= new ModelNode[nodes.length - 1];
-                    System.arraycopy(nodes, 0, newNodes, 0, i);
-                    if (i < newNodes.length) {
-                        System.arraycopy(nodes, i + 1, newNodes, i, newNodes.length - i);
-                    }
-                    fElementToNodes.put(element, newNodes);
-                }
-            }
-        }
-    }
-	
-	/**
-	 * Returns the nodes in this model for the given element or
-     * <code>null</code> if none.
-	 * 
-	 * @param element model element
-	 * @return associated nodes or <code>null</code>
-	 */
-	public synchronized ModelNode[] getNodes(Object element) {
-		return (ModelNode[]) fElementToNodes.get(element);
-	}
-	
-	/**
-	 * Returns the root node or <code>null</code>
-	 * 
-	 * @return the root node or <code>null</code>
-	 */
-	public ModelNode getRootNode() {
-		return fRoot;
-	}
-	
-	/**
-	 * Cancels any conflicting updates for children of the given item, and
-	 * schedules the new update.
-	 * 
-	 * @param update the update to schedule
-	 */
-	protected void requestScheduled(IStatusMonitor update) {
-		AsynchronousRequestMonitor absUpdate = (AsynchronousRequestMonitor) update;
-		synchronized (fPendingUpdates) {
-			Iterator updates = fPendingUpdates.listIterator();
-			while (updates.hasNext()) {
-				AsynchronousRequestMonitor pendingUpdate = (AsynchronousRequestMonitor) updates.next();
-				if (absUpdate.contains(pendingUpdate)) {
-					updates.remove();
-					pendingUpdate.setCanceled(true);
-				}
-			}
-			fPendingUpdates.add(update);
-		}
-	}	
-	
-	/**
-	 * Removes the update from the pending updates list.
-	 * 
-	 * @param update
-	 */
-	protected void requestComplete(IStatusMonitor update) {
-		synchronized (fPendingUpdates) {
-			fPendingUpdates.remove(update);
-		}
-	}
-	
-	/**
-	 * An viewer update has been scheduled due to the following update request.
-	 * 
-	 * @param update
-	 */
-	protected void viewerUpdateScheduled(IStatusMonitor update) {
-		// synch viewer updates and pending updates on same lock - fPendingUpdates
-		synchronized (fPendingUpdates) {
-			fViewerUpdates.add(update);
-		}
-	}
-	
-	/**
-	 * Returns the result of running the given elements through the
-	 * viewers filters.
-	 * 
-	 * @param parent parent element
-	 * @param elements the elements to filter
-	 * @return only the elements which all filters accept
-	 */
-	protected Object[] filter(Object parent, Object[] elements) {
-		ViewerFilter[] filters = getViewer().getFilters();
-		if (filters != null) {
-			ArrayList filtered = new ArrayList(elements.length);
-			for (int i = 0; i < elements.length; i++) {
-				boolean add = true;
-				for (int j = 0; j < filters.length; j++) {
-					add = filters[j].select(getViewer(), parent, elements[i]);
-					if (!add)
-						break;
-				}
-				if (add)
-					filtered.add(elements[i]);
-			}
-			return filtered.toArray();
-		}
-		return elements;
-	}
-	
-	/**
-	 * Refreshes the given node.
-	 * 
-	 * @param node
-	 */
-	protected void updateLabel(ModelNode node) {
-		Object element = node.getElement();
-		IAsynchronousLabelAdapter adapter = getLabelAdapter(element);
-		if (adapter != null) {
-			ILabelRequestMonitor labelUpdate = new LabelRequestMonitor(node, this);
-			requestScheduled(labelUpdate);
-			adapter.retrieveLabel(element, getPresentationContext(), labelUpdate);
-		}		
-	}
-	
-	/**
-	 * Returns the label adapter for the given element or <code>null</code> if none.
-	 * 
-	 * @param element element to retrieve adapter for
-	 * @return presentation adapter or <code>null</code>
-	 */
-	protected IAsynchronousLabelAdapter getLabelAdapter(Object element) {
-		IAsynchronousLabelAdapter adapter = null;
-		if (element instanceof IAsynchronousLabelAdapter) {
-			adapter = (IAsynchronousLabelAdapter) element;
-		} else if (element instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) element;
-			adapter = (IAsynchronousLabelAdapter) adaptable.getAdapter(IAsynchronousLabelAdapter.class);
-		}
-		// if no adapter, use default (i.e. model presentation)
-		if (adapter == null) {
-			return new AsynchronousDebugLabelAdapter();
-		}
-		return adapter;
-	}	
-	
-    /**
-     * Returns the tree element adapter for the given element or
-     * <code>null</code> if none.
-     * 
-     * @param element
-     *            element to retrieve adapter for
-     * @return presentation adapter or <code>null</code>
-     */
-    protected IAsynchronousContentAdapter getContentAdapter(Object element) {        
-        IAsynchronousContentAdapter adapter = null;
-        if (element instanceof IAsynchronousContentAdapter) {
-            adapter = (IAsynchronousContentAdapter) element;
-        } else if (element instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) element;
-            adapter = (IAsynchronousContentAdapter) adaptable.getAdapter(IAsynchronousContentAdapter.class);
-        }
-        return adapter;
-    }	
-    
-    /**
-     * Updates the children of the given node.
-     * 
-     * @param parent
-     *            node of which to update children
-     */
-    public void updateChildren(ModelNode parent) {
-        Object element = parent.getElement();
-        IAsynchronousContentAdapter adapter = getContentAdapter(element);
-        if (adapter == null) {
-        	adapter = fEmptyContentAdapter;
-        }
-        if (adapter != null) {
-            IChildrenRequestMonitor update = new ChildrenRequestMonitor(parent, this);
-            requestScheduled(update);
-            adapter.retrieveChildren(element, getPresentationContext(), update);
-        }
-    }    
-	
-	/**
-	 * Update this model's viewer preserving its selection.
-	 * 
-	 * @param update
-	 */
-	protected void preservingSelection(Runnable update) {
-		getViewer().preservingSelection(update);
-	}
-
-	/**
-	 * The viewer updated associated with a request is compelte.
-	 * 
-	 * @param monitor
-	 */
-	protected void viewerUpdateComplete(IStatusMonitor monitor) {
-		// synch viewer updates and pending updates on same lock - fPendingUpdates
-		synchronized (fPendingUpdates) {
-			fViewerUpdates.remove(monitor);
-		}
-		getViewer().updateComplete(monitor);
-	}
-	
-	/**
-	 * An update request was cancelled
-	 * 
-	 * @param monitor
-	 */
-	protected void requestCanceled(AsynchronousRequestMonitor monitor) {
-		synchronized (fPendingUpdates) {
-			fPendingUpdates.remove(monitor);
-		}
-	}
-	
-	/**
-	 * Whether any updates are still in progress in the model or against the viewer.
-	 * 
-	 * @return
-	 */
-	protected boolean hasPendingUpdates() {
-		synchronized (fViewerUpdates) {
-			return !fPendingUpdates.isEmpty() || !fViewerUpdates.isEmpty();
-		}
-	}
-	
-    /**
-     * Asynchronous update for add/set children request.
-     * 
-     * @param parent
-     * @param element
-     */
-	protected abstract void add(ModelNode parent, Object element);
-	
-	/**
-	 * Notification from children request monitor
-	 * 
-	 * @param parentNode parent node
-	 * @param kids list of model elements
-	 */
-	protected void setChildren(final ModelNode parentNode, List kids) {
-		
-        final Object[] children = filter(parentNode.getElement(), kids.toArray());
-        final AsynchronousViewer viewer = getViewer();
-        ViewerSorter sorter = viewer.getSorter();
-        if (sorter != null) {
-        	sorter.sort(viewer, children);
-        }
-        
-        ModelNode[] prevKids = null;
-        ModelNode[] newChildren = null;
-        ModelNode[] unmap = null; 
-        
-        synchronized (this) {
-        	if (isDisposed()) {
-                return;
-            }
-        	prevKids = parentNode.getChildrenNodes();
-            if (prevKids == null) {
-            	newChildren = new ModelNode[children.length];
-            	for (int i = 0; i < children.length; i++) {
-    				ModelNode node = new ModelNode(parentNode, children[i]);
-    				mapElement(children[i], node);
-    				newChildren[i] = node;
-    			}
-            	parentNode.setChildren(newChildren);
-            } else {
-            	newChildren = new ModelNode[children.length];
-            	unmap = new ModelNode[prevKids.length];
-            	for (int i = 0; i < prevKids.length; i++) {
-					unmap[i] = prevKids[i];	
-				}
-            	for (int i = 0; i < children.length; i++) {
-					Object child = children[i];
-					boolean found = false;
-					for (int j = 0; j < prevKids.length; j++) {
-						ModelNode prevKid = prevKids[j];
-						if (prevKid != null && child.equals(prevKid.getElement())) {
-							newChildren[i] = prevKid;
-							prevKids[j] = null;
-							found = true;
-							break;
-						}
-					}
-					if (!found) {
-						newChildren[i] = new ModelNode(parentNode, child);
-						mapElement(child, newChildren[i]);
-					}
-				}
-            	for (int i = 0; i < prevKids.length; i++) {
-            		ModelNode kid = prevKids[i];
-            		if (kid != null) {
-            			kid.dispose();
-            			unmapNode(kid);
-            		}
-            	}
-    	        parentNode.setChildren(newChildren);
-            }
-            if (DEBUG_MODEL) {
-            	DebugUIPlugin.debug("CHILDREN CHANGED: " + parentNode); //$NON-NLS-1$
-            	DebugUIPlugin.debug(toString());
-            }
-        }
-        
-        //update viewer outside the lock
-    	final ModelNode[] finalUnmap = unmap; 
-        preservingSelection(new Runnable() {
-            public void run() {
-            	if (finalUnmap != null) {
-	            	for (int i = 0; i < finalUnmap.length; i++) {
-						viewer.unmapNode(finalUnmap[i]);
-					}
-            	}
-            	viewer.nodeChildrenChanged(parentNode);
-            }
-        });        	        
-
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer();
-		if (fRoot != null) {
-			buf.append("ROOT: "); //$NON-NLS-1$
-			append(buf, fRoot, 0);
-		} else {
-			buf.append("ROOT: null"); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-	
-	private void append(StringBuffer buf, ModelNode node, int level) {
-		for (int i = 0; i < level; i++) {
-			buf.append('\t');
-		}
-		buf.append(node);
-		buf.append('\n');
-		ModelNode[] childrenNodes = node.getChildrenNodes();
-		if (childrenNodes != null) {
-			for (int i = 0; i < childrenNodes.length; i++) {
-				append(buf, childrenNodes[i], level + 1);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousRequestMonitor.java
deleted file mode 100644
index fba6d5d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousRequestMonitor.java
+++ /dev/null
@@ -1,180 +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.debug.internal.ui.viewers;
-
-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.debug.internal.ui.commands.actions.AbstractRequestMonitor;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Base implementation of an asynchronous request monitor.
- * <p>
- * Not intended to be subclassed or instantiated by clients. For internal use
- * with the <code>AsynchronousViewer</code> implementation.
- * </p>
- * @since 3.2
- */
-public abstract class AsynchronousRequestMonitor extends AbstractRequestMonitor {
-    
-	/**
-	 * Model node the update is rooted at
-	 */
-    private ModelNode fNode;
-    
-    /**
-     * Model the update is being performed for
-     */
-    private AsynchronousModel fModel;
-    
-    /**
-     * Whether this request's 'done' method has been called.
-     */
-    private boolean fDone = false;
-    
-    protected WorkbenchJob fViewerUpdateJob = new WorkbenchJob("Asynchronous viewer update") { //$NON-NLS-1$
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            // necessary to check if widget is disposed. The item may
-            // have been removed from the tree when another children update
-            // occurred.
-        	getModel().viewerUpdateScheduled(AsynchronousRequestMonitor.this);
-        	if (fDone) {
-        		getModel().requestComplete(AsynchronousRequestMonitor.this);
-        	}
-            if (!isCanceled() && !getNode().isDisposed()) {
-            	IStatus status = getStatus();
-                if (status != null && !status.isOK()) {
-                	getModel().getViewer().handlePresentationFailure(AsynchronousRequestMonitor.this, status);
-                } else {
-                	performUpdate();
-                }
-            }
-            getModel().viewerUpdateComplete(AsynchronousRequestMonitor.this);
-            return Status.OK_STATUS;
-        }
-    };
-    
-    /**
-     * Constructs an update rooted at the given item.
-     * 
-     * @param node model node
-     * @param model model the node is in
-     */
-    public AsynchronousRequestMonitor(ModelNode node, AsynchronousModel model) {
-        fNode = node;
-        fModel = model;
-        // serialize updates per viewer
-        fViewerUpdateJob.setRule(getUpdateSchedulingRule());
-        fViewerUpdateJob.setSystem(true);
-    }
-    
-    /**
-     * Returns the scheduling rule for viewer update job.
-     * 
-     * @return rule or <code>null</code>
-     */
-    protected ISchedulingRule getUpdateSchedulingRule() {
-    	return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(getModel().getViewer());
-    }
-    
-    /**
-     * Returns the model this update is being performed for
-     * 
-     * @return the model this update is being performed for
-     */
-    protected AsynchronousModel getModel() {
-        return fModel;
-    }
-    
-    /**
-     * Returns the model node this update is rooted at
-     * 
-     * @return the model node this update is rooted at
-     */
-    protected ModelNode getNode() {
-        return fNode;
-    }
-    
-    /**
-     * Returns whether this update contains the given node.
-     * That is, whether this update is for the same node or a child of
-     * the given node.
-     * 
-     * @param ndoe node to test containment on
-     * @return whether this update contains the given node
-     */
-    protected boolean contains(ModelNode node) {
-    	if (node == getNode()) {
-    		return true;
-    	}
-        ModelNode parentNode = getNode().getParentNode();
-        while (parentNode != null) {
-            if (parentNode.equals(getNode())) {
-                return true;
-            }
-            parentNode = parentNode.getParentNode();
-        }
-        return false;
-    }
-    
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
-     */
-    public void setCanceled(boolean value) {
-        super.setCanceled(value);
-        if (value) {
-        	getModel().requestCanceled(this);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitor#done()
-     */
-    public final void done() {
-    	synchronized (this) {
-    		fDone = true;
-		}
-		scheduleViewerUpdate(0L);
-	}
-    
-    /**
-     * Returns whether this request is done yet.
-     * 
-     * @return
-     */
-    protected synchronized boolean isDone() {
-    	return fDone;
-    }
-
-    protected void scheduleViewerUpdate(long ms) {
-        if(!isCanceled()) 
-            fViewerUpdateJob.schedule(ms);
-    }
-    
-    /**
-	 * Notification this update has been completed and should now be applied to
-	 * this update's viewer. This method is called in the UI thread.
-	 */
-    protected abstract void performUpdate();
-    
-    /**
-     * Returns whether this update effectively contains the given update.
-     * That is, whether this update will also perform the given update.
-     * 
-     * @param update update to compare to
-     * @return whether this update will also perform the given update
-     */
-    protected abstract boolean contains(AsynchronousRequestMonitor update);
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousSchedulingRuleFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousSchedulingRuleFactory.java
deleted file mode 100644
index 5a9218c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousSchedulingRuleFactory.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.debug.internal.ui.viewers;
-
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * Scheduling rule factory for asycn operations.
- * 
- * @since 3.2
- */
-public class AsynchronousSchedulingRuleFactory {
-	
-	private static AsynchronousSchedulingRuleFactory fgFactory = null;
-
-	/**
-	 * Rule allows only one job to run at a time
-	 */
-	class SerialRule implements ISchedulingRule {
-
-		public SerialRule() {
-		}
-
-		public boolean contains(ISchedulingRule rule) {
-			return rule == this;
-		}
-
-		public boolean isConflicting(ISchedulingRule rule) {
-			return rule instanceof SerialRule;
-		}
-	}
-	
-   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;
-		}
-    	
-    }	
-	
-	private AsynchronousSchedulingRuleFactory() {}
-	
-	public static AsynchronousSchedulingRuleFactory getDefault() {
-		if (fgFactory == null) {
-			fgFactory = new AsynchronousSchedulingRuleFactory();
-		}
-		return fgFactory;
-	}
-	
-	/**
-	 * Returns a scheulding rule that allows all jobs with an instance
-	 * of the rule to run one at a time.
-	 *  
-	 * @return scheduling rule
-	 */
-	public ISchedulingRule newSerialRule() {
-		return new SerialRule();
-	}
-	
-	/**
-	 * Returns a scheduling rule that allows all jobs with an instance
-	 * of the rule on the same object to run one at a time.
-	 * 
-	 * @param lock object to serialize one
-	 * @return scheduling rule
-	 */
-	public ISchedulingRule newSerialPerObjectRule(Object lock) {
-		return new SerialPerObjectRule(lock);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousTableModel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousTableModel.java
deleted file mode 100644
index 98b70f2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousTableModel.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-/**
- * @since 3.2
- *
- */
-public class AsynchronousTableModel extends AsynchronousModel {
-
-	/**
-	 * Constructs a new table model.
-	 * 
-	 * @param viewer
-	 */
-	public AsynchronousTableModel(AsynchronousViewer viewer) {
-		super(viewer);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousModel#add(org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelNode, java.lang.Object)
-	 */
-	protected void add(ModelNode parent, Object element) {}
-	
-	/**
-	 * Adds the given elements to the table.
-	 * 
-	 * @param elements
-	 */
-	public void add(Object[] elements) {
-		TableAddRequestMonitor update = new TableAddRequestMonitor(getRootNode(), elements, this);
-		requestScheduled(update);
-		update.done();
-	}
-	
-	/**
-	 * Notification add request is complete.
-	 * 
-	 * @param elements elements to add
-	 */
-	protected void added(Object[] elements) {
-		List kids = null;
-		boolean changed = false;
-    	synchronized (this) {
-    		ModelNode[] childrenNodes = getRootNode().getChildrenNodes();
-    		if (childrenNodes == null) {
-    			kids = new ArrayList(elements.length);
-    		} else {
-    			kids = new ArrayList(elements.length + childrenNodes.length);
-    			for (int i = 0; i < childrenNodes.length; i++) {
-					kids.add(childrenNodes[i].getElement());
-				}
-    		}
-    		for (int i = 0; i < elements.length; i++) {
-    			if (!kids.contains(elements[i])) {
-    				kids.add(elements[i]);
-    				changed = true;
-    			}
-			}
-		}
-    	if (changed) {
-    		setChildren(getRootNode(), kids);
-    	}
-	}
-	
-	/**
-	 * Inserts the given elements to the table.
-	 * 
-	 * @param elements
-	 * @param index
-	 */
-	public void insert(Object[] elements, int index) {
-		TableAddRequestMonitor update = new TableInsertRequestMonitor(getRootNode(), elements, index, this);
-		requestScheduled(update);
-		update.done();
-	}
-	
-	/**
-	 * Notification insert request is complete.
-	 * 
-	 * @param elements elements to add
-	 * @param index index to insert at
-	 */
-	protected void inserted(Object[] elements, int index) {
-		List kids = null;
-		boolean changed = false;
-    	synchronized (this) {
-    		ModelNode[] childrenNodes = getRootNode().getChildrenNodes();
-    		if (childrenNodes == null) {
-    			kids = new ArrayList(elements.length);
-    		} else {
-    			kids = new ArrayList(elements.length + childrenNodes.length);
-    			for (int i = 0; i < childrenNodes.length; i++) {
-					kids.add(childrenNodes[i].getElement());
-				}
-    		}
-    		for (int i = 0; i < elements.length; i++) {
-    			if (!kids.contains(elements[i])) {
-    				kids.add(index, elements[i]);
-    				index++;
-    				changed = true;
-    			}
-			}
-		}
-    	if (changed) {
-    		setChildren(getRootNode(), kids);
-    	}
-	}	
-
-	/**
-	 * Removes the given elements from the table.
-	 * 
-	 * @param elements
-	 */
-	public void remove(Object[] elements) {
-		TableRemoveRequestMonitor update = new TableRemoveRequestMonitor(getRootNode(), elements, this);
-		requestScheduled(update);
-		update.done();
-	}	
-	
-	/**
-	 * Notification remove request is complete.
-	 * 
-	 * @param elements elements to remove
-	 */
-	protected void removed(Object[] elements) {
-		List kids = null;
-		boolean changed = false;
-    	synchronized (this) {
-    		ModelNode[] childrenNodes = getRootNode().getChildrenNodes();
-    		if (childrenNodes != null) {
-    			kids = new ArrayList(childrenNodes.length);
-    			for (int i = 0; i < childrenNodes.length; i++) {
-					kids.add(childrenNodes[i].getElement());
-				}
-    		}
-    		for (int i = 0; i < elements.length; i++) {
-    			if (kids.remove(elements[i])) {
-    				changed = true;
-    			}
-			}
-		}
-    	if (changed) {
-    		setChildren(getRootNode(), kids);
-    	}
-	}	
-	
-	/**
-	 * Adds the given elements to the table.
-	 * 
-	 * @param elements
-	 */
-	public void replace(Object element, Object replacement) {
-		TableReplaceRequestMonitor update = new TableReplaceRequestMonitor(getRootNode(), element, replacement, this);
-		requestScheduled(update);
-		update.done();
-	}
-	
-	/**
-	 * Notification add request is complete.
-	 * 
-	 * @param elements elements to add
-	 */
-	protected void replaced(Object element, Object replacement) {
-        Object[] filtered = filter(getRootNode().getElement(), new Object[] { replacement });
-        if (filtered.length == 0) {
-            remove(new Object[]{element});
-            return;
-        }		
-		List list = new ArrayList();
-    	synchronized (this) {
-    		ModelNode[] nodes = getNodes(element);
-    		for (int i = 0; i < nodes.length; i++) {
-				ModelNode node = nodes[i];
-				node.remap(replacement);
-				list.add(node);
-			}
-		}
-    	if (!list.isEmpty()) {
-    		Iterator iterator = list.iterator();
-    		while (iterator.hasNext()) {
-    			ModelNode node = (ModelNode) iterator.next();
-    			getViewer().nodeChanged(node);
-    		}
-    	}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousTableViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousTableViewer.java
deleted file mode 100644
index 785a26b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousTableViewer.java
+++ /dev/null
@@ -1,517 +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.debug.internal.ui.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.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.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-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.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-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.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.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * @since 3.2
- */
-public class AsynchronousTableViewer extends AsynchronousViewer implements Listener {
-
-    private Table fTable;
-
-    private TableEditor fTableEditor;
-
-    private TableEditorImpl fTableEditorImpl;
-
-    public AsynchronousTableViewer(Composite parent) {
-        this(parent, SWT.VIRTUAL);
-    }
-
-    public AsynchronousTableViewer(Composite parent, int style) {
-        this(new Table(parent, style));
-    }
-
-    /**
-     * Table must be SWT.VIRTUAL. This is intentional. Labels will never be
-     * retrieved for non-visible items.
-     * 
-     * @see SWT.VIRTUAL
-     * @param table
-     */
-    public AsynchronousTableViewer(Table table) {
-        Assert.isTrue((table.getStyle() & SWT.VIRTUAL) != 0);
-        fTable = table;
-        hookControl(fTable);
-        fTableEditor = new TableEditor(fTable);
-        fTableEditorImpl = createTableEditorImpl();
-    }
-
-    protected void hookControl(Control control) {
-        super.hookControl(control);
-        control.addMouseListener(new MouseAdapter() {
-            public void mouseDown(MouseEvent e) {
-                fTableEditorImpl.handleMouseDown(e);
-            }
-        });      
-    }
-
-    public synchronized void dispose() {
-    	fTableEditor.dispose();
-    	fTable.dispose();
-        super.dispose();
-    }  
-
-    protected ISelection doAttemptSelectionToWidget(ISelection selection, boolean reveal) {
-        if (acceptsSelection(selection)) {
-            List list = ((IStructuredSelection) selection).toList();
-            if (list == null) {
-                fTable.deselectAll();
-                return StructuredSelection.EMPTY;
-            }
-
-            int[] indices = new int[list.size()];
-            ModelNode[] nodes = getModel().getRootNode().getChildrenNodes();
-            if (nodes != null) {
-	            int index = 0;
-	
-	            // I'm not sure if it would be faster to check TableItems first...
-	            for (int i = 0; i < nodes.length; i++) {
-	                Object element = nodes[i].getElement();
-	                if (list.contains(element)) {
-	                    indices[index] = i;
-	                    index++;
-	                }
-	            }
-	
-	            fTable.setSelection(indices);
-	            if (reveal && indices.length > 0) {
-	                TableItem item = fTable.getItem(indices[0]);
-	                fTable.showItem(item);
-	            }
-            }
-        }
-        return StructuredSelection.EMPTY;
-    }
-
-    protected boolean acceptsSelection(ISelection selection) {
-        return selection instanceof IStructuredSelection;
-    }
-
-    protected ISelection getEmptySelection() {
-        return StructuredSelection.EMPTY;
-    }
-
-    protected Widget getParent(Widget widget) {
-        if (widget instanceof TableItem) {
-            return fTable;
-        }
-        return null;
-    }
-
-    protected List getSelectionFromWidget() {
-        TableItem[] selection = fTable.getSelection();
-        List datas = new ArrayList(selection.length);
-        for (int i = 0; i < selection.length; i++) {
-            datas.add(selection[i].getData());
-        }
-        return datas;
-    }
-
-    public Control getControl() {
-        return fTable;
-    }
-
-    public Table getTable() {
-        return (Table) getControl();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#internalRefresh(org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelNode)
-     */
-    protected void internalRefresh(ModelNode node) {
-        super.internalRefresh(node);
-        if (node.getElement().equals(getInput())) {
-            updateChildren(node);
-        }
-    } 
-
-    protected void restoreLabels(Item item) {
-    	TableItem tableItem = (TableItem) item;
-    	String[] values = (String[]) tableItem.getData(OLD_LABEL);
-    	Image[] images = (Image[]) tableItem.getData(OLD_IMAGE);
-		if (values != null) {
-			tableItem.setText(values);
-			tableItem.setImage(images);
-		}
-	}
-
-	public void setLabels(Widget widget, String[] labels, ImageDescriptor[] imageDescriptors) {
-        TableItem item = (TableItem) widget;
-        item.setText(labels);
-        item.setData(OLD_LABEL, labels);
-        Image[] images = new Image[labels.length];
-        item.setData(OLD_IMAGE, images);
-        if (imageDescriptors != null) {
-            for (int i = 0; i < images.length; i++) {
-                if (i < imageDescriptors.length)
-                    images[i] = getImage(imageDescriptors[i]);
-            }
-        }
-        item.setImage(images);
-    }
-
-    public void setColors(Widget widget, RGB[] foregrounds, RGB[] backgrounds) {
-        TableItem item = (TableItem) widget;
-        if (foregrounds == null) {
-            foregrounds = new RGB[fTable.getColumnCount()];
-        }
-        if (backgrounds == null) {
-            backgrounds = new RGB[fTable.getColumnCount()];
-        }
-
-        for (int i = 0; i < foregrounds.length; i++) {
-            Color fg = getColor(foregrounds[i]);
-            item.setForeground(i, fg);
-        }
-        for (int i = 0; i < backgrounds.length; i++) {
-            Color bg = getColor(backgrounds[i]);
-            item.setBackground(i, bg);
-        }
-    }
-
-    public void setFonts(Widget widget, FontData[] fontDatas) {
-        TableItem item = (TableItem) widget;
-        if (fontDatas != null) {
-            for (int i = 0; i < fontDatas.length; i++) {
-                Font font = getFont(fontDatas[i]);
-                item.setFont(i, font);
-            }
-        }
-    }
-
-    public void setColumnHeaders(final String[] headers) {
-        fTableEditorImpl.setColumnProperties(headers);
-    }
-
-    public Object[] getColumnProperties() {
-        return fTableEditorImpl.getColumnProperties();
-    }
-
-    public void showColumnHeader(final boolean showHeaders) {
-        WorkbenchJob job = new WorkbenchJob("Set Header Visibility") { //$NON-NLS-1$
-            public IStatus runInUIThread(IProgressMonitor monitor) {
-            	if (!fTable.isDisposed())
-            	{
-            		fTable.setHeaderVisible(showHeaders);
-            	}
-                return Status.OK_STATUS;
-            }
-        };
-        job.setPriority(Job.INTERACTIVE);
-        job.setSystem(true);
-        job.schedule();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object)
-     */
-    public void reveal(Object element) {
-        Assert.isNotNull(element);
-        Widget w = findItem(element);
-        if (w instanceof TableItem)
-            getTable().showItem((TableItem) w);
-    }
-
-    /**
-     * Sets the cell editors of this table viewer.
-     * 
-     * @param editors
-     *            the list of cell editors
-     */
-    public void setCellEditors(CellEditor[] editors) {
-        fTableEditorImpl.setCellEditors(editors);
-    }
-
-    /**
-     * Sets the cell modifier of this table viewer.
-     * 
-     * @param modifier
-     *            the cell modifier
-     */
-    public void setCellModifier(ICellModifier modifier) {
-        fTableEditorImpl.setCellModifier(modifier);
-    }
-
-    protected TableEditorImpl createTableEditorImpl() {
-        return new TableEditorImpl(this) {
-            Rectangle getBounds(Item item, int columnNumber) {
-                return ((TableItem) item).getBounds(columnNumber);
-            }
-
-            int getColumnCount() {
-                return getTable().getColumnCount();
-            }
-
-            Item[] getSelection() {
-                return getTable().getSelection();
-            }
-
-            void setEditor(Control w, Item item, int columnNumber) {
-                fTableEditor.setEditor(w, (TableItem) item, columnNumber);
-            }
-
-            void setSelection(StructuredSelection selection, boolean b) {
-                AsynchronousTableViewer.this.setSelection(selection, b);
-            }
-
-            void showSelection() {
-                getTable().showSelection();
-            }
-
-            void setLayoutData(CellEditor.LayoutData layoutData) {
-                fTableEditor.grabHorizontal = layoutData.grabHorizontal;
-                fTableEditor.horizontalAlignment = layoutData.horizontalAlignment;
-                fTableEditor.minimumWidth = layoutData.minimumWidth;
-            }
-
-            void handleDoubleClickEvent() {
-                Viewer viewer = getViewer();
-                fireDoubleClick(new DoubleClickEvent(viewer, viewer.getSelection()));
-                fireOpen(new OpenEvent(viewer, viewer.getSelection()));
-            }
-        };
-    }
-
-    protected ISelection newSelectionFromWidget() {
-        Control control = getControl();
-        if (control == null || control.isDisposed()) {
-            return StructuredSelection.EMPTY;
-        }
-        List list = getSelectionFromWidget();
-        return new StructuredSelection(list);
-    }
-
-    public CellEditor[] getCellEditors() {
-        return fTableEditorImpl.getCellEditors();
-    }
-
-    public ICellModifier getCellModifier() {
-        return fTableEditorImpl.getCellModifier();
-    }
-
-    public boolean isCellEditorActive() {
-        return fTableEditorImpl.isCellEditorActive();
-    }
-
-    /**
-     * This is not asynchronous. This method must be called in the UI Thread.
-     */
-    public void cancelEditing() {
-        fTableEditorImpl.cancelEditing();
-    }
-
-    /**
-     * This is not asynchronous. This method must be called in the UI Thread.
-     * 
-     * @param element
-     *            The element to edit. Each element maps to a row in the Table.
-     * @param column
-     *            The column to edit
-     */
-    public void editElement(Object element, int column) {
-        fTableEditorImpl.editElement(element, column);
-    }
-
-    protected int indexForElement(Object element) {
-        ViewerSorter sorter = getSorter();
-        if (sorter == null)
-            return fTable.getItemCount();
-        int count = fTable.getItemCount();
-        int min = 0, max = count - 1;
-        while (min <= max) {
-            int mid = (min + max) / 2;
-            Object data = fTable.getItem(mid).getData();
-            int compare = sorter.compare(this, data, element);
-            if (compare == 0) {
-                // find first item > element
-                while (compare == 0) {
-                    ++mid;
-                    if (mid >= count) {
-                        break;
-                    }
-                    data = fTable.getItem(mid).getData();
-                    compare = sorter.compare(this, data, element);
-                }
-                return mid;
-            }
-            if (compare < 0)
-                min = mid + 1;
-            else
-                max = mid - 1;
-        }
-        return min;
-    }
-
-    public void add(Object element) {
-        if (element != null)
-            add(new Object[] { element });
-    }
-
-    public void add(Object[] elements) {
-        if (elements == null || elements.length == 0)
-            return; // done
-        ((AsynchronousTableModel)getModel()).add(elements);
-    }
-
-    public void remove(Object element) {
-        if (element != null)
-            remove(new Object[] { element });
-    }
-
-    public void remove(final Object[] elements) {
-        if (elements == null || elements.length == 0)
-            return; // done
-        ((AsynchronousTableModel)getModel()).remove(elements);
-    }
-
-    public void insert(Object element, int position) {
-        if (element != null)
-            insert(new Object[] { element }, position);
-    }
-
-    public void insert(Object[] elements, int position) {
-        if (elements == null || elements.length == 0)
-            return;
-        ((AsynchronousTableModel)getModel()).insert(elements, position);
-    }
-
-    public void replace(Object element, Object replacement) {
-        if (element == null || replacement == null)
-            throw new IllegalArgumentException("unexpected null parameter"); //$NON-NLS-1$
-        ((AsynchronousTableModel)getModel()).replace(element, replacement);
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#createModel()
-	 */
-	protected AsynchronousModel createModel() {
-		return new AsynchronousTableModel(this);
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#setItemCount(org.eclipse.swt.widgets.Widget, int)
-     */
-    protected void setItemCount(Widget parent, int itemCount) {
-		fTable.setItemCount(itemCount);
-	}  
-
-	protected int getVisibleItemCount(int top) {
-        int itemCount = fTable.getItemCount();
-        return Math.min((fTable.getBounds().height / fTable.getItemHeight()) + 2, itemCount - top);
-    }   
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#createUpdatePolicy()
-	 */
-	public AbstractUpdatePolicy createUpdatePolicy() {
-		return new TableUpdatePolicy();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#getParentWidget(org.eclipse.swt.widgets.Widget)
-	 */
-	protected Widget getParentWidget(Widget widget) {
-		if (widget instanceof TableItem) {
-			return ((TableItem)widget).getParent();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#getChildWidget(org.eclipse.swt.widgets.Widget, int)
-	 */
-	protected Widget getChildWidget(Widget parent, int index) {
-		if (index < fTable.getItemCount()) {
-			return fTable.getItem(index);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#clear(org.eclipse.swt.widgets.Widget)
-	 */
-	protected void clear(Widget item) {
-		if (item instanceof TableItem) {
-			int i = fTable.indexOf((TableItem)item);
-			if (i >= 0) {
-				fTable.clear(i);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#clearChild(org.eclipse.swt.widgets.Widget, int)
-	 */
-	protected void clearChild(Widget parent, int childIndex) {
-		if (parent instanceof Table) {
-			fTable.clear(childIndex);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#clearChildren(org.eclipse.swt.widgets.Widget)
-	 */
-	protected void clearChildren(Widget item) {
-		if (item instanceof Table) {
-			fTable.clearAll();
-		}	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#indexOf(org.eclipse.swt.widgets.Widget, org.eclipse.swt.widgets.Widget)
-	 */
-	protected int indexOf(Widget parent, Widget child) {
-		if (parent instanceof Table) {
-			return ((Table)parent).indexOf((TableItem)child);
-		}
-		return -1;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousViewer.java
deleted file mode 100644
index e5878c4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/AsynchronousViewer.java
+++ /dev/null
@@ -1,1193 +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.debug.internal.ui.viewers;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-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.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-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.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * A viewer that retrieves labels and content asynchronously via adapters and supports
- * duplicate elements in the viewer. Retrieving content and labels asynchronously allows
- * for arbitrary latency without blocking the UI thread.
- * <p>
- * This viewer uses adapters to retrieve labels and content rather than
- * a label provider and content provider. As such, the label provider for this viewer
- * is <code>null</code> by default. The content provider returned by this viewer is
- * non-<code>null</code> to conform to the viewer specification, but performs no 
- * useful function.
- * </p>
- * <p>
- * The selection in this viewer is also set asynchronously. When the selection is set,
- * the viewer attempts to perform the selection. If the elements in the specified selection
- * are not yet in the viewer, the portion of the selection that could not be honored
- * becomes a pending selection. As more elements are added to viewer, the pending selection
- * is attempted to be set.  
- * </p>
- * @since 3.2
- */
-public abstract class AsynchronousViewer extends StructuredViewer implements Listener {
-	
-	/**
-	 * Model of elements for this viewer
-	 */
-	private AsynchronousModel fModel;
-
-	/**
-	 * Cache of images used for elements in this tree viewer. Label updates
-	 * use the method <code>getImage(...)</code> to cache images for
-	 * image descriptors. The images are disposed when this viewer is disposed.
-	 */
-	private Map fImageCache = new HashMap();
-
-	/**
-	 * Cache of the fonts used for elements in this tree viewer. Label updates
-	 * use the method <code>getFont(...)</code> to cache fonts for
-	 * FontData objects. The fonts are disposed with the viewer.
-	 */
-	private Map fFontCache = new HashMap();
-
-	/**
-	 * Cache of the colors used for elements in this tree viewer. Label updates
-	 * use the method <code>getColor(...)</code> to cache colors for
-	 * RGB values. The colors are disposed with the viewer.
-	 */
-	private Map fColorCache = new HashMap();
-
-	/**
-	 * The context in which this viewer is being used - i.e. what part it is contained
-	 * in any any preference settings associated with it.
-	 */
-	private IPresentationContext fContext;
-
-	private ISelection fPendingSelection;
-
-	private ISelection fCurrentSelection;
-	
-	/**
-	 * Array used to store indices of the path to an item in the viewer being mapped
-	 * by a 'set data' callback. Indices are bottom up. For example when 'set data' for 
-	 * the 3rd child of the 4th child of the 2nd root element were being asked for,
-	 * the first 3 indices would look like: [3, 4, 2, ....]. We re-use an array to avoid
-	 * creating a new one all the time. The array grows as needed to accommodate deep
-	 * elements.
-	 */
-	private int[] fSetDataIndicies = new int[5];
-	
-	/**
-	 * The update policy for this viewer.
-	 */
-	private AbstractUpdatePolicy fUpdatePolicy;
-
-	protected static final String OLD_LABEL = "old_label"; //$NON-NLS-1$
-	protected static final String OLD_IMAGE = "old_image"; //$NON-NLS-1$
-	
-	   // debug flags
-	public static boolean DEBUG_VIEWER = false;
-	
-	static {
-		DEBUG_VIEWER = DebugUIPlugin.DEBUG && "true".equals( //$NON-NLS-1$
-		 Platform.getDebugOption("org.eclipse.debug.ui/debug/viewers/viewer")); //$NON-NLS-1$
-	}    	
-	
-	/**
-	 * Creates a new viewer 
-	 */
-	protected AsynchronousViewer() {
-		setContentProvider(new NullContentProvider());
-		setUseHashlookup(true);
-	}
-
-	/**
-	 * Hash lookup is required, don't let subclasses change behavior.
-	 */
-	public final void setUseHashlookup(boolean enable) {
-		Assert.isTrue(enable);
-		super.setUseHashlookup(enable);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#hookControl(org.eclipse.swt.widgets.Control)
-	 */
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		control.addListener(SWT.SetData, this);
-	}
-
-	/**
-	 * Clients must call this methods when this viewer is no longer needed
-	 * so it can perform cleanup.
-	 */
-	public synchronized void dispose() {
-		Iterator images = fImageCache.values().iterator();
-		while (images.hasNext()) {
-			Image image = (Image) images.next();
-			image.dispose();
-		}
-		fImageCache.clear();
-		
-		Iterator fonts = fFontCache.values().iterator();
-		while (fonts.hasNext()) {
-			Font font = (Font) fonts.next();
-			font.dispose();
-		}
-		fFontCache.clear();
-		
-		Iterator colors = fColorCache.values().iterator();
-		while (colors.hasNext()) {
-			Color color = (Color) colors.next();
-			color.dispose();
-		}
-		fColorCache.clear();
-		
-		if (fModel != null) {
-			fModel.dispose();
-		}
-		if (fUpdatePolicy != null) {
-			fUpdatePolicy.dispose();
-		}
-		if (fContext != null) {
-			((PresentationContext)fContext).dispose();
-		}
-	}
-
-	/**
-	 * Updates all occurrences of the given element in this viewer.
-	 * 
-	 * @param element element to update
-	 */
-	public void update(Object element) {
-		ModelNode[] nodes = getModel().getNodes(element);
-		if (nodes != null) {
-			for (int i = 0; i < nodes.length; i++) {
-				updateLabel(nodes[i]);
-			}
-		}
-	}
-	
-	/**
-	 * Updates the label for a specific element (node) in the model.
-	 * 
-	 * @param node node to update
-	 * @param item its associated item
-	 */
-	protected void updateLabel(ModelNode node) {
-		// the input is not displayed
-		if (!node.getElement().equals(getInput())) {
-			getModel().updateLabel(node);
-		}
-	}
-		
-	/**
-	 * Returns the presentation context to be used in update requests.
-	 * Clients may override this method if required to provide special
-	 * implementations of contexts.
-	 * 
-	 * @return presentation context
-	 */
-	public IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#unmapAllElements()
-	 */
-	protected synchronized void unmapAllElements() {
-		super.unmapAllElements();
-		AsynchronousModel model = getModel();
-		if (model != null) {
-			model.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object)
-	 */
-	protected synchronized void inputChanged(Object input, Object oldInput) {
-		fPendingSelection = null;
-		if (fCurrentSelection != null) {
-			updateSelection(new StructuredSelection());
-			fCurrentSelection = null;
-		}
-		if (fUpdatePolicy == null) {
-			fUpdatePolicy = createUpdatePolicy();
-            fUpdatePolicy.init(this);
-		}
-		if (fModel != null) {
-			fModel.dispose();
-		}
-		fModel = createModel();
-		fModel.init(input);
-		if (input != null) {
-			mapElement(fModel.getRootNode(), getControl());
-			getControl().setData(fModel.getRootNode().getElement());
-		} else {
-			unmapAllElements();
-			getControl().setData(null);
-		}
-        refresh();		
-	}
-	
-	/**
-	 * Creates a new empty model for this viewer that
-	 * is *not* initialized.
-	 * 
-	 * @return a new model
-	 */
-	protected abstract AsynchronousModel createModel();
-
-	/**
-	 * Creates and returns this viewers update policy.
-	 * @return update policy
-	 */
-	public abstract AbstractUpdatePolicy createUpdatePolicy();
-
-	Image[] getImages(ImageDescriptor[] descriptors) {
-        if (descriptors == null || descriptors.length == 0) {
-            String[] columns = getPresentationContext().getColumns();
-            if (columns == null) {
-                return new Image[1];
-            } else {
-                return new Image[columns.length];
-            }
-        }
-		Image[] images = new Image[descriptors.length];
-		for (int i = 0; i < images.length; i++) {
-			images[i] = getImage(descriptors[i]);
-		}
-		return images;
-	}
-	
-	/**
-	 * Returns an image for the given image descriptor or <code>null</code>. Adds the image
-	 * to a cache of images if it does not already exist. The cache is cleared when this viewer
-	 * is disposed. 
-	 * 
-	 * @param descriptor image descriptor or <code>null</code>
-	 * @return image or <code>null</code>
-	 */
-	protected Image getImage(ImageDescriptor descriptor) {
-		if (descriptor == null) {
-			return null;
-		}
-		Image image = (Image) fImageCache.get(descriptor);
-		if (image == null) {
-			image = new Image(getControl().getDisplay(), descriptor.getImageData());
-			fImageCache.put(descriptor, image);
-		}
-		return image;
-	}
-
-	protected Font[] getFonts(FontData[] fontDatas) {
-		if (fontDatas == null || fontDatas.length == 0) {
-            String[] columns = getPresentationContext().getColumns();
-            if (columns == null) {
-                return new Font[1];
-            } else {
-                return new Font[columns.length];
-            }
-		}
-		
-		Font[] fonts = new Font[fontDatas.length];
-		for (int i = 0; i < fonts.length; i++) {
-			fonts[i] = getFont(fontDatas[i]);
-		}
-		return fonts;
-	}
-	
-	/**
-	 * Returns a font for the given font data or <code>null</code>. Adds the font to this viewer's font 
-	 * cache which is disposed when this viewer is disposed.
-	 * 
-	 * @param fontData font data or <code>null</code>
-	 * @return font font or <code>null</code>
-	 */
-	protected Font getFont(FontData fontData) {
-		if (fontData == null) {
-			return null;
-		}
-		Font font = (Font) fFontCache.get(fontData);
-		if (font == null) {
-			font = new Font(getControl().getDisplay(), fontData);
-			fFontCache.put(fontData, font);
-		}
-		return font;
-	}
-	
-	protected Color[] getColors(RGB[] rgb) {
-        if (rgb == null || rgb.length == 0) {
-            String[] columns = getPresentationContext().getColumns();
-            if (columns == null) {
-                return new Color[1];
-            } else {
-                return new Color[columns.length];
-            }
-        }
-		Color[] colors = new Color[rgb.length];
-		for (int i = 0; i < colors.length; i++) {
-			colors[i] = getColor(rgb[i]);
-		}
-		return colors;
-	}
-	/**
-	 * Returns a color for the given RGB or <code>null</code>. Adds the color to this viewer's color 
-	 * cache which is disposed when this viewer is disposed.
-	 * 
-	 * @param rgb RGB or <code>null</code>
-	 * @return color or <code>null</code>
-	 */
-	protected Color getColor(RGB rgb) {
-		if (rgb == null) {
-			return null;
-		}
-		Color color = (Color) fColorCache.get(rgb);
-		if (color == null) {
-			color = new Color(getControl().getDisplay(), rgb);
-			fColorCache.put(rgb, color);
-		}
-		return color;
-	}
-	
-	/**
-	 * Sets the context for this viewer. 
-	 * 
-	 * @param context
-	 */
-	public void setContext(IPresentationContext context) {
-		fContext = context;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object)
-	 */
-	protected Widget doFindItem(Object element) {
-		// this viewer maps model nodes to widgets, so the element is a ModelNode
-		AsynchronousModel model = getModel();
-		if (model != null) {
-			if (element.equals(model.getRootNode())) {
-				return doFindInputItem(element);
-			}
-			Widget[] widgets = findItems(element);
-			if (widgets.length > 0) {
-				return widgets[0];
-			}
-		}
-		return null;
-	}
-	
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object)
-     */
-    protected Widget doFindInputItem(Object element) {
-    	if (element instanceof ModelNode) {
-			ModelNode node = (ModelNode) element;
-			if (node.getElement().equals(getInput())) {
-				return getControl();
-			}
-		}
-        return null;
-    }	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean)
-	 */
-	protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object)
-	 */
-	protected void internalRefresh(Object element) {
-		// get the nodes in the model
-		AsynchronousModel model = getModel();
-		if (model != null) {
-			ModelNode[] nodes = model.getNodes(element);
-			if (nodes != null) {
-				for (int i = 0; i < nodes.length; i++) {
-					ModelNode node = nodes[i];
-					// get the widget for the node
-					Widget item = findItem(node);
-					if (item != null) {
-						internalRefresh(node);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Refreshes a specific occurrence of an element (a node).
-	 * 
-	 * @param node node to update
-	 * 
-	 * Subclasses should override and call super
-	 */
-	protected void internalRefresh(ModelNode node) {
-		updateLabel(node);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
-	 */
-	public synchronized void setSelection(ISelection selection, boolean reveal) {
-		setSelection(selection, reveal, false);
-	}
-	
-	/**
-	 * Sets the selection in this viewer.
-	 * 
-	 * @param selection new selection
-	 * @param reveal whether to reveal the selection
-	 * @param force whether to force the selection change without consulting the model
-	 *  selection policy
-	 */
-	public synchronized void setSelection(ISelection selection, final boolean reveal, boolean force) {
-		Control control = getControl();
-		if (control == null || control.isDisposed()) {
-			return;
-		}
-		if (!acceptsSelection(selection)) {
-			selection = getEmptySelection();
-		}
-		if (!force && !overrideSelection(fCurrentSelection, selection)) {
-			return;
-		}
-		
-		fPendingSelection = selection;
-		
-		if (getControl().getDisplay().getThread() == Thread.currentThread()) {
-			attemptSelection(reveal);
-		} else {
-			WorkbenchJob job = new WorkbenchJob("attemptSelection") { //$NON-NLS-1$
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					attemptSelection(reveal);
-					return Status.OK_STATUS;
-				}
-				
-			};
-			job.setSystem(true);
-			job.schedule();
-		}		
-	}	
-	
-	
-	/**
-	 * Returns whether the candidate selection should override the current
-	 * selection.
-	 * 
-	 * @param current
-	 * @param curr
-	 * @return
-	 */
-	protected boolean overrideSelection(ISelection current, ISelection candidate) {
-		IModelSelectionPolicy selectionPolicy = getSelectionPolicy(current);
-		if (selectionPolicy == null) {
-			return true;
-		}
-		if (selectionPolicy.contains(candidate, getPresentationContext())) {
-			return selectionPolicy.overrides(current, candidate, getPresentationContext());
-		}
-		return !selectionPolicy.isSticky(current, getPresentationContext());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelection()
-	 */
-	public ISelection getSelection() {
-		Control control = getControl();
-		if (control == null || control.isDisposed() || fCurrentSelection == null) {
-			return StructuredSelection.EMPTY;
-		}
-		return fCurrentSelection;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#handleSelect(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handleSelect(SelectionEvent event) {
-		// handle case where an earlier selection listener disposed the control.
-		Control control = getControl();
-		if (control != null && !control.isDisposed()) {
-			updateSelection(newSelectionFromWidget());
-		}
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#handlePostSelect(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handlePostSelect(SelectionEvent e) {
-		SelectionChangedEvent event = new SelectionChangedEvent(this, newSelectionFromWidget());
-		firePostSelectionChanged(event);
-	}	
-	
-	/**
-	 * Creates and returns a new selection from this viewer, based on the selected
-	 * elements in the widget.
-	 * 
-	 * @return a new selection
-	 */
-	protected abstract ISelection newSelectionFromWidget();
-	
-	/**
-	 * Returns the selection policy associated with the given selection
-	 * or <code>null</code> if none.
-	 * 
-	 * @param selection or <code>null</code>
-	 * @return selection policy or <code>null</code>
-	 */
-	protected IModelSelectionPolicy getSelectionPolicy(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			Object element = ss.getFirstElement();
-			if (element instanceof IAdaptable) {
-				IAdaptable adaptable = (IAdaptable) element;
-				IModelSelectionPolicyFactory factory =  (IModelSelectionPolicyFactory) adaptable.getAdapter(IModelSelectionPolicyFactory.class);
-				if (factory != null) {
-					return factory.createModelSelectionPolicyAdapter(adaptable, getPresentationContext());
-				}
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(org.eclipse.jface.viewers.ISelection, boolean)
-	 */
-	final protected void setSelectionToWidget(ISelection selection, final boolean reveal) {
-		// NOT USED
-		throw new IllegalArgumentException("This method should not be called"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List, boolean)
-	 */
-	final protected void setSelectionToWidget(List l, boolean reveal) {
-		// NOT USED
-		throw new IllegalArgumentException("This method should not be called"); //$NON-NLS-1$
-	}	
-		
-	/**
-	 * Attempts to update any pending selection.
-	 * 
-	 * @param reveal whether to reveal the selection
-	 */
-	protected void attemptSelection(boolean reveal) {
-		ISelection currentSelection = null;
-		synchronized (this) {
-			if (fPendingSelection != null) {
-				ISelection remaining = doAttemptSelectionToWidget(fPendingSelection, reveal);
-				if (remaining.isEmpty()) {
-					remaining = null;
-				}
-				if (!fPendingSelection.equals(remaining)) {
-					fPendingSelection = remaining;
-					currentSelection = newSelectionFromWidget();
-					if (isSuppressEqualSelections() && currentSelection.equals(fCurrentSelection)) {
-						return;
-					}
-				}
-			}
-		}
-		if (currentSelection != null) {
-			updateSelection(currentSelection);
-			firePostSelectionChanged(new SelectionChangedEvent(this, currentSelection));
-		}
-	}
-	
-	/**
-	 * Controls whether selection change notification is sent even when
-	 * successive selections are equal.
-	 * 
-	 * TODO: what we really want is to fire selection change on ACTIVATE model
-	 * change, even when selection is the same.
-	 * 
-	 * @return whether to suppress change notification for equal successive
-	 *         selections
-	 */
-	protected boolean isSuppressEqualSelections() {
-		return true;
-	}
-	
-	/**
-	 * Attempts to selection the specified selection and returns a selection
-	 * representing the portion of the selection that could not be honored
-	 * and still needs to be selected.
-	 * 
-	 * @param selection selection to attempt
-	 * @param reveal whether to reveal the selection
-	 * @return remaining selection
-	 */
-	protected abstract ISelection doAttemptSelectionToWidget(ISelection selection, boolean reveal);
-	
-	/**
-	 * Returns whether this viewer supports the given selection.
-	 * 
-	 * @param selection a selection
-	 * @return whether this viewer supports the given selection
-	 */
-	protected abstract boolean acceptsSelection(ISelection selection);
-	
-	/**
-	 * Returns an empty selection supported by this viewer.
-	 * 
-	 * @return an empty selection supported by this viewer
-	 */
-	protected abstract ISelection getEmptySelection();
-	
-	/**
-	 * A content provider that does nothing.
-	 */
-	private class NullContentProvider implements IStructuredContentProvider {
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return null;
-		}
-	}
-
-	/**
-	 * Notification that a presentation update has failed.
-	 * Subclasses may override as required. The default implementation
-	 * does nothing.
-	 * 
-	 * @param monitor monitor for the presentation request that failed
-	 * @param status status of update
-	 */
-	protected void handlePresentationFailure(IStatusMonitor monitor, IStatus status) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#preservingSelection(java.lang.Runnable)
-	 */
-	protected synchronized void preservingSelection(Runnable updateCode) {
-		if (fPendingSelection == null || fPendingSelection.isEmpty()) {
-			ISelection oldSelection = null;
-			try {
-				// preserve selection
-				oldSelection = fCurrentSelection;				
-				// perform the update
-				updateCode.run();
-			} finally {
-				// restore selection
-				if (oldSelection == null) {
-					oldSelection = new StructuredSelection();
-				}
-				if (getControl().getDisplay().getThread() == Thread.currentThread()) {
-					if (!oldSelection.equals(newSelectionFromWidget())) {
-						restoreSelection(oldSelection);
-					}
-				} else {
-					WorkbenchJob job = new WorkbenchJob("attemptSelection") { //$NON-NLS-1$
-						public IStatus runInUIThread(IProgressMonitor monitor) {
-							synchronized (AsynchronousViewer.this) {
-	                            if (!getControl().isDisposed()) {
-	                            	if (fPendingSelection == null || fPendingSelection.isEmpty()) {
-		                            	ISelection tempSelection = fCurrentSelection;
-		                            	if (tempSelection == null) {
-		                            		tempSelection = new StructuredSelection();
-		                				}
-		                				if (!tempSelection.equals(newSelectionFromWidget())) {
-		                					restoreSelection(tempSelection);
-		                				}
-	                            	}
-	                            }
-							}
-                            return Status.OK_STATUS;
-						}
-						
-					};
-					job.setSystem(true);
-					job.schedule();
-				}							
-			}
-		} else {
-			updateCode.run();
-		}
-	}
-	
-	protected synchronized void restoreSelection(ISelection oldSelection) {
-		ISelection remaining = doAttemptSelectionToWidget(oldSelection, false);
-		// send out notification if old and new differ
-		fCurrentSelection = newSelectionFromWidget();
-		if (!selectionExists(fCurrentSelection)) {
-			if (selectionExists(oldSelection)) {
-				// old selection exists in the model, but not widget
-				fCurrentSelection = oldSelection;
-			} else {
-				fCurrentSelection = getEmptySelection();
-			}
-		}
-		if (!fCurrentSelection.equals(oldSelection)) {
-			handleInvalidSelection(oldSelection, fCurrentSelection);
-			// if the remaining selection still exists in the model, make it pending
-			if (selectionExists(remaining)) {
-				setSelection(remaining);
-			}
-		}
-	}
-	
-	/**
-	 * Returns whether the selection exists in the model
-	 */
-	protected boolean selectionExists(ISelection selection) {
-		if (selection.isEmpty()) {
-			return false;
-		}
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			Iterator iterator = ss.iterator();
-			while (iterator.hasNext()) {
-				Object element = iterator.next();
-				if (getModel().getNodes(element) == null) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-    
-	/**
-	 * Sets the color attributes of the given widget.
-	 * 
-	 * @param widget the widget to update
-	 * @param foreground foreground color of the widget or <code>null</code> if default
-	 * @param background background color of the widget or <code>null</code> if default
-	 */
-	protected abstract void setColors(Widget widget, RGB foreground[], RGB background[]);
-	
-	/**
-	 * Sets the label attributes of the given widget.
-	 * 
-	 * @param widget the widget to update
-	 * @param text label text
-	 * @param image label image or <code>null</code>
-	 */
-	protected abstract void setLabels(Widget widget, String[] text, ImageDescriptor[] image);
-	
-	/**
-	 * Sets the font attributes of the given widget.
-	 * 
-	 * @param widget widget to update
-	 * @param font font of the widget or <code>null</code> if default.
-	 */
-	protected abstract void setFonts(Widget widget, FontData[] font);
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#updateSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	protected synchronized void updateSelection(ISelection selection) {
-		fCurrentSelection = selection;
-		super.updateSelection(selection);
-	}
-	
-
-	
-	/**
-	 * Notification the given model proxy has been added to this viewer's model.
-	 * 
-	 * @param proxy
-	 */
-	protected void modelProxyAdded(IModelProxy proxy) {
-		if (fUpdatePolicy instanceof IModelChangedListener) {
-			proxy.addModelChangedListener((IModelChangedListener)fUpdatePolicy);
-		}		
-	}
-	
-	/**
-	 * Notification the given model proxy has been removed from this viewer's model.
-	 * 
-	 * @param proxy
-	 */
-	protected void modelProxyRemoved(IModelProxy proxy) {
-		if (fUpdatePolicy instanceof IModelChangedListener) {
-			proxy.removeModelChangedListener((IModelChangedListener)fUpdatePolicy);
-		}		
-	}	
-	
-	/**
-	 * Returns this viewer's model
-	 * 
-	 * @return model
-	 */
-	protected AsynchronousModel getModel() {
-		return fModel;
-	}	
-
-	/**
-	 * A node in the model has been updated
-	 * 
-	 * @param node
-	 */
-	protected void nodeChanged(ModelNode node) {
-		Widget widget = findItem(node);
-		if (widget != null) {
-			clear(widget);
-			attemptPendingUpdates();
-		}
-	}
-
-	/**
-	 * @return if there are any more pending updates in the viewer
-	 */
-	public synchronized boolean hasPendingUpdates() {
-        return getModel().hasPendingUpdates();
-	}
-
-	/**
-	 * Notification from the model that the update for the given request
-	 * has completed.
-	 * 
-	 * @param monitor
-	 */
-	protected void updateComplete(IStatusMonitor monitor) {
-	}
-
-	/**
-	 * Clears the given widget
-	 * 
-	 * @param item
-	 */
-    protected abstract void clear(Widget item);
-    
-    /**
-     * Clears the children of the widget.
-     * 
-     * @param item
-     */
-    protected abstract void clearChildren(Widget item);
-    
-    /**
-     * Clears the child at the given index.
-     * 
-     * @param parent
-     * @param childIndex
-     */
-    protected abstract void clearChild(Widget parent, int childIndex);
-
-	/**
-	 * Returns the child widget at the given index for the given parent or
-	 * <code>null</code>
-	 * 
-	 * @param parent
-	 * @param index
-	 * @return
-	 */
-	protected abstract Widget getChildWidget(Widget parent, int index);
-
-	/**
-	 * Sets the item count for a parent widget
-	 * 
-	 * @param parent
-	 * @param itemCount
-	 */
-	protected abstract void setItemCount(Widget parent, int itemCount);
-
-    /**
-     * Attempt pending updates. Subclasses may override but should call super.
-     */
-    protected void attemptPendingUpdates() {
-    	attemptSelection(false);
-    }
-	
-	/**
-	 * Notification a node's children have changed.
-	 * Updates the child count for the parent's widget
-	 * and clears children to be updated.
-	 * 
-	 * @param parentNode
-	 */
-	protected void nodeChildrenChanged(ModelNode parentNode) {
-		Widget widget = findItem(parentNode);
-		if (widget != null && !widget.isDisposed()) {
-			int childCount = parentNode.getChildCount();
-			setItemCount(widget, childCount);
-			clearChildren(widget);
-			attemptPendingUpdates();
-		}		
-	}
-	
-	/**
-	 * Notification children have been added to the end
-	 * of the given parent.
-	 * 
-	 * @param parentNode
-	 */
-	protected void nodeChildrenAdded(ModelNode parentNode) {
-		Widget widget = findItem(parentNode);
-		if (widget != null && !widget.isDisposed()) {
-			int childCount = parentNode.getChildCount();
-			setItemCount(widget, childCount);
-			attemptPendingUpdates();
-		}		
-	}
-	
-	/**
-	 * Notification children have been added to the end
-	 * of the given parent.
-	 * 
-	 * @param parentNode
-	 */
-	protected void nodeChildRemoved(ModelNode parentNode, int index) {
-		Widget widget = findItem(parentNode);
-		if (widget != null && !widget.isDisposed()) {
-			Widget childWidget = getChildWidget(widget, index);
-			int childCount = parentNode.getChildCount();
-			// if the child widget exists, dispose it so item state remains, otherwise update child count
-			if (childWidget == null) {
-				setItemCount(widget, childCount);
-			} else {
-				childWidget.dispose();
-			}
-			for (int i = index; i < childCount; i ++) {
-				clearChild(widget, i);
-			}
-			attemptPendingUpdates();
-		}		
-	}	
-	
-	/**
-	 * Unmaps the node from its widget and all of its children nodes from
-	 * their widgets.
-	 * 
-	 * @param node
-	 */
-	protected void unmapNode(ModelNode node) {
-		unmapElement(node);
-		ModelNode[] childrenNodes = node.getChildrenNodes();
-		if (childrenNodes != null) {
-			for (int i = 0; i < childrenNodes.length; i++) {
-				unmapNode(childrenNodes[i]);
-			}
-		}
-	}
-
-    /**
-     * Returns the node corresponding to the given widget or <code>null</code>
-     * @param widget widget for which a node is requested
-     * @return node or <code>null</code>
-     */
-    protected ModelNode findNode(Widget widget) {
-        ModelNode[] nodes = getModel().getNodes(widget.getData());
-        if (nodes != null) {
-        	for (int i = 0; i < nodes.length; i++) {
-				ModelNode node = nodes[i];
-				Widget item = findItem(node);
-				if (widget == item) {
-					return node;
-				}
-			}
-        }    	
-        return null;
-    }
-    
-    /**
-     * Returns the item for the node or <code>null</code>
-     * @param node
-     * @return
-     */
-    protected Widget findItem(ModelNode node) {
-    	return findItem((Object)node);
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * A virtual item has been exposed in the control, map its data.
-	 * 
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(final Event event) {		
-		update((Item)event.item, event.index);
-    }
-	
-	/**
-	 * Update the given item.
-	 * 
-	 * @param item item to update
-	 * @param index index of item in parent's children
-	 */
-	protected void update(Item item, int index) {
-		restoreLabels(item);
-		int level = 0;
-		
-		Widget parentItem = getParentWidget(item);
-		if (DEBUG_VIEWER) {
-			DebugUIPlugin.debug("SET DATA [" + index + "]: " + parentItem);  //$NON-NLS-1$//$NON-NLS-2$
-		}
-		ModelNode node = null;
-		// first, see if the parent element is in the model
-		// and look directly for the child
-		if (parentItem != null) {
-			ModelNode[] nodes = getModel().getNodes(parentItem.getData());
-			if (nodes != null) {
-				for (int i = 0; i < nodes.length; i++) {
-					ModelNode parentNode = nodes[i];
-					Widget parentWidget = findItem(parentNode);
-					if (parentWidget == parentItem) {
-			        	ModelNode[] childrenNodes = parentNode.getChildrenNodes();
-			        	if (childrenNodes != null && index < childrenNodes.length) {
-			        		node = childrenNodes[index];
-			        	}
-					}
-				}
-			}
-		}
-
-		// otherwise, build a path to the model node
-		if (node == null) {
-			setNodeIndex(index, level);
-			while (parentItem instanceof Item) {
-				level++;
-				Widget parent = getParentWidget(parentItem);
-				int pindex = indexOf(parent, parentItem);
-				if (pindex < 0) {
-					return;
-				}
-				setNodeIndex(pindex, level);
-				parentItem = parent;
-			}
-			
-			node = getModel().getRootNode();
-			if (node == null) {
-				if (DEBUG_VIEWER) {
-					DebugUIPlugin.debug("\tFAILED - root model node is null"); //$NON-NLS-1$
-				}
-				return;
-			}
-			for (int i = level; i >= 0; i--) {
-				ModelNode[] childrenNodes = node.getChildrenNodes();
-				if (childrenNodes == null) {
-					if (DEBUG_VIEWER) {
-						DebugUIPlugin.debug("\tFAILED - no children nodes for " + node); //$NON-NLS-1$
-					}
-					return;
-				}
-				int pindex = getNodeIndex(i);
-				if (pindex < childrenNodes.length) {
-					node = childrenNodes[pindex];
-				} else {
-					if (DEBUG_VIEWER) {
-						DebugUIPlugin.debug("\tFAILED - no children nodes for " + node); //$NON-NLS-1$
-					}
-					return;
-				}
-			}
-		}
-		
-		
-		// map the node to the element and refresh it
-		if (node != null) {
-			mapElement(node, item);
-    		item.setData(node.getElement());
-    		if (DEBUG_VIEWER) {
-				DebugUIPlugin.debug("\titem mapped: " + node); //$NON-NLS-1$
-    		}
-    		internalRefresh(node);
-		} else {
-			if (DEBUG_VIEWER) {
-				DebugUIPlugin.debug("\tFAILED - unable to find corresponding node"); //$NON-NLS-1$
-			}
-		}		
-	}
-	
-	/**
-	 * Sets the index of a child node being mapped at the given expansion level
-	 * in the tree.
-	 * 
-	 * @param nodeIndex
-	 * @param level
-	 */
-	private void setNodeIndex(int nodeIndex, int level) {
-		if (level > (fSetDataIndicies.length - 1)) {
-			// grow the array
-			int[] next = new int[level+5];
-			System.arraycopy(fSetDataIndicies, 0, next, 0, fSetDataIndicies.length);
-			fSetDataIndicies = next;
-		}
-		fSetDataIndicies[level] = nodeIndex;
-	}
-	
-	/**
-	 * Returns the index of a child node being mapped at the given expansion level in
-	 * the tree.
-	 * 
-	 * @param level
-	 * @return
-	 */
-	private int getNodeIndex(int level) {
-		return fSetDataIndicies[level];
-	}
-	
-	protected abstract int indexOf(Widget parent, Widget child);
-	
-	protected abstract void restoreLabels(Item item);
-	
-	/**
-	 * Returns the parent widget for the given widget or <code>null</code>
-	 * 
-	 * @param widget
-	 * @return parent widget or <code>null</code>
-	 */
-	protected abstract Widget getParentWidget(Widget widget);
-
-	/**
-	 * Updates the children of the given node.
-	 * 
-	 * @param parent
-	 *            node of which to update children
-	 */
-	protected void updateChildren(ModelNode parent) {
-		getModel().updateChildren(parent);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ChildrenRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ChildrenRequestMonitor.java
deleted file mode 100644
index 6050992..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ChildrenRequestMonitor.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.debug.internal.ui.viewers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.viewers.provisional.IChildrenRequestMonitor;
-
-/**
- * Implementation for <code>IChildrenRequestMonitor</code>. Collects
- * children from an asynchronous tree content adapter.  
- * <p>
- * Not intended to be subclassed or instantiated by clients. For use
- * speficially with <code>AsynchronousTreeViewer</code>.
- * </p>
- * @since 3.2
- */
-class ChildrenRequestMonitor extends AsynchronousRequestMonitor implements IChildrenRequestMonitor {
-    
-    private boolean fFirstUpdate = true;
-    
-	/**
-	 * Collection of children retrieved
-	 */
-    private List fChildren = new ArrayList();
-
-    /**
-     * Constucts a monitor to retrieve and update the children of the given
-     * node.
-     * 
-     * @param parent parent to retrieve children for
-     * @param model model being updated
-     */
-    ChildrenRequestMonitor(ModelNode parent, AsynchronousModel model) {
-        super(parent, model);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.viewers.IChildrenRequestMonitor#addChild(java.lang.Object)
-     */
-    public void addChild(Object child) {
-        synchronized (fChildren) {
-            fChildren.add(child);
-        }
-        
-        scheduleViewerUpdate(250);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.viewers.IChildrenRequestMonitor#addChildren(java.lang.Object[])
-     */
-    public void addChildren(Object[] children) {
-        synchronized (fChildren) {
-            for (int i = 0; i < children.length; i++) {
-                fChildren.add(children[i]);
-            }
-        }
-        
-        scheduleViewerUpdate(0);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor#contains(org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor)
-     */
-    protected boolean contains(AsynchronousRequestMonitor update) {
-        return (update instanceof ChildrenRequestMonitor) && contains(update.getNode());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor#performUpdate()
-     */
-    protected void performUpdate() {
-        synchronized (fChildren) {
-            if (fFirstUpdate) {
-            	getModel().setChildren(getNode(), fChildren);
-                fFirstUpdate = false;
-            } else {
-                for (Iterator iter = fChildren.iterator(); iter.hasNext();) {
-                    Object child = iter.next();
-                    getModel().add(getNode(), child);    
-                }
-            }
-            fChildren.clear();
-        }
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/FindElementDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/FindElementDialog.java
deleted file mode 100644
index 4ef42ab..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/FindElementDialog.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.jface.viewers.ILabelProvider;
-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.ElementListSelectionDialog;
-
-/**
- * A dialog used to select elements from a list.
- * 
- * @since 3.3
- *
- */
-public class FindElementDialog extends ElementListSelectionDialog {
-	
-	/**
-	 * Constructs a dialog to navigate to an element in the given viewer.
-	 * 
-	 * @param shell shell to open on
-	 * @param provider label provider
-	 * @param elements elements to choose from
-	 */
-	public FindElementDialog(Shell shell, ILabelProvider provider, Object[] elements) {
-		super(shell, provider);
-		setElements(elements);
-		setMultipleSelection(false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.ElementListSelectionDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Control comp = super.createDialogArea(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IDebugHelpContextIds.FIND_ELEMENT_DIALOG);
-		return comp;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ILabelResult.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ILabelResult.java
deleted file mode 100644
index cde762d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ILabelResult.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.debug.internal.ui.viewers;
-
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * Results of collecting an asynchronous label in a tree. 
- * 
- * @since 3.2
- */
-public interface ILabelResult {
-
-	/**
-	 * Returns the labels for the element. One for each column.
-	 * 
-	 * @return
-	 */
-	public String[] getLabels();
-	
-	/**
-	 * Returns the images for the element.
-	 * 
-	 * @return
-	 */
-	public Image[] getImages();
-	
-	/**
-	 * Returns the element the label is for.
-	 * 
-	 * @return
-	 */
-	public Object getElement();
-	
-	/**
-	 * Returns the path to the element in the tree.
-	 * 
-	 * @return
-	 */
-	public TreePath getTreePath();
-	
-	/**
-	 * Returns this element's depth in the tree.
-	 * 
-	 * @return
-	 */
-	public int getDepth();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/LabelRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/LabelRequestMonitor.java
deleted file mode 100644
index 152a332..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/LabelRequestMonitor.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers;
-
-import org.eclipse.debug.internal.ui.viewers.provisional.ILabelRequestMonitor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Implementation of an <code>ILabelRequestMonitor</code>. Collects label
- * attributes from an asynchronous label adapter.
- * <p>
- * Not intended to be subclassed or instantiated by clients. For use speficially
- * with <code>AsynchronousViewer</code>.
- * </p>
- * 
- * @since 3.2
- */
-class LabelRequestMonitor extends AsynchronousRequestMonitor implements ILabelRequestMonitor {
-
-	/**
-	 * Retrieved label text. Only <code>null</code> if cancelled or failed.
-	 */
-	private String[] fLabels;
-
-	/**
-	 * Retrieved image descriptor or <code>null</code>
-	 */
-	private ImageDescriptor[] fImageDescriptors;
-
-	/**
-	 * Retrieved font data or <code>null</code>
-	 */
-	private FontData[] fFontDatas;
-
-	/**
-	 * Retieved colors or <code>null</code>
-	 */
-	private RGB[] fForegrounds;
-	private RGB[] fBackgrounds;
-
-	/**
-	 * Cosntructs a request to upate the label of the given node in the give
-	 * model.
-	 * 
-	 * @param node node to update
-	 * @param model model containing the node
-	 */
-	public LabelRequestMonitor(ModelNode node, AsynchronousModel model) {
-		super(node, model);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		AsynchronousViewer viewer = getModel().getViewer();
-		Widget widget = viewer.findItem(getNode());
-		if (widget != null && !widget.isDisposed()) {
-    		viewer.setLabels(widget, fLabels, fImageDescriptors);
-    		viewer.setColors(widget, fForegrounds, fBackgrounds);
-    		viewer.setFonts(widget, fFontDatas);
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor#contains(org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor)
-	 */
-	protected boolean contains(AsynchronousRequestMonitor update) {
-		return update instanceof LabelRequestMonitor && update.getNode() == getNode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.ILabelRequestMonitor#setLabel(java.lang.String)
-	 */
-	public void setLabels(String[] text) {
-		fLabels = text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.ILabelRequestMonitor#setFontData(org.eclipse.swt.graphics.FontData)
-	 */
-	public void setFontDatas(FontData[] fontData) {
-		fFontDatas = fontData;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.ILabelRequestMonitor#setImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
-	 */
-	public void setImageDescriptors(ImageDescriptor[] image) {
-		fImageDescriptors = image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.ILabelRequestMonitor#setForeground(org.eclipse.swt.graphics.RGB)
-	 */
-	public void setForegrounds(RGB[] foreground) {
-		fForegrounds = foreground;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.ILabelRequestMonitor#setBackground(org.eclipse.swt.graphics.RGB)
-	 */
-	public void setBackgrounds(RGB[] background) {
-		fBackgrounds = background;
-	}
-	
-	protected RGB[] getBackgrounds() {
-		return fBackgrounds;
-	}
-	
-	protected RGB[] getForegrounds() {
-		return fForegrounds;
-	}
-	
-	protected FontData[] getFontDatas() {
-		return fFontDatas;
-	}
-	
-	protected String[] getLabels() {
-		return fLabels;
-	}
-	
-	protected ImageDescriptor[] getImageDescriptors() {
-		return fImageDescriptors;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/LabelResult.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/LabelResult.java
deleted file mode 100644
index 2e04a1a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/LabelResult.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers;
-
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * @since 3.2
- *
- */
-class LabelResult extends LabelRequestMonitor implements ILabelResult {
-
-	public LabelResult(ModelNode node, AsynchronousModel model) {
-		super(node, model);
-	}
-	
-	protected synchronized void scheduleViewerUpdate(long ms) {
-		notifyAll();
-	}
-	
-	public synchronized boolean isDone() {
-		return super.isDone();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.ILabelResult#getElement()
-	 */
-	public Object getElement() {
-		return getNode().getElement();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.ILabelResult#getImages()
-	 */
-	public Image[] getImages() {
-		return getModel().getViewer().getImages(getImageDescriptors());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.ILabelResult#getLabels()
-	 */
-	public String[] getLabels() {
-		return super.getLabels();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.ILabelResult#getTreePath()
-	 */
-	public TreePath getTreePath() {
-		return getNode().getTreePath();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.ILabelResult#getDepth()
-	 */
-	public int getDepth() {
-		int level = 0;
-		ModelNode node = getNode().getParentNode();
-		while (node != null) {
-			node = node.getParentNode();
-			level++;
-		}
-		return level;
-	}
-
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ModelNode.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ModelNode.java
deleted file mode 100644
index ee2edde..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/ModelNode.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.debug.internal.ui.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.TreePath;
-
-/**
- * A node in an asynchronous model.
- * 
- * @since 3.2
- */
-public class ModelNode {
-
-	private Object fElement; // model element
-	private boolean fIsContainer; // whether this element may have children
-	private ModelNode fParent; // parent node or null for root
-	private ModelNode[] fChildren; // child nodes, possibly null
-	private boolean fDisposed; // whether this node has been disposed
-	
-	public ModelNode(ModelNode parent, Object element) {
-		fParent = parent;
-		fElement = element;
-	}
-	
-	public synchronized Object getElement() {
-		return fElement;
-	}
-    
-    public synchronized void remap(Object element) {
-        fElement = element;
-    }
-	
-	public ModelNode getParentNode() {
-		return fParent;
-	}
-	
-	public synchronized boolean isContainer() {
-		return fIsContainer;
-	}
-	
-	public synchronized ModelNode[] getChildrenNodes() {
-		return fChildren;
-	}
-	
-	public synchronized boolean isDisposed() {
-		return fDisposed; 
-	}
-	
-	public synchronized void dispose() {
-		fDisposed = true;
-        ModelNode[] childrenNodes = getChildrenNodes();
-        if (childrenNodes != null) {
-            for (int i = 0; i < childrenNodes.length; i++) {
-                childrenNodes[i].dispose();
-            }
-        }
-	}
-	
-	/**
-	 * Returns whether this node corresponds to the given path
-	 * 
-	 * @param path tree path
-	 */
-	public synchronized boolean correspondsTo(TreePath path) {
-		int index = path.getSegmentCount() - 1;
-		ModelNode node = this;
-		while (index >= 0 && node != null) {
-			Object pathElement = path.getSegment(index);
-			if (pathElement.equals(node.getElement())) {
-				index--;
-				node = node.getParentNode();
-			} else {
-				return false;
-			}
-		}
-		return index == -1;
-	}
-	
-	/**
-	 * Returns a tree path corresponding to this node.
-	 * 
-	 * @return
-	 */
-	public synchronized TreePath getTreePath() {
-		List path = new ArrayList();
-		ModelNode node = this;
-		while (node != null) {
-			path.add(0, node.getElement());
-			node = node.getParentNode();
-		}
-		return new TreePath(path.toArray());
-	}
-	
-	/**
-	 * Adds the given child to this node.
-	 * 
-	 * @param child
-	 */
-	public synchronized void addChild(ModelNode child) {
-		if (fChildren == null) {
-			fChildren = new ModelNode[] {child};
-		} else {
-			ModelNode[] kids = new ModelNode[fChildren.length + 1];
-			System.arraycopy(fChildren, 0, kids, 0, fChildren.length);
-			kids[fChildren.length] = child;
-			fChildren = kids;
-		}
-	}
-    
-    /**
-     * Removes the given child from this node.
-     * 
-     * @param child
-     */
-    public synchronized void removeChild(ModelNode child) {
-        if (fChildren != null) {
-            for (int i = 0; i < fChildren.length; i++) {
-                ModelNode kid = fChildren[i];
-                if (child == kid) {
-                    ModelNode[] newNodes= new ModelNode[fChildren.length - 1];
-                    System.arraycopy(fChildren, 0, newNodes, 0, i);
-                    if (i < newNodes.length) {
-                        System.arraycopy(fChildren, i + 1, newNodes, i, newNodes.length - i);
-                    }
-                    fChildren = newNodes;
-                    return;
-                }
-            }
-        }
-    }    
-	
-	/**
-	 * Sets the children for this node
-	 * 
-	 * @param children
-	 */
-	public synchronized void setChildren(ModelNode[] children) {
-		if (children != null && children.length == 0) {
-			fChildren = null;
-			setIsContainer(false);
-		} else {
-			fChildren = children;
-		}
-	}
-	
-	/**
-	 * Returns the number of children for this node.
-	 * 
-	 * @return
-	 */
-	public synchronized int getChildCount() {
-		if (fChildren == null) {
-            if (isContainer()) {
-                return 1;
-            }
-			return 0;
-		}
-		return fChildren.length;
-	}
-    
-    /**
-     * Returns the index of the given child in this parent, or -1
-     * 
-     * @param child
-     */
-    public synchronized int getChildIndex(ModelNode child) {
-       if (fChildren != null) {
-           for (int i = 0; i < fChildren.length; i++) {
-                if (child == fChildren[i]) {
-                    return i;
-                }
-           }
-       }
-       return -1;
-    }
-    
-    /**
-     * Sets whether this node has children.
-     * 
-     * @param container
-     */
-    public synchronized void setIsContainer(boolean container) {
-        fIsContainer = container;
-    }
-    
-    public String toString() {
-    	StringBuffer buf = new StringBuffer();
-    	if (isDisposed()) {
-    		buf.append("[DISPOSED] "); //$NON-NLS-1$
-    	}
-    	if (isContainer()) {
-    		buf.append("[+] "); //$NON-NLS-1$
-    	}
-    	buf.append(getElement());
-    	return buf.toString();
-    }
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/PartPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/PartPresentationContext.java
deleted file mode 100644
index 9ecf2ee..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/PartPresentationContext.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.debug.internal.ui.viewers;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * A presentation context tied to a part.
- * 
- * @since 3.3
- */
-public class PartPresentationContext extends PresentationContext {
-	
-	private IWorkbenchPart fPart;
-
-	/**
-	 * Constructs a part presentation context.
-	 *  
-	 * @param part part 
-	 */
-	public PartPresentationContext(IWorkbenchPart part) {
-		super(part.getSite().getId());
-		fPart = part;
-	}
-	
-	public IWorkbenchPart getPart() {
-		return fPart;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableAddRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableAddRequestMonitor.java
deleted file mode 100644
index 360186c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableAddRequestMonitor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers;
-
-
-/**
- * @since 3.2
- *
- */
-public class TableAddRequestMonitor extends AsynchronousRequestMonitor {
-	
-	protected Object[] fElements;
-
-	/**
-	 * @param node
-	 * @param model
-	 */
-	TableAddRequestMonitor(ModelNode parent, Object elements[], AsynchronousModel model) {
-		super(parent, model);
-		fElements = elements;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		((AsynchronousTableModel)getModel()).added(fElements);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor#contains(org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor)
-	 */
-	protected boolean contains(AsynchronousRequestMonitor update) {
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableEditorImpl.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableEditorImpl.java
deleted file mode 100644
index e4fda98..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableEditorImpl.java
+++ /dev/null
@@ -1,355 +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.debug.internal.ui.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Item;
-
-/**
- * This class is copied from package org.eclipse.jface.viewers.TableEditorImpl
- * because the original has package access only.
- * 
- * TODO: complain to UI about package access to API class.
- * 
- */
-public abstract class TableEditorImpl {
-	private CellEditor fCellEditor;
-	private CellEditor[] fCellEditors;
-	private ICellModifier fCellModifier;
-	private String[] fColumnProperties;
-	private Item fTableItem;
-	private int fColumnNumber;
-	private ICellEditorListener fCellEditorListener;
-	private FocusListener fFocusListener;
-	private MouseListener fMouseListener;
-	private int fDoubleClickExpirationTime;
-	private StructuredViewer fViewer;
-
-	TableEditorImpl(StructuredViewer viewer) {
-		fViewer = viewer;
-		initCellEditorListener();
-	}
-
-	/**
-	 * Returns this <code>TableViewerImpl</code> viewer
-	 * 
-	 * @return the viewer
-	 */
-	public StructuredViewer getViewer() {
-		return fViewer;
-	}
-
-	private void activateCellEditor() {
-		if (fCellEditors != null) {
-			if (fCellEditors[fColumnNumber] != null && fCellModifier != null) {
-				Object element = fTableItem.getData();
-				String property = fColumnProperties[fColumnNumber];
-				if (fCellModifier.canModify(element, property)) {
-					fCellEditor = fCellEditors[fColumnNumber];
-					// table.showSelection();
-					fCellEditor.addListener(fCellEditorListener);
-					Object value = fCellModifier.getValue(element, property);
-					fCellEditor.setValue(value);
-					// Tricky flow of control here:
-					// activate() can trigger callback to cellEditorListener
-					// which will clear cellEditor
-					// so must get control first, but must still call activate()
-					// even if there is no control.
-					final Control control = fCellEditor.getControl();
-					fCellEditor.activate();
-					if (control == null)
-						return;
-					setLayoutData(fCellEditor.getLayoutData());
-					setEditor(control, fTableItem, fColumnNumber);
-					fCellEditor.setFocus();
-					if (fFocusListener == null) {
-						fFocusListener = new FocusAdapter() {
-							public void focusLost(FocusEvent e) {
-								applyEditorValue();
-							}
-						};
-					}
-					control.addFocusListener(fFocusListener);
-					fMouseListener = new MouseAdapter() {
-						public void mouseDown(MouseEvent e) {
-							// time wrap?
-							// check for expiration of doubleClickTime
-							if (e.time <= fDoubleClickExpirationTime) {
-								control.removeMouseListener(fMouseListener);
-								cancelEditing();
-								handleDoubleClickEvent();
-							} else if (fMouseListener != null) {
-								control.removeMouseListener(fMouseListener);
-							}
-						}
-					};
-					control.addMouseListener(fMouseListener);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Activate a cell editor for the given mouse position.
-	 */
-	private void activateCellEditor(MouseEvent event) {
-		if (fTableItem == null || fTableItem.isDisposed()) {
-			// item no longer exists
-			return;
-		}
-		int columnToEdit;
-		int columns = getColumnCount();
-		if (columns == 0) {
-			// If no TableColumn, Table acts as if it has a single column
-			// which takes the whole width.
-			columnToEdit = 0;
-		} else {
-			columnToEdit = -1;
-			for (int i = 0; i < columns; i++) {
-				Rectangle bounds = getBounds(fTableItem, i);
-				if (bounds.contains(event.x, event.y)) {
-					columnToEdit = i;
-					break;
-				}
-			}
-			if (columnToEdit == -1) {
-				return;
-			}
-		}
-
-		fColumnNumber = columnToEdit;
-		activateCellEditor();
-	}
-
-	/**
-	 * Deactivates the currently active cell editor.
-	 */
-	public void applyEditorValue() {
-		CellEditor c = fCellEditor;
-		if (c != null) {
-			// null out cell editor before calling save
-			// in case save results in applyEditorValue being re-entered
-			// see 1GAHI8Z: ITPUI:ALL - How to code event notification when
-			// using cell editor ?
-			fCellEditor = null;
-			Item t = fTableItem;
-			// don't null out table item -- same item is still selected
-			if (t != null && !t.isDisposed()) {
-				saveEditorValue(c, t);
-			}
-			setEditor(null, null, 0);
-			c.removeListener(fCellEditorListener);
-			Control control = c.getControl();
-			if (control != null) {
-				if (fMouseListener != null) {
-					control.removeMouseListener(fMouseListener);
-				}
-				if (fFocusListener != null) {
-					control.removeFocusListener(fFocusListener);
-				}
-			}
-			c.deactivate();
-		}
-	}
-
-	/**
-	 * Cancels the active cell editor, without saving the value back to the
-	 * domain model.
-	 */
-	public void cancelEditing() {
-		if (fCellEditor != null) {
-			setEditor(null, null, 0);
-			fCellEditor.removeListener(fCellEditorListener);
-			CellEditor oldEditor = fCellEditor;
-			fCellEditor = null;
-			oldEditor.deactivate();
-		}
-	}
-
-	/**
-	 * Start editing the given element.
-	 * 
-	 * @param element
-	 * @param column
-	 */
-	public void editElement(Object element, int column) {
-		if (fCellEditor != null)
-			applyEditorValue();
-
-		setSelection(new StructuredSelection(element), true);
-		Item[] selection = getSelection();
-		if (selection.length != 1)
-			return;
-
-		fTableItem = selection[0];
-
-		// Make sure selection is visible
-		showSelection();
-		fColumnNumber = column;
-		activateCellEditor();
-
-	}
-
-	abstract Rectangle getBounds(Item item, int columnNumber);
-
-	/**
-	 * Return the array of CellEditors used in the viewer
-	 * 
-	 * @return the cell editors
-	 */
-	public CellEditor[] getCellEditors() {
-		return fCellEditors;
-	}
-
-	/**
-	 * Get the cell modifier
-	 * 
-	 * @return the cell modifier
-	 */
-	public ICellModifier getCellModifier() {
-		return fCellModifier;
-	}
-
-	abstract int getColumnCount();
-
-	/**
-	 * Return the properties for the column
-	 * 
-	 * @return the array of column properties
-	 */
-	public Object[] getColumnProperties() {
-		return fColumnProperties;
-	}
-
-	abstract Item[] getSelection();
-
-	/**
-	 * Handles the mouse down event; activates the cell editor.
-	 * 
-	 * @param event
-	 *            the mouse event that should be handled
-	 */
-	public void handleMouseDown(MouseEvent event) {
-		if (event.button != 1)
-			return;
-
-		if (fCellEditor != null)
-			applyEditorValue();
-
-		// activate the cell editor immediately. If a second mouseDown
-		// is received prior to the expiration of the doubleClick time then
-		// the cell editor will be deactivated and a doubleClick event will
-		// be processed.
-		//
-		fDoubleClickExpirationTime = event.time + Display.getCurrent().getDoubleClickTime();
-
-		Item[] items = getSelection();
-		// Do not edit if more than one row is selected.
-		if (items.length != 1) {
-			fTableItem = null;
-			return;
-		}
-		fTableItem = items[0];
-		activateCellEditor(event);
-	}
-
-	private void initCellEditorListener() {
-		fCellEditorListener = new ICellEditorListener() {
-			public void editorValueChanged(boolean oldValidState, boolean newValidState) {
-				// Ignore.
-			}
-
-			public void cancelEditor() {
-				TableEditorImpl.this.cancelEditing();
-			}
-
-			public void applyEditorValue() {
-				TableEditorImpl.this.applyEditorValue();
-			}
-		};
-	}
-
-	/**
-	 * Return whether there is an active cell editor.
-	 * 
-	 * @return <code>true</code> if there is an active cell editor; otherwise
-	 *         <code>false</code> is returned.
-	 */
-	public boolean isCellEditorActive() {
-		return fCellEditor != null;
-	}
-
-	/**
-	 * Saves the value of the currently active cell editor, by delegating to the
-	 * cell modifier.
-	 */
-	private void saveEditorValue(CellEditor cellEditor, Item tableItem) {
-		if (fCellModifier != null) {
-			if (!cellEditor.isValueValid()) {
-				// /Do what ???
-			}
-			String property = null;
-			if (fColumnProperties != null && fColumnNumber < fColumnProperties.length)
-				property = fColumnProperties[fColumnNumber];
-			fCellModifier.modify(tableItem, property, cellEditor.getValue());
-		}
-	}
-
-	/**
-	 * Set the cell editors
-	 * 
-	 * @param editors
-	 */
-	public void setCellEditors(CellEditor[] editors) {
-		fCellEditors = editors;
-	}
-
-	/**
-	 * Set the cell modifier
-	 * 
-	 * @param modifier
-	 */
-	public void setCellModifier(ICellModifier modifier) {
-		fCellModifier = modifier;
-	}
-
-	/**
-	 * Set the column properties
-	 * 
-	 * @param columnProperties
-	 */
-	public void setColumnProperties(String[] columnProperties) {
-		fColumnProperties = columnProperties;
-	}
-
-	abstract void setEditor(Control w, Item item, int fColumnNumber);
-
-	abstract void setLayoutData(CellEditor.LayoutData layoutData);
-
-	abstract void setSelection(StructuredSelection selection, boolean b);
-
-	abstract void showSelection();
-
-	abstract void handleDoubleClickEvent();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableInsertRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableInsertRequestMonitor.java
deleted file mode 100644
index 57f15cd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableInsertRequestMonitor.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.debug.internal.ui.viewers;
-
-
-/**
- * @since 3.2
- *
- */
-public class TableInsertRequestMonitor extends TableAddRequestMonitor {
-	
-	private int fIndex;
-
-	/**
-	 * @param node
-	 * @param model
-	 */
-	TableInsertRequestMonitor(ModelNode parent, Object elements[], int index, AsynchronousModel model) {
-		super(parent, elements, model);
-		fIndex = index;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		((AsynchronousTableModel)getModel()).inserted(fElements, fIndex);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableRemoveRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableRemoveRequestMonitor.java
deleted file mode 100644
index 421ade7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableRemoveRequestMonitor.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.debug.internal.ui.viewers;
-
-
-/**
- * @since 3.2
- *
- */
-public class TableRemoveRequestMonitor extends TableAddRequestMonitor {
-
-	/**
-	 * @param parent
-	 * @param elements
-	 * @param model
-	 */
-	TableRemoveRequestMonitor(ModelNode parent, Object[] elements, AsynchronousModel model) {
-		super(parent, elements, model);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		((AsynchronousTableModel)getModel()).removed(fElements);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableReplaceRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableReplaceRequestMonitor.java
deleted file mode 100644
index ca66b86..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableReplaceRequestMonitor.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.debug.internal.ui.viewers;
-
-
-/**
- * @since 3.2
- *
- */
-public class TableReplaceRequestMonitor extends AsynchronousRequestMonitor {
-	
-	private Object fOriginal;
-	private Object fReplacement;
-
-	/**
-	 * @param node
-	 * @param model
-	 */
-	TableReplaceRequestMonitor(ModelNode node, Object element, Object replacement, AsynchronousModel model) {
-		super(node, model);
-		fReplacement = replacement;
-		fOriginal = element;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		((AsynchronousTableModel)getModel()).replaced(fOriginal, fReplacement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor#contains(org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousRequestMonitor)
-	 */
-	protected boolean contains(AsynchronousRequestMonitor update) {
-		return false;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableUpdatePolicy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableUpdatePolicy.java
deleted file mode 100644
index b3f1763..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/TableUpdatePolicy.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.debug.internal.ui.viewers;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Default update policy updates a viewer based on model deltas.
- * 
- * @since 3.2
- */
-public class TableUpdatePolicy extends org.eclipse.debug.internal.ui.viewers.AbstractUpdatePolicy implements IModelChangedListener {
-
-    public void modelChanged(IModelDelta delta, IModelProxy proxy) {
-        updateNodes(new IModelDelta[] {delta});
-    }
-
-    private void handleState(IModelDelta node) {
-        AsynchronousViewer viewer = getViewer();
-        if (viewer != null) {
-            Object element = node.getElement();
-			viewer.update(element);
-            updateSelection(element, node.getFlags());
-        }
-    }
-    private void handleContent(IModelDelta node) {
-    	AsynchronousViewer viewer = getViewer();
-        if (viewer != null) {
-        	Object element = node.getElement();
-			viewer.refresh(element);
-        	updateSelection(element, node.getFlags());
-        }
-    }
-
-    private void updateSelection(Object element, int flags) {
-    	AsynchronousViewer viewer = getViewer();
-        if (viewer != null) {
-            if ((flags & IModelDelta.SELECT) != 0) {
-                getViewer().setSelection(new StructuredSelection(element));
-            }
-        }
-    }
-
-    protected void updateNodes(IModelDelta[] nodes) {
-        for (int i = 0; i < nodes.length; i++) {
-            IModelDelta node = nodes[i];
-            int flags = node.getFlags();
-
-            if ((flags & IModelDelta.STATE) != 0) {
-                handleState(node);
-            }
-            if ((flags & IModelDelta.CONTENT) != 0) {
-                handleContent(node);
-            }
-            if ((flags & IModelDelta.ADDED) != 0) {
-                handleAdd(node);
-            } 
-            if ((flags & IModelDelta.REMOVED) != 0) {
-                handleRemove(node);
-            }
-            if ((flags & IModelDelta.REPLACED) != 0) {
-                handleReplace(node);
-            }
-            if ((flags & IModelDelta.INSERTED) != 0) {
-                handleInsert(node);
-            }
-
-            IModelDelta[] childNodes = node.getChildDeltas();
-            updateNodes(childNodes);
-        }
-    }
-
-    private void handleInsert(IModelDelta node) {
-        AsynchronousTableViewer viewer = (AsynchronousTableViewer) getViewer();
-        if (viewer != null) {
-            viewer.insert(node.getElement(), node.getIndex());
-            updateSelection(node.getElement(), node.getFlags());
-        }
-    }
-
-    private void handleReplace(IModelDelta node) {
-        AsynchronousTableViewer viewer = (AsynchronousTableViewer) getViewer();
-        if (viewer != null) {
-            viewer.replace(node.getElement(), node.getReplacementElement());
-            updateSelection(node.getReplacementElement(), node.getFlags());
-        }
-    }
-
-    protected void handleAdd(IModelDelta node) {
-        ((AsynchronousTableViewer) getViewer()).add(node.getElement());
-        updateSelection(node.getElement(), node.getFlags());
-    }
-
-    protected void handleRemove(IModelDelta node) {
-        ((AsynchronousTableViewer) getViewer()).remove(node.getElement());
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java
deleted file mode 100644
index c41be39..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * @since 3.3
- */
-class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountUpdate {
-
-	private int fCount = 0;
-	
-	private List fBatchedRequests = null;
-	
-	/**
-	 * @param contentProvider
-	 */
-	public ChildrenCountUpdate(ModelContentProvider contentProvider, TreePath elementPath, Object element, IElementContentProvider elementContentProvider, IPresentationContext context) {
-		super(contentProvider, elementPath, element, elementContentProvider, context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ViewerUpdateMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		int viewCount = fCount;
-		TreePath elementPath = getElementPath();
-		if (viewCount == 0) {
-			getContentProvider().clearFilters(elementPath);
-		} else {
-			getContentProvider().setModelChildCount(elementPath, fCount);
-			viewCount = getContentProvider().modelToViewChildCount(elementPath, fCount);
-		}
-		if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) {
-			System.out.println("setChildCount(" + getElement() + ", modelCount: " + fCount + " viewCount: " + viewCount + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		((TreeViewer)(getContentProvider().getViewer())).setChildCount(elementPath, viewCount);
-	}
-
-	public void setChildCount(int numChildren) {
-		fCount = numChildren;
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer();
-		buf.append("IChildrenCountUpdate: "); //$NON-NLS-1$
-		buf.append(getElement());
-		return buf.toString();
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#coalesce(org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor)
-	 */
-	boolean coalesce(ViewerUpdateMonitor request) {
-		if (request instanceof ChildrenCountUpdate) {
-			if (getElementPath().equals(request.getElementPath())) {
-				// duplicate request
-				return true;
-			} else if (getElementContentProvider().equals(request.getElementContentProvider())) {
-				if (fBatchedRequests == null) {
-					fBatchedRequests = new ArrayList();
-					fBatchedRequests.add(this);
-				}
-				fBatchedRequests.add(request);
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#startRequest()
-	 */
-	void startRequest() {
-		if (fBatchedRequests == null) {
-			getElementContentProvider().update(new IChildrenCountUpdate[]{this});
-		} else {
-			IChildrenCountUpdate[] updates = (IChildrenCountUpdate[]) fBatchedRequests.toArray(new IChildrenCountUpdate[fBatchedRequests.size()]);
-			// notify that the other updates have also started to ensure correct sequence
-			// of model updates - **** start at index 1 since the first (0) update has
-			// already notified the content provider that it has started.
-			for (int i = 1; i < updates.length; i++) {
-				getContentProvider().updateStarted((ViewerUpdateMonitor) updates[i]);
-			}
-			getElementContentProvider().update(updates);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority()
-	 */
-	int getPriority() {
-		return 2;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getSchedulingPath()
-	 */
-	TreePath getSchedulingPath() {
-		TreePath path = getElementPath();
-		if (path.getSegmentCount() > 0) {
-			return path.getParentPath();
-		}
-		return path;
-	}		
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java
deleted file mode 100644
index 2557a3c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.viewers.TreePath;
-
-/**
- * This class is public so the test suite has access - it should be default protection.
- * 
- * @since 3.3 
- */
-public class ChildrenUpdate extends ViewerUpdateMonitor implements IChildrenUpdate {
-	
-	private Object[] fElements;
-	private int fIndex;
-	private int fLength;
-
-	/**
-	 * Constructs a request to update an element
-	 * 
-	 * @param node node to update
-	 * @param model model containing the node
-	 */
-	public ChildrenUpdate(ModelContentProvider provider, TreePath elementPath, Object element, int index, IElementContentProvider elementContentProvider, IPresentationContext context) {
-		super(provider, elementPath, element, elementContentProvider, context);
-		fIndex = index;
-		fLength = 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.viewers.AsynchronousRequestMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		TreeModelContentProvider provider = (TreeModelContentProvider) getContentProvider();
-		TreePath elementPath = getElementPath();
-		if (fElements != null) {
-			InternalTreeModelViewer viewer = (InternalTreeModelViewer) provider.getViewer();
-			for (int i = 0; i < fElements.length; i++) {
-				int modelIndex = fIndex + i;
-				Object element = fElements[i];
-				if (element != null) {
-					int viewIndex = provider.modelToViewIndex(elementPath, modelIndex);
-					if (provider.shouldFilter(elementPath, element)) {
-						if (provider.addFilteredIndex(elementPath, modelIndex, element)) {
-							if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) {
-								System.out.println("REMOVE(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-							}
-							viewer.remove(elementPath, viewIndex);
-						}
-					} else {
-						if (provider.isFiltered(elementPath, modelIndex)) {
-							provider.clearFilteredChild(elementPath, modelIndex);
-							int insertIndex = provider.modelToViewIndex(elementPath, modelIndex);
-							if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) {
-								System.out.println("insert(" + getElement() + ", modelIndex: " + modelIndex + " insertIndex: " + insertIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-							}
-							viewer.insert(elementPath, element, insertIndex);
-						} else {
-							if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) {
-								System.out.println("replace(" + getElement() + ", modelIndex: " + modelIndex + " viewIndex: " + viewIndex + ", " + element + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-							}
-							viewer.replace(elementPath, viewIndex, element);
-						}
-						TreePath childPath = elementPath.createChildPath(element);
-						provider.updateHasChildren(childPath);
-					}
-				}
-			}
-		} else {
-			provider.updateHasChildren(elementPath);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate#setChild(java.lang.Object, int)
-	 */
-	public void setChild(Object child, int index) {
-		if (fElements == null) {
-			fElements = new Object[fLength];
-		}
-		fElements[index - fIndex] = child;
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * This method is public so the test suite has access - it should be default protection.
-	 * 
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#coalesce(org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor)
-	 */
-	public synchronized boolean coalesce(ViewerUpdateMonitor request) {
-		if (request instanceof ChildrenUpdate) {
-			ChildrenUpdate cu = (ChildrenUpdate) request;
-			if (getElement().equals(cu.getElement()) && getElementPath().equals(cu.getElementPath())) { 
-				int end = fIndex + fLength;
-				int otherStart = cu.getOffset();
-				int otherEnd = otherStart + cu.getLength();
-				if ((otherStart >= fIndex && otherStart <= end) || (otherEnd >= fIndex && otherEnd <= end)) {
-					// overlap
-					fIndex = Math.min(fIndex, otherStart);
-					end = Math.max(end, otherEnd);
-					fLength = end - fIndex;
-					if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) {
-						System.out.println("coalesced: " + this.toString()); //$NON-NLS-1$
-					}
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate#getLength()
-	 */
-	public int getLength() {
-		return fLength;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate#getOffset()
-	 */
-	public int getOffset() {
-		return fIndex;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#startRequest()
-	 */
-	void startRequest() {
-		getElementContentProvider().update(new IChildrenUpdate[]{this});
-	}
-
-	public String toString() {
-		StringBuffer buf = new StringBuffer();
-		buf.append("IChildrenUpdate: "); //$NON-NLS-1$
-		buf.append(getElement());
-		buf.append(" {"); //$NON-NLS-1$
-		buf.append(getOffset());
-		buf.append(',');
-		buf.append(getLength());
-		buf.append("}"); //$NON-NLS-1$
-		return buf.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority()
-	 */
-	int getPriority() {
-		return 3;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getSchedulingPath()
-	 */
-	TreePath getSchedulingPath() {
-		return getElementPath();
-	}		
-	
-	/**
-	 * Sets this request's offset. Used when modifying a waiting request when
-	 * the offset changes due to a removed element.
-	 * 
-	 * @param offset new offset
-	 */
-	void setOffset(int offset) {
-		fIndex = offset;
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.java
deleted file mode 100644
index 04a8d99..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementCompareRequest.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.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.3
- */
-class ElementCompareRequest extends MementoUpdate implements IElementCompareRequest {
-
-	private boolean fEqual;
-	private ModelDelta fDelta;
-	/**
-	 * @param context
-	 * @param element
-	 * @param memento
-	 */
-	public ElementCompareRequest(ModelContentProvider provider, Object element, TreePath elementPath, IMemento memento, ModelDelta delta) {
-		super(provider, provider.getPresentationContext(), element, elementPath, memento);
-		fProvider = provider;
-		fDelta = delta;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest#setEqual(boolean)
-	 */
-	public void setEqual(boolean equal) {
-		fEqual = equal;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
-	 */
-	public void done() {
-		if (isEqual()) {
-			fDelta.setElement(getElement());
-			fProvider.doRestore(fDelta);
-		}
-	}
-	
-	boolean isEqual() {
-		return fEqual;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.java
deleted file mode 100644
index 238c3e3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ElementMementoRequest.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.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.3
- */
-class ElementMementoRequest extends MementoUpdate implements IElementMementoRequest {
-	
-	private IMementoManager fManager;
-	private ModelDelta fDelta;
-
-	/**
-	 * @param context
-	 * @param element
-	 * @param memento
-	 */
-	public ElementMementoRequest(ModelContentProvider provider, IMementoManager manager, IPresentationContext context, Object element, TreePath elementPath, IMemento memento, ModelDelta delta) {
-		super(provider, context, element, elementPath, memento);
-		fManager = manager;
-		fDelta = delta;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
-	 */
-	public void done() {
-		if (!isCanceled() && (getStatus() == null || getStatus().isOK())) {
-			// replace the element with a memento
-			fDelta.setElement(getMemento());
-		}
-		fManager.requestComplete(this);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java
deleted file mode 100644
index a405dec..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/FilterTransform.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.TreePath;
-
-
-/**
- * Helper class to support filtering in virtual tree viewer.
- * Translates indexes from viewer to model coordinate space (and visa versa).
- * <p>
- * This filter transform maintains a tree representing filtered elements in the
- * viewer. The filtering is performed dynamically as elements are 'replaced' in the tree
- * by a lazy tree content provider.
- * </p>
- * <p>
- * This class not intended to be subclassed or instantiated. For internal use only.
- * </p>
- * @since 3.3
- */
-public class FilterTransform {
-
-	private Node root = new Node();
-	
-	class Node {
-		private int[] filteredIndexes = null;
-		private Object[] filteredElements = null;
-		private Map children = null; // only set for parent nodes, indexed by child
-		
-		Node() {
-		}
-		
-		boolean addFilter(TreePath path, int childIndex, int pathIndex, Object filtered) {
-			if (pathIndex == path.getSegmentCount()) {
-				if (filteredIndexes == null) {
-					filteredIndexes = new int[]{childIndex};
-					filteredElements = new Object[]{filtered};
-					return true;
-				}
-				int location = Arrays.binarySearch(filteredIndexes, childIndex);
-				if (location >= 0) {
-					return false;
-				}
-				location = 0 - (location + 1);
-				int[] next = new int[filteredIndexes.length + 1];
-				Object[] filt = new Object[next.length];
-				if (location == 0) {
-					next[0] = childIndex;
-					filt[0] = filtered;
-					System.arraycopy(filteredIndexes, 0, next, 1, filteredIndexes.length);
-					System.arraycopy(filteredElements, 0, filt, 1, filteredElements.length);
-				} else if (location == filteredIndexes.length) {
-					next[filteredIndexes.length] = childIndex;
-					filt[filteredElements.length] = filtered;
-					System.arraycopy(filteredIndexes, 0, next, 0, filteredIndexes.length);
-					System.arraycopy(filteredElements, 0, filt, 0, filteredElements.length);
-				} else {
-					System.arraycopy(filteredIndexes, 0, next, 0, location);
-					System.arraycopy(filteredElements, 0, filt, 0, location);
-					next[location] = childIndex;
-					filt[location] = filtered;
-					System.arraycopy(filteredIndexes, location, next, location + 1, filteredIndexes.length - location);
-					System.arraycopy(filteredElements, location, filt, location + 1, filteredElements.length - location);
-				}
-				filteredIndexes = next;
-				filteredElements = filt;
-				return true;
-			}
-			
-			if (children == null) {
-				children = new HashMap();
-			}
-			Object element = path.getSegment(pathIndex);
-			Node node = (Node) children.get(element);
-			if (node == null) {
-				node = new Node();
-				children.put(element, node);
-			}
-			return node.addFilter(path, childIndex, pathIndex + 1, filtered);
-		}
-		
-		boolean clear(TreePath path, int pathIndex) {
-			if (pathIndex == path.getSegmentCount()) {
-				return true;
-			}
-			if (children == null) {
-				return false;
-			}
-			Object child = path.getSegment(pathIndex);
-			Node node = (Node) children.get(child);
-			if (node != null) {
-				if (node.clear(path, pathIndex + 1)) {
-					children.remove(child);
-				}
-			}
-			return children.isEmpty() && (filteredIndexes == null || filteredIndexes.length == 0);
-		}
-		
-		boolean clear(TreePath path, int childIndex, int pathIndex) {
-			if (pathIndex == path.getSegmentCount()) {
-				if (filteredIndexes != null) {
-					int location = Arrays.binarySearch(filteredIndexes, childIndex);
-					if (location >= 0) {
-						// remove it
-						if (location == 0 && filteredIndexes.length == 1) {
-							filteredIndexes = null;
-							filteredElements = null;
-							return true;
-						}
-						int[] next = new int[filteredIndexes.length - 1];
-						Object[] filt = new Object[next.length];
-						if (location == 0) {
-							System.arraycopy(filteredIndexes, 1, next, 0, next.length);
-							System.arraycopy(filteredElements, 1, filt, 0, filt.length);
-						} else if (location == (filteredIndexes.length - 1)) {
-							System.arraycopy(filteredIndexes, 0, next, 0, location);
-							System.arraycopy(filteredElements, 0, filt, 0, location);
-						} else {
-							System.arraycopy(filteredIndexes, 0, next, 0, location);
-							System.arraycopy(filteredElements, 0, filt, 0, location);
-							System.arraycopy(filteredIndexes, location + 1, next, location, next.length - location);
-							System.arraycopy(filteredElements, location + 1, filt, location, filt.length - location);
-						}
-						filteredIndexes = next;
-						filteredElements = filt;
-						return false;
-					}
-				} else {
-					return false;
-				}
-			}
-			if (children == null) {
-				return false;
-			}
-			Object element = path.getSegment(pathIndex);
-			Node node = (Node) children.get(element);
-			if (node == null) {
-				return false;
-			}
-			boolean remove = node.clear(path, childIndex, pathIndex + 1);
-			if (remove) {
-				children.remove(element);
-				return filteredIndexes == null && children.isEmpty();
-			} else {
-				return false;
-			}
-		}	
-		
-		Node find(TreePath path, int pathIndex) {
-			if (pathIndex == path.getSegmentCount()) 
-				return this;
-			if (children == null) {
-				return null;
-			}
-			Object child = path.getSegment(pathIndex);
-			Node node = (Node) children.get(child);
-			if (node != null) {
-				return node.find(path, pathIndex + 1);
-			}
-			return null;
-		}
-		
-		int viewToModel(int childIndex) {
-			if (filteredIndexes == null) {
-				return childIndex;
-			}
-			// If there are filtered children, then we want to find the
-			// (n+1)th missing number in the list of filtered indexes (missing
-			// entries are visible in the view). For example, if the request
-			// has asked for the model index corresponding to the 4th viewer
-			// index, then we want to find the 5th missing number in the
-			// filtered index sequence.
-			
-			int count = -1; // count from 0, 1, 2...
-			int missingNumbers = 0; // how many numbers missing from the filtered index
-			int offset = 0; // offset into the filtered index
-			
-			while (missingNumbers < (childIndex + 1)) {
-				count++;
-				if (offset < filteredIndexes.length) {
-					if (filteredIndexes[offset] == count) {
-						// not missing
-						offset++;
-					} else {
-						// missing
-						missingNumbers++;
-					}
-				} else {
-					missingNumbers++;
-				}
-			}
-			return count;
-		}
-		
-		int modelToView(int childIndex) {
-			if (filteredIndexes == null) {
-				return childIndex;
-			}
-			int offset = 0;
-			for (int i = 0; i < filteredIndexes.length; i++) {
-				if (childIndex == filteredIndexes[i] ) {
-					return -1;
-				} else if (childIndex > filteredIndexes[i]) {
-					offset++;
-				} else {
-					break;
-				}
-			}
-			return childIndex - offset;
-		}	
-		
-		int modelToViewCount(int childCount) {
-			if (filteredIndexes == null) {
-				return childCount;
-			}
-			return childCount - filteredIndexes.length;
-		}
-		
-		boolean isFiltered(int index) {
-			if (filteredIndexes != null) {
-				int location = Arrays.binarySearch(filteredIndexes, index);
-				return location >= 0;
-			}
-			return false;
-		}
-		
-		int indexOfFilteredElement(Object element) {
-			if (filteredElements != null) {
-				for (int i = 0; i < filteredElements.length; i++) {
-					if (element.equals(filteredElements[i])) {
-						return filteredIndexes[i];
-					}
-				}
-			}
-			return -1;
-		}
-		
-		/**
-		 * Sets the child count for this element, trimming any filtered elements
-		 * that were above this count.
-		 * 
-		 * @param childCount new child count
-		 */
-		void setModelChildCount(int childCount) {
-			if (filteredIndexes != null) {
-				for (int i = 0; i < filteredIndexes.length; i++) {
-					if (filteredIndexes[i] >= childCount) {
-						// trim
-						if (i == 0) {
-							filteredIndexes = null;
-							return;
-						} else {
-							int[] temp = new int[i + 1];
-							System.arraycopy(filteredIndexes, 0, temp, 0, temp.length);
-							filteredIndexes = temp;
-						}
-					}
-				}
-			}
-		}
-		
-		/**
-		 * Updates filter index for a removed element at the given index
-		 * 
-		 * @param index index at which an element was removed
-		 */
-		void removeElementFromFilters(int index) {
-			if (filteredIndexes != null) {
-				int location = Arrays.binarySearch(filteredIndexes, index);
-				if (location >= 0) {
-					// remove a filtered item
-					if (filteredIndexes.length == 1) {
-						// only filtered item
-						filteredIndexes = null;
-						filteredElements = null;
-					} else {
-						int[] next = new int[filteredIndexes.length - 1];
-						Object[] filt = new Object[next.length];
-						if (location == 0) {
-							// first
-							System.arraycopy(filteredIndexes, 1, next, 0, next.length);
-							System.arraycopy(filteredElements, 1, filt, 0, filt.length);
-						} else if (location == (filteredIndexes.length - 1)) {
-							// last
-							System.arraycopy(filteredIndexes, 0, next, 0, next.length);
-							System.arraycopy(filteredElements, 0, filt, 0, filt.length);
-						} else {
-							// middle
-							System.arraycopy(filteredIndexes, 0, next, 0, location);
-							System.arraycopy(filteredElements, 0, filt, 0, location);
-							System.arraycopy(filteredIndexes, location + 1, next, location, next.length - location);
-							System.arraycopy(filteredElements, location + 1, filt, location, filt.length - location);
-						}
-						filteredIndexes = next;
-						filteredElements = filt;
-					}
-				} else {
-					location = 0 - (location + 1);
-				}
-				if (filteredIndexes != null) {
-					// decrement remaining indexes
-					for (int i = location; i < filteredIndexes.length; i ++) {
-						filteredIndexes[i]--;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Filters the specified child of the given parent and returns
-	 * whether the child was already filtered.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param childIndex index of filtered child relative to parent (in model coordinates)
-	 * @param element the filtered element
-	 * @return whether the child was already filtered
-	 */
-	public synchronized boolean addFilteredIndex(TreePath parentPath, int childIndex, Object element) {
-		return root.addFilter(parentPath, childIndex, 0, element);
-	}
-	
-	/**
-	 * Clears all filtered elements.
-	 */
-	public synchronized void clear() {
-		root = new Node();
-	}
-	
-	/**
-	 * Clears all filters in the subtree of the given element.
-	 * 
-	 * @param path element path
-	 */
-	public synchronized void clear(TreePath path) {
-		root.clear(path, 0);
-	}
-	
-	/**
-	 * Clears the given filtered index of the specified parent. I.e.
-	 * the child still exists, but is no longer filtered.
-	 * 
-	 * @param path parent path
-	 * @param index index to clear
-	 */
-	public synchronized void clear(TreePath parentPath, int index) {
-		root.clear(parentPath, index, 0);
-	}	
-	
-	/**
-	 * Translates and returns the given model index (raw index) into
-	 * a view index (filtered index), or -1 if filtered.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param childIndex index of child element in model space
-	 * @return the given index in view coordinates, or -1 if filtered.
-	 */
-	public synchronized int modelToViewIndex(TreePath parentPath, int childIndex) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode == null) {
-			return childIndex;
-		}
-		return parentNode.modelToView(childIndex);
-	}
-	
-	/**
-	 * Translates and returns the given view index (filtered) into
-	 * a model index (raw index).
-	 * 
-	 * @param parentPath path to parent element
-	 * @param childIndex index of child element in view space
-	 * @return the given index in model coordinates
-	 */
-	public synchronized int viewToModelIndex(TreePath parentPath, int childIndex) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode == null) {
-			return childIndex;
-		}
-		return parentNode.viewToModel(childIndex);
-	}
-	
-	/**
-	 * Returns the number of children for the given parent, in the model.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param viewCount number of children in the view
-	 * @return number of children in the model
-	 */
-	public synchronized int viewToModelCount(TreePath parentPath, int viewCount) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode != null) {
-			if (parentNode.filteredIndexes != null) {
-				return viewCount + parentNode.filteredIndexes.length;
-			}
-		}
-		return viewCount;
-	}
-	
-	/**
-	 * Translates and returns the given model child count (raw) into
-	 * a view count (filtered).
-	 * 
-	 * @param parentPath path to parent element
-	 * @param count child count in model space
-	 * @return the given count in view coordinates
-	 */
-	public synchronized int modelToViewCount(TreePath parentPath, int count) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode == null) {
-			return count;
-		}
-		return parentNode.modelToViewCount(count);
-	}	
-	
-	/**
-	 * Returns whether the given index of the specified parent is currently filtered.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param index index of child element
-	 * @return whether the child is currently filtered
-	 */
-	public synchronized boolean isFiltered(TreePath parentPath, int index) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode == null) {
-			return false;
-		}
-		return parentNode.isFiltered(index);
-	}
-	
-	/**
-	 * Returns filtered children of the given parent, or <code>null</code> if none.
-	 * 
-	 * @param parentPath
-	 * @return filtered children or <code>null</code>
-	 */
-	public int[] getFilteredChildren(TreePath parentPath) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode == null) {
-			return null;
-		}
-		return parentNode.filteredIndexes;
-	}
-	
-	/**
-	 * Clears any filters for the given parent above the given count.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param childCount child count
-	 */
-	public synchronized void setModelChildCount(TreePath parentPath, int childCount) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode != null) {
-			parentNode.setModelChildCount(childCount);
-		}
-	}
-	
-	/**
-	 * The element at the given index has been removed from the parent. Update
-	 * indexes.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param index index of child element in model coordinates
-	 */
-	public synchronized void removeElementFromFilters(TreePath parentPath, int index) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode != null) {
-			parentNode.removeElementFromFilters(index);
-		}
-	}
-	
-	/**
-	 * The element has been removed from the parent. Update
-	 * filtered indexes, in case it was a filtered object.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param element removed element
-	 */
-	public synchronized boolean removeElementFromFilters(TreePath parentPath, Object element) {
-		Node parentNode = root.find(parentPath, 0);
-		if (parentNode != null) {
-			int index = parentNode.indexOfFilteredElement(element);
-			if (index >= 0) {
-				parentNode.removeElementFromFilters(index);
-				return true;
-			}
-		}
-		return false;
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java
deleted file mode 100644
index 6a34cbf..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/HasChildrenUpdate.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * @since 3.3
- */
-class HasChildrenUpdate extends ViewerUpdateMonitor implements IHasChildrenUpdate {
-
-	private boolean fHasChildren = false;
-	
-	private List fBatchedRequests = null;
-	
-	/**
-	 * @param contentProvider
-	 */
-	public HasChildrenUpdate(ModelContentProvider contentProvider, TreePath elementPath, Object element, IElementContentProvider elementContentProvider, IPresentationContext context) {
-		super(contentProvider, elementPath, element, elementContentProvider, context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ViewerUpdateMonitor#performUpdate()
-	 */
-	protected void performUpdate() {
-		ModelContentProvider contentProvider = getContentProvider();
-		TreePath elementPath = getElementPath();
-		if (!fHasChildren) {
-			contentProvider.clearFilters(elementPath);
-		}
-		if (ModelContentProvider.DEBUG_CONTENT_PROVIDER) {
-			System.out.println("setHasChildren(" + getElement() + " >> " + fHasChildren); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		((TreeViewer)(contentProvider.getViewer())).setHasChildren(elementPath, fHasChildren);
-		if (elementPath.getSegmentCount() > 0) {
-			contentProvider.doRestore(elementPath);
-		}
-	}
-
-	public void setHasChilren(boolean hasChildren) {
-		fHasChildren = hasChildren;
-	}
-
-	public String toString() {
-		StringBuffer buf = new StringBuffer();
-		buf.append("IHasChildrenUpdate: "); //$NON-NLS-1$
-		buf.append(getElement());
-		return buf.toString();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#coalesce(org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor)
-	 */
-	boolean coalesce(ViewerUpdateMonitor request) {
-		if (request instanceof HasChildrenUpdate) {
-			if (getElementPath().equals(request.getElementPath())) {
-				// duplicate request
-				return true;
-			} else if (getElementContentProvider().equals(request.getElementContentProvider())) {
-				if (fBatchedRequests == null) {
-					fBatchedRequests = new ArrayList();
-					fBatchedRequests.add(this);
-				}
-				fBatchedRequests.add(request);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#startRequest()
-	 */
-	void startRequest() {
-		if (fBatchedRequests == null) {
-			getElementContentProvider().update(new IHasChildrenUpdate[]{this});
-		} else {
-			IHasChildrenUpdate[] updates = (IHasChildrenUpdate[]) fBatchedRequests.toArray(new IHasChildrenUpdate[fBatchedRequests.size()]);
-			// notify that the other updates have also started to ensure correct sequence
-			// of model updates - **** start at index 1 since the first (0) update has
-			// already notified the content provider that it has started.
-			for (int i = 1; i < updates.length; i++) {
-				getContentProvider().updateStarted((ViewerUpdateMonitor) updates[i]);
-			}
-			getElementContentProvider().update(updates);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getPriority()
-	 */
-	int getPriority() {
-		return 1;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ViewerUpdateMonitor#getSchedulingPath()
-	 */
-	TreePath getSchedulingPath() {
-		TreePath path = getElementPath();
-		if (path.getSegmentCount() > 0) {
-			return path.getParentPath();
-		}
-		return path;
-	}		
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ILabelUpdateListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ILabelUpdateListener.java
deleted file mode 100644
index a53be35..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ILabelUpdateListener.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.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
-
-/**
- * Notified of label updates.
- * 
- * @since 3.3
- */
-public interface ILabelUpdateListener {
-
-	/**
-	 * Notification that a sequence of viewer updates are starting.
-	 */
-	public void labelUpdatesBegin();
-	
-	/**
-	 * Notification that viewer updates are complete. Corresponds to
-	 * a <code>viewerUpdatesBegin()</code> notification.
-	 */
-	public void labelUpdatesComplete();
-	
-	/**
-	 * Notification that a specific update has started within
-	 * a sequence of updates.
-	 * 
-	 * @param update update
-	 */
-	public void labelUpdateStarted(ILabelUpdate update);
-	
-	/**
-	 * Notification that a specific update has completed within a
-	 * sequence of updates.
-	 * 
-	 * @param update update
-	 */
-	public void labelUpdateComplete(ILabelUpdate update);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IMementoManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IMementoManager.java
deleted file mode 100644
index 92f1d43..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/IMementoManager.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.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest;
-
-/**
- * @since 3.3
- */
-interface IMementoManager {
-
-	/**
-	 * Adds the request to this manager.
-	 * 
-	 * @param memento request
-	 */
-	public void addRequest(IElementMementoRequest request);
-	
-	/**
-	 * Notification the request is complete.
-	 * 
-	 * @param request
-	 */
-	public void requestComplete(IElementMementoRequest request);
-	
-	/**
-	 * Process the queued requests. Accepts no more new requests.
-	 */
-	public void processReqeusts();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java
deleted file mode 100644
index 106e017..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java
+++ /dev/null
@@ -1,1231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILazyTreePathContentProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-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.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IMemento;
-
-/**
- * A tree viewer that displays a model.
- * 
- * @since 3.3
- */
-public class InternalTreeModelViewer extends TreeViewer {
-	
-	private IPresentationContext fContext;
-	
-    /**
-     * Current column presentation or <code>null</code>
-     */
-    private IColumnPresentation fColumnPresentation = null;	
-    
-    /**
-     * Map of columns presentation id to its visible columns id's (String[])
-     * When a columns presentation is not in the map, default settings are used.
-     */
-    private Map fVisibleColumns = new HashMap();
-    
-    /**
-     * Map of column id's to persisted sizes
-     */
-    private Map fColumnSizes = new HashMap();
-    
-    /**
-     * Map of column presentation id's to an array of integers representing the column order
-     * for that presentation, or <code>null</code> if default.
-     */
-    private Map fColumnOrder = new HashMap();
-    
-    /**
-     * Map of column presentation id to whether columns should be displayed
-     * for that presentation (the user can toggle columns on/off when a 
-     * presentation is optional.
-     */
-    private Map fShowColumns = new HashMap();    
-    
-    /**
-     * Item's tree path cache 
-     */
-    private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$
-    
-    /**
-	 * Memento type for column sizes. Sizes are keyed by column presentation id 
-	 */
-	private static final String COLUMN_SIZES = "COLUMN_SIZES"; //$NON-NLS-1$
-	/**
-	 * Memento type for the column order for a presentation context.
-	 * A memento is created for each column presentation
-	 */
-	private static final String COLUMN_ORDER = "COLUMN_ORDER";     //$NON-NLS-1$	
-	/**
-	 * Memento type for the visible columns for a presentation context.
-	 * A memento is created for each column presentation keyed by column number
-	 */
-	private static final String VISIBLE_COLUMNS = "VISIBLE_COLUMNS";     //$NON-NLS-1$
-	/**
-	 * Memento type for whether columns are visible for a presentation context.
-	 * Booleans are keyed by column presentation id
-	 */
-	private static final String SHOW_COLUMNS = "SHOW_COLUMNS";     //$NON-NLS-1$	
-	/**
-	 * Memento key for the number of visible columns in a VISIBLE_COLUMNS memento
-	 * or for the width of a column
-	 */
-	private static final String SIZE = "SIZE";	 //$NON-NLS-1$
-	/**
-	 * Memento key prefix a visible column
-	 */
-	private static final String COLUMN = "COLUMN";	 //$NON-NLS-1$	    
-	
-	/**
-	 * True while performing an insert... we allow insert with filters
-	 */
-	private boolean fInserting = false;
-	
-	/**
-	 * Whether to notify the content provider when an element is unmapped
-	 */
-	private boolean fNotifyUnmap = true;
-	
-	/**
-	 * Persist column sizes when they change.
-	 * 
-	 * @since 3.2
-	 */
-	class ColumnListener implements ControlListener {
-		/* (non-Javadoc)
-		 * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
-		 */
-		public void controlMoved(ControlEvent e) {
-			persistColumnOrder();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
-		 */
-		public void controlResized(ControlEvent e) {
-			persistColumnSizes();
-		}
-	}
-	
-	private ColumnListener fListener = new ColumnListener();    
-
-	/**
-	 * Proxy to cell modifier/editor support
-	 */
-	class CellModifierProxy implements ICellModifier {
-		
-		private ICellModifier fModifier;
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-		 */
-		public boolean canModify(Object element, String property) {
-			IElementEditor editor = getElementEditorAdapter(element);
-			if (editor != null) {
-				fModifier = editor.getCellModifier(getPresentationContext(), element);
-				if (fModifier != null) {
-					if (fModifier.canModify(element, property)) {
-						// install cell editor
-						CellEditor cellEditor = editor.getCellEditor(getPresentationContext(), property, element, (Composite)getControl());
-		                if (cellEditor != null) {
-			                disposeCellEditors();
-			                CellEditor[] newEditors = new CellEditor[getVisibleColumns().length];
-			                for (int i = 0; i < newEditors.length; i++) {
-								newEditors[i] = cellEditor;
-							}
-			                setCellEditors(newEditors);
-			                return true;
-		                }
-					}
-				}
-			}
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-		 */
-		public Object getValue(Object element, String property) {
-			if (fModifier != null) {
-				return fModifier.getValue(element, property);
-			}
-			return null;
-		}
-
-		/* (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 (fModifier != null) {
-				if (element instanceof Item) {
-					element = ((Item)element).getData();
-				}
-				fModifier.modify(element, property, value);
-			}
-		}
-		
-		/**
-		 * Disposes client's column editor and cell editors
-		 */
-		protected void dispose() {
-			fModifier = null;
-			disposeCellEditors();
-			setCellEditors(null);
-		}
-
-		/**
-		 * Disposes current cell editors
-		 */
-		protected void disposeCellEditors() {
-			CellEditor[] cellEditors = getCellEditors();
-			if (cellEditors != null) {
-				for (int i = 0; i < cellEditors.length; i++) {
-					CellEditor editor = cellEditors[i];
-					if (editor != null) {
-						editor.dispose();
-					}
-				}
-			}
-		}
-		
-	    /**
-	     * Returns the element editor for the given element or <code>null</code>.
-	     * 
-	     * @param input
-	     * @return element editor or <code>null</code>
-	     */
-	    protected IElementEditor getElementEditorAdapter(Object input) {
-	    	if (input instanceof IElementEditor) {
-				return (IElementEditor) input;
-			}
-	    	if (input instanceof IAdaptable) {
-				IAdaptable adaptable = (IAdaptable) input;
-				return (IElementEditor) adaptable.getAdapter(IElementEditor.class);
-			}
-	    	return null;
-	    } 
-	}
-	
-	private CellModifierProxy fCellModifier;
-	
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public InternalTreeModelViewer(Composite parent, int style, IPresentationContext context) {
-		super(parent, style);
-		if ((style & SWT.VIRTUAL) == 0) {
-			throw new IllegalArgumentException("style must include SWT.VIRTUAL"); //$NON-NLS-1$
-		}
-		setUseHashlookup(true);
-		fCellModifier = new CellModifierProxy();
-		fContext = context;
-		setContentProvider(createContentProvider());
-		setLabelProvider(createLabelProvider());
-	}
-	
-	/**
-	 * @return content provider for this tree viewer
-	 */
-	protected TreeModelContentProvider createContentProvider()
-	{
-		return new TreeModelContentProvider();
-	}
-	
-	/**
-	 * @return label provider for this tree viewer
-	 */
-	protected TreeModelLabelProvider createLabelProvider()
-	{
-		return new TreeModelLabelProvider(this);
-	}
-	
-	/* (non-Javadoc)
-	 * 
-	 * Workaround for bug 159461: when an item is cleared it's label is cleared. To avoid
-	 * flashing, restore its label to its previous value.
-	 * 
-	 * @see org.eclipse.jface.viewers.TreeViewer#hookControl(org.eclipse.swt.widgets.Control)
-	 */
-	protected void hookControl(Control control) {
-		Tree treeControl = (Tree) control;
-		treeControl.addListener(SWT.SetData, new Listener() {
-			public void handleEvent(Event event) {
-				// to avoid flash, reset previous label data
-				TreeItem item = (TreeItem) event.item;
-				preserveItem(item);
-			}
-		});
-		super.hookControl(control);
-	}
-	
-	/**
-	 * @param item
-	 */
-	private void preserveItem(TreeItem item) {
-		Object[] labels = (Object[]) item.getData(LabelUpdate.PREV_LABEL_KEY);
-		if (labels != null) {
-			for (int i = 0; i < labels.length; i++) {
-				if (labels[i] != null) {
-					item.setText(i, (String)labels[i]);
-				}
-			}
-		}
-		Object[] images = (Object[]) item.getData(LabelUpdate.PREV_IMAGE_KEY);
-		if (images != null) {
-			for (int i = 0; i < images.length; i++) {
-				item.setImage(i, (Image) images[i]);
-			}
-		}
-		Object[] fonts = (Object[]) item.getData(LabelUpdate.PREV_FONT_KEY);
-		if (fonts != null) {
-			for (int i = 0; i < fonts.length; i++) {
-				item.setFont(i, (Font) fonts[i]);
-			}
-		}
-		Object[] foregrounds = (Object[]) item.getData(LabelUpdate.PREV_FOREGROUND_KEY);
-		if (foregrounds != null) {
-			for (int i = 0; i < foregrounds.length; i++) {
-				item.setForeground(i, (Color) foregrounds[i]);
-			}
-		}
-		Object[] backgrounds = (Object[]) item.getData(LabelUpdate.PREV_BACKGROUND_KEY);
-		if (backgrounds != null) {
-			for (int i = 0; i < backgrounds.length; i++) {
-				item.setBackground(i, (Color) backgrounds[i]);
-			}
-		}
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.StructuredViewer#handleInvalidSelection
-     * 
-     * Override the default handler for invalid selection to allow model 
-     * selection policy to select the new selection.
-     */
-	protected void handleInvalidSelection(ISelection selection, ISelection newSelection) {
-	    IModelSelectionPolicy selectionPolicy = getSelectionPolicy(selection);
-	    if (selectionPolicy != null) {
-	    	ISelection temp = newSelection;
-            newSelection = selectionPolicy.replaceInvalidSelection(selection, newSelection);
-            if (temp != newSelection) {
-            	if (newSelection == null) {
-            		newSelection = new StructuredSelection();
-            	}
-            	// call super.setSelection(...) to avoid asking the selection policy
-            	// if the selection should be overridden
-            	super.setSelection(newSelection, false);
-            	return;
-            }
-	    }
-	    super.handleInvalidSelection(selection, newSelection);
-	}
-        
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ContentViewer#handleDispose(org.eclipse.swt.events.DisposeEvent)
-	 */
-	protected void handleDispose(DisposeEvent event) {
-		if (fColumnPresentation != null) {
-			fColumnPresentation.dispose();
-		}
-		fCellModifier.dispose();
-		fContext.dispose();
-		super.handleDispose(event);
-	}
-	
-	/**
-	 * Returns this viewer's presentation context.
-	 * 
-	 * @return presentation context
-	 */
-	public IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-	
-	protected void unmapElement(Object element, Widget widget) {
-		if (fNotifyUnmap) {
-			// TODO: should we update the filter with the "new non-identical element"?
-			IContentProvider provider = getContentProvider();
-			if (provider instanceof ModelContentProvider) {
-				((ModelContentProvider) provider).unmapPath((TreePath) widget.getData(TREE_PATH_KEY));
-			}
-		}
-		super.unmapElement(element, widget);
-	}
-	
-	protected void associate(Object element, Item item) {
-		// see AbstractTreeViewer.associate(...)
-		Object data = item.getData();
-		if (data != null && data != element && equals(data, element)) {
-			// elements are equal but not identical
-			// -> being removed from map, but should not change filters
-			try {
-				fNotifyUnmap = false;
-				super.associate(element, item);
-			} finally {
-				fNotifyUnmap = true;
-			}
-		} else {
-			super.associate(element, item);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * We need tree paths when disposed/unmapped in any order so cache the tree path.
-	 * 
-	 * @see org.eclipse.jface.viewers.TreeViewer#mapElement(java.lang.Object, org.eclipse.swt.widgets.Widget)
-	 */
-	protected void mapElement(Object element, Widget widget) {
-		super.mapElement(element, widget);
-		if (widget instanceof Item) {
-			widget.setData(TREE_PATH_KEY, getTreePathFromItem((Item)widget));
-		} else {
-			widget.setData(TREE_PATH_KEY, ModelContentProvider.EMPTY_TREE_PATH);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * 
-	 * Override because we allow inserting with filters present.
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#insert(java.lang.Object, java.lang.Object, int)
-	 */
-	public void insert(Object parentElementOrTreePath, Object element, int position) {
-		try {
-			fInserting = true;
-			super.insert(parentElementOrTreePath, element, position);
-		} finally {
-			fInserting = false;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * 
-	 * Override because we allow inserting with filters present.
-	 * 
-	 * @see org.eclipse.jface.viewers.StructuredViewer#hasFilters()
-	 */
-	protected boolean hasFilters() {
-		if (fInserting) {
-			return false;
-		}
-		return super.hasFilters();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#inputChanged(java.lang.Object, java.lang.Object)
-	 */
-	protected void inputChanged(Object input, Object oldInput) {
-		super.inputChanged(input, oldInput);
-		resetColumns(input);
-	}
-
-	/**
-     * Configures the columns for the given viewer input.
-     * 
-     * @param input
-     */
-    protected void resetColumns(Object input) {
-    	if (input != null) {
-    		// only change columns if the input is non-null (persist when empty)
-	    	IColumnPresentationFactory factory = getColumnPresenetationFactoryAdapter(input);
-	    	PresentationContext context = (PresentationContext) getPresentationContext();
-	    	String type = null;
-	    	if (factory != null) {
-	    		type = factory.getColumnPresentationId(context, input);
-	    	}
-			if (type != null) {
-				if (fColumnPresentation != null) {
-					if (!fColumnPresentation.getId().equals(type)) {
-						// dispose old, create new
-						fColumnPresentation.dispose();
-						fColumnPresentation = null;
-					}
-				}
-				if (fColumnPresentation == null) {
-					fColumnPresentation = factory.createColumnPresentation(context, input);
-					if (fColumnPresentation != null) {
-						fColumnPresentation.init(context);
-						configureColumns();
-					}
-				}
-			} else {
-				if (fColumnPresentation != null) {
-					fColumnPresentation.dispose();
-					fColumnPresentation = null;
-					configureColumns();
-				}
-			}
-    	}
-    } 
-    
-    /**
-     * Returns the column presentation factory for the given element or <code>null</code>.
-     * 
-     * @param input
-     * @return column presentation factory of <code>null</code>
-     */
-    protected IColumnPresentationFactory getColumnPresenetationFactoryAdapter(Object input) {
-    	if (input instanceof IColumnPresentationFactory) {
-			return (IColumnPresentationFactory) input;
-		}
-    	if (input instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) input;
-			return (IColumnPresentationFactory) adaptable.getAdapter(IColumnPresentationFactory.class);
-		}
-    	return null;
-    }    
-        
-    /**
-     * Configures the columns based on the current settings.
-     * 
-     * @param input
-     */
-    protected void configureColumns() {
-    	if (fColumnPresentation != null) {
-			IColumnPresentation build = null;
-			if (isShowColumns(fColumnPresentation.getId())) {
-				build = fColumnPresentation;
-			}
-			buildColumns(build);					
-		} else {
-			// get rid of columns
-			buildColumns(null);
-		}
-    }
-    
-	/**
-	 * Toggles columns on/off for the current column presentation, if any.
-	 * 
-	 * @param show whether to show columns if the current input supports
-	 * 	columns
-	 */
-	public void setShowColumns(boolean show) {
-		if (show) {
-			if (!isShowColumns()) {
-				fShowColumns.remove(fColumnPresentation.getId());
-			}
-		} else {
-			if (isShowColumns()){
-				fShowColumns.put(fColumnPresentation.getId(), Boolean.FALSE);
-			}
-		}
-		refreshColumns();
-	}
-	
-	/**
-	 * Resets any persisted column size for the given columns
-	 */
-	public void resetColumnSizes(String[] columnIds) {
-		for (int i = 0; i < columnIds.length; i++) {
-			fColumnSizes.remove(columnIds[i]);
-		}
-	}
-	
-	/**
-	 * Sets the id's of visible columns, or <code>null</code> to set default columns.
-	 * Only effects the current column presentation.
-	 * 
-	 * @param ids visible columns
-	 */
-	public void setVisibleColumns(String[] ids) {
-		if (ids != null && ids.length == 0) {
-			ids = null;
-		}
-		IColumnPresentation presentation = getColumnPresentation();
-		if (presentation != null) {
-			fColumnOrder.remove(presentation.getId());
-			fVisibleColumns.remove(presentation.getId());
-			if (ids != null) {
-				// put back in table if not default
-				String[] columns = presentation.getInitialColumns();
-				if (columns.length == ids.length) {
-					for (int i = 0; i < columns.length; i++) {
-						if (!ids[i].equals(columns[i])) {
-							fVisibleColumns.put(presentation.getId(), ids);
-							break;
-						}
-					}
-				} else {
-					fVisibleColumns.put(presentation.getId(), ids);
-				}
-			}
-			PresentationContext presentationContext = (PresentationContext) getPresentationContext();
-			presentationContext.setColumns(getVisibleColumns());
-			refreshColumns();
-		}
-	}	
-	
-    /**
-     * Refreshes the columns in the view, based on the viewer input.
-     */
-    protected void refreshColumns() {
-    	configureColumns();
-    	refresh();
-    }
-    
-	/**
-	 * Returns whether columns are being displayed currently.
-	 * 
-	 * @return
-	 */
-	public boolean isShowColumns() {
-		if (fColumnPresentation != null) {
-			return isShowColumns(fColumnPresentation.getId());
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns whether columns can be toggled on/off for the current input.
-	 * 
-	 * @return whether columns can be toggled on/off for the current input
-	 */
-	public boolean canToggleColumns() {
-		return fColumnPresentation != null && fColumnPresentation.isOptional();
-	}
-	
-	protected boolean isShowColumns(String columnPresentationId) {
-		Boolean bool = (Boolean) fShowColumns.get(columnPresentationId);
-		if (bool == null) {
-			return true;
-		}
-		return bool.booleanValue();
-	}    
-    
-    /**
-     * Creates new columns for the given presentation.
-     * 
-     * TODO: does this need to be asynchronous?
-     * 
-     * @param presentation
-     */
-    protected void buildColumns(IColumnPresentation presentation) {
-    	// dispose current columns, persisting their weights
-    	Tree tree = getTree();
-		final TreeColumn[] columns = tree.getColumns();
-		String[] visibleColumnIds = getVisibleColumns();
-    	for (int i = 0; i < columns.length; i++) {
-    		TreeColumn treeColumn = columns[i];
-    		treeColumn.removeControlListener(fListener);
-			treeColumn.dispose();
-		}
-    	PresentationContext presentationContext = (PresentationContext) getPresentationContext();
-    	if (presentation != null) {	    	
-	    	for (int i = 0; i < visibleColumnIds.length; i++) {
-				String id = visibleColumnIds[i];
-				String header = presentation.getHeader(id);
-				// TODO: allow client to specify style
-				TreeColumn column = new TreeColumn(tree, SWT.LEFT, i);
-				column.setMoveable(true);
-				column.setText(header);
-				column.setWidth(1);
-				ImageDescriptor image = presentation.getImageDescriptor(id);
-				if (image != null) {
-					column.setImage(((TreeModelLabelProvider)getLabelProvider()).getImage(image));
-				}
-				column.setData(id);
-			}
-	    	int[] order = (int[]) fColumnOrder.get(presentation.getId());
-	    	if (order != null) {
-	    		tree.setColumnOrder(order);
-	    	}
-	    	tree.setHeaderVisible(true);
-	    	tree.setLinesVisible(true);
-	    	presentationContext.setColumns(getVisibleColumns());
-	    	setColumnProperties(getVisibleColumns());
-	    	setCellModifier(fCellModifier);
-    	} else {
-    		tree.setHeaderVisible(false);
-    		tree.setLinesVisible(false);
-    		presentationContext.setColumns(null);
-    		setCellModifier(null);
-    		setColumnProperties(null);
-    	}
-    	
-
-    	int avg = tree.getSize().x;
-    	if (visibleColumnIds != null)
-    		avg /= visibleColumnIds.length;
-    	
-        if (avg == 0) {
-            tree.addPaintListener(new PaintListener() {
-                public void paintControl(PaintEvent e) {
-                    Tree tree2 = getTree();
-                    String[] visibleColumns = getVisibleColumns();
-                    if (visibleColumns != null) {
-						int avg1 = tree2.getSize().x / visibleColumns.length;
-	                    initColumns(avg1);
-                    }
-                    tree2.removePaintListener(this);
-                }
-            });
-        } else {
-            initColumns(avg);
-        }
-    }
-
-    private void initColumns(int widthHint) {
-        TreeColumn[] columns = getTree().getColumns();
-        for (int i = 0; i < columns.length; i++) {
-            TreeColumn treeColumn = columns[i];
-            Integer width = (Integer) fColumnSizes.get(treeColumn.getData());
-            if (width == null) {
-                treeColumn.setWidth(widthHint);
-            } else {
-                treeColumn.setWidth(width.intValue());
-            }
-            treeColumn.addControlListener(fListener);
-        }
-    }    
-    
-	/**
-	 * Returns the current column presentation for this viewer, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return column presentation or <code>null</code>
-	 */
-	public IColumnPresentation getColumnPresentation() {
-		return fColumnPresentation;
-	}
-	
-	/**
-	 * Returns identifiers of the visible columns in this viewer, or <code>null</code>
-	 * if there is currently no column presentation.
-	 *  
-	 * @return visible columns or <code>null</code>
-	 */
-	public String[] getVisibleColumns() {
-		if (isShowColumns()) {
-			IColumnPresentation presentation = getColumnPresentation();
-			if (presentation != null) {
-				String[] columns = (String[]) fVisibleColumns.get(presentation.getId());
-				if (columns == null) {
-					return presentation.getInitialColumns();
-				}
-				return columns;
-			}
-		}
-		return null;
-	}    
-	
-    /**
-     * Persists column sizes in cache
-     */
-    protected void persistColumnSizes() { 
-		Tree tree = getTree();
-		TreeColumn[] columns = tree.getColumns();
-		for (int i = 0; i < columns.length; i++) {
-			TreeColumn treeColumn = columns[i];
-			Object id = treeColumn.getData();
-			fColumnSizes.put(id, new Integer(treeColumn.getWidth()));
-		}
-    }
-    
-    /**
-     * Persists column ordering
-     */
-    protected void persistColumnOrder() {
-    	IColumnPresentation presentation = getColumnPresentation();
-    	if (presentation != null) {
-	    	Tree tree = getTree();
-	    	int[] order = tree.getColumnOrder();
-	    	if (order.length > 0) {
-	    		for (int i = 0; i < order.length; i++) {
-					if (i != order[i]) {
-						// non default order
-						fColumnOrder.put(presentation.getId(), order);
-						return;
-					}
-				}
-	    	}
-	    	// default order
-	    	fColumnOrder.remove(presentation.getId());
-    	}
-    }
-    
-	/**
-	 * Save viewer state into the given memento.
-	 * 
-	 * @param memento
-	 */
-	public void saveState(IMemento memento) {
-		if (!fColumnSizes.isEmpty()) {
-			Iterator iterator = fColumnSizes.entrySet().iterator();
-			while (iterator.hasNext()) {
-				Map.Entry entry = (Entry) iterator.next();
-				IMemento sizes = memento.createChild(COLUMN_SIZES, (String)entry.getKey());
-				sizes.putInteger(SIZE, ((Integer)entry.getValue()).intValue());
-			}
-		}
-		if (!fShowColumns.isEmpty()) {
-			Iterator iterator = fShowColumns.entrySet().iterator();
-			while (iterator.hasNext()) {
-				Map.Entry entry = (Entry) iterator.next();
-				IMemento sizes = memento.createChild(SHOW_COLUMNS, (String)entry.getKey());
-				sizes.putString(SHOW_COLUMNS, ((Boolean)entry.getValue()).toString());
-			}			
-		}
-		if (!fVisibleColumns.isEmpty()) {
-			Iterator iterator = fVisibleColumns.entrySet().iterator();
-			while (iterator.hasNext()) {
-				Map.Entry entry = (Entry) iterator.next();
-				String id = (String) entry.getKey();
-				IMemento visible = memento.createChild(VISIBLE_COLUMNS, id);
-				String[] columns = (String[]) entry.getValue();
-				visible.putInteger(SIZE, columns.length);
-				for (int i = 0; i < columns.length; i++) {
-					visible.putString(COLUMN+Integer.toString(i), columns[i]);
-				}
-			}
-		}
-		if (!fColumnOrder.isEmpty()) {
-			Iterator iterator = fColumnOrder.entrySet().iterator();
-			while (iterator.hasNext()) {
-				Map.Entry entry = (Entry) iterator.next();
-				String id = (String) entry.getKey();
-				IMemento orderMemento = memento.createChild(COLUMN_ORDER, id);
-				int[] order = (int[]) entry.getValue();
-				orderMemento.putInteger(SIZE, order.length);
-				for (int i = 0; i < order.length; i++) {
-					orderMemento.putInteger(COLUMN+Integer.toString(i), order[i]);
-				}
-			}
-		}
-	}    
-	
-	/**
-	 * Initializes viewer state from the memento
-	 * 
-	 * @param memento
-	 */
-	public void initState(IMemento memento) {
-		IMemento[] mementos = memento.getChildren(COLUMN_SIZES);
-		for (int i = 0; i < mementos.length; i++) {
-			IMemento child = mementos[i];
-			String id = child.getID();
-			Integer size = child.getInteger(SIZE);
-			if (size != null) {
-				fColumnSizes.put(id, size);
-			}
-		}
-		mementos = memento.getChildren(SHOW_COLUMNS);
-		for (int i = 0; i < mementos.length; i++) {
-			IMemento child = mementos[i];
-			String id = child.getID();
-			Boolean bool = Boolean.valueOf(child.getString(SHOW_COLUMNS));
-			if (!bool.booleanValue()) {
-				fShowColumns.put(id, bool);
-			}
-		}
-		mementos = memento.getChildren(VISIBLE_COLUMNS);
-		for (int i = 0; i < mementos.length; i++) {
-			IMemento child = mementos[i];
-			String id = child.getID();
-			Integer integer = child.getInteger(SIZE);
-			if (integer != null) {
-				int length = integer.intValue();
-				String[] columns = new String[length];
-				for (int j = 0; j < length; j++) {
-					columns[j] = child.getString(COLUMN+Integer.toString(j));
-				}
-				fVisibleColumns.put(id, columns);
-			}
-		}
-		mementos = memento.getChildren(COLUMN_ORDER);
-		for (int i = 0; i < mementos.length; i++) {
-			IMemento child = mementos[i];
-			String id = child.getID();
-			Integer integer = child.getInteger(SIZE);
-			if (integer != null) {
-				int length = integer.intValue();
-				int[] order = new int[length];
-				for (int j = 0; j < length; j++) {
-					order[j] = child.getInteger(COLUMN+Integer.toString(j)).intValue();
-				}
-				fColumnOrder.put(id, order);
-			}
-		}
-	}
-	
-	/**
-	 * Returns whether the candidate selection should override the current
-	 * selection.
-	 * 
-	 * @param current
-	 * @param curr
-	 * @return
-	 */
-	protected boolean overrideSelection(ISelection current, ISelection candidate) {
-		IModelSelectionPolicy selectionPolicy = getSelectionPolicy(current);
-		if (selectionPolicy == null) {
-			return true;
-		}
-		if (selectionPolicy.contains(candidate, getPresentationContext())) {
-			return selectionPolicy.overrides(current, candidate, getPresentationContext());
-		}
-		return !selectionPolicy.isSticky(current, getPresentationContext());
-	}
-	
-	/**
-	 * Returns the selection policy associated with the given selection
-	 * or <code>null</code> if none.
-	 * 
-	 * @param selection or <code>null</code>
-	 * @return selection policy or <code>null</code>
-	 */
-	protected IModelSelectionPolicy getSelectionPolicy(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			Object element = ss.getFirstElement();
-			if (element instanceof IAdaptable) {
-				IAdaptable adaptable = (IAdaptable) element;
-				IModelSelectionPolicyFactory factory =  (IModelSelectionPolicyFactory) adaptable.getAdapter(IModelSelectionPolicyFactory.class);
-				if (factory == null && !(element instanceof PlatformObject)) {
-					// for objects that don't properly subclass PlatformObject to inherit default
-    	    		// adapters, just delegate to the adapter factory
-					factory = (IModelSelectionPolicyFactory) new DebugElementAdapterFactory().getAdapter(element, IModelSelectionPolicyFactory.class);
-				}
-				if (factory != null) {
-					return factory.createModelSelectionPolicyAdapter(adaptable, getPresentationContext());
-				}
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * Consider selection policy
-	 * 
-	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
-	 */
-	public void setSelection(ISelection selection, boolean reveal) {
-		if (!overrideSelection(getSelection(), selection)) {
-			return;
-		}
-		super.setSelection(selection, reveal);
-	}
-	
-	/**
-	 * Sets the selection in the viewer to the specified selection.
-	 * 
-	 * @param selection the selection
-	 * @param reveal whether to reveal the selection
-	 * @param force whether to force the selection (i.e. <code>true</code> to
-	 *  override the model selection policy)
-	 */
-	public void setSelection(ISelection selection, boolean reveal, boolean force) {
-		if (force) {
-			super.setSelection(selection, reveal);
-		} else {
-			setSelection(selection, reveal);
-		}
-	}
-	
-	/**
-	 * Registers the specified listener for view update notifications.
-	 * 
-	 * @param listener listener
-	 */
-	public void addViewerUpdateListener(IViewerUpdateListener listener) {
-		((ModelContentProvider)getContentProvider()).addViewerUpdateListener(listener);
-	}
-	
-	/**
-	 * Removes the specified listener from update notifications.
-	 * 
-	 * @param listener listener
-	 */
-	public void removeViewerUpdateListener(IViewerUpdateListener listener) {
-		ModelContentProvider cp = (ModelContentProvider)getContentProvider();
-		if (cp !=  null) {
-			cp.removeViewerUpdateListener(listener);
-		}
-	}
-	
-	/**
-	 * Registers the given listener for model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	public void addModelChangedListener(IModelChangedListener listener) {
-		((ModelContentProvider)getContentProvider()).addModelChangedListener(listener); 
-	}
-	
-	/**
-	 * Unregisters the given listener from model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	public void removeModelChangedListener(IModelChangedListener listener) {
-		ModelContentProvider cp = (ModelContentProvider)getContentProvider();
-		if (cp !=  null) {
-			cp.removeModelChangedListener(listener);
-		}
-	}
-	
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void doUpdateItem(final Item item, Object element) {
-		if (!(item instanceof TreeItem)) {
-			return;
-		}
-		TreeItem treeItem = (TreeItem) item;
-		if (treeItem.isDisposed()) {
-			unmapElement(element, treeItem);
-			return;
-		}
-		
-		((TreeModelLabelProvider)getLabelProvider()).update(getTreePathFromItem(item), getViewerRowFromItem(treeItem));
-
-		// As it is possible for user code to run the event
-		// loop check here.
-		if (item.isDisposed()) {
-			unmapElement(element, item);
-		}
-	}
-	
-	/**
-	 * Forces unmapped virtual items to populate 
-	 */
-	boolean populateVitrualItems() {
-		Tree tree = getTree();
-		return populateVitrualItems(TreePath.EMPTY, tree.getItems());
-	}
-
-	/**
-	 * @param items
-	 */
-	private boolean populateVitrualItems(TreePath parentPath, TreeItem[] items) {
-		boolean queued = false;
-		for (int i = 0; i < items.length; i++) {
-			TreeItem treeItem = items[i];
-			if (treeItem.getData() == null) {
-				queued = true;
-				((ILazyTreePathContentProvider)getContentProvider()).updateElement(parentPath, i);
-			}
-			if (treeItem.getExpanded()) {
-				queued = populateVitrualItems(parentPath.createChildPath(treeItem.getData()), treeItem.getItems()) | queued;
-			}
-		}
-		return queued;
-	}
-	
-	void addLabelUpdateListener(ILabelUpdateListener listener) {
-		((TreeModelLabelProvider)getLabelProvider()).addLabelUpdateListener(listener);
-	}
-	
-	void removeLabelUpdateListener(ILabelUpdateListener listener) {
-		((TreeModelLabelProvider)getLabelProvider()).removeLabelUpdateListener(listener);
-	}
-	
-	/**
-	 * Returns the item for the element at the given tree path or <code>null</code>
-	 * if none.
-	 * 
-	 * @param path tree path
-	 * @return item or <code>null</code>
-	 */
-	Widget findItem(TreePath path) {
-		if (path.getSegmentCount() == 0) {
-			return getTree();
-		}
-		Widget[] items = super.findItems(path.getLastSegment());
-		if (items.length == 1) {
-			return items[0];
-		}
-		for (int i = 0; i < items.length; i++) {
-			if (getTreePathFromItem((Item)items[i]).equals(path)) {
-				return items[i];
-			}
-		}
-		return null;
-	}
-	
-	public Item[] getChildren(Widget widget) {
-		return super.getChildren(widget);
-	}
-	
-	/**
-	 * Returns the tree path for the given item.
-	 * @param item
-	 * @return {@link TreePath}
-	 */
-	protected TreePath getTreePathFromItem(Item item) {
-		return super.getTreePathFromItem(item);
-	}	
-
-//**************************************************************************	
-// These methods were copied from TreeViewer as a workaround for bug 183463:
-// 		Expanded nodes in tree viewer flash on refresh
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * workaround for bug 183463
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalRefreshStruct(org.eclipse.swt.widgets.Widget,
-	 *      java.lang.Object, boolean)
-	 */
-	protected void internalRefreshStruct(Widget widget, Object element,
-			boolean updateLabels) {
-		// clear all starting with the given widget
-		if (widget instanceof Tree) {
-			((Tree) widget).clearAll(true);
-		} else if (widget instanceof TreeItem) {
-			((TreeItem) widget).clearAll(true);
-		}
-		int index = 0;
-		Widget parent = null;
-		if (widget instanceof TreeItem) {
-			TreeItem treeItem = (TreeItem) widget;
-			parent = treeItem.getParentItem();
-			if (parent == null) {
-				parent = treeItem.getParent();
-			}
-			if (parent instanceof Tree) {
-				index = ((Tree) parent).indexOf(treeItem);
-			} else {
-				index = ((TreeItem) parent).indexOf(treeItem);
-			}
-		}
-		virtualRefreshExpandedItems(parent, widget, element, index);
-	}	
-	
-	/**
-	 * Traverses the visible (expanded) part of the tree and updates child
-	 * counts.
-	 * <p>
-	 * workaround for bug 183463
-	 * </p>
-	 * @param parent the parent of the widget, or <code>null</code> if the widget is the tree
-	 * @param widget
-	 * @param element
-	 * @param index the index of the widget in the children array of its parent, or 0 if the widget is the tree
-	 */
-	private void virtualRefreshExpandedItems(Widget parent, Widget widget, Object element, int index) {
-		if (widget instanceof Tree) {
-			if (element == null) {
-				((Tree) widget).setItemCount(0);
-				return;
-			}
-			virtualLazyUpdateChildCount(widget, getChildren(widget).length);
-		} else if (((TreeItem) widget).getExpanded()) {
-			// prevent SetData callback
-			preserveItem((TreeItem)widget);
-			//((TreeItem)widget).setText(" "); //$NON-NLS-1$
-			virtualLazyUpdateWidget(parent, index);
-		} else {
-			return;
-		}
-		Item[] items = getChildren(widget);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			Object data = item.getData();
-			virtualRefreshExpandedItems(widget, item, data, i);
-		}
-	}
-	
-	/**
-	 * workaround for bug 183463
-	 * 
-	 * Update the child count
-	 * @param widget
-	 * @param currentChildCount
-	 */
-	private void virtualLazyUpdateChildCount(Widget widget, int currentChildCount) {
-		TreePath treePath;
-		if (widget instanceof Item) {
-			treePath = getTreePathFromItem((Item) widget);
-		} else {
-			treePath = TreePath.EMPTY;
-		}
-		((ILazyTreePathContentProvider) getContentProvider())
-				.updateChildCount(treePath, currentChildCount);
-	}
-	
-	/**
-	 * Update the widget at index.
-	 * <p>
-	 * workaround for bug 183463
-	 * </p>
-	 * @param widget
-	 * @param index
-	 */
-	private void virtualLazyUpdateWidget(Widget widget, int index) {
-		TreePath treePath;
-		if (widget instanceof Item) {
-			if (widget.getData() == null) {
-				// we need to materialize the parent first
-				// see bug 167668
-				// however, that would be too risky
-				// see bug 182782 and bug 182598
-				// so we just ignore this call altogether
-				// and don't do this: virtualMaterializeItem((TreeItem) widget);
-				return;
-			}
-			treePath = getTreePathFromItem((Item) widget);
-		} else {
-			treePath = TreePath.EMPTY;
-		}
-		((ILazyTreePathContentProvider) getContentProvider())
-				.updateElement(treePath, index);
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java
deleted file mode 100644
index a1cab72..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/LabelUpdate.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.core.commands.Request;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TreePath;
-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.graphics.RGB;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * @since 3.3
- */
-class LabelUpdate extends Request implements ILabelUpdate {
-	
-	private TreePath fElementPath;
-	private String[] fColumnIds;
-	private RGB[] fBackgrounds;
-	private RGB[] fForegrounds;
-	private ImageDescriptor[] fImageDescriptors;
-	private String[] fLabels;
-	private FontData[] fFontDatas;
-	private TreeModelLabelProvider fProvider;
-	private TreeItem fItem;
-	private int fNumColumns; 
-	private IPresentationContext fContext;
-	
-	/**
-	 * Label data cache keys
-	 * TODO: workaround for bug 159461
-	 */
-	static String PREV_LABEL_KEY = "PREV_LABEL_KEY"; //$NON-NLS-1$
-	static String PREV_IMAGE_KEY = "PREV_IMAGE_KEY"; //$NON-NLS-1$
-	static String PREV_FONT_KEY = "PREV_FONT_KEY"; //$NON-NLS-1$
-	static String PREV_FOREGROUND_KEY = "PREV_FOREGROUND_KEY"; //$NON-NLS-1$
-	static String PREV_BACKGROUND_KEY = "PREV_BACKGROUND_KEY"; //$NON-NLS-1$
-	
-	/**
-	 * @param elementPath element the label is for
-	 * @param item item the label is for
-	 * @param provider label provider to callback to 
-	 * @param columnIds column identifiers or <code>null</code>
-	 * @param context presentation context
-	 */
-	public LabelUpdate(TreePath elementPath, TreeItem item, TreeModelLabelProvider provider, String[] columnIds, IPresentationContext context) {
-		fContext = context;
-		fElementPath = elementPath;
-		fProvider = provider;
-		fColumnIds = columnIds;
-		fItem = item;
-		fNumColumns = 1;
-		if (columnIds != null) {
-			fNumColumns = columnIds.length;
-		}
-		fLabels = new String[fNumColumns];
-		fProvider.updateStarted(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#getColumnIds()
-	 */
-	public String[] getColumnIds() {
-		return fColumnIds;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#getElement()
-	 */
-	public TreePath getElementPath() {
-		return fElementPath;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#setBackground(org.eclipse.swt.graphics.RGB, int)
-	 */
-	public void setBackground(RGB background, int columnIndex) {
-		if (background == null) {
-			return;
-		}
-		if (fBackgrounds == null) {
-			fBackgrounds = new RGB[fNumColumns];
-		}
-		fBackgrounds[columnIndex] = background;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#setFontData(org.eclipse.swt.graphics.FontData, int)
-	 */
-	public void setFontData(FontData fontData, int columnIndex) {
-		if (fontData == null) {
-			return;
-		}
-		if (fFontDatas == null) {
-			fFontDatas = new FontData[fNumColumns];
-		}
-		fFontDatas[columnIndex] = fontData;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#setForeground(org.eclipse.swt.graphics.RGB, int)
-	 */
-	public void setForeground(RGB foreground, int columnIndex) {
-		if (foreground == null) {
-			return;
-		}
-		if (fForegrounds == null) {
-			fForegrounds = new RGB[fNumColumns];
-		}
-		fForegrounds[columnIndex] = foreground;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#setImageDescriptor(org.eclipse.jface.resource.ImageDescriptor, int)
-	 */
-	public void setImageDescriptor(ImageDescriptor image, int columnIndex) {
-		if (image == null) {
-			return;
-		}
-		if (fImageDescriptors == null) {
-			fImageDescriptors = new ImageDescriptor[fNumColumns];
-		}
-		fImageDescriptors[columnIndex] = image;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate#setLabel(java.lang.String, int)
-	 */
-	public void setLabel(String text, int columnIndex) {
-		fLabels[columnIndex] = text;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate#getPresentationContext()
-	 */
-	public IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
-	 */
-	public void done() {
-		fProvider.complete(this);
-	}
-
-	/**
-	 * Applies settings to viewer cell
-	 */
-	public void update() {
-		// label data is stored to prevent flickering of asynchronous view, see bug 159461
-		if (!fItem.isDisposed()) {
-			
-			for (int i=0; i<fNumColumns; i++){
-				// text might be null if the launch has been terminated
-				fItem.setText(i,(fLabels[i] == null ? "" : fLabels[i])); //$NON-NLS-1$
-			}
-			fItem.setData(PREV_LABEL_KEY, fLabels);
-			
-			if (fImageDescriptors == null) {
-				for (int i=0; i<fNumColumns; i++){
-					fItem.setImage(i,null);
-				}
-				fItem.setData(PREV_IMAGE_KEY, null);
-			} else {
-				Image[] images = new Image[fImageDescriptors.length];
-				for (int i = 0; i < fImageDescriptors.length; i++) {
-					images[i] = fProvider.getImage(fImageDescriptors[i]);
-				}
-				if (fColumnIds == null) {
-					fItem.setImage(images[0]);
-				} else {
-					fItem.setImage(images);
-				}
-				fItem.setData(PREV_IMAGE_KEY, images);
-			}
-			
-			if (fForegrounds == null) {	
-				for (int i=0; i<fNumColumns; i++){
-					fItem.setForeground(i,null);
-				}
-				fItem.setData(PREV_FOREGROUND_KEY, null);
-			} else {
-				Color[] foregrounds = new Color[fForegrounds.length];
-				for (int i = 0; i< foregrounds.length; i++) {
-					foregrounds[i] = fProvider.getColor(fForegrounds[i]);
-				}
-				if (fColumnIds == null) {
-					fItem.setForeground(0,foregrounds[0]);
-				} else {
-					for (int i = 0; i< foregrounds.length; i++) {
-						fItem.setForeground(i, foregrounds[i]);
-					}
-				}
-				fItem.setData(PREV_FOREGROUND_KEY, foregrounds);
-			}
-			
-			if (fBackgrounds == null) {
-				for (int i=0; i<fNumColumns; i++){
-					fItem.setBackground(i,null);
-				}
-				fItem.setData(PREV_BACKGROUND_KEY, null);
-			} else {
-				Color[] backgrounds = new Color[fBackgrounds.length];
-				for (int i = 0; i< backgrounds.length; i++) {
-					backgrounds[i] = fProvider.getColor(fBackgrounds[i]);
-				}
-				if (fColumnIds == null) {
-					fItem.setBackground(0,backgrounds[0]);
-				} else {
-					for (int i = 0; i< backgrounds.length; i++) {
-						fItem.setBackground(i, backgrounds[i]);
-					}
-				}
-				fItem.setData(PREV_BACKGROUND_KEY, backgrounds);
-			}
-			
-			if (fFontDatas == null) {
-				for (int i=0; i<fNumColumns; i++){
-					fItem.setFont(i,null);
-				}
-				fItem.setData(PREV_FONT_KEY, null);
-			} else {
-				Font[] fonts = new Font[fFontDatas.length];
-				for (int i = 0; i < fFontDatas.length; i++) {
-					fonts[i] = fProvider.getFont(fFontDatas[i]);
-				}
-				if (fColumnIds == null) {
-					fItem.setFont(0,fonts[0]);
-				} else {
-					for (int i = 0; i < fonts.length; i++) {
-						fItem.setFont(i, fonts[i]);
-					}
-				}
-				fItem.setData(PREV_FONT_KEY, fonts);
-			}
-		}
-		fProvider.updateComplete(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate#getElement()
-	 */
-	public Object getElement() {
-		return getElementPath().getLastSegment();
-	}
-
-	public String toString() {
-		StringBuffer buf = new StringBuffer();
-		buf.append("ILabelUpdate: "); //$NON-NLS-1$
-		buf.append(getElement());
-		return buf.toString();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java
deleted file mode 100644
index 6e19552..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/MementoUpdate.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import org.eclipse.debug.internal.core.commands.Request;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.3
- */
-abstract class MementoUpdate extends Request implements IViewerUpdate {
-	
-	private IPresentationContext fContext;
-	private Object fElement;
-	private TreePath fElementPath;
-	private IMemento fMemento;
-	protected ModelContentProvider fProvider;
-	
-	/**
-	 * Constructs a viewer state request.
-	 * 
-	 * @param viewer viewer
-	 * @param element element
-	 * @param memento memento
-	 */
-	public MementoUpdate(ModelContentProvider provider, IPresentationContext context, Object element, TreePath elementPath, IMemento memento) {
-		fContext = context;
-		fElement = element;
-		fElementPath = elementPath;
-		fMemento = memento;
-		fProvider = provider;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate#getPresentationContext()
-	 */
-	public IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-	
-	public Object getElement() {
-		return fElement;
-	}
-	
-	public TreePath getElementPath() {
-		return fElementPath;
-	}
-	
-	public IMemento getMemento() {
-		return fMemento;
-	}
-	
-	public ModelContentProvider getContentProvider() {
-		return fProvider;
-	}
-
-	public Object getElement(TreePath path) {
-		return fProvider.getElement(path);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java
deleted file mode 100644
index c4035d7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java
+++ /dev/null
@@ -1,1262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-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.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.Platform;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Content provider for a virtual viewer.
- * 
- * @since 3.3
- */
-abstract class ModelContentProvider implements IContentProvider, IModelChangedListener {
-
-	private Viewer fViewer;
-
-	private Map fModelProxies = new HashMap(); // model proxy by element
-	
-	/**
-	 * Map of nodes that have been filtered from the viewer.
-	 */
-	private FilterTransform fTransform = new FilterTransform();
-	
-	/**
-	 * Model listeners
-	 */
-	private ListenerList fModelListeners = new ListenerList();
-	
-	/**
-	 * Update listeners
-	 */
-	private ListenerList fUpdateListeners = new ListenerList();
-	
-	/**
-	 * Map of updates in progress: element path -> list of requests
-	 */
-	private Map fRequestsInProgress = new HashMap();
-	
-	/**
-	 * Map of dependent requests waiting for parent requests to complete:
-	 *  element path -> list of requests
-	 */
-	private Map fWaitingRequests = new HashMap();
-	
-	/**
-	 * Map of viewer states keyed by viewer input mementos
-	 */
-	private Map fViewerStates = new LRUMap(20);
-	
-	/**
-	 * Pending viewer state to be restored
-	 */
-	private ModelDelta fPendingState = null;
-	
-	/**
-	 * Set of IMementoManager's that are currently saving state
-	 */
-	private Set fPendingStateSaves = new HashSet();
-	
-	/**
-	 * Used to queue a viewer input for state restore
-	 */
-	private Object fQueuedRestore = null;
-	
-	/**
-	 * Used to determine when restoration delta has been processed
-	 */
-	class CheckState implements IModelDeltaVisitor {
-		private boolean complete = true;
-		private IModelDelta topDelta = null;
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelDeltaVisitor#visit(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta, int)
-		 */
-		public boolean visit(IModelDelta delta, int depth) {
-			if (delta.getFlags() != IModelDelta.NO_CHANGE) {
-				if (delta.getFlags() == IModelDelta.REVEAL && !(delta.getElement() instanceof IMemento)) {
-					topDelta = delta;
-				} else {
-					complete = false;
-					return false;
-				}
-			}
-			return true;
-		}
-		
-		public boolean isComplete() {
-			return complete;
-		}
-		
-		public IModelDelta getTopItemDelta() {
-			return topDelta;
-		}
-	}
-	
-	/**
-	 * LRU cache for viewer states 
-	 */
-	class LRUMap extends LinkedHashMap {
-		private static final long serialVersionUID= 1L;
-		private int fMaxSize;
-		LRUMap(int maxSize) {
-			super();
-			fMaxSize = maxSize;
-		}
-		protected boolean removeEldestEntry(Entry eldest) {
-			return size() > fMaxSize;
-		}	
-	}
-	
-	/**
-	 * Update type constants
-	 */
-	static final int UPDATE_SEQUENCE_BEGINS = 0;
-	static final int UPDATE_SEQUENCE_COMPLETE = 1;
-	static final int UPDATE_BEGINS = 2;
-	static final int UPDATE_COMPLETE = 3;
-	
-	/**
-	 * Constant for an empty tree path.
-	 */
-	protected static final TreePath EMPTY_TREE_PATH = new TreePath(new Object[]{});
-	
-	// debug flags
-	public static boolean DEBUG_CONTENT_PROVIDER = false;
-	public static boolean DEBUG_UPDATE_SEQUENCE = false;
-	
-	static {
-		DEBUG_CONTENT_PROVIDER = DebugUIPlugin.DEBUG && "true".equals( //$NON-NLS-1$
-		 Platform.getDebugOption("org.eclipse.debug.ui/debug/viewers/contentProvider")); //$NON-NLS-1$
-		DEBUG_UPDATE_SEQUENCE = DebugUIPlugin.DEBUG && "true".equals( //$NON-NLS-1$
-		 Platform.getDebugOption("org.eclipse.debug.ui/debug/viewers/updateSequence")); //$NON-NLS-1$
-	} 	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public synchronized void dispose() {
-		// cancel pending updates
-		synchronized (fRequestsInProgress) {
-			Iterator iterator = fRequestsInProgress.values().iterator();
-			while (iterator.hasNext()) {
-				List requests = (List) iterator.next();
-				Iterator reqIter = requests.iterator();
-				while (reqIter.hasNext()) {
-					((IRequest) reqIter.next()).cancel();
-				}
-			}
-			fWaitingRequests.clear();
-		}
-		fModelListeners.clear();
-		fUpdateListeners.clear();
-		disposeAllModelProxies();
-		fViewer = null;
-	}
-	
-	public synchronized boolean isDisposed() {
-		return fViewer == null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public synchronized void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		fViewer = viewer;
-		if (oldInput != null) {
-			saveViewerState(oldInput);
-		}
-		if (newInput != oldInput) {
-			disposeAllModelProxies();
-			fTransform.clear();
-			if (newInput != null) {
-				installModelProxy(newInput);
-				restoreViewerState(newInput);
-			}
-		}
-	}
-
-	/**
-	 * Restores the viewer state unless a save is taking place.  If a save is
-	 * taking place, the restore is queued.
-	 * @param input viewer input
-	 */
-	protected synchronized void restoreViewerState(final Object input) {
-		fPendingState = null;
-		if (isSavingState()) {
-			fQueuedRestore = input;
-		} else {
-			startRestoreViewerState(input);
-		}
-	}
-	
-	/**
-	 * Restores viewer state for the given input
-	 * 
-	 * @param input viewer input
-	 */
-	private  synchronized void startRestoreViewerState(final Object input) {
-		fPendingState = null;
-		final IElementMementoProvider defaultProvider = getViewerStateAdapter(input);
-		if (defaultProvider != null) {
-			// build a model delta representing expansion and selection state
-			final ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE);
-			final XMLMemento inputMemento = XMLMemento.createWriteRoot("VIEWER_INPUT_MEMENTO"); //$NON-NLS-1$
-			final IMementoManager manager = new IMementoManager() {
-			
-				private IElementMementoRequest fRequest;
-				
-				/* (non-Javadoc)
-				 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IMementoManager#requestComplete(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest)
-				 */
-				public synchronized void requestComplete(IElementMementoRequest request) {
-					if (!request.isCanceled() && (request.getStatus() == null || request.getStatus().isOK())) {
-						XMLMemento keyMemento = (XMLMemento) delta.getElement();
-						StringWriter writer = new StringWriter();
-						try {
-							keyMemento.save(writer);
-							final ModelDelta stateDelta = (ModelDelta) fViewerStates.remove(writer.toString());
-							if (stateDelta != null) {
-								if (DEBUG_CONTENT_PROVIDER) {
-									System.out.println("RESTORE: " + stateDelta.toString()); //$NON-NLS-1$
-								}
-								stateDelta.setElement(input);
-								// begin restoration
-								UIJob job = new UIJob("restore state") { //$NON-NLS-1$
-									public IStatus runInUIThread(IProgressMonitor monitor) {
-										if (input.equals(getViewer().getInput())) {
-											fPendingState = stateDelta;
-											doInitialRestore();
-										}
-										return Status.OK_STATUS;
-									}
-								
-								};
-								job.setSystem(true);
-								job.schedule();
-							}
-						} catch (IOException e) {
-							DebugUIPlugin.log(e);
-						}
-					}
-				}
-			
-				/* (non-Javadoc)
-				 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IMementoManager#processReqeusts()
-				 */
-				public void processReqeusts() {
-					defaultProvider.encodeElements(new IElementMementoRequest[]{fRequest});
-				}
-			
-				/* (non-Javadoc)
-				 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IMementoManager#addRequest(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest)
-				 */
-				public synchronized void addRequest(IElementMementoRequest req) {
-					fRequest = req;
-				}
-			
-			};
-			manager.addRequest(new ElementMementoRequest(ModelContentProvider.this, manager, getPresentationContext(),
-									delta.getElement(), getViewerTreePath(delta), inputMemento, delta));
-			manager.processReqeusts();
-		}
-	}
-	
-	/**
-	 * Restore selection/expansion based on items already in the viewer
-	 */
-	abstract protected void doInitialRestore();
-	
-	/**
-	 * @param delta
-	 */
-	abstract void doRestore(final ModelDelta delta);
-	
-	/**
-	 * Perform any restoration required for the given tree path.
-	 * 
-	 * @param path
-	 */
-	protected synchronized void doRestore(final TreePath path) {
-		if (fPendingState == null) { 
-			return;
-		}
-		final IElementMementoProvider defaultProvider = getViewerStateAdapter(getViewer().getInput());
-		IModelDeltaVisitor visitor = new IModelDeltaVisitor() {
-			public boolean visit(IModelDelta delta, int depth) {
-				if (delta.getParentDelta() == null) {
-					return true;
-				}
-				Object element = delta.getElement();
-				Object potentialMatch = path.getSegment(depth - 1);
-				if (element instanceof IMemento) {
-					if (defaultProvider != null) {
-						defaultProvider.compareElements(new IElementCompareRequest[]{
-								new ElementCompareRequest(ModelContentProvider.this,
-										potentialMatch, path, (IMemento) element, (ModelDelta)delta)});
-					}
-				} else {
-					if (element.equals(potentialMatch)) {
-						// already processed - visit children
-						return path.getSegmentCount() > depth;
-					}
-				}
-				return false;
-			}
-		};
-		fPendingState.accept(visitor);
-	}
-
-	/**
-	 * Saves the viewer's state for the previous input.
-	 * 
-	 * @param oldInput
-	 */
-	protected void saveViewerState(Object input) {
-		IElementMementoProvider stateProvider = getViewerStateAdapter(input);
-		if (stateProvider != null) {
-			// build a model delta representing expansion and selection state
-			ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE);
-			buildViewerState(delta);
-			if (delta.getChildDeltas().length > 0) {
-				// encode delta with mementos in place of elements, in non-UI thread
-				encodeDelta(delta, stateProvider);
-			}
-		}
-	}
-
-	/**
-	 * Encodes delta elements into mementos using the given provider.
-	 *  
-	 * @param delta
-	 * @param stateProvider
-	 */
-	protected void encodeDelta(final ModelDelta rootDelta, final IElementMementoProvider defaultProvider) {
-		final XMLMemento inputMemento = XMLMemento.createWriteRoot("VIEWER_INPUT_MEMENTO"); //$NON-NLS-1$
-		final XMLMemento childrenMemento = XMLMemento.createWriteRoot("CHILDREN_MEMENTO"); //$NON-NLS-1$
-		final IMementoManager manager = new IMementoManager() {
-		
-			/**
-			 * list of memento requests
-			 */
-			private List requests = new ArrayList();
-			private boolean abort = false; 
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IMementoManager#requestComplete(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest)
-			 */
-			public synchronized void requestComplete(IElementMementoRequest request) {
-				if (!abort) {
-					if (!request.isCanceled() && (request.getStatus() == null || request.getStatus().isOK())) {
-						requests.remove(request);
-						if (requests.isEmpty()) {
-							XMLMemento keyMemento = (XMLMemento) rootDelta.getElement();
-							StringWriter writer = new StringWriter();
-							try {
-								keyMemento.save(writer);
-								fViewerStates.put(writer.toString(), rootDelta);
-							} catch (IOException e) {
-								DebugUIPlugin.log(e);
-							}
-							stateSaveComplete(this);
-						}
-					} else {
-						abort = true;
-						Iterator iterator = requests.iterator();
-						while (iterator.hasNext()) {
-							IElementMementoRequest req = (IElementMementoRequest) iterator.next();
-							req.cancel();
-						}
-						requests.clear();
-						stateSaveComplete(this);
-					}
-				}
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IMementoManager#processReqeusts()
-			 */
-			public synchronized void processReqeusts() {
-				defaultProvider.encodeElements((IElementMementoRequest[]) requests.toArray(new IElementMementoRequest[requests.size()]));
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IMementoManager#addRequest(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest)
-			 */
-			public synchronized void addRequest(IElementMementoRequest request) {
-				requests.add(request);
-			}
-		
-		};
-		IModelDeltaVisitor visitor = new IModelDeltaVisitor() {
-			public boolean visit(IModelDelta delta, int depth) {
-				if (delta.getParentDelta() == null) {
-					manager.addRequest(
-						new ElementMementoRequest(ModelContentProvider.this, manager, getPresentationContext(),
-								delta.getElement(), getViewerTreePath(delta), inputMemento, (ModelDelta)delta));
-				} else {
-					manager.addRequest(
-						new ElementMementoRequest(ModelContentProvider.this, manager, getPresentationContext(),
-								delta.getElement(), getViewerTreePath(delta), childrenMemento.createChild("CHILD_ELEMENT"), (ModelDelta)delta)); //$NON-NLS-1$
-				}
-				return true;
-			}
-		};
-		rootDelta.accept(visitor);
-		stateSaveStarted(manager);
-		manager.processReqeusts();
-	}
-	
-	/**
-	 * Called when a state save is starting.
-	 * 
-	 * @param manager
-	 */
-	private synchronized void stateSaveStarted(IMementoManager manager) {
-		fPendingStateSaves.add(manager);
-	}
-	
-	/**
-	 * Called when a state save is complete.
-	 * 
-	 * @param manager
-	 */
-	private synchronized void stateSaveComplete(IMementoManager manager) {
-		fPendingStateSaves.remove(manager);
-		if (fQueuedRestore != null) {
-			Object temp = fQueuedRestore;
-			fQueuedRestore = null;
-			restoreViewerState(temp);
-		}
-	}
-	
-	/**
-	 * Returns whether any state saving is in progress.
-	 * 
-	 * @return whether any state saving is in progress
-	 */
-	private synchronized boolean isSavingState() {
-		return !fPendingStateSaves.isEmpty();
-	}
-
-	/**
-	 * Builds a delta with the given root delta for expansion/selection state.
-	 * 
-	 * @param delta root delta
-	 */
-	protected abstract void buildViewerState(ModelDelta delta);
-
-	/**
-	 * Uninstalls the model proxy installed for the given element, if any.
-	 * 
-	 * @param element
-	 */
-	protected synchronized void disposeModelProxy(Object element) {
-		IModelProxy proxy = (IModelProxy) fModelProxies.remove(element);
-		if (proxy != null) {
-			proxy.dispose();
-		}
-	}
-
-	/**
-	 * Uninstalls each model proxy
-	 */
-	protected synchronized void disposeAllModelProxies() {
-		Iterator updatePolicies = fModelProxies.values().iterator();
-		while (updatePolicies.hasNext()) {
-			IModelProxy proxy = (IModelProxy) updatePolicies.next();
-			proxy.dispose();
-		}
-		fModelProxies.clear();
-	}
-
-	/**
-	 * Installs the model proxy for the given element into this content provider
-	 * if not already installed.
-	 * 
-	 * @param element
-	 *            element to install an update policy for
-	 */
-	protected synchronized void installModelProxy(Object element) {
-		if (!fModelProxies.containsKey(element)) {
-			IModelProxyFactory modelProxyFactory = getModelProxyFactoryAdapter(element);
-			if (modelProxyFactory != null) {
-				final IModelProxy proxy = modelProxyFactory.createModelProxy(
-						element, getPresentationContext());
-				if (proxy != null) {
-					fModelProxies.put(element, proxy);
-					Job job = new Job("Model Proxy installed notification job") {//$NON-NLS-1$
-						protected IStatus run(IProgressMonitor monitor) {
-							if (!monitor.isCanceled()) {
-								proxy.init(getPresentationContext());
-								Object[] mcls = fModelListeners.getListeners();
-								for (int i = 0; i < mcls.length; i++) {
-									proxy.addModelChangedListener((IModelChangedListener) mcls[i]);
-								}
-								proxy
-										.addModelChangedListener(ModelContentProvider.this);
-								proxy.installed(getViewer());
-							}
-							return Status.OK_STATUS;
-						}
-					};
-					job.setSystem(true);
-					job.schedule();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns the model proxy factory for the given element or
-	 * <code>null</code> if none.
-	 * 
-	 * @param element
-	 *            element to retrieve adapter for
-	 * @return model proxy factory adapter or <code>null</code>
-	 */
-	protected IModelProxyFactory getModelProxyFactoryAdapter(Object element) {
-		IModelProxyFactory adapter = null;
-		if (element instanceof IModelProxyFactory) {
-			adapter = (IModelProxyFactory) element;
-		} else if (element instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) element;
-			adapter = (IModelProxyFactory) adaptable.getAdapter(IModelProxyFactory.class);
-			if (adapter == null && !(element instanceof PlatformObject)) {
-    	    	// for objects that don't properly subclass PlatformObject to inherit default
-        		// adapters, just delegate to the adapter factory
-	        	adapter = (IModelProxyFactory) new DebugElementAdapterFactory().getAdapter(element, IModelProxyFactory.class);
-	        }
-		}
-		return adapter;
-	}
-	
-	/**
-	 * Returns the viewer state adapter for the given element or
-	 * <code>null</code> if none.
-	 * 
-	 * @param element
-	 *            element to retrieve adapter for
-	 * @return viewer state adapter or <code>null</code>
-	 */
-	protected IElementMementoProvider getViewerStateAdapter(Object element) {
-		IElementMementoProvider adapter = null;
-		if (element instanceof IElementMementoProvider) {
-			adapter = (IElementMementoProvider) element;
-		} else if (element instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) element;
-			adapter = (IElementMementoProvider) adaptable.getAdapter(IElementMementoProvider.class);
-		}
-		return adapter;
-	}	
-
-	/**
-	 * Returns the presentation context for this content provider.
-	 * 
-	 * @return presentation context
-	 */
-	protected abstract IPresentationContext getPresentationContext();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelChangedListener#modelChanged(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	public void modelChanged(final IModelDelta delta, final IModelProxy proxy) {
-		WorkbenchJob job = new WorkbenchJob("process model delta") { //$NON-NLS-1$
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				if (!proxy.isDisposed()) {
-					updateNodes(new IModelDelta[] { delta });
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.schedule();
-		
-	}
-
-	protected void updateNodes(IModelDelta[] nodes) {
-		for (int i = 0; i < nodes.length; i++) {
-			IModelDelta node = nodes[i];
-			int flags = node.getFlags();
-
-			if ((flags & IModelDelta.ADDED) != 0) {
-				handleAdd(node);
-			}
-			if ((flags & IModelDelta.REMOVED) != 0) {
-				handleRemove(node);
-			}
-			if ((flags & IModelDelta.CONTENT) != 0) {
-				handleContent(node);
-			}
-			if ((flags & IModelDelta.EXPAND) != 0) {
-				handleExpand(node);
-			}
-			if ((flags & IModelDelta.COLLAPSE) != 0) {
-				handleCollapse(node);
-			}
-			if ((flags & IModelDelta.SELECT) != 0) {
-				handleSelect(node);
-			}
-			if ((flags & IModelDelta.STATE) != 0) {
-				handleState(node);
-			}
-			if ((flags & IModelDelta.INSERTED) != 0) {
-				handleInsert(node);
-			}
-			if ((flags & IModelDelta.REPLACED) != 0) {
-				handleReplace(node);
-			}
-			if ((flags & IModelDelta.INSTALL) != 0) {
-				handleInstall(node);
-			}
-			if ((flags & IModelDelta.UNINSTALL) != 0) {
-				handleUninstall(node);
-			}
-			if ((flags & IModelDelta.REVEAL) != 0) {
-				handleReveal(node);
-			}
-			updateNodes(node.getChildDeltas());
-		}
-	}
-	
-    /**
-     * Returns the content adapter for the given element or
-     * <code>null</code> if none.
-     * 
-     * @param element
-     *            element to retrieve adapter for
-     * @return content adapter or <code>null</code>
-     */
-    protected IElementContentProvider getContentAdapter(Object element) {        
-        IElementContentProvider adapter = null;
-        if (element instanceof IElementContentProvider) {
-            adapter = (IElementContentProvider) element;
-        } else if (element instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) element;
-            adapter = (IElementContentProvider) adaptable.getAdapter(IElementContentProvider.class);
-            if (adapter == null && !(element instanceof PlatformObject)) {
-                // for objects that don't properly subclass PlatformObject to inherit default
-        		// adapters, just delegate to the adapter factory
-	        	adapter = (IElementContentProvider) new DebugElementAdapterFactory().getAdapter(element, IElementContentProvider.class);
-    	    }
-        }
-        return adapter;
-    }		
-
-	protected abstract void handleState(IModelDelta delta);
-
-	protected abstract void handleSelect(IModelDelta delta);
-
-	protected abstract void handleExpand(IModelDelta delta);
-	
-	protected abstract void handleCollapse(IModelDelta delta);
-
-	protected abstract void handleContent(IModelDelta delta);
-
-	protected abstract void handleRemove(IModelDelta delta);
-
-	protected abstract void handleAdd(IModelDelta delta);
-
-	protected abstract void handleInsert(IModelDelta delta);
-
-	protected abstract void handleReplace(IModelDelta delta);
-	
-	protected abstract void handleReveal(IModelDelta delta);
-	
-	protected void handleInstall(IModelDelta delta) {
-		installModelProxy(delta.getElement());
-	}
-	
-	protected void handleUninstall(IModelDelta delta) {
-		disposeModelProxy(delta.getElement());
-	}	
-
-	/**
-	 * Returns a tree path for the node, *not* including the root element.
-	 * 
-	 * @param node
-	 *            model delta
-	 * @return corresponding tree path
-	 */
-	protected TreePath getViewerTreePath(IModelDelta node) {
-		ArrayList list = new ArrayList();
-		IModelDelta parentDelta = node.getParentDelta();
-		while (parentDelta != null) {
-			list.add(0, node.getElement());
-			node = parentDelta;
-			parentDelta = node.getParentDelta();
-		}
-		return new TreePath(list.toArray());
-	}
-
-	/**
-	 * Returns the viewer this content provider is working for.
-	 * 
-	 * @return viewer
-	 */
-	protected Viewer getViewer() {
-		return fViewer;
-	}
-	
-	/**
-	 * Translates and returns the given child index from the viewer coordinate
-	 * space to the model coordinate space.
-	 *  
-	 * @param parentPath path to parent element
-	 * @param index index of child element in viewer (filtered) space
-	 * @return index of child element in model (raw) space
-	 */
-	public /* protected */ int viewToModelIndex(TreePath parentPath, int index) {
-		return fTransform.viewToModelIndex(parentPath, index);
-	}
-	
-	/**
-	 * Translates and returns the given child count from the viewer coordinate
-	 * space to the model coordinate space.
-	 *  
-	 * @param parentPath path to parent element
-	 * @param count number of child elements in viewer (filtered) space
-	 * @return number of child elements in model (raw) space
-	 */
-	public /* protected */ int viewToModelCount(TreePath parentPath, int count) {
-		return fTransform.viewToModelCount(parentPath, count);
-	}	
-	
-	/**
-	 * Translates and returns the given child index from the model coordinate
-	 * space to the viewer coordinate space.
-	 *  
-	 * @param parentPath path to parent element
-	 * @param index index of child element in model (raw) space
-	 * @return index of child element in viewer (filtered) space or -1 if filtered
-	 */
-	protected int modelToViewIndex(TreePath parentPath, int index) {
-		return fTransform.modelToViewIndex(parentPath, index);
-	}	
-	
-	/**
-	 * Translates and returns the given child count from the model coordinate
-	 * space to the viewer coordinate space.
-	 *  
-	 * @param parentPath path to parent element
-	 * @param count child count element in model (raw) space
-	 * @return child count in viewer (filtered) space
-	 */
-	protected int modelToViewChildCount(TreePath parentPath, int count) {
-		return fTransform.modelToViewCount(parentPath, count);
-	}	
-	
-	/**
-	 * Notes that the child at the specified index of the given parent element
-	 * has been filtered from the viewer. Returns whether the child at the given
-	 * index was already filtered.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param index index of child element to be filtered
-	 * @param element the filtered element
-	 * @return whether the child was already filtered
-	 */
-	protected boolean addFilteredIndex(TreePath parentPath, int index, Object element) {
-		return fTransform.addFilteredIndex(parentPath, index, element);
-	}
-	
-	/**
-	 * Notes that the element at the given index has been removed from its parent
-	 * and filtered indexes should be updated accordingly.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param index index of element that was removed
-	 */
-	protected void removeElementFromFilters(TreePath parentPath, int index) {
-		fTransform.removeElementFromFilters(parentPath, index);
-	}
-	
-	/**
-	 * Removes the given element from filtered elements of the given parent
-	 * element. Return true if the element was removed, otherwise false.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param element element to remove
-	 * @return whether the element was removed
-	 */
-	protected boolean removeElementFromFilters(TreePath parentPath, Object element) {
-		return fTransform.removeElementFromFilters(parentPath, element);
-	}	
-	
-	/**
-	 * The child count for a parent has been computed. Ensure any filtered items
-	 * above the given count are cleared.
-	 * 
-	 * @param parentPath path to parent element
-	 * @param childCount number of children
-	 */
-	protected void setModelChildCount(TreePath parentPath, int childCount) {
-		fTransform.setModelChildCount(parentPath, childCount);
-	}
-	
-	/**
-	 * Returns whether the given element is filtered.
-	 * 
-	 * @param parentElementOrTreePath
-	 *            the parent element or path
-	 * @param element
-	 *            the child element
-	 * @return whether to filter the element
-	 */
-	protected boolean shouldFilter(Object parentElementOrTreePath, Object element) {
-		ViewerFilter[] filters = ((StructuredViewer)fViewer).getFilters();
-		if (filters.length > 0) {
-			for (int j = 0; j < filters.length; j++) {
-				if (!(filters[j].select(fViewer, parentElementOrTreePath, element))) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}	
-	
-	/**
-	 * Returns whether the given index of the specified parent was previously filtered.
-	 * 
-	 * @param parentPath
-	 * @param index
-	 * @return whether the element at the given index was filtered
-	 */
-	protected boolean isFiltered(TreePath parentPath, int index) {
-		return fTransform.isFiltered(parentPath, index);
-	}
-	
-	/**
-	 * Notification the given element is being unmapped.
-	 * 
-	 * @param path
-	 */
-	protected void unmapPath(TreePath path) {
-		//System.out.println("Unmap " + path.getLastSegment());
-		fTransform.clear(path);
-		cancelSubtreeUpdates(path);
-	}
-
-	/**
-	 * Returns filtered children or <code>null</code>
-	 * @param parent
-	 * @return filtered children or <code>null</code>
-	 */
-	protected int[] getFilteredChildren(TreePath parent) {
-		return fTransform.getFilteredChildren(parent);
-	}
-	
-	protected void clearFilteredChild(TreePath parent, int modelIndex) {
-		fTransform.clear(parent, modelIndex);
-	}
-	
-	protected void clearFilters(TreePath parent) {
-		fTransform.clear(parent);
-	}
-
-	protected synchronized IModelDelta checkIfRestoreComplete() {
-		if (fPendingState == null) {
-			return null;
-		}
-		CheckState state = new CheckState();
-		fPendingState.accept(state);
-		if (state.isComplete()) {
-			fPendingState = null;
-			if (DEBUG_CONTENT_PROVIDER) {
-				System.out.println("RESTORE COMPELTE"); //$NON-NLS-1$
-			}
-			return state.getTopItemDelta();
-		}
-		return null;
-	}
-	
-	void addViewerUpdateListener(IViewerUpdateListener listener) {
-		fUpdateListeners.add(listener);
-	}
-	
-	void removeViewerUpdateListener(IViewerUpdateListener listener) {
-		fUpdateListeners.remove(listener);
-	}
-	
-	/**
-	 * Notification an update request has started
-	 * 
-	 * @param update
-	 */
-	void updateStarted(ViewerUpdateMonitor update) {
-		boolean begin = false;
-		synchronized (fRequestsInProgress) {
-			begin = fRequestsInProgress.isEmpty();
-			List requests = (List) fRequestsInProgress.get(update.getSchedulingPath());
-			if (requests == null) {
-				requests = new ArrayList();
-				fRequestsInProgress.put(update.getSchedulingPath(), requests);
-			}
-			requests.add(update);
-		}
-		if (begin) {
-			if (DEBUG_UPDATE_SEQUENCE) {
-				System.out.println("MODEL SEQUENCE BEGINS"); //$NON-NLS-1$
-			}
-			notifyUpdate(UPDATE_SEQUENCE_BEGINS, null);
-		}
-		if (DEBUG_UPDATE_SEQUENCE) {
-			System.out.println("\tBEGIN - " + update); //$NON-NLS-1$
-		}
-		notifyUpdate(UPDATE_BEGINS, update);
-	}
-	
-	/**
-	 * Notification an update request has completed
-	 * 
-	 * @param update
-	 */
-	void updateComplete(ViewerUpdateMonitor update) {
-		boolean end = false;
-		synchronized (fRequestsInProgress) {
-			List requests = (List) fRequestsInProgress.get(update.getSchedulingPath());
-			if (requests != null) {
-				requests.remove(update);
-				trigger(update);
-				if (requests.isEmpty()) {
-					fRequestsInProgress.remove(update.getSchedulingPath());
-				}
-			}
-			end = fRequestsInProgress.isEmpty();
-		}
-		notifyUpdate(UPDATE_COMPLETE, update);
-		if (DEBUG_UPDATE_SEQUENCE) {
-			System.out.println("\tEND - " + update); //$NON-NLS-1$
-		}
-		if (end) {
-			if (DEBUG_UPDATE_SEQUENCE) {
-				System.out.println("MODEL SEQUENCE ENDS"); //$NON-NLS-1$
-			}
-			notifyUpdate(UPDATE_SEQUENCE_COMPLETE, null);
-		}
-	}
-	
-	protected void notifyUpdate(final int type, final IViewerUpdate update) {
-		if (!fUpdateListeners.isEmpty()) {
-			Object[] listeners = fUpdateListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IViewerUpdateListener listener = (IViewerUpdateListener) listeners[i];
-				SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {
-						switch (type) {
-							case UPDATE_SEQUENCE_BEGINS:
-								listener.viewerUpdatesBegin();
-								break;
-							case UPDATE_SEQUENCE_COMPLETE:
-								listener.viewerUpdatesComplete();
-								break;
-							case UPDATE_BEGINS:
-								listener.updateStarted(update);
-								break;
-							case UPDATE_COMPLETE:
-								listener.updateComplete(update);
-								break;
-						}
-					}
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-				});
-			}
-		}
-	}	
-	
-	protected void cancelSubtreeUpdates(TreePath path) {
-		synchronized (fRequestsInProgress) {
-			Iterator iterator = fRequestsInProgress.entrySet().iterator();
-			while (iterator.hasNext()) {
-				Entry entry = (Entry) iterator.next();
-				TreePath entryPath = (TreePath) entry.getKey();
-				if (entryPath.startsWith(path, null)) {
-					List requests = (List) entry.getValue();
-					Iterator reqIter = requests.iterator();
-					while (reqIter.hasNext()) {
-						((IRequest)reqIter.next()).cancel();
-					}
-				}
-			}
-			List purge = new ArrayList(); 
-			iterator = fWaitingRequests.keySet().iterator();
-			while (iterator.hasNext()) {
-				TreePath entryPath = (TreePath) iterator.next();
-				if (entryPath.startsWith(path, null)) {
-					purge.add(entryPath);
-				}
-			}
-			iterator = purge.iterator();
-			while (iterator.hasNext()) {
-				fWaitingRequests.remove(iterator.next());
-			}
-		}
-	}
-	
-	/**
-	 * Returns whether this given request should be run, or should wait for parent
-	 * update to complete.
-	 * 
-	 * @param update
-	 * @return whether to start the given request
-	 */
-	void schedule(ViewerUpdateMonitor update) {
-		synchronized (fRequestsInProgress) {
-			TreePath schedulingPath = update.getSchedulingPath();
-			List requests = (List) fWaitingRequests.get(schedulingPath);
-			if (requests == null) {
-				// no waiting requests
-				TreePath parentPath = schedulingPath;
-				while (fRequestsInProgress.get(parentPath) == null) {
-					parentPath = parentPath.getParentPath();
-					if (parentPath == null) {
-						// no running requests: start request
-						update.start();
-						return;
-					}
-				}
-				// request running on parent, add to waiting list
-				requests = new ArrayList();
-				requests.add(update);
-				fWaitingRequests.put(schedulingPath, requests);
-			} else {
-				// there are waiting requests: coalesce with existing request?
-				Iterator reqIter = requests.iterator();
-				while (reqIter.hasNext()) {
-					ViewerUpdateMonitor waiting = (ViewerUpdateMonitor) reqIter.next();
-					if (waiting.coalesce(update)) {
-						// coalesced with existing request, done
-						return;
-					}
-				}
-				// add to list of waiting requests
-				requests.add(update);
-				return;
-			}
-		}
-	}
-	
-	/**
-	 * Triggers waiting requests based on the given request that just completed.
-	 * 
-	 * TODO: should we cancel child updates if a request has been canceled?
-	 * 
-	 * @param request
-	 */
-	void trigger(ViewerUpdateMonitor request) {
-		if (fWaitingRequests.isEmpty()) {
-			return;
-		}
-		TreePath schedulingPath = request.getSchedulingPath();
-		List waiting = (List) fWaitingRequests.get(schedulingPath);
-		if (waiting == null) {
-			// no waiting, update the entry with the shortest path
-			int length = Integer.MAX_VALUE;
-			Iterator entries = fWaitingRequests.entrySet().iterator();
-			Entry candidate = null;
-			while (entries.hasNext()) {
-				Entry entry = (Entry) entries.next();
-				TreePath key = (TreePath) entry.getKey();
-				if (key.getSegmentCount() < length) {
-					candidate = entry;
-					length = key.getSegmentCount();
-				}
-			}
-			if (candidate != null) {
-				startHighestPriorityRequest((TreePath) candidate.getKey(), (List) candidate.getValue());
-			}
-		} else {
-			// start the highest priority request
-			startHighestPriorityRequest(schedulingPath, waiting);
-		}
-	}
-
-	/**
-	 * @param key
-	 * @param waiting
-	 */
-	private void startHighestPriorityRequest(TreePath key, List waiting) {
-		int priority = 4;
-		ViewerUpdateMonitor next = null;
-		Iterator requests = waiting.iterator();
-		while (requests.hasNext()) {
-			ViewerUpdateMonitor vu = (ViewerUpdateMonitor) requests.next();
-			if (vu.getPriority() < priority) {
-				next = vu;
-				priority = next.getPriority();
-			}
-		}
-		waiting.remove(next);
-		if (waiting.isEmpty()) {
-			fWaitingRequests.remove(key);
-		}
-		next.start();
-	}
-	
-	/**
-	 * Registers the given listener for model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	void addModelChangedListener(IModelChangedListener listener) {
-		fModelListeners.add(listener); 
-		Iterator proxies = fModelProxies.values().iterator();
-		while (proxies.hasNext()) {
-			IModelProxy proxy = (IModelProxy) proxies.next();
-			proxy.addModelChangedListener(listener);
-		}
-	}
-	
-	/**
-	 * Unregisters the given listener from model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	void removeModelChangedListener(IModelChangedListener listener) {
-		fModelListeners.remove(listener);
-		Iterator proxies = fModelProxies.values().iterator();
-		while (proxies.hasNext()) {
-			IModelProxy proxy = (IModelProxy) proxies.next();
-			proxy.removeModelChangedListener(listener);
-		}
-	}
-	
-	/**
-	 * Returns the element corresponding to the given tree path.
-	 * 
-	 * @param path tree path
-	 * @return model element
-	 */
-	protected Object getElement(TreePath path) {
-		if (path.getSegmentCount() > 0) {
-			return path.getLastSegment();
-		}
-		return getViewer().getInput();
-	}
-	
-	/**
-	 * Reschedule any children updates in progress for the given parent
-	 * that have a start index greater than the given index. An element
-	 * has been removed at this index, invalidating updates in progress.
-	 * 
-	 * @param parentPath view tree path to parent element
-	 * @param modelIndex index at which an element was removed
-	 */
-	protected void rescheduleUpdates(TreePath parentPath, int modelIndex) {
-		synchronized (fRequestsInProgress) {
-			List requests = (List)fRequestsInProgress.get(parentPath);
-			List reCreate = null;
-			if (requests != null) {
-				Iterator iterator = requests.iterator();
-				while (iterator.hasNext()) {
-					IViewerUpdate update = (IViewerUpdate) iterator.next();
-					if (update instanceof IChildrenUpdate) {
-						IChildrenUpdate childrenUpdate = (IChildrenUpdate) update;
-						if (childrenUpdate.getOffset() > modelIndex) {
-							childrenUpdate.cancel();
-							if (reCreate == null) {
-								reCreate  = new ArrayList();
-							}
-							reCreate.add(childrenUpdate);
-							if (DEBUG_CONTENT_PROVIDER) {
-								System.out.println("canceled update in progress handling REMOVE: " + childrenUpdate); //$NON-NLS-1$
-							}
-						}
-					}
-				}
-			}
-			requests = (List)fWaitingRequests.get(parentPath);
-			if (requests != null) {
-				Iterator iterator = requests.iterator();
-				while (iterator.hasNext()) {
-					IViewerUpdate update = (IViewerUpdate) iterator.next();
-					if (update instanceof IChildrenUpdate) {
-						IChildrenUpdate childrenUpdate = (IChildrenUpdate) update;
-						if (childrenUpdate.getOffset() > modelIndex) {
-							((ChildrenUpdate)childrenUpdate).setOffset(childrenUpdate.getOffset() - 1);
-							if (DEBUG_CONTENT_PROVIDER) {
-								System.out.println("modified waiting update handling REMOVE: " + childrenUpdate); //$NON-NLS-1$
-							}
-						}
-					}
-				}
-			}
-			// re-schedule canceled updates at new position.
-			// have to do this last else the requests would be waiting and
-			// get modified.
-			if (reCreate != null) {
-				Iterator iterator = reCreate.iterator();
-				while (iterator.hasNext()) {
-					IChildrenUpdate childrenUpdate = (IChildrenUpdate) iterator.next();
-					int start = childrenUpdate.getOffset() - 1;
-					int end = start + childrenUpdate.getLength();
-					for (int i = start; i < end; i++) {
-						((TreeModelContentProvider)this).doUpdateElement(parentPath, i);
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeCursor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeCursor.java
deleted file mode 100644
index c9670cc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeCursor.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.debug.internal.ui.viewers.model;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.TypedListener;
-
-/**
- * A TreeCursor provides a way for the user to navigate around a Tree with columns
- * using the keyboard.  It also provides a mechanism for selecting an
- * individual cell in a tree.
- * 
- * <p> Here is an example of using a TreeCursor to navigate to a cell and then edit it.
- * 
- * <code><pre>
- *  public static void main(String[] args) {
- *		Display display = new Display();
- *		Shell shell = new Shell(display);
- *		shell.setLayout(new GridLayout());
- *	
- *		// create a a tree with 3 columns and fill with data
- *		final Tree tree = new Tree(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
- *		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
- *		TreeColumn column1 = new TreeColumn(tree, SWT.NONE);
- *		TreeColumn column2 = new TreeColumn(tree, SWT.NONE);
- *		TreeColumn column3 = new TreeColumn(tree, SWT.NONE);
- *		for (int i = 0; i &lt; 100; i++) {
- *			TreeItem item = new TreeItem(tree, SWT.NONE);
- *			item.setText(new String[] { "cell "+i+" 0", "cell "+i+" 1", "cell "+i+" 2"});
- *		}
- *		column1.pack();
- *		column2.pack();
- *		column3.pack();
- *	
- *		// create a TreeCursor to navigate around the tree
- *		final TreeCursor cursor = new TreeCursor(tree, SWT.NONE);
- *		// create an editor to edit the cell when the user hits "ENTER" 
- *		// while over a cell in the tree
- *		final ControlEditor editor = new ControlEditor(cursor);
- *		editor.grabHorizontal = true;
- *		editor.grabVertical = true;
- *	
- *		cursor.addSelectionListener(new SelectionAdapter() {
- *			// when the TreeEditor is over a cell, select the corresponding row in 
- *			// the tree
- *			public void widgetSelected(SelectionEvent e) {
- *				tree.setSelection(new TreeItem[] {cursor.getRow()});
- *			}
- *			// when the user hits "ENTER" in the TreeCursor, 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);
- *				TreeItem row = cursor.getRow();
- *				int column = cursor.getColumn();
- *				text.setText(row.getText(column));
- *				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) {
- *							TreeItem row = cursor.getRow();
- *							int column = cursor.getColumn();
- *							row.setText(column, 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 TreeCursor when the user hits the "MOD1" or "MOD2" key.
- *		// This alows the user to select multiple items in the tree.
- *		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 TreeCursor when the user releases the "MOD2" or "MOD1" key.
- *		// This signals the end of the multiple selection task.
- *		tree.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;
- *			
- *				TreeItem[] selection = tree.getSelection();
- *				TreeItem row = (selection.length == 0) ? tree.getItem(tree.indexOf(tree.getTopItem())) : selection[0];
- *				tree.showItem(row);
- *				cursor.setSelection(row, 0);
- *				cursor.setVisible(true);
- *				cursor.setFocus();
- *			}
- *		});
- *	
- *		shell.open();
- *		while (!shell.isDisposed()) {
- *			if (!display.readAndDispatch())
- *				display.sleep();
- *		}
- *		display.dispose();
- *	}
- * </pre></code>
- * 
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>BORDER</dd>
- * <dt><b>Events:</b></dt>
- * <dd>Selection, DefaultSelection</dd>
- * </dl>
- * 
- * @since 3.3
- * 
- */
-public class TreeCursor extends Canvas {
-	Tree tree;
-	TreeItem row = null;
-	TreeColumn column = null;
-	Listener treeListener, resizeListener, disposeItemListener, disposeColumnListener;
-	
-	// By default, invert the list selection colors
-	static final int BACKGROUND = SWT.COLOR_LIST_SELECTION_TEXT;
-	static final int FOREGROUND = SWT.COLOR_LIST_SELECTION;
-
-/**
- * Constructs a new instance of this class given its parent
- * table 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 Tree control 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>
- *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- *
- * @see SWT#BORDER
- * @see Widget#checkSubclass()
- * @see Widget#getStyle()
- */
-public TreeCursor(Tree parent, int style) {
-	super(parent, style);
-	tree = parent;
-	setBackground(null);
-	setForeground(null);
-	
-	Listener listener = new Listener() {
-		public void handleEvent(Event event) {
-			switch (event.type) {
-				case SWT.Dispose :
-					dispose(event);
-					break;
-				case SWT.FocusIn :
-				case SWT.FocusOut :
-					redraw();
-					break;
-				case SWT.KeyDown :
-					keyDown(event);
-					break;
-				case SWT.Paint :
-					paint(event);
-					break;
-				case SWT.Traverse :
-					traverse(event);
-					break;
-			}
-		}
-	};
-	int[] events = new int[] {SWT.Dispose, SWT.FocusIn, SWT.FocusOut, SWT.KeyDown, SWT.Paint, SWT.Traverse};
-	for (int i = 0; i < events.length; i++) {
-		addListener(events[i], listener);
-	}
-
-	treeListener = new Listener() {
-		public void handleEvent(Event event) {
-			switch (event.type) {
-				case SWT.MouseDown :
-					tableMouseDown(event);
-					break;
-				case SWT.FocusIn :
-					tableFocusIn(event);
-					break;
-			}
-		}
-	};
-	tree.addListener(SWT.FocusIn, treeListener);
-	tree.addListener(SWT.MouseDown, treeListener);
-
-	disposeItemListener = new Listener() {
-		public void handleEvent(Event event) {
-			row = null;
-			column = null;
-			_resize();
-		}
-	};
-	disposeColumnListener = new Listener() {
-		public void handleEvent(Event event) {
-			row = null;
-			column = null;
-			_resize();
-		}
-	};
-	resizeListener = new Listener() {
-		public void handleEvent(Event event) {
-			_resize();
-		}
-	};
-	ScrollBar hBar = tree.getHorizontalBar();
-	if (hBar != null) {
-		hBar.addListener(SWT.Selection, resizeListener);
-	}
-	ScrollBar vBar = tree.getVerticalBar();
-	if (vBar != null) {
-		vBar.addListener(SWT.Selection, resizeListener);
-	}
-}
-
-/**
- * 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>
- * When <code>widgetSelected</code> is called, the item field of the event object is valid.
- * If the receiver has <code>SWT.CHECK</code> style set and the check selection changes,
- * the event object detail field contains the value <code>SWT.CHECK</code>.
- * <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 SelectionEvent
- * @see #removeSelectionListener(SelectionListener)
- * 
- */
-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);
-}
-
-void dispose(Event event) {
-	tree.removeListener(SWT.FocusIn, treeListener);
-	tree.removeListener(SWT.MouseDown, treeListener);
-	if (column != null) {
-		column.removeListener(SWT.Dispose, disposeColumnListener);
-		column.removeListener(SWT.Move, resizeListener);
-		column.removeListener(SWT.Resize, resizeListener);
-		column = null;
-	}
-	if (row != null) {
-		row.removeListener(SWT.Dispose, disposeItemListener);
-		row = null;
-	}
-	ScrollBar hBar = tree.getHorizontalBar();
-	if (hBar != null) {
-		hBar.removeListener(SWT.Selection, resizeListener);
-	}
-	ScrollBar vBar = tree.getVerticalBar();
-	if (vBar != null) {
-		vBar.removeListener(SWT.Selection, resizeListener);
-	}
-}
-
-void keyDown(Event event) {
-	if (row == null) return;
-	switch (event.character) {
-		case SWT.CR :
-			notifyListeners(SWT.DefaultSelection, new Event());
-			return;
-	}
-	int rowIndex = tree.indexOf(row);
-	int columnIndex = column == null ? 0 : tree.indexOf(column);
-	switch (event.keyCode) {
-		case SWT.ARROW_UP :
-			setRowColumn(Math.max(0, rowIndex - 1), columnIndex, true);
-			break;
-		case SWT.ARROW_DOWN :
-			setRowColumn(Math.min(rowIndex + 1, tree.getItemCount() - 1), columnIndex, true);
-			break;
-        case SWT.ARROW_LEFT :
-        case SWT.ARROW_RIGHT :
-        	{	
-        		int columnCount = tree.getColumnCount();
-        		if (columnCount == 0) break;
-        		int[] order = tree.getColumnOrder();
-        		int index = 0;
-        		while (index < order.length) {
-        			if (order[index] == columnIndex) break;
-        			index++;
-				}
-				if (index == order.length) index = 0;
-		        int leadKey = (getStyle() & SWT.RIGHT_TO_LEFT) != 0 ? SWT.ARROW_RIGHT : SWT.ARROW_LEFT;
-		        if (event.keyCode == leadKey) {
-		           setRowColumn(rowIndex, order[Math.max(0, index - 1)], true);
-		        } else {
-		           setRowColumn(rowIndex, order[Math.min(columnCount - 1, index + 1)], true);
-		        }
-		        break;
-        	}
-		case SWT.HOME :
-			setRowColumn(0, columnIndex, true);
-			break;
-		case SWT.END :
-			{
-				int i = tree.getItemCount() - 1;
-				setRowColumn(i, columnIndex, true);
-				break;
-			}
-		case SWT.PAGE_UP :
-			{
-				int index = tree.indexOf(tree.getTopItem());
-				if (index == rowIndex) {
-					Rectangle rect = tree.getClientArea();
-					TreeItem item = tree.getItem(index);
-					Rectangle itemRect = item.getBounds(0);
-					rect.height -= itemRect.y;
-					int height = tree.getItemHeight();
-					int page = Math.max(1, rect.height / height);
-					index = Math.max(0, index - page + 1);
-				}
-				setRowColumn(index, columnIndex, true);
-				break;
-			}
-		case SWT.PAGE_DOWN :
-			{
-				int index = tree.indexOf(tree.getTopItem());
-				Rectangle rect = tree.getClientArea();
-				TreeItem item = tree.getItem(index);
-				Rectangle itemRect = item.getBounds(0);
-				rect.height -= itemRect.y;
-				int height = tree.getItemHeight();
-				int page = Math.max(1, rect.height / height);
-				int end = tree.getItemCount() - 1;
-				index = Math.min(end, index + page - 1);
-				if (index == rowIndex) {
-					index = Math.min(end, index + page - 1);
-				}
-				setRowColumn(index, columnIndex, true);
-				break;
-			}
-	}
-}
-
-void paint(Event event) {
-	if (row == null) return;
-	int columnIndex = column == null ? 0 : tree.indexOf(column);
-	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 = row.getImage(columnIndex);
-	if (image != null) {
-		Rectangle imageSize = image.getBounds();
-		int imageY = (size.y - imageSize.height) / 2;
-		gc.drawImage(image, x, imageY);
-		x += imageSize.width;
-	}
-	String text = row.getText(columnIndex);
-	if (text != "") { //$NON-NLS-1$
-		Rectangle bounds = row.getBounds(columnIndex);
-		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 (tree.getColumnCount() == 0 || columnIndex == 0) {
-				x += 2; 
-			} else {
-				int alignmnent = column.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 (tree.getColumnCount() == 0) {
-				x += 5; 
-			} else {
-				int alignmnent = column.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);
-	}
-}
-
-void tableFocusIn(Event event) {
-	if (isDisposed())
-		return;
-	if (isVisible())
-		setFocus();
-}
-
-void tableMouseDown(Event event) {
-	if (isDisposed() || !isVisible()) return;
-	Point pt = new Point(event.x, event.y);
-	int lineWidth = tree.getLinesVisible() ? tree.getGridLineWidth() : 0;
-	TreeItem item = tree.getItem(pt);
-	if ((tree.getStyle() & SWT.FULL_SELECTION) != 0) {
-		if (item == null) return;
-	} else {
-		int start = item != null ? tree.indexOf(item) : tree.indexOf(tree.getTopItem());
-		int end = tree.getItemCount();
-		Rectangle clientRect = tree.getClientArea();
-		for (int i = start; i < end; i++) {
-			TreeItem nextItem = tree.getItem(i);
-			Rectangle rect = nextItem.getBounds(0);
-			if (pt.y >= rect.y && pt.y < rect.y + rect.height + lineWidth) {
-				item = nextItem;
-				break;
-			}
-			if (rect.y > clientRect.y + clientRect.height) 	return;
-		}
-		if (item == null) return;
-	}
-	TreeColumn newColumn = null;
-	int columnCount = tree.getColumnCount();
-	if (columnCount > 0) {
-		for (int i = 0; i < columnCount; i++) {
-			Rectangle rect = item.getBounds(i);
-			rect.width += lineWidth;
-			rect.height += lineWidth;
-			if (rect.contains(pt)) {
-				newColumn = tree.getColumn(i);
-				break;
-			}
-		}
-		if (newColumn == null) {
-			newColumn = tree.getColumn(0);
-		}
-	}
-	setRowColumn(item, newColumn, true);
-	setFocus();
-	return;
-}
-
-void traverse(Event event) {
-	switch (event.detail) {
-		case SWT.TRAVERSE_ARROW_NEXT :
-		case SWT.TRAVERSE_ARROW_PREVIOUS :
-		case SWT.TRAVERSE_RETURN :
-			event.doit = false;
-			return;
-	}
-	event.doit = true;
-}
-void setRowColumn(int row, int column, boolean notify) {
-	TreeItem item = row == -1 ? null : tree.getItem(row);
-	TreeColumn col = column == -1 || tree.getColumnCount() == 0 ? null : tree.getColumn(column);
-	setRowColumn(item, col, notify);
-}
-void setRowColumn(TreeItem row, TreeColumn column, boolean notify) {
-	if (this.row == row && this.column == column) {
-		return;
-	}
-	if (this.row != null && this.row != row) {
-		this.row.removeListener(SWT.Dispose, disposeItemListener);
-		this.row = null;
-	}
-	if (this.column != null && this.column != column) {
-		this.column.removeListener(SWT.Dispose, disposeColumnListener);
-		this.column.removeListener(SWT.Move, resizeListener);
-		this.column.removeListener(SWT.Resize, resizeListener);
-		this.column = null;
-	}
-	if (row != null) {
-		if (this.row != row) {
-			this.row = row;
-			row.addListener(SWT.Dispose, disposeItemListener);
-			tree.showItem(row);
-		}
-		if (this.column != column && column != null) {
-			this.column = column;
-			column.addListener(SWT.Dispose, disposeColumnListener);
-			column.addListener(SWT.Move, resizeListener);
-			column.addListener(SWT.Resize, resizeListener);
-			tree.showColumn(column);
-		}
-		int columnIndex = column == null ? 0 : tree.indexOf(column);
-		setBounds(row.getBounds(columnIndex));
-		redraw();
-		if (notify) {
-			notifyListeners(SWT.Selection, new Event());
-		}
-	}
-}
-
-public void setVisible(boolean visible) {
-	checkWidget();
-	if (visible) _resize();
-	super.setVisible(visible);
-}
-
-/**
- * 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(SelectionListener)
- * 
- * @since 3.0
- */
-public void removeSelectionListener(SelectionListener listener) {
-	checkWidget();
-	if (listener == null) {
-		SWT.error(SWT.ERROR_NULL_ARGUMENT);
-	}
-	removeListener(SWT.Selection, listener);
-	removeListener(SWT.DefaultSelection, listener);	
-}
-
-void _resize() {
-	if (row == null) {
-		setBounds(-200, -200, 0, 0);
-	} else {
-		int columnIndex = column == null ? 0 : tree.indexOf(column);
-		setBounds(row.getBounds(columnIndex));
-	}
-}
-/**
- * Returns the column over which the TreeCursor is positioned.
- *
- * @return the column for the current 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>
- * </ul>
- */
-public int getColumn() {
-	checkWidget();
-	return column == null ? 0 : tree.indexOf(column);
-}
-/**
- * Returns the row over which the TreeCursor is positioned.
- *
- * @return the item for the current 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>
- * </ul>
- */
-public TreeItem getRow() {
-	checkWidget();
-	return row;
-}
-public void setBackground (Color color) {
-	if (color == null) color = getDisplay().getSystemColor(BACKGROUND);
-	super.setBackground(color);
-	redraw();
-}
-public void setForeground (Color color) {
-	if (color == null) color = getDisplay().getSystemColor(FOREGROUND);
-	super.setForeground(color);
-	redraw();
-}
-/**
- * Positions the TreeCursor over the cell at the given row and column in the parent table. 
- *
- * @param row the index of the row for the cell to select
- * @param column the index of column for the cell 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 setSelection(int row, int column) {
-	checkWidget();
-	int columnCount = tree.getColumnCount();
-	int maxColumnIndex =  columnCount == 0 ? 0 : columnCount - 1;
-	if (row < 0
-	    || row >= tree.getItemCount()
-		|| column < 0
-		|| column > maxColumnIndex)
-		SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-	setRowColumn(row, column, false);
-}
-/**
- * Positions the TreeCursor over the cell at the given row and column in the parent table. 
- *
- * @param row the TreeItem of the row for the cell to select
- * @param column the index of column for the cell 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 setSelection(TreeItem row, int column) {
-	checkWidget();
-	int columnCount = tree.getColumnCount();
-	int maxColumnIndex =  columnCount == 0 ? 0 : columnCount - 1;
-	if (row == null
-		|| row.isDisposed()
-		|| column < 0
-		|| column > maxColumnIndex)
-		SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-	setRowColumn(tree.indexOf(row), column, false);
-}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
deleted file mode 100644
index b74f602..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ILazyTreePathContentProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Content provider for a virtual tree.
- * 
- * @since 3.3
- */
-public class TreeModelContentProvider extends ModelContentProvider implements ILazyTreePathContentProvider {
-	
-	protected static final String[] STATE_PROPERTIES = new String[]{IBasicPropertyConstants.P_TEXT, IBasicPropertyConstants.P_IMAGE};
-	
-	/**
-	 * Re-filters any filtered children of the given parent element.
-	 * 
-	 * @param path parent element
-	 */
-	protected void refilterChildren(TreePath path) {
-		if (getViewer() != null) {
-			int[] filteredChildren = getFilteredChildren(path);
-			if (filteredChildren != null) {
-				for (int i = 0; i < filteredChildren.length; i++) {
-					doUpdateElement(path, filteredChildren[i]);
-				}
-			}
-		}
-	}
-	
-	protected synchronized void doUpdateChildCount(TreePath path) {
-		Object element = getElement(path);
-		IElementContentProvider contentAdapter = getContentAdapter(element);
-		if (contentAdapter != null) {
-			ChildrenCountUpdate request = new ChildrenCountUpdate(this, path, element, contentAdapter, getPresentationContext());
-			schedule(request);
-		}
-	}	
-	
-	protected synchronized void doUpdateElement(TreePath parentPath, int modelIndex) {
-		Object parent = getElement(parentPath);
-		IElementContentProvider contentAdapter = getContentAdapter(parent);
-		if (contentAdapter != null) {
-			ChildrenUpdate request = new ChildrenUpdate(this, parentPath, parent, modelIndex, contentAdapter, getPresentationContext());
-			schedule(request);
-		}			
-	}	
-	
-	protected synchronized void doUpdateHasChildren(TreePath path) {
-		Object element = getElement(path);
-		IElementContentProvider contentAdapter = getContentAdapter(element);
-		if (contentAdapter != null) {
-			HasChildrenUpdate request = new HasChildrenUpdate(this, path, element, contentAdapter, getPresentationContext());
-			schedule(request);
-		}
-	}		
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#getPresentationContext()
-	 */
-	protected IPresentationContext getPresentationContext() {
-		return ((TreeModelViewer)getViewer()).getPresentationContext();
-	}
-	
-	/**
-	 * Returns the tree viewer this content provider is working for
-	 * 
-	 * @return tree viewer
-	 */
-	protected TreeViewer getTreeViewer() {
-		return (TreeViewer)getViewer();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleAdd(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleAdd(IModelDelta delta) {
-		if (DEBUG_CONTENT_PROVIDER) {
-			System.out.println("handleAdd(" + delta.getElement() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		doUpdateChildCount(getViewerTreePath(delta.getParentDelta()));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleContent(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleContent(IModelDelta delta) {
-		if (delta.getChildCount() == 0) {
-			// if the delta is for the root, ensure the root still matches viewer input
-			if (!delta.getElement().equals(getViewer().getInput())) {
-				return;
-			}
-		}
-		TreePath treePath = getViewerTreePath(delta);
-		cancelSubtreeUpdates(treePath);
-		getTreeViewer().refresh(getElement(treePath));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#handleCollapse(org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta)
-	 */
-	protected void handleCollapse(IModelDelta delta) {
-		TreePath elementPath = getViewerTreePath(delta);
-		getTreeViewer().setExpandedState(elementPath, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleExpand(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleExpand(IModelDelta delta) {
-		// expand each parent, then this node
-		IModelDelta parentDelta = delta.getParentDelta();
-		if (parentDelta != null) {
-			handleExpand(parentDelta);
-			expand(delta);
-		}
-	}
-	
-	protected void expand(IModelDelta delta) {
-		int childCount = delta.getChildCount();
-		int modelIndex = delta.getIndex();
-		TreeViewer treeViewer = getTreeViewer();
-		TreePath elementPath = getViewerTreePath(delta);
-		if (modelIndex >= 0) {
-			int viewIndex = modelToViewIndex(getViewerTreePath(delta.getParentDelta()), modelIndex);
-			if (viewIndex >= 0) {
-				if (DEBUG_CONTENT_PROVIDER) {
-					System.out.println("[expand] replace(" + delta.getParentDelta().getElement() + ", (model) " + modelIndex + " (view) " + viewIndex + ", " + delta.getElement()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				}
-				TreePath parentPath = elementPath.getParentPath();
-				if (parentPath == null) {
-					parentPath = TreePath.EMPTY;
-				}
-				treeViewer.replace(parentPath, viewIndex, delta.getElement());
-			}
-		}
-		if (childCount > 0) {
-			int viewCount = modelToViewChildCount(elementPath, childCount);
-			if (DEBUG_CONTENT_PROVIDER) {
-				System.out.println("[expand] setChildCount(" + delta.getElement() + ", (model) " + childCount + " (view) " + viewCount); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			treeViewer.setChildCount(elementPath, viewCount);
-			if (!treeViewer.getExpandedState(elementPath)) {
-				treeViewer.expandToLevel(elementPath, 1);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleInsert(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleInsert(IModelDelta delta) {
-		// TODO: filters
-		getTreeViewer().insert(getViewerTreePath(delta.getParentDelta()), delta.getElement(), delta.getIndex());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleRemove(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleRemove(IModelDelta delta) {
-		if (DEBUG_CONTENT_PROVIDER) {
-			System.out.println("handleRemove(" + delta.getElement() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		IModelDelta parentDelta = delta.getParentDelta();
-		InternalTreeModelViewer treeViewer = (InternalTreeModelViewer)getViewer();
-		TreePath parentPath = getViewerTreePath(parentDelta);
-		Widget parentItem = treeViewer.findItem(parentPath);
-		if (parentItem == null) {
-			// if we can't see the parent, nothing to worry about (but clear the filters, if any)
-			clearFilters(parentPath);
-			return;
-		}
-		Object element = delta.getElement();
-		if (removeElementFromFilters(parentPath, element)) {
-			// element was filtered - done
-			return;
-		}
-		int viewIndex = -1;
-		int modelIndex = delta.getIndex();
-		int unmappedIndex = -1;
-		int itemCount = -1;
-		if (modelIndex < 0) {
-			// index not provided by delta
-			Item[] children = treeViewer.getChildren(parentItem);
-			itemCount = children.length;
-			for (int i = 0; i < children.length; i++) {
-				Item item = children[i];
-				Object data = item.getData();
-				if (element.equals(data)) {
-					viewIndex = i;
-					modelIndex = viewToModelIndex(parentPath, i);
-					break;
-				} else if (data == null) {
-					unmappedIndex = i;
-				}
-			}
-		} else {
-			viewIndex = modelToViewIndex(parentPath, modelIndex);
-		}
-		if (modelIndex >= 0) {
-			// found the element
-			if (DEBUG_CONTENT_PROVIDER) {
-				System.out.println(" - (found) remove(" + parentPath.getLastSegment() + ", viewIndex: " + viewIndex + " modelIndex: " + modelIndex); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			rescheduleUpdates(parentPath, modelIndex);
-			getTreeViewer().remove(parentPath, viewIndex);
-			removeElementFromFilters(parentPath, modelIndex);
-			return;
-		}
-		if (unmappedIndex >= 0) {
-			// did not find the element, but found an unmapped item.
-			// remove the unmapped item in it's place and update filters
-			if (DEBUG_CONTENT_PROVIDER) {
-				System.out.println(" - (not found) remove(" + parentPath.getLastSegment() + ", viewIndex: " + viewIndex + " modelIndex: " + modelIndex); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			modelIndex = viewToModelIndex(parentPath, unmappedIndex);
-			rescheduleUpdates(parentPath, modelIndex);
-			getTreeViewer().remove(parentPath, unmappedIndex);
-			removeElementFromFilters(parentPath, modelIndex);
-			return;
-		}
-		int modelCount = parentDelta.getChildCount();
-		if (itemCount >= 0 && modelCount >= 0) {
-			if (modelToViewChildCount(parentPath, modelCount) == itemCount) {
-				// item count matches the parent's child count, don't do anything
-				return;
-			}
-		}
-		// failing that, refresh the parent to properly update for non-visible/unmapped children
-		// and update filtered indexes
-		if (DEBUG_CONTENT_PROVIDER) {
-			System.out.println(" - (not found) remove/refresh(" + delta.getElement()); //$NON-NLS-1$
-		}
-		getTreeViewer().remove(getViewerTreePath(delta));
-		clearFilters(parentPath);
-		getTreeViewer().refresh(parentDelta.getElement());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleReplace(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleReplace(IModelDelta delta) {
-		TreePath parentPath = getViewerTreePath(delta.getParentDelta());
-		getTreeViewer().replace(parentPath, delta.getIndex(), delta.getElement());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleSelect(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleSelect(IModelDelta delta) {
-		int modelIndex = delta.getIndex();
-		TreeViewer treeViewer = getTreeViewer();
-		if (modelIndex >= 0) {
-			IModelDelta parentDelta = delta.getParentDelta();
-			TreePath parentPath = getViewerTreePath(parentDelta);
-			int viewIndex = modelToViewIndex(parentPath, modelIndex);
-			if (viewIndex >= 0) {
-				// when viewIndex < 0, the element has been filtered - so we should not try to replace
-				int modelCount = parentDelta.getChildCount();
-				if (modelCount > 0) {
-					int viewCount = modelToViewChildCount(parentPath, modelCount);
-					if (DEBUG_CONTENT_PROVIDER) {
-						System.out.println("[select] setChildCount(" + parentDelta.getElement() + ", (model) " + parentDelta.getChildCount() + " (view) " + viewCount ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-					treeViewer.setChildCount(parentPath, viewCount);
-				}
-				if (DEBUG_CONTENT_PROVIDER) {
-					System.out.println("[select] replace(" + parentDelta.getElement() + ", (model) " + modelIndex + " (view) " + viewIndex + ", " + delta.getElement()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				}
-				treeViewer.replace(parentPath, viewIndex, delta.getElement());
-			}
-		}
-		treeViewer.setSelection(new TreeSelection(getViewerTreePath(delta)));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#handleState(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	protected void handleState(IModelDelta delta) {
-		getTreeViewer().update(delta.getElement(), STATE_PROPERTIES);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#handleReveal(org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta)
-	 */
-	protected void handleReveal(IModelDelta delta) {
-		IModelDelta parentDelta = delta.getParentDelta();
-		if (parentDelta != null) {
-			handleExpand(parentDelta);
-			reveal(delta);
-		}
-	}
-	
-	protected void reveal(IModelDelta delta) {
-		int modelIndex = delta.getIndex();
-		InternalTreeModelViewer treeViewer = (InternalTreeModelViewer) getTreeViewer();
-		TreePath elementPath = getViewerTreePath(delta);
-		if (modelIndex >= 0) {
-			int viewIndex = modelToViewIndex(getViewerTreePath(delta.getParentDelta()), modelIndex);
-			if (DEBUG_CONTENT_PROVIDER) {
-				System.out.println("[reveal] replace(" + delta.getParentDelta().getElement() + ", (model) " + modelIndex + " (view) " + viewIndex + ", " + delta.getElement()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			}
-			TreePath parentPath = elementPath.getParentPath();
-			if (parentPath == null) {
-				parentPath = TreePath.EMPTY;
-			}
-			treeViewer.replace(parentPath, viewIndex, delta.getElement());
-			Widget item = treeViewer.findItem(elementPath);
-			if (item instanceof TreeItem) {
-				treeViewer.getTree().setTopItem((TreeItem) item);
-			}
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#buildViewerState(org.eclipse.debug.internal.ui.viewers.provisional.ModelDelta)
-	 */
-	protected void buildViewerState(ModelDelta delta) {
-		Tree tree = (Tree) getViewer().getControl();
-		TreeItem[] selection = tree.getSelection();
-		Set set = new HashSet();
-		for (int i = 0; i < selection.length; i++) {
-			set.add(selection[i]);
-		}
-		TreeItem[] items = tree.getItems();
-		for (int i = 0; i < items.length; i++) {
-			buildViewerState(EMPTY_TREE_PATH, delta, items[i], set, i);
-		}
-		// add memento for top item if it is mapped to an element
-		TreeItem topItem = tree.getTopItem();
-		if (topItem != null && topItem.getData() != null) {
-			TreePath path = ((InternalTreeModelViewer)getTreeViewer()).getTreePathFromItem(topItem);
-			ModelDelta parentDelta = delta;
-			for (int i = 0; i < path.getSegmentCount(); i++) {
-				Object element = path.getSegment(i);
-				ModelDelta childDelta = parentDelta.getChildDelta(element);
-				if (childDelta == null) {
-					parentDelta = parentDelta.addNode(element, IModelDelta.NO_CHANGE);
-				} else {
-					parentDelta = childDelta;
-				}
-			}
-			parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.REVEAL);
-		}
-	}
-
-	/**
-	 * @param delta parent delta to build on
-	 * @param item item
-	 * @param set set of selected tree items
-	 * @param index the item's index relative to it's parent
-	 */
-	private void buildViewerState(TreePath parentPath, ModelDelta delta, TreeItem item, Set set, int index) {
-		Object element = item.getData();
-		if (element != null) {
-			boolean expanded = item.getExpanded();
-			boolean selected = set.contains(item);
-			if (expanded || selected) {
-				int flags = IModelDelta.NO_CHANGE;
-				if (expanded) {
-					flags = flags | IModelDelta.EXPAND;
-				}
-				if (selected) {
-					flags = flags | IModelDelta.SELECT;
-				}
-				int modelIndex = viewToModelIndex(parentPath, index);
-				TreePath elementPath = parentPath.createChildPath(element);
-				int numChildren = viewToModelCount(elementPath, item.getItemCount());
-				ModelDelta childDelta = delta.addNode(element, modelIndex, flags, numChildren);
-				if (expanded) {
-					TreeItem[] items = item.getItems();
-					for (int i = 0; i < items.length; i++) {
-						buildViewerState(elementPath, childDelta, items[i], set, i);
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.ModelContentProvider#doInitialRestore()
-	 */
-	protected void doInitialRestore() {
-		Tree tree = (Tree) getViewer().getControl();
-		TreeItem[] items = tree.getItems();
-		for (int i = 0; i < items.length; i++) {
-			TreeItem item = items[i];
-			Object data = item.getData();
-			if (data != null) {
-				doRestore(new TreePath(new Object[]{data}));
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILazyTreePathContentProvider#getParents(java.lang.Object)
-	 */
-	public TreePath[] getParents(Object element) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILazyTreePathContentProvider#updateChildCount(org.eclipse.jface.viewers.TreePath, int)
-	 */
-	public synchronized void updateChildCount(TreePath treePath, int currentChildCount) {
-		if (DEBUG_CONTENT_PROVIDER) {
-			System.out.println("updateChildCount(" + getElement(treePath) + ", " + currentChildCount + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		refilterChildren(treePath);
-		//re-filter children when asked to update the child count for an element (i.e.
-		// when refreshing, see if filtered children are still filtered)
-		doUpdateChildCount(treePath);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILazyTreePathContentProvider#updateElement(org.eclipse.jface.viewers.TreePath, int)
-	 */
-	public synchronized void updateElement(TreePath parentPath, int viewIndex) {
-		int modelIndex = viewToModelIndex(parentPath, viewIndex);
-		if (DEBUG_CONTENT_PROVIDER) {
-			System.out.println("updateElement("+ getElement(parentPath) + ", " + viewIndex + ") > modelIndex = " + modelIndex); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		doUpdateElement(parentPath, modelIndex);		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILazyTreePathContentProvider#updateHasChildren(org.eclipse.jface.viewers.TreePath)
-	 */
-	public synchronized void updateHasChildren(TreePath path) {
-		if (DEBUG_CONTENT_PROVIDER) {
-			System.out.println("updateHasChildren(" + getElement(path)); //$NON-NLS-1$
-		}
-		doUpdateHasChildren(path);
-	}
-
-	/**
-	 * @param delta
-	 */
-	void doRestore(final ModelDelta delta) {
-		if (delta.getFlags() != IModelDelta.NO_CHANGE) {
-			UIJob job = new UIJob("restore delta") { //$NON-NLS-1$
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					TreePath treePath = getViewerTreePath(delta);
-					InternalTreeModelViewer viewer = (InternalTreeModelViewer)getViewer();
-					if ((delta.getFlags() & IModelDelta.EXPAND) != 0) {
-						viewer.expandToLevel(treePath, 1);
-					}
-					if ((delta.getFlags() & IModelDelta.SELECT) != 0) {
-						viewer.setSelection(new TreeSelection(treePath));
-					}
-					int flag = IModelDelta.NO_CHANGE;
-					if ((delta.getFlags() & IModelDelta.REVEAL) != 0) {
-						flag = IModelDelta.REVEAL;
-					}
-					delta.setFlags(flag);
-					IModelDelta topItemDelta = checkIfRestoreComplete();
-					// force child deltas to update, so viewer is populated
-					IModelDelta[] childDeltas = delta.getChildDeltas();
-					for (int i = 0; i < childDeltas.length; i++) {
-						IModelDelta childDelta = childDeltas[i];
-						int modelIndex = childDelta.getIndex();
-						if (modelIndex >= 0) {
-							doUpdateElement(treePath, modelIndex);
-						}
-					}
-					if (topItemDelta != null) {
-						TreePath itemPath = getViewerTreePath(topItemDelta);
-						Widget topItem = viewer.findItem(itemPath);
-						if (topItem instanceof TreeItem) {
-							viewer.getTree().setTopItem((TreeItem) topItem);
-						}
-					}
-					return Status.OK_STATUS;
-				}
-			};
-			job.setSystem(true);
-			job.schedule();
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java
deleted file mode 100644
index a919420..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelLabelProvider.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.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.PlatformObject;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementAdapterFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerRow;
-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.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * @since 3.3
- */
-public class TreeModelLabelProvider extends ColumnLabelProvider {
-	
-	private InternalTreeModelViewer fViewer;
-	private List fComplete;
-	
-	/**
-	 * Cache of images used for elements in this label provider. Label updates
-	 * use the method <code>getImage(...)</code> to cache images for
-	 * image descriptors. The images are disposed with this label provider.
-	 */
-	private Map fImageCache = new HashMap();
-
-	/**
-	 * Cache of the fonts used for elements in this label provider. Label updates
-	 * use the method <code>getFont(...)</code> to cache fonts for
-	 * FontData objects. The fonts are disposed with this label provider.
-	 */
-	private Map fFontCache = new HashMap();
-
-	/**
-	 * Cache of the colors used for elements in this label provider. Label updates
-	 * use the method <code>getColor(...)</code> to cache colors for
-	 * RGB values. The colors are disposed with this label provider.
-	 */
-	private Map fColorCache = new HashMap();
-	
-	/**
-	 * Label listeners
-	 */
-	private ListenerList fLabelListeners = new ListenerList();
-	
-	/**
-	 * List of updates in progress
-	 */
-	private List fUpdatesInProgress = new ArrayList();
-	
-	/**
-	 * Constructs a new label provider on the given display
-	 */
-	public TreeModelLabelProvider(InternalTreeModelViewer viewer) {
-		fViewer = viewer;
-	}
-	
-	/**
-	 * Returns an image for the given image descriptor or <code>null</code>. Adds the image
-	 * to a cache of images if it does not already exist.
-	 * 
-	 * @param descriptor image descriptor or <code>null</code>
-	 * @return image or <code>null</code>
-	 */
-	protected Image getImage(ImageDescriptor descriptor) {
-		if (descriptor == null) {
-			return null;
-		}
-		Image image = (Image) fImageCache.get(descriptor);
-		if (image == null) {
-			image = new Image(getDisplay(), descriptor.getImageData());
-			fImageCache.put(descriptor, image);
-		}
-		return image;
-	}
-
-	/**
-	 * Returns the display to use for resource allocation.
-	 * 
-	 * @return display
-	 */
-	private Display getDisplay() {
-		return fViewer.getControl().getDisplay();
-	}
-	
-	/**
-	 * Returns a font for the given font data or <code>null</code>. Adds the font to the font 
-	 * cache if not yet created.
-	 * 
-	 * @param fontData font data or <code>null</code>
-	 * @return font font or <code>null</code>
-	 */
-	protected Font getFont(FontData fontData) {
-		if (fontData == null) {
-			return null;
-		}
-		Font font = (Font) fFontCache.get(fontData);
-		if (font == null) {
-			font = new Font(getDisplay(), fontData);
-			fFontCache.put(fontData, font);
-		}
-		return font;
-	}	
-	
-	/**
-	 * Returns a color for the given RGB or <code>null</code>. Adds the color to the color 
-	 * cache if not yet created.
-	 * 
-	 * @param rgb RGB or <code>null</code>
-	 * @return color or <code>null</code>
-	 */
-	protected Color getColor(RGB rgb) {
-		if (rgb == null) {
-			return null;
-		}
-		Color color = (Color) fColorCache.get(rgb);
-		if (color == null) {
-			color = new Color(getDisplay(), rgb);
-			fColorCache.put(rgb, color);
-		}
-		return color;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		synchronized (fUpdatesInProgress) {
-			Iterator updatesInProgress = fUpdatesInProgress.iterator();
-			while (updatesInProgress.hasNext()) {
-				ILabelUpdate currentUpdate = (ILabelUpdate) updatesInProgress.next();
-				currentUpdate.cancel();			
-			}
-		}		
-		Iterator images = fImageCache.values().iterator();
-		while (images.hasNext()) {
-			Image image = (Image) images.next();
-			image.dispose();
-		}
-		fImageCache.clear();
-		
-		Iterator fonts = fFontCache.values().iterator();
-		while (fonts.hasNext()) {
-			Font font = (Font) fonts.next();
-			font.dispose();
-		}
-		fFontCache.clear();
-		
-		Iterator colors = fColorCache.values().iterator();
-		while (colors.hasNext()) {
-			Color color = (Color) colors.next();
-			color.dispose();
-		}
-		fColorCache.clear();
-
-		super.dispose();
-	}
-
-	public synchronized void update(ViewerCell cell) {
-		// NOT USED - the viewer updates each row instead 
-	}	
-	
-	public synchronized void update(TreePath elementPath, ViewerRow row) {
-		String[] visibleColumns = fViewer.getVisibleColumns();
-		Object element = elementPath.getLastSegment();
-		IElementLabelProvider presentation = getLabelAdapter(element);
-		if (presentation != null) {
-			presentation.update(new ILabelUpdate[]{new LabelUpdate(elementPath, (TreeItem) row.getItem(), this, visibleColumns, fViewer.getPresentationContext())});
-		} else if (element instanceof String) {
-			// for example, expression error messages
-			row.setText(0, (String)element);
-		}		
-	}
-	
-	/**
-	 * Returns the presentation context for this label provider.
-	 * 
-	 * @return presentation context
-	 */
-	protected IPresentationContext getPresentationContext() {
-		return fViewer.getPresentationContext();
-	}
-	
-    /**
-     * Returns the label provider for the given element or
-     * <code>null</code> if none.
-     * 
-     * @param element
-     *            element to retrieve adapter for
-     * @return label adapter or <code>null</code>
-     */
-    protected IElementLabelProvider getLabelAdapter(Object element) {        
-    	IElementLabelProvider adapter = null;
-        if (element instanceof IElementLabelProvider) {
-            adapter = (IElementLabelProvider) element;
-        } else if (element instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) element;
-            adapter = (IElementLabelProvider) adaptable.getAdapter(IElementLabelProvider.class);
-	        if (adapter == null && !(element instanceof PlatformObject)) {
-    	    	// for objects that don't properly subclass PlatformObject to inherit default
-	        	// adapters, just delegate to the adapter factory
-    	    	adapter = (IElementLabelProvider) new DebugElementAdapterFactory().getAdapter(element, IElementLabelProvider.class);
-        	}            
-        }
-        return adapter;
-    }		
-
-    /**
-     * A label update is complete.
-     * 
-     * @param update
-     */
-    protected synchronized void complete(ILabelUpdate update) {
-		if (update.isCanceled()){
-			updateComplete(update);
-		} else {
-			if (fComplete == null) {
-				fComplete = new ArrayList();
-				UIJob job = new UIJob(getDisplay(), "Label Updates") { //$NON-NLS-1$
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						LabelUpdate[] updates = null;
-						synchronized (TreeModelLabelProvider.this) {
-							updates = (LabelUpdate[]) fComplete.toArray(new LabelUpdate[fComplete.size()]);
-							fComplete = null;
-						}
-						//System.out.println("Changed Labels: " + updates.length);
-						for (int i = 0; i < updates.length; i++) {
-							updates[i].update();
-						}
-						return Status.OK_STATUS;
-					}
-				};
-				job.setSystem(true);
-				job.schedule(10L);
-			}
-			fComplete.add(update);
-		}
-    }
-    
-	void addLabelUpdateListener(ILabelUpdateListener listener) {
-		fLabelListeners.add(listener);
-	}
-	
-	void removeLabelUpdateListener(ILabelUpdateListener listener) {
-		fLabelListeners.remove(listener);
-	}
-	
-	/**
-	 * Notification an update request has started
-	 * 
-	 * @param update
-	 */
-	void updateStarted(ILabelUpdate update) {
-		boolean begin = false;
-		synchronized (fUpdatesInProgress) {
-			begin = fUpdatesInProgress.isEmpty();
-			fUpdatesInProgress.add(update);
-		}
-		if (begin) {
-			if (ModelContentProvider.DEBUG_UPDATE_SEQUENCE) {
-				System.out.println("LABEL SEQUENCE BEGINS"); //$NON-NLS-1$
-			}
-			notifyUpdate(ModelContentProvider.UPDATE_SEQUENCE_BEGINS, null);
-		}
-		if (ModelContentProvider.DEBUG_UPDATE_SEQUENCE) {
-			System.out.println("\tBEGIN - " + update); //$NON-NLS-1$
-		}
-		notifyUpdate(ModelContentProvider.UPDATE_BEGINS, update);
-	}
-	
-	/**
-	 * Notification an update request has completed
-	 * 
-	 * @param update
-	 */
-	void updateComplete(ILabelUpdate update) {
-		boolean end = false;
-		synchronized (fUpdatesInProgress) {
-			fUpdatesInProgress.remove(update);
-			end = fUpdatesInProgress.isEmpty();
-		}
-		if (ModelContentProvider.DEBUG_UPDATE_SEQUENCE) {
-			System.out.println("\tEND - " + update); //$NON-NLS-1$
-		}
-		notifyUpdate(ModelContentProvider.UPDATE_COMPLETE, update);
-		if (end) {
-			if (ModelContentProvider.DEBUG_UPDATE_SEQUENCE) {
-				System.out.println("LABEL SEQUENCE ENDS"); //$NON-NLS-1$
-			}
-			notifyUpdate(ModelContentProvider.UPDATE_SEQUENCE_COMPLETE, null);
-		}
-	}
-	
-	protected void notifyUpdate(final int type, final ILabelUpdate update) {
-		if (!fLabelListeners.isEmpty()) {
-			Object[] listeners = fLabelListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final ILabelUpdateListener listener = (ILabelUpdateListener) listeners[i];
-				SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {
-						switch (type) {
-							case ModelContentProvider.UPDATE_SEQUENCE_BEGINS:
-								listener.labelUpdatesBegin();
-								break;
-							case ModelContentProvider.UPDATE_SEQUENCE_COMPLETE:
-								listener.labelUpdatesComplete();
-								break;
-							case ModelContentProvider.UPDATE_BEGINS:
-								listener.labelUpdateStarted(update);
-								break;
-							case ModelContentProvider.UPDATE_COMPLETE:
-								listener.labelUpdateComplete(update);
-								break;
-						}
-					}
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-				});
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java
deleted file mode 100644
index 8fc6ef2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerUpdateMonitor.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-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.debug.internal.core.commands.Request;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousSchedulingRuleFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * @since 3.3
- */
-abstract class ViewerUpdateMonitor extends Request implements IViewerUpdate {
-
-	private ModelContentProvider fContentProvider;
-	
-	/**
-	 * Element's tree path
-	 */
-	private TreePath fElementPath;
-	
-	/**
-	 * Element
-	 */
-	private Object fElement;
-	
-	/**
-	 * Element content provider
-	 */
-	private IElementContentProvider fElementContentProvider;
-    
-    /**
-     * Whether this request's 'done' method has been called.
-     */
-    private boolean fDone = false;
-    
-    /**
-     * Whether this request has been started
-     */
-    private boolean fStarted = false;
-    
-    /**
-     * Presentation context
-     */
-    private IPresentationContext fContext;
-    
-    protected WorkbenchJob fViewerUpdateJob = new WorkbenchJob("Asynchronous viewer update") { //$NON-NLS-1$
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            // necessary to check if viewer is disposed
-        	try {
-	            if (!isCanceled() && !getContentProvider().isDisposed()) {
-	            	IStatus status = getStatus();
-	                if (status == null || status.isOK()) {
-	                	performUpdate();
-	                }
-	            }
-        	} finally {
-        		getContentProvider().updateComplete(ViewerUpdateMonitor.this);
-        	}
-            return Status.OK_STATUS;
-        }
-    };
-    
-    /**
-     * Constructs an update for the given content provider
-     * 
-     * @param contentProvider content provider
-     * @param elementPath path to associated model element - empty for root element
-     * @param element associated model element
-     */
-    public ViewerUpdateMonitor(ModelContentProvider contentProvider, TreePath elementPath, Object element, IElementContentProvider elementContentProvider, IPresentationContext context) {
-    	fContext = context;
-    	fElementContentProvider = elementContentProvider;
-        fContentProvider = contentProvider;
-        fElement = element;
-        fElementPath = elementPath;
-        // serialize updates per viewer
-        fViewerUpdateJob.setRule(getUpdateSchedulingRule());
-        fViewerUpdateJob.setSystem(true);
-    }
-    
-    /**
-     * Returns the scheduling rule for viewer update job.
-     * 
-     * @return rule or <code>null</code>
-     */
-    protected ISchedulingRule getUpdateSchedulingRule() {
-    	return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(getContentProvider());
-    }
-    
-    /**
-     * Returns the model content provider this update is being performed for.
-     * 
-     * @return the model content provider this update is being performed for
-     */
-    protected ModelContentProvider getContentProvider() {
-        return fContentProvider;
-    }   
-    
-    /**
-     * Returns the element content provider to use for this request
-     * 
-     * @return element content provider
-     */
-    protected IElementContentProvider getElementContentProvider() {
-    	return fElementContentProvider;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitor#done()
-     */
-    public final void done() {
-    	synchronized (this) {
-    		if (isDone()) {
-    			return;
-    		}
-    		fDone = true;
-		}
-    	scheduleViewerUpdate();
-	}
-    
-    /**
-     * Returns whether this request is done yet.
-     * 
-     * @return
-     */
-    protected synchronized boolean isDone() {
-    	return fDone;
-    }
-
-    protected void scheduleViewerUpdate() {
-        if(!isCanceled()) {
-            fViewerUpdateJob.schedule();
-        } else {
-        	getContentProvider().updateComplete(this);
-        }
-    }
-    
-    /**
-	 * Notification this update has been completed and should now be applied to
-	 * this update's viewer. This method is called in the UI thread.
-	 */
-    protected abstract void performUpdate();
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate#getPresentationContext()
-	 */
-	public IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate#getElement()
-	 */
-	public Object getElement() {
-		return fElement;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate#getElementPath()
-	 */
-	public TreePath getElementPath() {
-		return fElementPath;
-	}
-	
-	/**
-	 * Returns whether this request can coalesce the given request, and performs the
-	 * coalesce if it can.
-	 * 
-	 * @param update request to coalesce with this request
-	 * @return whether it worked
-	 */
-	abstract boolean coalesce(ViewerUpdateMonitor update);
-	
-	/**
-	 * Starts this request. Subclasses must override startRequest().
-	 */
-	final void start() {
-		synchronized (this) {
-			if (fStarted) {
-				return;
-			}
-			fStarted = true;
-		}
-		getContentProvider().updateStarted(this);
-		if (!isCanceled()) {
-			startRequest();
-		} else {
-			done();
-		}
-	}	
-	
-	/**
-	 * Subclasses must override to initiate specific request types.
-	 */
-	abstract void startRequest();
-	
-	/**
-	 * Returns the priority of this request. Subclasses must override. The
-	 * highest priority is 1. Priorities indicate the order that waiting
-	 * requests should be started in (for example, 'hasChildren' before 'update child count'). 
-	 * 
-	 * @return priority
-	 */
-	abstract int getPriority();
-	
-	/**
-	 * Returns a path used to schedule this request - i.e. based on this path, this
-	 * request will be scheduled to run when no requests are running against the
-	 * same element or a parent of the element denoted by the path.
-	 * 
-	 * @return path used to schedule request
-	 */
-	abstract TreePath getSchedulingPath();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java
deleted file mode 100644
index 32c0b12..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
- 
-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.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.ISelection;
-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.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDelegate {
-	
-	private ContentViewer fViewer;
-	private static final String TAB = "\t"; //$NON-NLS-1$
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	private static final String SEPARATOR = "line.separator"; //$NON-NLS-1$
-	private boolean fDone = false;
-	
-	/**
-	 * @see AbstractDebugActionDelegate#initialize(IAction, ISelection)
-	 */
-	protected boolean initialize(IAction action, ISelection selection) {
-		if (!isInitialized()) {
-			IDebugView adapter= (IDebugView)getView().getAdapter(IDebugView.class);
-			if (adapter != null) {
-				if (adapter.getViewer() instanceof ContentViewer) {
-					setViewer((ContentViewer) adapter.getViewer());
-				}
-				adapter.setAction(getActionId(), action);
-			}
-			return super.initialize(action, selection);
-		} 
-		return false;
-	}
-
-	protected String getActionId() {
-		return IDebugView.COPY_ACTION;
-	}
-
-	/** 
-	 * Appends the representation of the specified element (using the label provider and indent)
-	 * to the buffer.  For elements down to stack frames, children representations
-	 * are append to the buffer as well.
-	 */
-	protected void append(TreeItem item, StringBuffer buffer, int indent) {
-		for (int i= 0; i < indent; i++) {
-			buffer.append(TAB);
-		}
-		String[] labels = null;
-		if (((InternalTreeModelViewer)fViewer).isShowColumns()) {
-			labels = new String[((InternalTreeModelViewer)fViewer).getPresentationContext().getColumns().length];
-			for (int i = 0; i < labels.length; i++) {
-				labels[i] = item.getText(i);
-			}
-		} else {
-			labels = new String[]{item.getText()};
-		}
-		int count = labels.length;
-		if(count > 0) {
-			for (int i = 0; i < count; i++) {
-				String text = labels[i];
-				if(text != null && !text.trim().equals(EMPTY_STRING)) {
-					buffer.append(text+TAB);
-				}
-			}
-			buffer.append(System.getProperty(SEPARATOR));
-		}
-	}
-	
-	/**
-	 * Do the specific action using the current selection.
-	 */
-	public void run(final IAction action) {
-		if (fViewer instanceof InternalTreeModelViewer) {
-			InternalTreeModelViewer viewer = (InternalTreeModelViewer) fViewer;
-			fDone = false;
-			final Object lock = new Object();
-			ProgressMonitorDialog dialog = new ProgressMonitorDialog(fViewer.getControl().getShell());
-			final IProgressMonitor monitor = dialog.getProgressMonitor();
-			dialog.setCancelable(true);
-			
-			boolean queued = false;
-			ILabelUpdateListener listener = new ILabelUpdateListener() {
-				public void labelUpdatesComplete() {
-					synchronized (lock) {
-						fDone = true;
-						lock.notifyAll();
-					}
-				}
-				public void labelUpdatesBegin() {
-				}
-				public void labelUpdateStarted(ILabelUpdate update) {
-				}
-				public void labelUpdateComplete(ILabelUpdate update) {
-					monitor.worked(1);
-				}
-			};
-			viewer.addLabelUpdateListener(listener);
-			queued = viewer.populateVitrualItems(); 
-			
-			if (queued) { 
-				IRunnableWithProgress runnable = new IRunnableWithProgress() {
-					public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException {
-						m.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), IProgressMonitor.UNKNOWN);
-						synchronized (lock) { 
-							if (!fDone) {
-								lock.wait();
-							}
-						}
-						m.done();
-					}
-				};
-				try {
-					dialog.run(true, true, runnable);
-				} catch (InvocationTargetException e) {
-					DebugUIPlugin.log(e);
-					return;
-				} catch (InterruptedException e) {
-					return;
-				}
-			}
-			
-			viewer.removeLabelUpdateListener(listener);
-			if (!monitor.isCanceled()) {
-				List roots = getPrunedSelection();
-				Iterator iterator = roots.iterator();
-				StringBuffer buffer = new StringBuffer();
-				while (iterator.hasNext()) {
-					TreeItem item = (TreeItem) iterator.next();
-					copy(item, buffer, 0);
-				}
-				TextTransfer plainTextTransfer = TextTransfer.getInstance();
-				Clipboard clipboard= new Clipboard(fViewer.getControl().getDisplay());		
-				try {
-					doCopy(clipboard, plainTextTransfer, buffer);
-				} finally {
-					clipboard.dispose();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * @param item
-	 * @param buffer
-	 */
-	protected void copy(TreeItem item, StringBuffer buffer, int indent) {
-		append(item, buffer, indent);
-		if (item.getExpanded()) {
-			TreeItem[] items = item.getItems();
-			for (int i = 0; i < items.length; i++) {
-				copy(items[i], buffer, indent + 1);
-			}
-		}
-	}
-
-	protected void doCopy(Clipboard clipboard, TextTransfer plainTextTransfer, StringBuffer buffer) {
-		try {
-			clipboard.setContents(
-					new String[]{buffer.toString()}, 
-					new Transfer[]{plainTextTransfer});
-		} catch (SWTError e){
-			if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-			if (MessageDialog.openQuestion(fViewer.getControl().getShell(), ActionMessages.CopyToClipboardActionDelegate_Problem_Copying_to_Clipboard_1, ActionMessages.CopyToClipboardActionDelegate_There_was_a_problem_when_accessing_the_system_clipboard__Retry__2)) { // 
-				doCopy(clipboard, plainTextTransfer, buffer);
-			}
-		}	
-	}
-	
-	/**
-	 * Returns the selected items in the tree, pruning children
-	 * if from selected parents.
-	 */
-	protected List getPrunedSelection() {
-		Control control = fViewer.getControl();
-		List items = new ArrayList();
-		if (control instanceof Tree) {
-			Tree tree = (Tree) control;
-			TreeItem[] selection = tree.getSelection();
-
-			for (int i = 0; i < selection.length; i++) {
-				TreeItem item = selection[i];
-				if (isEnabledFor(item.getData())) {
-					if (walkHierarchy(item, items)) {
-						items.add(item);
-					}
-				}
-			}
-		}
-		return items;
-	}
-	
-	/**
-	 * Returns whether the parent of the specified
-	 * element is already contained in the collection.
-	 */
-	protected boolean walkHierarchy(TreeItem item, List elements) {
-		TreeItem parent= item.getParentItem();
-		if (parent == null) {
-			return true;
-		}
-		if (elements.contains(parent)) {
-			return false;
-		}
-		return walkHierarchy(parent, elements);		
-	}
-			
-	protected ContentViewer getViewer() {
-		return fViewer;
-	}
-
-	protected void setViewer(ContentViewer viewer) {
-		fViewer = viewer;
-	}
-	/**
-	 * @see AbstractDebugActionDelegate#doAction(Object)
-	 */
-	protected void doAction(Object element) {
-		//not used
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java
deleted file mode 100644
index 4adf19a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse 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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.viewers.FindElementDialog;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.IUpdate;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * Action which prompts the user to find/navigate to an element in a virtual tree.
- * 
- * @since 3.3
- */
-public class VirtualFindAction extends Action implements IUpdate {
-	
-	private InternalTreeModelViewer fViewer;
-	private boolean fDone = false;
-	
-	class FindLabelProvider extends LabelProvider {
-		
-		public FindLabelProvider() {
-		}
-
-		public Image getImage(Object element) {
-			return ((TreeItem)element).getImage();
-		}
-
-		public String getText(Object element) {
-			return ((TreeItem)element).getText();
-		}
-		
-	}
-
-	public VirtualFindAction(InternalTreeModelViewer viewer) {
-		setText(ActionMessages.FindAction_0);
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".FindElementAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.FIND_ELEMENT_ACTION);
-		setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_REPLACE);
-		fViewer = viewer;
-	}
-
-	public void run() {
-		fDone = false;
-		final Object lock = new Object();
-		ProgressMonitorDialog dialog = new ProgressMonitorDialog(fViewer.getControl().getShell());
-		final IProgressMonitor monitor = dialog.getProgressMonitor();
-		dialog.setCancelable(true);
-		
-		boolean queued = false;
-		ILabelUpdateListener listener = new ILabelUpdateListener() {
-			public void labelUpdatesComplete() {
-				synchronized (lock) {
-					fDone = true;
-					lock.notifyAll();
-				}
-			}
-			public void labelUpdatesBegin() {
-			}
-			public void labelUpdateStarted(ILabelUpdate update) {
-			}
-			public void labelUpdateComplete(ILabelUpdate update) {
-				monitor.worked(1);
-			}
-		};
-		fViewer.addLabelUpdateListener(listener);
-		queued = fViewer.populateVitrualItems(); 
-		
-		if (queued) { 
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException {
-					m.beginTask(DebugUIPlugin.removeAccelerators(getText()), IProgressMonitor.UNKNOWN);
-					synchronized (lock) { 
-						if (!fDone) {
-							lock.wait();
-						}
-					}
-					m.done();
-				}
-			};
-			try {
-				dialog.run(true, true, runnable);
-			} catch (InvocationTargetException e) {
-				DebugUIPlugin.log(e);
-				return;
-			} catch (InterruptedException e) {
-				return;
-			}
-		}
-		
-		fViewer.removeLabelUpdateListener(listener);
-		if (!monitor.isCanceled()) {
-			Tree tree = (Tree) fViewer.getControl();
-			List items = new ArrayList();
-			collectItems(items, tree.getItems());
-			performFind(items);
-		}
-	}
-	
-	private void collectItems(List list, TreeItem[] items) {
-		for (int i = 0; i < items.length; i++) {
-			TreeItem treeItem = items[i];
-			list.add(treeItem);
-			if (treeItem.getExpanded()) {
-				collectItems(list, treeItem.getItems());
-			}
-		}
-	}
-
-	protected void performFind(List items) {
-		FindElementDialog dialog = new FindElementDialog(fViewer.getControl().getShell(), new FindLabelProvider(), items.toArray()); 
-		dialog.setTitle(ActionMessages.FindDialog_3);
-		dialog.setMessage(ActionMessages.FindDialog_1);
-		if (dialog.open() == Window.OK) {
-			Object[] elements = dialog.getResult();
-			if (elements.length == 1) {
-				TreeItem item = (TreeItem) elements[0];
-				List path = new ArrayList();
-				while (item != null) {
-					path.add(0, item.getData());
-					item = item.getParentItem();
-				}
-				fViewer.setSelection(new TreeSelection(new TreePath(path.toArray())));
-			}
-		}
-	}
-	
-	public void update() {
-		setEnabled(fViewer.getInput() != null);
-	}	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IChildrenCountUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IChildrenCountUpdate.java
deleted file mode 100644
index 09cb089..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IChildrenCountUpdate.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.debug.internal.ui.viewers.model.provisional;
-
-
-
-/**
- * Request monitor used to collect the number of children for an element in a viewer.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IChildrenCountUpdate extends IViewerUpdate {
-
-	/**
-	 * Sets the number of children for this update.
-	 * 
-	 * @param numChildren number of children
-	 */
-	public void setChildCount(int numChildren);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IChildrenUpdate.java
deleted file mode 100644
index 643a837..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IChildrenUpdate.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.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * Context sensitive children update request for a parent and subrange of its
- * children.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IChildrenUpdate extends IViewerUpdate {
-
-	/**
-	 * 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 offset); 	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IColumnPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IColumnPresentation.java
deleted file mode 100644
index acdd43c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IColumnPresentation.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Defines the possible set of columns presented in a view for a model.
- * A column presentation is customizable per presentation context (view) and
- * view input, and is created by an <code>IColumnPresentationFactory</code>.
- * 
- * @since 3.2
- */
-public interface IColumnPresentation {
-	
-	/**
-	 * Initializes this column presentation to be used in the
-	 * given context.
-	 * 
-	 * @param context
-	 */
-	public void init(IPresentationContext context);
-	
-	/**
-	 * Disposes this column presentation
-	 */
-	public void dispose();
-	
-	/**
-	 * Returns an array of all columns supported by this adapter as
-	 * column identifiers.
-	 * 
-	 * @return column identifiers
-	 */
-	public String[] getAvailableColumns();
-	
-	/**
-	 * Returns an ordered array of columns that should be displayed initially for
-	 * this presentation as column IDs.
-	 * 
-	 * @return initial columns to display
-	 */
-	public String[] getInitialColumns();
-	
-	/**
-	 * Returns the column header for the column with the given identifier.
-	 * 
-	 * @param id a column identifier included in <code>getColumns()</code>
-	 * @return column header
-	 */
-	public String getHeader(String id);
-	
-	/**
-	 * Returns the image for the column with the given identifier, or <code>null</code>
-	 * 
-	 * @param id column id
-	 * @return image descriptor or <code>null</code>
-	 */
-	public ImageDescriptor getImageDescriptor(String id);
-	
-	/**
-	 * Returns an identifier for this columns presentation.
-	 * The identifier should be unique per kind of column presentation 
-	 * (for example, the column presentation for Java stack frames
-	 * in the variables view). Allows visible column information to be
-	 * persisted by the platform.
-	 * 
-	 * @return identifier
-	 */
-	public String getId();
-	
-	/**
-	 * Returns whether this column presentation is optional. When a column presentation
-	 * is optional, the user may toggle columns on/off.
-	 * 
-	 * @return whether this column presentation is optional
-	 */
-	public boolean isOptional();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IColumnPresentationFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IColumnPresentationFactory.java
deleted file mode 100644
index 49795c6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IColumnPresentationFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-/**
- * An adapter used to create column presentations.
- * 
- * @see IColumnPresentation
- * @since 3.2
- */
-public interface IColumnPresentationFactory {
-
-	/**
-	 * Constructs and returns the column presentation for the given presentation
-	 * context (view) and input element, or <code>null</code> of none.
-	 * 
-	 * @param context presentation context
-	 * @param element the input element
-	 * @return column presentation or <code>null</code>
-	 */
-	public IColumnPresentation createColumnPresentation(IPresentationContext context, Object element);
-	
-	/**
-	 * Returns the type of column presentation to be used for the given context and object
-	 * or <code>null</code> if none. Allows a previous column presentation to be re-used if
-	 * it has not changed type.
-	 * 
-	 * @param context presentation context
-	 * @param element input element
-	 * @return column presentation id or <code>null</code>
-	 */
-	public String getColumnPresentationId(IPresentationContext context, Object element);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementCompareRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementCompareRequest.java
deleted file mode 100644
index 7f6dfc4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementCompareRequest.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.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * Request to compare an element to a previously created memento.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IElementCompareRequest extends IElementMementoRequest {
-	
-	/**
-	 * Sets whether this request's memento represents this requests's element.
-	 * 
-	 * @param equal whether the memento represents the element 
-	 */
-	public void setEqual(boolean equal);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java
deleted file mode 100644
index 0490995..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementContentProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * Provides content for an element in a virtual viewer.
- * 
- * @since 3.3
- */
-public interface IElementContentProvider {
-
-	/**
-	 * Updates the number of children for the given parent elements in the
-	 * specified requests.
-	 * 
-	 * @param updates each update specifies an element to update and provides
-	 *  a store for the result
-	 */
-	public void update(IChildrenCountUpdate[] updates);
-	
-	/**
-	 * Updates children as requested by the given updates.
-	 * 
-	 * @param updates each update specifies children to update and stores results
-	 */	
-	public void update(IChildrenUpdate[] updates);
-	
-	/**
-	 * Updates whether elements have children.
-	 * 
-	 * @param updates each update specifies an element to update and provides
-	 *  a store for the result
-	 */
-	public void update(IHasChildrenUpdate[] updates);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementEditor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementEditor.java
deleted file mode 100644
index 9d04de4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementEditor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Creates context specific cell modifiers and editors for elements.
- *  
- * @since 3.3
- */
-public interface IElementEditor {
-	
-	/**
-	 * Returns a cell editor to use for the specified column and object or <code>null</code>
-	 * if none.
-	 * 
-	 * @param context presentation context
-	 * @param id column id
-	 * @param element object to be edited
-	 * @param parent parent control to create the cell editor in
-	 * @return cell editor or <code>null</code>
-	 */
-	public CellEditor getCellEditor(IPresentationContext context, String columnId, Object element, Composite parent);
-	
-	/**
-	 * Returns a cell modifier for the specified element in the given context
-	 * or <code>null</code> if none.
-	 * 
-	 * @return cell modifier or <code>null</code>
-	 */
-	public ICellModifier getCellModifier(IPresentationContext context, Object element);	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementLabelProvider.java
deleted file mode 100644
index fb6ef79..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementLabelProvider.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.debug.internal.ui.viewers.model.provisional;
-
-/**
- * Provides context sensitive labels. Can be registered as an adapter for an element,
- * or implemented directly.
- * 
- * @since 3.3
- */
-public interface IElementLabelProvider {
-	
-	/**
-	 * Updates the specified labels.
-	 * 
-	 * @param updates each update specifies the element and context for which a label is requested and
-	 *  stores label attributes
-	 */
-	public void update(ILabelUpdate[] updates);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.java
deleted file mode 100644
index 870ab22..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoProvider.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.debug.internal.ui.viewers.model.provisional;
-
-/**
- * Used to save and restore viewer selection/expansion state. A memento
- * provider adapter should be available from a viewer input element
- * in order to support viewer state save/restore.
- *
- * @since 3.3
- */
-public interface IElementMementoProvider {
-	
-	/**
-	 * Creates and stores a mementos for the elements specified in the requests.
-	 * A request should be cancelled if a memento is not supported for the
-	 * specified element or context.
-	 * 
-	 * @param requests specifies elements and provides memento stores
-	 */
-	public void encodeElements(IElementMementoRequest[] requests);
-	
-	/**
-	 * Determines whether mementos represent associated elements specified in the requests.
-	 * 
-	 * @param requests specifies each element and previously created memento
-	 */
-	public void compareElements(IElementCompareRequest[] requests);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoRequest.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoRequest.java
deleted file mode 100644
index 9e664df..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IElementMementoRequest.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.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.ui.IMemento;
-
-/**
- * Request to store a memento for an element in a specific context.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IElementMementoRequest extends IViewerUpdate {
-	
-	/**
-	 * Returns the memento used to persist the element.
-	 * 
-	 * @return memento
-	 */
-	public IMemento getMemento();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IHasChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IHasChildrenUpdate.java
deleted file mode 100644
index 6c7fab0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IHasChildrenUpdate.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.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * Context sensitive update request for whether an element has children.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IHasChildrenUpdate extends IViewerUpdate {
-
-	/**
-	 * Sets whether there are children for this update.
-	 * 
-	 * @param hasChildren whether there are children
-	 */
-	public void setHasChilren(boolean hasChildren);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.java
deleted file mode 100644
index bbd606a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ILabelUpdate.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.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Context sensitive label update request for an element.
- * <p>
- * Clients are not intended to implement this interface.
- * </p> 
- * @since 3.3
- */
-public interface ILabelUpdate extends IViewerUpdate {
-		
-	/**
-	 * Returns the id's of the visible columns in presentation order,
-	 * or <code>null</code> if none.
-	 * 
-	 * @return column id's or <code>null</code>
-	 */
-	public String[] getColumnIds();
-
-	/**
-	 * Sets the text of the label of the specified column. Cannot be <code>null</code>.
-	 * 
-	 * @param text
-	 * @param columnIndex column index (0 when no columns)
-	 */
-    public void setLabel(String text, int columnIndex);
-    
-    /**
-     * Sets the font of the label.
-     * 
-     * @param fontData
-     * @param columnIndex column index (0 when no columns)
-     */
-    public void setFontData(FontData fontData, int columnIndex);
-    
-    /**
-     * Sets the image of the label.
-     * 
-     * @param image
-     * @param columnIndex column index (0 when no columns)
-     */
-    public void setImageDescriptor(ImageDescriptor image, int columnIndex);
-    
-    /**
-     * Sets the foreground color of the label.
-     * 
-     * @param foreground
-     * @param columnIndex column index (0 when no columns)
-     */
-    public void setForeground(RGB foreground, int columnIndex);
-    
-    /**
-     * Sets the background color of the label.
-     * 
-     * @param background
-     * @param columnIndex column index (0 when no columns)
-     */
-    public void setBackground(RGB background, int columnIndex);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelChangedListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelChangedListener.java
deleted file mode 100644
index f812ee9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelChangedListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-/**
- * A model changed listener is notified of changes in a model. A model
- * is represented by an {@link IModelProxy}.
- *
- * @since 3.2
- * @see IModelProxy
- * @see IModelDeltaNode
- */
-public interface IModelChangedListener {
-	
-	/**
-	 * Notification a model has changed as described by the given delta.
-	 * 
-	 * @param delta model delta
-	 * @param proxy proxy that created the delta
-	 */
-	public void modelChanged(IModelDelta delta, IModelProxy proxy);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelDelta.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelDelta.java
deleted file mode 100644
index 1b7dd39..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelDelta.java
+++ /dev/null
@@ -1,183 +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.debug.internal.ui.viewers.model.provisional;
-
-
-
-/**
- * Describes a change within a model. A delta is a hierarchical description of changes
- * within a model. It consists of a tree of nodes. Each node references an element
- * from a model describing how that element changed. A model proxy fires model deltas
- * as its model changes in order to update views displaying that model. 
- * <p>
- * Each node in a model delta describes the following:
- * <ul>
- * <li>the type of change - for example, whether an element was added, removed,
- *  or whether its content or state changed</li>
- * <li>action to consider - for example, select or reveal the element</li>
- * </ul> 
- * </p>
- * <p>
- * Clients are not intended to implement this interface directly. Instead, clients
- * creating and firing model deltas should create instances of
- * {@link org.eclipse.debug.internal.ui.viewers.update.ModelDelta}.
- * </p>
- * </p>
- * @since 3.2
- */
-public interface IModelDelta {
-	
-	// types of changes
-	
-	/**
-	 * Indicates an element has not changed, but has children that have
-	 * changed in some way.
-	 */
-	public static int NO_CHANGE = 0;
-	/**
-	 * Indicates an element has been added to the model, as described by
-	 * its path.
-	 */
-	public static int ADDED = 1;
-	/**
-	 * Indicates an element has been removed from the model, as described by
-	 * its path.
-	 */
-	public static int REMOVED = 1 << 1;
-	/**
-	 * Indicates an element has been replaced in the model, as described by
-	 * its path. In this case a replacement element is also specified in the
-	 * model delta node.
-	 */	
-	public static int REPLACED = 1 << 3;
-	/**
-	 * Indicates an element has been inserted into the model, as described
-	 * by its path and index.
-	 */
-	public static int INSERTED = 1 << 4;
-	
-	// how an element changed
-	
-	/**
-	 * Indicates an elements content has changed (i.e. its children).
-	 */
-	public static int CONTENT = 1 << 10;
-	/**
-	 * Indicates an elements state has changed (i.e. label)
-	 */
-	public static int STATE = 1 << 11;
-	
-	// Suggested actions
-	
-	/**
-	 * Suggests that the element should be expanded, as described by its path.
-	 */
-	public static int EXPAND = 1 << 20;
-	/**
-	 * Suggests that the element should be selected, as described by its path.
-	 */
-	public static int SELECT = 1 << 21;
-	
-	/**
-	 * Suggests that the element should be revealed, as described by its path.
-	 * @since 3.3
-	 */
-	public static int REVEAL = 1 << 24;	
-	
-	/**
-	 * Indicates a model proxy should be installed for the given element
-	 * @since 3.3
-	 */
-	public static int INSTALL = 1 << 22;
-	
-	/**
-	 * Indicates a model proxy should be uninstalled for the given element
-	 * @since 3.3
-	 */
-	public static int UNINSTALL = 1 << 23;
-	
-	/**
-	 * Suggests that the element should be collapsed, as described by its path.
-	 * @since 3.3
-	 */
-	public static int COLLAPSE = 1 << 25;	
-	
-	/**
-	 * Returns the parent of this node, or <code>null</code> if this is
-	 * a root node.
-	 * 
-	 * @return parent node or <code>null</code> if this is a root node
-	 */
-	public IModelDelta getParentDelta();
-	
-	/**
-	 * Returns the model element this node describes.
-	 * 
-	 * @return associated model element
-	 */
-	public Object getElement();
-	
-	/**
-	 * Returns flags describing how this element changed. A bit mask of the
-	 * change type constants described in {@link IModelDelta}.
-	 * 
-	 * @return change flags
-	 */
-	public int getFlags();
-	
-	/**
-	 * Returns nodes describing changed children, possibly an empty collection.
-	 *  
-	 * @return changed children, possibly empty
-	 */
-	public IModelDelta[] getChildDeltas();
-	
-	/**
-	 * When a node indicates the <code>IModelDelta.REPLACED</code> flag, this method
-	 * returns the replacement element, otherwise <code>null</code>.
-	 *  
-	 * @return replacement element or <code>null</code>
-	 */
-	public Object getReplacementElement();
-	
-	/**
-	 * Returns this node's index in its parents child collection or -1 if unknown.
-	 * This attribute is required when expanding or selecting an element.
-	 * <p>
-	 * When a node indicates the <code>IModelDelta.INSERTED</code> flag, this method
-	 * returns the index that the new element should be inserted at relative to its
-	 * parents children, otherwise -1.
-	 * </p>
-	 * @return insertion index or -1
-	 */
-	public int getIndex();
-	
-	/**
-	 * Returns the total number of children this element has, or -1 if unknown. Note
-	 * that this number may be greater than the number of child delta nodes for this
-	 * node, since not all children may be reporting deltas.
-	 * <p>
-	 * This attribute is required when expanding or selecting an element.
-	 * </p>
-	 * 
-	 * @return total number of child elements this element has
-	 */
-	public int getChildCount();
-	
-	/**
-	 * Accepts the given visitor.
-	 * 
-	 * @param visitor
-	 * @since 3.3
-	 */
-	public void accept(IModelDeltaVisitor visitor);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelDeltaVisitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelDeltaVisitor.java
deleted file mode 100644
index 1d41546..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelDeltaVisitor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * An objects that visits model deltas.
- * 
- * @since 3.3
- */
-public interface IModelDeltaVisitor {
-	
-	/** 
-	 * Visits the given model delta.
-	 * 
-	 * @param delta the delta to visit
-	 * @param depth depth in the delta where 0 == root node
-	 * @return <code>true</code> if the model delta's children should
-	 *		be visited; <code>false</code> if they should be skipped.
-	 */
-	public boolean visit(IModelDelta delta, int depth);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java
deleted file mode 100644
index 98c60b1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxy.java
+++ /dev/null
@@ -1,94 +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.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * A model proxy represents a model for a specific presentation context and
- * fires deltas to notify listeners of changes in the model. A model proxy
- * is created by a model proxy factory.
- * <p>
- * When an element is added to an asynchronous viewer, its associated model proxy
- * factory is queried to create a model proxy for that element. The model proxy
- * is then installed into the viewer and the viewer listens to model deltas
- * in order to update that element. Generally, a model proxy factory creates
- * model proxies for root elements in a model, and then represents all elements
- * within that model for a specific presentation context. 
- * </p>
- * <p>
- * Clients may implement this interface. Implementation of this interface
- * must subclass {@link AbstractModelProxy}.
- * </p>
- * @see IModelDelta
- * @see IModelProxyFactory
- * @see IModelChangedListener
- * @since 3.2
- */
-public interface IModelProxy {
-
-	/**
-	 * Notification this model proxy has been created and is about to be installed
-	 * in the following context. This is the first method called after a model proxy
-	 * is created.
-	 * <p>
-	 * This method is called by the asynchronous viewer framework and should not
-	 * be called by clients.
-	 * </p>
-	 * @param context presentation context in which the proxy will be installed
-	 */
-	public void init(IPresentationContext context);
-	
-	/** 
-	 * Notification this model proxy has been installed in the specified 
-	 * viewer. This indicates that the model proxy has been created and registered
-	 * model change listeners are ready to process deltas.
-	 * <p>
-	 * This method is called by the asynchronous viewer framework and should not
-	 * be called by clients.
-	 * </p>
-	 * @param viewer viewer
-	 * @since 3.3
-	 */
-	public void installed(Viewer viewer);
-	
-	/**
-	 * Disposes this model proxy.
-	 * <p>
-	 * This method is called by the asynchronous viewer framework and should not
-	 * be called by clients.
-	 * </p>
-	 */
-	public void dispose();
-	
-	/**
-	 * Registers the given listener for model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	public void addModelChangedListener(IModelChangedListener listener);
-	
-	/**
-	 * Unregisters the given listener from model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	public void removeModelChangedListener(IModelChangedListener listener);
-	
-	/**
-	 * Returns whether this proxy has been disposed.
-	 * 
-	 * @return whether this proxy has been disposed
-	 * @since 3.3
-	 */
-	public boolean isDisposed();
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory.java
deleted file mode 100644
index e46847f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory.java
+++ /dev/null
@@ -1,35 +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.debug.internal.ui.viewers.model.provisional;
-
-/**
- * A model proxy factory creates model proxies for elements based on 
- * specific presentation contexts. A model proxy factory is provided for
- * a model element by registering a model proxy factory adapter for
- * an element.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IModelProxy
- * @see IModelDelta
- * @since 3.2
- */
-public interface IModelProxyFactory {
-	/**
-	 * Creates and returns a model proxy for the given element in the specified
-	 * context or <code>null</code> if none.
-	 * 
-	 * @param element model element to create a model proxy for
-	 * @param context presentation context
-	 * @return model proxy or <code>null</code>
-	 */
-	public IModelProxy createModelProxy(Object element, IPresentationContext context);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java
deleted file mode 100644
index c0fec65..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicy.java
+++ /dev/null
@@ -1,87 +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.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * Resolves selection conflicts within a model. When
- * a selection exists in a viewer, and a client asks
- * to set another selection, the selection policy for
- * that model is asked to determine whether the new
- * selection should override the previous selection.
- * When a selection is from a different model, the
- * original selection is maintained if its model selection
- * policy specifies the selection to be 'sticky'.
- * <p>
- * A selection policy is obtained by querying for the selection
- * policy factory for a given element.  The selection policy factory
- * will then be asked to create a model selection policy adapter.
- * The adapter represents selections from an instance of a model.
- * </p>
- * 
- * @see IModelSelectionPolicyFactory
- * @since 3.2
- */
-public interface IModelSelectionPolicy {
-	
-	/**
-	 * Returns whether the given selection is contained in
-	 * this model.
-	 * 
-	 * @param selection
-	 * @param context
-	 * @return
-	 */
-	public boolean contains(ISelection selection, IPresentationContext context);
-	
-	/**
-	 * Returns whether the candidate selection overrides the
-	 * existing selection. The policy is only asked about selections
-	 * that it contains.
-	 * 
-	 * @param existing
-	 * @param candidate
-	 * @param context
-	 * @return
-	 */
-	public boolean overrides(ISelection existing, ISelection candidate, IPresentationContext context);
-
-	/**
-	 * Returns whether the given selection should be maintained in the
-	 * face of a selection attempt from a different model.
-	 *  
-	 * @param selection
-	 * @param context
-	 * @return
-	 */
-	public boolean isSticky(ISelection selection, IPresentationContext context);
-	
-	/**
-	 * Replaces an invalid selection.
-	 * <p>
-	 * This method is called if a model change picked up by a viewer
-	 * results in an invalid selection. For instance if an element contained in
-	 * the selection has been removed from the viewer, the selection policy associated
-	 * with the invalid selection is free to specify a new selection. The default
-	 * selection policy returns the <code>newSelection</code> as is (with missing
-	 * elements removed). Model selection policies may implement a different strategy
-	 * for picking a new selection when the old selection becomes invalid.
-	 * </p>
-	 * 
-	 * @param invalidSelection
-	 *            the selection before the viewer was updated
-	 * @param newSelection
-	 *            the selection after the update, or <code>null</code> if none
-	 * @return new selection or <code>null</code> if none
-	 */
-    public ISelection replaceInvalidSelection(ISelection invalidSelection, ISelection newSelection);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicyFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicyFactory.java
deleted file mode 100644
index d318f8e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelSelectionPolicyFactory.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.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * A model selection policy factory creates a model selection policy for an element based on 
- * a specific presentation context. A model selection policy factory is provided for
- * a model element by registering a model selection policy factory adapter for
- * an element.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IModelSelectionPolicy
- * @since 3.2
- */
-public interface IModelSelectionPolicyFactory {
-	/**
-	 * Creates and returns a model selection policy for the given element in the specified
-	 * context or <code>null</code> if none.
-	 * 
-	 * @param element model element to create a selection policy for
-	 * @param context presentation context
-	 * @return model selection policy or <code>null</code>
-	 */
-	public IModelSelectionPolicy createModelSelectionPolicyAdapter(Object element, IPresentationContext context);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java
deleted file mode 100644
index fca304e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.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 Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-/**
- * Context in which an asynchronous request has been made.
- * <p>
- * Clients may implement and extend this interface to provide
- * special contexts. Implementations must subclass {@link PresentationContext}.
- * </p>
- * @since 3.2
- */
-public interface IPresentationContext {
-	
-	/**
-	 * Property name used for property change notification when the columns
-	 * in a presentation context change.
-	 */
-	public static final String PROPERTY_COLUMNS = "PROPERTY_COLUMNS"; //$NON-NLS-1$
-    
-    /**
-     * Returns identifiers of the visible columns in the order
-     * labels should be provided, or <code>null</code> if columns
-     * are not being displayed. Label providers use this
-     * information. 
-     * 
-     * @return visible column identifiers or <code>null</code>
-     * @see IColumnPresentation
-     */
-    public String[] getColumns();
-    
-    /**
-     * Registers the given listener for property change notification.
-     * 
-     * @param listener property listener
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Unregisters the given listener from property change notification.
-     * 
-     * @param listener property listener.
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Returns the id of this presentation context. Usually this is the id of
-     * the associated part. However, when no part is associated with this context,
-     * the id may exist on its own. Allows for a context that is not tied to a part.
-     * 
-     * @return id
-     * @since 3.3
-     */
-    public String getId();
-    
-    /**
-     * Sets the specified property and notifies listeners of changes.
-     * 
-     * @param property property name
-     * @param value property value
-     */
-    public void setProperty(String property, Object value);
-    
-    /**
-     * Returns the property with the specified name or <code>null</code>
-     * if none.
-     * 
-     * @param property property name
-     * @return property value or <code>null</code>
-     */
-    public Object getProperty(String property);
-    
-    /**
-     * Disposes this presentation context. Called by the framework
-     * when the associated viewer is disposed.
-     */
-    public void dispose();
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java
deleted file mode 100644
index 0ba8af6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IStatusMonitor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A progress monitor that accepts a status. This common base interface is used
- * to make non-blocking requests on models that may reply asynchronously. A request
- * may be cancelled by the caller or by the client fulfilling the request (by 
- * calling <code>setCancelled(true)</code> on the request). Failure and error
- * states are reported by setting a status on a monitor. When a request
- * is complete, the client fulfilling the request must call <code>done()</code> on the
- * monitor, whether the update succeeds, fails, or is cancelled.
- * <p>
- * Clients accepting a status monitor are expected to poll the
- * monitor (using <code>isCanceled</code>) periodically and abort at their
- * earliest convenience if a request is cancelled.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @since 3.3
- * <p>
- * <strong>EXPERIMENTAL</strong>. This interface has been added as
- * part of a work in progress. There is no guarantee that this API will
- * remain unchanged during the 3.3 release cycle. Please do not use this API
- * without consulting with the Platform/Debug team.
- * </p>
- */
-public interface IStatusMonitor extends IProgressMonitor {
-
-    /**
-     * Sets the status for a 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 - <code>null</code> is equivalent
-     *  to an OK status
-     */
-    public IStatus getStatus();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java
deleted file mode 100644
index df2937c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdate.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.debug.core.IRequest;
-import org.eclipse.jface.viewers.TreePath;
-
-/**
- * A context sensitive viewer update request.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.3
- */
-public interface IViewerUpdate extends IRequest {
-
-	/**
-	 * Returns the context this update was requested in.
-	 * 
-	 * @return context this update was requested in
-	 */
-	public IPresentationContext getPresentationContext();
-    
-    /**
-     * Returns the model element associated with this request.
-     * 
-     * @return associated model element
-     */
-    public Object getElement();
-    
-    /**
-     * Returns the viewer tree path to the model element associated with this
-     * request. An empty path indicates a root element.
-     * 
-     * @return tree path, possibly empty
-     */
-    public TreePath getElementPath();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdateListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdateListener.java
deleted file mode 100644
index c8b9d92..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IViewerUpdateListener.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.debug.internal.ui.viewers.model.provisional;
-
-
-/**
- * Notified of viewer updates.
- * 
- * @since 3.3
- */
-public interface IViewerUpdateListener {
-
-	/**
-	 * Notification that a sequence of viewer updates are starting.
-	 */
-	public void viewerUpdatesBegin();
-	
-	/**
-	 * Notification that viewer updates are complete. Corresponds to
-	 * a <code>viewerUpdatesBegin()</code> notification.
-	 */
-	public void viewerUpdatesComplete();
-	
-	/**
-	 * Notification that a specific update has started within
-	 * a sequence of updates.
-	 * 
-	 * @param update update
-	 */
-	public void updateStarted(IViewerUpdate update);
-	
-	/**
-	 * Notification that a specific update has completed within a
-	 * sequence of updates.
-	 * 
-	 * @param update update
-	 */
-	public void updateComplete(IViewerUpdate update);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java
deleted file mode 100644
index d415004..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ModelDelta.java
+++ /dev/null
@@ -1,335 +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.debug.internal.ui.viewers.model.provisional;
-
-
-
-
-/**
- * A model delta. Used to create model deltas.
- * <p>
- * Clients may instantiate this class; not intended to be subclassed.
- * </p>
- * @see org.eclipse.debug.internal.ui.viewers.IModelDelta
- * @since 3.2
- */
-public class ModelDelta implements IModelDelta {
-
-	private IModelDelta fParent;
-	private Object fElement;
-	private int fFlags;
-	private ModelDelta[] fNodes = EMPTY_NODES;
-	private Object fReplacement;
-	private int fIndex = -1;
-	private int fChildCount = -1;
-	private static final ModelDelta[] EMPTY_NODES = new ModelDelta[0];
-
-	/**
-	 * Constructs a new delta for the given element.
-	 * 
-	 * @param element model element
-	 * @param flags change flags
-	 */
-	public ModelDelta(Object element, int flags) {
-		fElement = element;
-		fFlags = flags;
-	}
-
-	/**
-	 * Constructs a new delta for the given element to be replaced
-	 * with the specified replacement element.
-	 * 
-	 * @param element model element
-	 * @param replacement replacement element
-	 * @param flags change flags
-	 */
-	public ModelDelta(Object element, Object replacement, int flags) {
-        fElement = element;
-        fReplacement = replacement;
-        fFlags = flags;
-    }
-
-	/**
-	 * Constructs a new delta for the given element to be inserted at
-	 * the specified index.
-	 * 
-	 * @param element model element
-	 * @param index insertion position
-	 * @param flags change flags
-	 */
-    public ModelDelta(Object element, int index, int flags) {
-        fElement = element;
-        fIndex = index;
-        fFlags = flags;
-    }
-    
-	/**
-	 * Constructs a new delta for the given element at the specified index
-	 * relative to its parent with the given number of children.
-	 * 
-	 * @param element model element
-	 * @param index insertion position
-	 * @param flags change flags
-	 * @param childCount number of children this node has
-	 */
-    public ModelDelta(Object element, int index, int flags, int childCount) {
-        fElement = element;
-        fIndex = index;
-        fFlags = flags;
-        fChildCount = childCount;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.IModelDelta#getElement()
-     */
-    public Object getElement() {
-		return fElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelDelta#getFlags()
-	 */
-	public int getFlags() {
-		return fFlags;
-	}
-
-	/**
-	 * Adds a child node to this delta with the given element and change flags,
-	 * and returns the child delta.
-	 * 
-	 * @param element child element to add
-	 * @param flags change flags for child
-	 * @return newly created child delta
-	 */
-	public ModelDelta addNode(Object element, int flags) {
-		ModelDelta node = new ModelDelta(element, flags);
-		node.setParent(this);
-		addDelta(node);
-		return node;
-	}
-	
-	/**
-	 * Returns the child delta for the given element, or <code>null</code> if none.
-	 * 
-	 * @param element child element
-	 * @return corresponding delta node, or <code>null</code>
-	 */
-	public ModelDelta getChildDelta(Object element) {
-		if (fNodes != null) {
-			for (int i = 0; i < fNodes.length; i++) {
-				ModelDelta delta = fNodes[i];
-				if (element.equals(delta.getElement())) {
-					return delta;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds a child node to this delta to replace the given element with the
-	 * specified replacement element and change flags, and returns the 
-	 * newly created child delta.
-	 * 
-	 * @param element child element to add to this delta
-	 * @param replacement replacement element for the child element
-	 * @param flags change flags
-	 * @return newly created child delta
-	 */
-    public ModelDelta addNode(Object element, Object replacement, int flags) {
-        ModelDelta node = new ModelDelta(element, replacement, flags);
-        node.setParent(this);
-        addDelta(node);
-        return node;
-    }
-
-    /**
-     * Adds a child delta to this delta to insert the specified element at
-     * the given index, and returns the newly created child delta.
-     * 
-     * @param element child element in insert
-     * @param index index of insertion
-     * @param flags change flags
-     * @return newly created child delta
-     */
-    public ModelDelta addNode(Object element, int index, int flags) {
-        ModelDelta node = new ModelDelta(element, index, flags);
-        node.setParent(this);
-        addDelta(node);
-        return node;
-    }
-    
-    /**
-     * Adds a child delta to this delta at the specified index with the
-     * given number of children, and returns the newly created child delta.
-     * 
-     * @param element child element in insert
-     * @param index index of the element relative to parent
-     * @param flags change flags
-     * @param numChildren the number of children the element has
-     * @return newly created child delta
-     */
-    public ModelDelta addNode(Object element, int index, int flags, int numChildren) {
-        ModelDelta node = new ModelDelta(element, index, flags, numChildren);
-        node.setParent(this);
-        addDelta(node);
-        return node;
-    }
-    
-    /**
-     * Sets the parent delta of this delta
-     * 
-     * @param node parent delta
-     */
-	void setParent(ModelDelta node) {
-		fParent = node;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelDelta#getParent()
-	 */
-	public IModelDelta getParentDelta() {
-		return fParent;
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.IModelDelta#getReplacementElement()
-     */
-    public Object getReplacementElement() {
-        return fReplacement;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.IModelDelta#getIndex()
-     */
-    public int getIndex() {
-        return fIndex;
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelDelta#getNodes()
-	 */
-	public IModelDelta[] getChildDeltas() {
-		return fNodes;
-	}
-	
-	private void addDelta(ModelDelta delta) {
-		if (fNodes.length == 0) {
-			fNodes = new ModelDelta[]{delta};
-		} else {
-			ModelDelta[] nodes = new ModelDelta[fNodes.length + 1];
-			System.arraycopy(fNodes, 0, nodes, 0, fNodes.length);
-			nodes[fNodes.length] = delta;
-			fNodes = nodes;
-		}
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer();
-		buf.append("Model Delta Start\n"); //$NON-NLS-1$
-		appendDetail(buf, this);
-		buf.append("Model Delta End\n"); //$NON-NLS-1$
-		return buf.toString();
-	}
-	
-	private void appendDetail(StringBuffer buf, IModelDelta delta) {
-		buf.append("\tElement: "); //$NON-NLS-1$
-		buf.append(delta.getElement());
-		buf.append('\n');
-		buf.append("\t\tFlags: "); //$NON-NLS-1$
-		int flags = delta.getFlags();
-		if (flags == 0) {
-			buf.append("NO_CHANGE"); //$NON-NLS-1$
-		} else {
-			if ((flags & IModelDelta.ADDED) > 0) {
-				buf.append("ADDED | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.CONTENT) > 0) {
-				buf.append("CONTENT | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.EXPAND) > 0) {
-				buf.append("EXPAND | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.INSERTED) > 0) {
-				buf.append("INSERTED | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.REMOVED) > 0) {
-				buf.append("REMOVED | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.REPLACED) > 0) {
-				buf.append("REPLACED | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.SELECT) > 0) {
-				buf.append("SELECT | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.STATE) > 0) {
-				buf.append("STATE | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.INSTALL) > 0) {
-				buf.append("INSTALL | "); //$NON-NLS-1$
-			}
-			if ((flags & IModelDelta.UNINSTALL) > 0) {
-				buf.append("UNINSTALL | "); //$NON-NLS-1$
-			}
-		}
-		buf.append('\n');
-		buf.append("\t\tIndex: "); //$NON-NLS-1$
-		buf.append(delta.getIndex());
-		buf.append(" Child Count: "); //$NON-NLS-1$
-		buf.append(delta.getChildCount());
-		buf.append('\n');
-		IModelDelta[] nodes = delta.getChildDeltas();
-		for (int i = 0; i < nodes.length; i++) {
-			appendDetail(buf, nodes[i]);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta#getChildCount()
-	 */
-	public int getChildCount() {
-		return fChildCount;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta#accept(org.eclipse.debug.internal.ui.viewers.provisional.IModelDeltaVisitor)
-	 */
-	public void accept(IModelDeltaVisitor visitor) {
-		doAccept(visitor, 0);
-	}
-	
-	protected void doAccept(IModelDeltaVisitor visitor, int depth) {
-		if (visitor.visit(this, depth)) {
-			IModelDelta[] childDeltas = getChildDeltas();
-			for (int i = 0; i < childDeltas.length; i++) {
-				((ModelDelta)childDeltas[i]).doAccept(visitor, depth+1);
-			}
-		}
-	}
-	
-	/**
-	 * Sets this delta's element
-	 * 
-	 * @param element
-	 */
-	public void setElement(Object element) {
-		fElement = element;
-	}
-	
-	/**
-	 * Sets this delta's flags.
-	 * 
-	 * @param flags
-	 */
-	public void setFlags(int flags) {
-		fFlags = flags;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java
deleted file mode 100644
index 3687011..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.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.debug.internal.ui.viewers.model.provisional;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.SafeRunnable;
-
-/**
- * Presentation context.
- * <p>
- * Clients may instantiate and subclass this class.
- * </p>
- * @since 3.2
- */
-public class PresentationContext implements IPresentationContext {
-    
-    private String fId;
-    private ListenerList fListeners = new ListenerList();
-    private Map fProperties = new HashMap();
-    
-    /**
-     * Constructs a presentation context for the given id.
-     * 
-     * @param id presentation context id
-     */
-    public PresentationContext(String id) {
-    	fId = id;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext#getColumns()
-	 */
-	public String[] getColumns() {
-		return (String[]) getProperty(IPresentationContext.PROPERTY_COLUMNS);
-	}
-	
-	/**
-	 * Fires a property change event to all registered listeners
-	 * 
-	 * @param property property name
-	 * @param oldValue old value or <code>null</code>
-	 * @param newValue new value or <code>null</code>
-	 */
-	protected void firePropertyChange(String property, Object oldValue, Object newValue) {
-		if (!fListeners.isEmpty()) {
-			final PropertyChangeEvent event = new PropertyChangeEvent(this, property, oldValue, newValue);
-			Object[] listeners = fListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IPropertyChangeListener listener = (IPropertyChangeListener) listeners[i];
-				SafeRunner.run(new SafeRunnable() {
-					public void run() throws Exception {
-						listener.propertyChange(event);
-					}
-				});
-			}
-		}
-	}
-	
-	/**
-	 * Sets the visible column ids.
-	 * 
-	 * @param ids column identifiers
-	 */
-	public void setColumns(String[] ids) {
-		setProperty(IPresentationContext.PROPERTY_COLUMNS, ids);
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext#dispose()
-	 */
-	public void dispose() {
-		fListeners.clear();
-		fProperties.clear();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-		fListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		fListeners.remove(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext#getId()
-	 */
-	public String getId() {
-		return fId;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext#getProperty(java.lang.String)
-	 */
-	public Object getProperty(String property) {
-		synchronized (fProperties) {
-			return fProperties.get(property);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext#setProperty(java.lang.String, java.lang.Object)
-	 */
-	public void setProperty(String property, Object value) {
-		synchronized (fProperties) {
-			Object oldValue = fProperties.get(property);
-			if (!isEqual(oldValue, value)) {
-				fProperties.put(property, value);
-				firePropertyChange(property, oldValue, value);
-			}
-		}
-	}
-	
-	private boolean isEqual(Object a, Object b) {
-		if (a == null) {
-			return b == null;
-		}
-		return a.equals(b);
-	}
-	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java
deleted file mode 100644
index 0ca9602..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/TreeModelViewer.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.model.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.InternalTreeModelViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IMemento;
-
-/**
- * A tree viewer for a model.
- * <p>
- * Clients may instantiate this class. Clients may not subclass this class.
- * </p>
- * @since 3.3
- */
-public class TreeModelViewer extends InternalTreeModelViewer {
-
-	/**
-	 * Constructs a new viewer.
-	 * 
-	 * @param parent parent widget
-	 * @param style viewer style bits
-	 * @param context presentation context
-	 */
-	public TreeModelViewer(Composite parent, int style, IPresentationContext context) {
-		super(parent, style, context);
-	}
-	
-	/**
-	 * Returns this viewer's presentation context.
-	 * 
-	 * @return presentation context
-	 */
-	public IPresentationContext getPresentationContext() {
-		return super.getPresentationContext();
-	}	
-
-	/**
-	 * Registers the given listener for model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	public void addModelChangedListener(IModelChangedListener listener) {
-		super.addModelChangedListener(listener); 
-	}
-	
-	/**
-	 * Unregisters the given listener from model delta notification.
-	 * 
-	 * @param listener model delta listener
-	 */
-	public void removeModelChangedListener(IModelChangedListener listener) {
-		super.removeModelChangedListener(listener);
-	}	
-	
-	/**
-	 * Registers the specified listener for view update notifications.
-	 * 
-	 * @param listener listener
-	 */
-	public void addViewerUpdateListener(IViewerUpdateListener listener) {
-		super.addViewerUpdateListener(listener);
-	}
-	
-	/**
-	 * Removes the specified listener from update notifications.
-	 * 
-	 * @param listener listener
-	 */
-	public void removeViewerUpdateListener(IViewerUpdateListener listener) {
-		super.removeViewerUpdateListener(listener);
-	}
-		
-	/**
-	 * Returns whether columns can be toggled on/off for this viewer's current
-	 * input element.
-	 * 
-	 * @return whether columns can be toggled on/off
-	 */
-	public boolean canToggleColumns() {
-		return super.canToggleColumns();
-	}	
-	
-	/**
-	 * Returns the current column presentation for this viewer, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return column presentation or <code>null</code>
-	 */
-	public IColumnPresentation getColumnPresentation() {
-		return super.getColumnPresentation();
-	}	
-	
-	/**
-	 * Returns identifiers of the visible columns in this viewer, or <code>null</code>
-	 * if there are currently no columns.
-	 *  
-	 * @return visible columns identifiers or <code>null</code>
-	 */
-	public String[] getVisibleColumns() {
-		return super.getVisibleColumns();
-	}  	
-	
-	/**
-	 * Initializes viewer state from the memento
-	 * 
-	 * @param memento
-	 */
-	public void initState(IMemento memento) {
-		super.initState(memento);
-	}
-	
-	/**
-	 * Save viewer state into the given memento.
-	 * 
-	 * @param memento
-	 */
-	public void saveState(IMemento memento) {
-		super.saveState(memento);
-	}
-	
-	/**
-	 * Returns whether columns are being displayed currently.
-	 * 
-	 * @return
-	 */
-	public boolean isShowColumns() {
-		return super.isShowColumns();
-	}	
-	
-	/**
-	 * Resets any persisted column size for the given columns
-	 * 
-	 * @param columnIds array of column identifiers
-	 */
-	public void resetColumnSizes(String[] columnIds) {
-		super.resetColumnSizes(columnIds);
-	}
-	
-	/**
-	 * Toggles columns on/off for the current column presentation, if any.
-	 * 
-	 * @param show whether to show columns if the current input supports
-	 * 	columns
-	 */
-	public void setShowColumns(boolean show) {
-		super.setShowColumns(show);
-	}	
-	
-	/**
-	 * Sets the visible columns for this viewer. Id's correspond to 
-	 * column identifiers from a column presentation. Use <code>null</code>
-	 * or an empty collection to display default columns for the current
-	 * column presentation. Only effects the current column presentation.
-	 * 
-	 * @param ids column identifiers or <code>null</code>
-	 */
-	public void setVisibleColumns(String[] ids) {
-		super.setVisibleColumns(ids);
-	}		
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AbstractColumnPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AbstractColumnPresentation.java
deleted file mode 100644
index 1467375..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AbstractColumnPresentation.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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Common function for a column presentation.
- * <p>
- * Clients implementing <code>IColumnPresentation</code> must subclass this class.
- * </p>
- * @since 3.2
- */
-public abstract class AbstractColumnPresentation implements IColumnPresentation {
-	
-	private IPresentationContext fContext;
-	
-	/**
-	 * Empty array of strings
-	 */
-	protected static final String[] EMPTY = new String[0];
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#init(org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-	 */
-	public void init(IPresentationContext context) {
-		fContext = context;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#dispose()
-	 */
-	public void dispose() {
-		fContext = null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IColumnPresentation#getImageDescriptor(java.lang.String)
-	 */
-	public ImageDescriptor getImageDescriptor(String id) {
-		return null;
-	}
-
-	/**
-	 * Returns the context this column presentation is installed in.
-	 * 
-	 * @return presentation context
-	 */
-	protected IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AbstractModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AbstractModelProxy.java
deleted file mode 100644
index c43a11d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AbstractModelProxy.java
+++ /dev/null
@@ -1,165 +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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Common function for a model proxy.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.2
- */
-public abstract class AbstractModelProxy implements IModelProxy {
-	
-	private IPresentationContext fContext;
-	private Viewer fViewer;
-	private boolean fDisposed = false;
-
-	private ListenerList fListeners = new ListenerList();
-	
-	// debug flags
-	public static boolean DEBUG_DELTAS = false;
-	
-	static {
-		DEBUG_DELTAS = DebugUIPlugin.DEBUG && "true".equals( //$NON-NLS-1$
-		 Platform.getDebugOption("org.eclipse.debug.ui/debug/viewers/deltas")); //$NON-NLS-1$
-	} 	
-
-	protected Object[] getListeners() {
-		synchronized (fListeners) {
-			return fListeners.getListeners();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelProxy#addModelChangedListener(org.eclipse.debug.internal.ui.viewers.IModelChangedListener)
-	 */
-	public void addModelChangedListener(IModelChangedListener listener) {
-		synchronized (fListeners) {
-			fListeners.add(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelProxy#removeModelChangedListener(org.eclipse.debug.internal.ui.viewers.IModelChangedListener)
-	 */
-	public void removeModelChangedListener(IModelChangedListener listener) {
-		synchronized (fListeners) {
-			fListeners.remove(listener);
-		}
-	}
-
-	/**
-	 * Notifies registered listeners of the given delta.
-	 * 
-	 * @param delta model delta to broadcast
-	 */
-	public void fireModelChanged(IModelDelta delta) {
-		final IModelDelta root = getRootDelta(delta);
-		Object[] listeners = getListeners();
-		if (DEBUG_DELTAS) {
-			DebugUIPlugin.debug("FIRE DELTA: " + delta.toString()); //$NON-NLS-1$
-		}
-		for (int i = 0; i < listeners.length; i++) {
-			final IModelChangedListener listener = (IModelChangedListener) listeners[i];
-			ISafeRunnable safeRunnable = new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					DebugUIPlugin.log(exception);
-				}
-
-				public void run() throws Exception {
-					listener.modelChanged(root, AbstractModelProxy.this);
-				}
-
-			};
-            SafeRunner.run(safeRunnable);
-		}
-	}
-	
-	/**
-	 * Returns the root node of the given delta.
-	 * 
-	 * @param delta delta node
-	 * @return returns the root of the given delta
-	 */
-	protected IModelDelta getRootDelta(IModelDelta delta) {
-		IModelDelta parent = delta.getParentDelta();
-		while (parent != null) {
-			delta = parent;
-			parent = delta.getParentDelta();
-		}
-		return delta;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelProxy#dispose()
-	 */
-	public synchronized void dispose() {
-		fDisposed = true;
-		fContext = null;
-		fViewer = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.IModelProxy#init(org.eclipse.debug.internal.ui.viewers.IPresentationContext)
-	 */
-	public void init(IPresentationContext context) {
-		fContext = context;
-	}
-	
-	/**
-	 * Returns the context this model proxy is installed in.
-	 * 
-	 * @return presentation context, or <code>null</code> if this
-	 *  model proxy has been disposed
-	 */
-	public IPresentationContext getPresentationContext() {
-		return fContext;
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * Subclasses should override as required.
-	 * 
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelProxy#installed(org.eclipse.jface.viewers.Viewer)
-	 */
-	public void installed(Viewer viewer) {	
-		fViewer = viewer;
-	}
-	
-	/**
-	 * Returns the viewer this proxy is installed in.
-	 * 
-	 * @return viewer or <code>null</code> if not installed
-	 */
-	protected Viewer getViewer() {
-		return fViewer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy#isDisposed()
-	 */
-	public synchronized boolean isDisposed() {
-		return fDisposed;
-	}	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AsynchronousContentAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AsynchronousContentAdapter.java
deleted file mode 100644
index 01635d1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AsynchronousContentAdapter.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.viewers.provisional;
-
-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.Job;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousSchedulingRuleFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-
-/**
- * Abstract implementation of an asynchronous content adapter.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.2
- */
-public abstract class AsynchronousContentAdapter implements IAsynchronousContentAdapter {
-	
-	protected static final Object[] EMPTY = new Object[0];
-	
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter#retrieveChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.provisional.IChildrenRequestMonitor)
-     */
-    public void retrieveChildren(final Object parent, final IPresentationContext context, final IChildrenRequestMonitor result) {
-		Job job = new Job("Retrieving Children") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				if (!monitor.isCanceled()) {
-					computeChildren(parent, context, result);
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.setRule(getRetrieveChildrenRule(parent, context));
-		job.schedule();
-	}
-    
-    /**
-     * Returns the scheduling rule for jobs retrieving children.
-     * 
-     * @param parent
-     * @param context
-     * @return scheduling rule or <code>null</code>
-     */
-    protected ISchedulingRule getRetrieveChildrenRule(Object parent, IPresentationContext context) {
-    	return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(context);
-    }
-    
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter#isContainer(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.provisional.IContainerRequestMonitor)
-     */
-    public void isContainer(final Object element, final IPresentationContext context, final IContainerRequestMonitor result) {
-		Job job = new Job("Computing hasChildren") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				if (!monitor.isCanceled()) {
-					computeIsContainer(element, context, result);
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.setRule(getIsContainerRule(element, context));
-		job.schedule();
-	}
-    
-    /**
-     * Returns the scheduling rule for jobs determining if an element is a container.
-     * 
-     * @param parent
-     * @param context
-     * @return scheduling rule or <code>null</code>
-     */
-    protected ISchedulingRule getIsContainerRule(Object parent, IPresentationContext context) {
-    	return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(context);
-    }
-    
-    /**
-     * Computes the children for the given parent in the specified context.
-     * 
-     * @param parent parent to retrieve children for
-     * @param context presentation context
-     * @param monitor result to report to
-     */
-    protected void computeChildren(Object parent, IPresentationContext context, IChildrenRequestMonitor monitor) {
-		if (!monitor.isCanceled()) {
-			IStatus status = Status.OK_STATUS;
-			try {
-				if (supportsContext(context)) {
-					monitor.addChildren(getChildren(parent, context));
-				}
-			} catch (CoreException e) {
-				status = e.getStatus();
-			}
-			monitor.setStatus(status);
-			monitor.done();
-		}    	
-    }
-    
-    /**
-     * Computes whether the given element is a container.
-     * 
-     * @param parent potential parent
-     * @param context presentation context
-     * @param monitor result to report to
-     */
-    protected void computeIsContainer(Object parent, IPresentationContext context, IContainerRequestMonitor monitor) {
-		if (!monitor.isCanceled()) {
-			IStatus status = Status.OK_STATUS;
-			try {
-				monitor.setIsContainer(hasChildren(parent, context));
-			} catch (CoreException e) {
-				status = e.getStatus();
-			}
-			monitor.setStatus(status);
-			monitor.done();
-		}    	
-    }    
-        
-    /**
-     * Returns the children for the given parent in the specified context.
-     * 
-     * @param parent element to retrieve children for
-     * @param context context children will be presented in
-     * @return children
-     * @throws CoreException if an exception occurs retrieving children
-     */
-    protected abstract Object[] getChildren(Object parent, IPresentationContext context) throws CoreException;
-    
-    /**
-     * Returns whether the given element has children in the specified context.
-     * 
-     * @param element element that may have children
-     * @param context context element will be presented in
-     * @return whether the given element has children in the specified context
-     * @throws CoreException if an exception occurs determining whether the
-     *  element has children
-     */
-    protected abstract boolean hasChildren(Object element, IPresentationContext context) throws CoreException;    
-
-    /**
-     * Returns whether this adapter supports the given context.
-     * 
-     * @param context
-     * @return whether this adapter supports the given context
-     */
-    protected boolean supportsContext(IPresentationContext context) {
-		return supportsPartId(context.getId());
-    }
-    
-    /**
-     * Returns whether this adapter provides content in the specified part.
-     * 
-     * @param id part id
-     * @return whether this adapter provides content in the specified part
-     */
-    protected abstract boolean supportsPartId(String id);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AsynchronousLabelAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AsynchronousLabelAdapter.java
deleted file mode 100644
index 9ce1554..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/AsynchronousLabelAdapter.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.viewers.provisional;
-
-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.Job;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousSchedulingRuleFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.views.launch.DebugElementHelper;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Abstract implementation of an asynchronous label adapter
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.2
- */
-public abstract class AsynchronousLabelAdapter implements IAsynchronousLabelAdapter {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.IAsynchronousLabelAdapter#retrieveLabel(java.lang.Object, org.eclipse.debug.ui.viewers.IPresentationContext, org.eclipse.debug.ui.viewers.ILabelRequestMonitor)
-	 */
-	public void retrieveLabel(final Object element, final IPresentationContext context, final ILabelRequestMonitor result) {
-		Job job = null;
-		if (requiresUIJob(element)) {
-			job = new UIJob("Retrieving labels") { //$NON-NLS-1$
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					computeLabels(element, context, result);
-					return Status.OK_STATUS;
-				}
-			};
-		} else {
-			job = new Job("Retrieving labels") { //$NON-NLS-1$
-				protected IStatus run(IProgressMonitor monitor) {
-					computeLabels(element, context, result);
-					return Status.OK_STATUS;
-				}
-			};
-		}
-		job.setSystem(true);
-		job.setRule(getLabelRule(element, context));
-		job.schedule();
-	}
-	
-    /**
-     * Returns the scheduling rule for label jobs.
-     * 
-     * @param element
-     * @param context
-     * @return scheduling rule or <code>null</code>
-     */
-    protected ISchedulingRule getLabelRule(Object element, IPresentationContext context) {
-    	return AsynchronousSchedulingRuleFactory.getDefault().newSerialPerObjectRule(context);
-    }
-	
-	/**
-	 * Returns whether this label adapter requires to be run in the UI thread.
-	 * By default, label jobs are not run in the UI thread. Subclasses should
-	 * override if required.
-	 * 
-	 * @return whether this label adapter requires to be run in the UI thread.
-	 */
-	protected boolean requiresUIJob(Object object) {
-		return !DebugElementHelper.isInitialized(object);
-	}
-	
-	/**
-	 * Computes label attributes for the given element in the specified context.
-	 * 
-	 * @param element element to compute label for
-	 * @param context presentation context
-	 * @param result monitor to report results to
-	 */
-	protected void computeLabels(Object element, IPresentationContext context, ILabelRequestMonitor monitor) {
-		if (!monitor.isCanceled()) {
-			IStatus status = Status.OK_STATUS;
-			try {
-				monitor.setLabels(getLabels(element, context));
-				if (!monitor.isCanceled()) {
-					monitor.setImageDescriptors(getImageDescriptors(element, context));
-				}
-				if (!monitor.isCanceled()) {
-					monitor.setFontDatas(getFontDatas(element, context));
-				}
-				if (!monitor.isCanceled()) {
-					monitor.setBackgrounds(getBackgrounds(element, context));
-				}
-				if (!monitor.isCanceled()) {
-					monitor.setForegrounds(getForegrounds(element, context));
-				}
-			} catch (CoreException e) {
-				status = e.getStatus();
-			}
-			if (!monitor.isCanceled()) {
-				monitor.setStatus(status);
-				monitor.done();
-			}
-		}
-	}	
-	
-	/**
-	 * Returns a label for the give element in the specified context.
-	 * 
-	 * @param element element to compute label for
-	 * @param context presentation context
-	 * @return label
-	 * @exception CoreException if an exception occurs computing label
-	 */
-    protected abstract String[] getLabels(Object element, IPresentationContext context) throws CoreException;
-    
-    /**
-     * Returns an image descriptor for the given element in the specified context
-     * or <code>null</code>.
-     * 
-     * @param element element to compute image descriptor for
-     * @param context presentation context
-     * @return image descriptor or <code>null</code>
-     * @throws CoreException if an exception occurs computing image descriptor
-     */
-    protected abstract ImageDescriptor[] getImageDescriptors(Object element, IPresentationContext context) throws CoreException;
-    
-    /**
-     * Returns font data for the given element in the specified context or <code>null</code>
-     * to use the default font.
-     * 
-     * @param element element to compute font data for
-     * @param context presentation context
-     * @return font data or <code>null</code>
-     * @throws CoreException if an exception occurs computing font data
-     */
-    protected abstract FontData[] getFontDatas(Object element, IPresentationContext context) throws CoreException;
-    
-    /**
-     * Returns a foreground color for the given element in the specified context or <code>null</code>
-     * to use the default color.
-     * 
-     * @param element element to compute color for
-     * @param context presentation context
-     * @return color or <code>null</code>
-     * @throws CoreException if an exception occurs computing color
-     */
-    protected abstract RGB[] getForegrounds(Object element, IPresentationContext context) throws CoreException;
-    
-    /**
-     * Returns a background color for the given element in the specified context or <code>null</code>
-     * to use the default color.
-     * 
-     * @param element element to compute color for
-     * @param context presentation context
-     * @return color or <code>null</code>
-     * @throws CoreException if an exception occurs computing color
-     */
-    protected abstract RGB[] getBackgrounds(Object element, IPresentationContext context) throws CoreException;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IAsynchronousContentAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IAsynchronousContentAdapter.java
deleted file mode 100644
index faf3f89..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IAsynchronousContentAdapter.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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-
-/**
- * Provides content for elements in an asynchronous viewer. Note that implementations
- * must provide content asynchronously. 
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- */
-public interface IAsynchronousContentAdapter {
-
-    /**
-     * Asynchronously retrieves the children of the given parent reporting to the
-     * given monitor. If unable to retrieve children, an exception should be reported
-     * to the monitor with an appropriate status.
-     * 
-     * @param parent the element to retrieve children for
-     * @param context the context in which children have been requested
-     * @param monitor request monitor to report children to
-     */
-    public void retrieveChildren(Object parent, IPresentationContext context, IChildrenRequestMonitor result);
-    
-    /**
-     * Asynchronously determines whether the given element contains children in the specified
-     * context reporting the result to the given monitor. If unable to determine
-     * whether the element has children, an exception should be reported to the monitor
-     * with an appropriate status.
-     * 
-     * @param element the element on which children may exist 
-     * @param context the context in which children may exist
-     * @param monitor request monitor to report the result to
-     */
-    public void isContainer(Object element, IPresentationContext context, IContainerRequestMonitor result);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IAsynchronousLabelAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IAsynchronousLabelAdapter.java
deleted file mode 100644
index d17025d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IAsynchronousLabelAdapter.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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-
-/**
- * Provides labels for elements. Note that implementations
- * are must provide labels asynchronously. 
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- */
-public interface IAsynchronousLabelAdapter {
-    
-    /**
-     * Asynchronously retrieves the label of the given object reporting to
-     * the given monitor. If unable to retrieve label information, an exception should be
-     * reported to the monitor with an appropriate status.
-     *  
-     * @param object the element for which a label is requested
-     * @param context the context in which the label has been requested
-     * @param monitor request monitor to report the result to
-     */
-    public void retrieveLabel(Object object, IPresentationContext context, ILabelRequestMonitor result);
-    
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IChildrenRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IChildrenRequestMonitor.java
deleted file mode 100644
index 7b41a6c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IChildrenRequestMonitor.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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-
-/**
- * A request monitor that collects children from an asynchronous tree content adapter.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @since 3.2
- */
-public interface IChildrenRequestMonitor extends IStatusMonitor {
-
-	/**
-	 * Adds the given child to this request.
-	 * 
-	 * @param child child to add
-	 */
-    public void addChild(Object child);
-    
-    /**
-     * Adds the given children to this request.
-     * 
-     * @param children children to add
-     */
-    public void addChildren(Object[] children);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IContainerRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IContainerRequestMonitor.java
deleted file mode 100644
index a73b6bf..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/IContainerRequestMonitor.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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-
-/**
- * A request monitor that collects whether an element contains
- * children.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @since 3.2
- */
-public interface IContainerRequestMonitor extends IStatusMonitor {
-
-	/**
-	 * Sets whether an element contains children.
-	 * 
-	 * @param container whether an element contains children
-	 */
-    public void setIsContainer(boolean container);
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/ILabelRequestMonitor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/ILabelRequestMonitor.java
deleted file mode 100644
index eb8a93f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/provisional/ILabelRequestMonitor.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.debug.internal.ui.viewers.provisional;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * A request monitor that collects attributes of a element's
- * label.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @since 3.2
- */
-public interface ILabelRequestMonitor extends IStatusMonitor {
-
-	/**
-	 * Sets the text of the label. Cannot be <code>null</code>.
-	 * 
-	 * @param text
-	 */
-    public void setLabels(String[] text);
-    
-    /**
-     * Sets the font of the label.
-     * 
-     * @param fontData
-     */
-    public void setFontDatas(FontData[] fontData);
-    
-    /**
-     * Sets the image of the label.
-     * 
-     * @param image
-     */
-    public void setImageDescriptors(ImageDescriptor[] image);
-    
-    /**
-     * Sets the foreground color of the label.
-     * 
-     * @param foreground
-     */
-    public void setForegrounds(RGB[] foreground);
-    
-    /**
-     * Sets the background color of the label.
-     * 
-     * @param background
-     */
-    public void setBackgrounds(RGB[] background);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugEventHandler.java
deleted file mode 100644
index cd8d568..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugEventHandler.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-/**
- * Handles debug events for an event update policy in a viewer.
- * 
- * @since 3.2
- */
-public abstract class DebugEventHandler {
-	
-	private AbstractModelProxy fModelProxy;	
-
-	/**
-	 * Constructs an event handler for the given model proxy.
-	 * 
-	 * @param policy
-	 */
-	public DebugEventHandler(AbstractModelProxy proxy) {
-		fModelProxy = proxy;
-	}
-	
-	/**
-	 * Disposes this event handler
-	 */
-	public synchronized void dispose() {
-		fModelProxy = null;
-	}
-		
-	/**
-	 * Returns the model proxy this event handler working for,
-	 * or <code>null</code> if disposed.
-	 * 
-	 * @return
-	 */
-	protected synchronized AbstractModelProxy getModelProxy() {
-		return fModelProxy;
-	}
-
-	/**
-	 * Returns whether this event handler handles the given event
-	 * 
-	 * @param event event to handle
-	 * @return whether this event handler handles the given event
-	 */
-	protected abstract boolean handlesEvent(DebugEvent event);
-	
-	/**
-	 * Handles a create event. 
-	 * 
-	 * @param event
-	 */
-	protected void handleCreate(DebugEvent event) {
-		refreshRoot(event);
-	}
-		
-	/**
-	 * Handles a terminate event.
-	 * 
-	 * @param event
-	 */
-	protected void handleTerminate(DebugEvent event) {
-		refreshRoot(event);
-	}
-	
-	/**
-	 * Handles a suspend event.
-	 * 
-	 * @param event
-	 */	
-	protected void handleSuspend(DebugEvent event) {
-		refreshRoot(event);
-	}
-	
-	/**
-	 * Handles a resume event for which a suspend is expected shortly (<500ms).
-	 * 
-	 * @param event
-	 */
-	protected void handleResumeExpectingSuspend(DebugEvent event) {
-		// do nothing unless the suspend times out
-	}
-	
-	/**
-	 * Handles a resume event that is not expecting an immediate suspend event
-	 * 
-	 * @param event
-	 */
-	protected void handleResume(DebugEvent event) {
-		refreshRoot(event);
-	}
-	
-	/**
-	 * Handles a change event. 
-	 * 
-	 * @param event
-	 */
-	protected void handleChange(DebugEvent event) {
-		refreshRoot(event);
-	}	
-
-	/**
-	 * Handles an unknown event.
-	 * 
-	 * @param event
-	 */
-	protected void handleOther(DebugEvent event) {
-		refreshRoot(event);
-	}
-	
-	/**
-	 * Notification that a pending suspend event was not received for the given
-	 * resume event within the timeout period.
-	 * 
-	 * @param resume resume event with missing suspend event
-	 */
-	protected void handleSuspendTimeout(DebugEvent event) {
-		refreshRoot(event);
-	}
-	
-	/**
-	 * Handles the given suspend event which caused a timeout. It is
-	 * parired with its original resume event.
-	 * 
-	 * @param suspend suspend event
-	 * @param resume resume event
-	 */
-	protected void handleLateSuspend(DebugEvent suspend, DebugEvent resume) {
-		refreshRoot(suspend);
-	}
-
-	/**
-	 * Fires a model delta to indicate that the launch manager should be refreshed.
-	 * Subclasses should override individual handle events to provide deltas that
-	 * better reflect the actual change in the model.
-	 */
-	protected void refreshRoot(DebugEvent event) {
-		ModelDelta delta = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.CONTENT);
-		fireDelta(delta);
-	}
-	
-	/**
-	 * Fires the given delta, unless this handler has been disposed.
-	 * 
-	 * @param delta
-	 */
-	protected void fireDelta(IModelDelta delta) {
-		AbstractModelProxy modelProxy = getModelProxy();
-		if (modelProxy != null) {
-			modelProxy.fireModelChanged(delta);
-		}
-	}
-	
-	/**
-	 * Returns whether this handler has been disposed.
-	 * 
-	 * @return whether this handler has been disposed
-	 */
-	protected synchronized boolean isDisposed() {
-		return fModelProxy == null;
-	}
-	
-	protected int indexOf(Object[] list, Object element) {
-		for (int i = 0; i < list.length; i++) {
-			if (element.equals(list[i])) {
-				return i;
-			}
-		}
-		return -1;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugTargetEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugTargetEventHandler.java
deleted file mode 100644
index 86eaaa1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugTargetEventHandler.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-
-/**
- * @since 3.2
- */
-public class DebugTargetEventHandler extends DebugEventHandler {
-
-	/**
-	 * Constructs an event handler for a debug target on the given viewer.
-	 * 
-	 * @param viewer
-	 */
-	public DebugTargetEventHandler(AbstractModelProxy proxy) {
-		super(proxy);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handlesEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected boolean handlesEvent(DebugEvent event) {
-		return event.getSource() instanceof IDebugTarget;
-	}
-
-	protected void handleChange(DebugEvent event) {
-		int flags = IModelDelta.STATE;
-		if (event.getDetail() == DebugEvent.CONTENT) {
-			flags = flags | IModelDelta.CONTENT;
-		}
-		fireDelta((IDebugTarget) event.getSource(), flags);
-	}
-
-	protected void handleCreate(DebugEvent event) {
-        fireDelta((IDebugTarget) event.getSource(), IModelDelta.EXPAND);
-	}
-
-	protected void handleResume(DebugEvent event) {
-		fireDelta((IDebugTarget) event.getSource(), IModelDelta.CONTENT | IModelDelta.STATE | IModelDelta.SELECT);
-	}
-
-	protected void handleSuspend(DebugEvent event) {
-		fireDelta((IDebugTarget) event.getSource(), IModelDelta.CONTENT | IModelDelta.STATE);
-	}
-
-	protected void handleTerminate(DebugEvent event) {
-		fireDelta((IDebugTarget) event.getSource(), IModelDelta.CONTENT | IModelDelta.STATE | IModelDelta.UNINSTALL);
-	}
-
-	private void fireDelta(IDebugTarget target, int flags) {
-		ModelDelta root = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
-		ModelDelta delta = root.addNode(target.getLaunch(), IModelDelta.NO_CHANGE);
-		delta.addNode(target, flags);
-		fireDelta(root);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugTargetProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugTargetProxy.java
deleted file mode 100644
index 8ddaea6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DebugTargetProxy.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Default model proxy for a debug target.
- * 
- * @since 3.2
- */
-public class DebugTargetProxy extends EventHandlerModelProxy {
-
-    private IDebugTarget fDebugTarget;
-
-    public DebugTargetProxy(IDebugTarget target) {
-        fDebugTarget = target;
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		fDebugTarget = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#containsEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected boolean containsEvent(DebugEvent event) {
-        Object source = event.getSource();
-        if (source instanceof IDebugElement) {
-            IDebugTarget debugTarget = ((IDebugElement) source).getDebugTarget();
-            // an expression can return null for debug target
-            if (debugTarget != null) {
-            	return debugTarget.equals(fDebugTarget);
-            }
-        }
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#createEventHandlers()
-     */
-    protected DebugEventHandler[] createEventHandlers() {
-        ThreadEventHandler threadEventHandler = new ThreadEventHandler(this);
-		return new DebugEventHandler[] { new DebugTargetEventHandler(this), threadEventHandler,
-				new StackFrameEventHandler(this, threadEventHandler) };
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelProxy#installed(org.eclipse.jface.viewers.Viewer)
-	 */
-	public void installed(Viewer viewer) {
-		// select any thread that is already suspended after installation
-		IDebugTarget target = fDebugTarget;
-		if (target != null) {
-			try {
-				IThread[] threads = target.getThreads();
-				ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-				ILaunch launch = target.getLaunch();
-				int launchIndex = indexOf(manager.getLaunches(), target.getLaunch());
-				for (int i = 0; i < threads.length; i++) {
-					IThread thread = threads[i];
-					if (thread.isSuspended()) {
-						IStackFrame frame = thread.getTopStackFrame();
-						if (frame != null) {
-							ModelDelta delta = new ModelDelta(manager, IModelDelta.NO_CHANGE);
-							ModelDelta node = delta.addNode(launch, launchIndex, IModelDelta.NO_CHANGE, target.getLaunch().getChildren().length);
-							node = node.addNode(target, 0, IModelDelta.NO_CHANGE, threads.length);
-							node = node.addNode(thread, i, IModelDelta.NO_CHANGE | IModelDelta.EXPAND, thread.getStackFrames().length);
-							node = node.addNode(frame, 0, IModelDelta.NO_CHANGE | IModelDelta.SELECT, 0);
-							fireModelChanged(delta);
-							return;
-						}
-					}
-				}
-				// expand the target if no suspended thread
-				ModelDelta delta = new ModelDelta(manager, IModelDelta.NO_CHANGE);
-				ModelDelta node = delta.addNode(launch, launchIndex, IModelDelta.NO_CHANGE, target.getLaunch().getChildren().length);
-				node = node.addNode(target, 0, IModelDelta.EXPAND | IModelDelta.SELECT, threads.length);
-				fireModelChanged(delta);
-			} catch (DebugException e) {
-			}
-		}
-	}
-    
-    
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultExpressionModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultExpressionModelProxy.java
deleted file mode 100644
index 8c7105a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultExpressionModelProxy.java
+++ /dev/null
@@ -1,65 +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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IVariable;
-
-/**
- * @since 3.2
- *
- */
-public class DefaultExpressionModelProxy extends EventHandlerModelProxy {
-	
-	private IExpression fExpression;
-	
-	public DefaultExpressionModelProxy(IExpression expression) {
-		fExpression = expression;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		fExpression = null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#createEventHandlers()
-	 */
-	protected DebugEventHandler[] createEventHandlers() {
-		return new DebugEventHandler[]{new ExpressionEventHandler(this)};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#containsEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected boolean containsEvent(DebugEvent event) {
-		// handles change events from expressions and debug targets
-		if (event.getSource().equals(fExpression) || event.getSource().equals(fExpression.getDebugTarget())) {
-			return true;
-		}
-		// have to consider change events on variables
-		return event.getKind() == DebugEvent.CHANGE && event.getSource() instanceof IVariable;
-	}
-
-	/**
-	 * Returns this model's expression, or <code>null</code> if disposed.
-	 * 
-	 * @return expression or <code>null</code>
-	 */
-	protected IExpression getExpression() {
-		return fExpression;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultModelProxyFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultModelProxyFactory.java
deleted file mode 100644
index 7892f66..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultModelProxyFactory.java
+++ /dev/null
@@ -1,86 +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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-public class DefaultModelProxyFactory implements IModelProxyFactory {
-
-	public IModelProxy createModelProxy(Object element, IPresentationContext context) {
-		String id = context.getId();
-		if (IDebugUIConstants.ID_DEBUG_VIEW.equals(id)) {
-			if (element instanceof IDebugTarget) {
-				return new DebugTargetProxy((IDebugTarget)element);
-			}
-			if (element instanceof ILaunchManager) {
-				return new LaunchManagerProxy();
-			}
-			if (element instanceof ILaunch) {
-				return new LaunchProxy((ILaunch) element);
-			}
-			if (element instanceof IProcess) {
-				return new ProcessProxy((IProcess)element);
-			}
-		}
-		if (IDebugUIConstants.ID_VARIABLE_VIEW.equals(id)) {
-			if (element instanceof IStackFrame) {
-				return new DefaultVariableViewModelProxy((IStackFrame)element);
-			}
-		}
-		if (IDebugUIConstants.ID_EXPRESSION_VIEW.equals(id)) {
-			if (element instanceof IExpressionManager) {
-				return new ExpressionManagerModelProxy();
-			} 
-			if (element instanceof IWatchExpression) {
-				return new DefaultWatchExpressionModelProxy((IWatchExpression)element);
-			}
-			if (element instanceof IExpression) {
-				return new DefaultExpressionModelProxy((IExpression)element);
-			}
-		}
-		if (IDebugUIConstants.ID_REGISTER_VIEW.equals(id)) {
-			if (element instanceof IStackFrame) {
-				return new DefaultVariableViewModelProxy((IStackFrame)element);
-			}
-		}
-		if (IDebugUIConstants.ID_MEMORY_VIEW.equals(id)) {
-			if (element instanceof IMemoryBlockRetrieval)
-				return new MemoryRetrievalProxy((IMemoryBlockRetrieval)element);
-		}
-		
-		if (context instanceof MemoryViewPresentationContext)
-		{
-			if (((MemoryViewPresentationContext)context).getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				if (element instanceof IMemoryBlock)
-					return new MemoryBlockProxy((IMemoryBlock)element);
-			}
-		}
-		
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultModelSelectionPolicyFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultModelSelectionPolicyFactory.java
deleted file mode 100644
index 6d87308..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultModelSelectionPolicyFactory.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Default factory for selection policies.
- * 
- * @since 3.2
- */
-public class DefaultModelSelectionPolicyFactory implements IModelSelectionPolicyFactory {
-
-	public IModelSelectionPolicy createModelSelectionPolicyAdapter(Object element, IPresentationContext context) {
-		if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {
-			if (element instanceof IDebugElement) {
-				return new DefaultSelectionPolicy((IDebugElement)element);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultSelectionPolicy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultSelectionPolicy.java
deleted file mode 100644
index 5c3f315..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultSelectionPolicy.java
+++ /dev/null
@@ -1,112 +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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Default selection policy for the debug view.
- *  
- * @since 3.2
- */
-public class DefaultSelectionPolicy implements IModelSelectionPolicy {
-	
-	private IDebugElement fDebugElement;
-	
-	/**
-	 * Constructs a new selection policy for the given debug
-	 * element.
-	 * 
-	 * @param element
-	 */
-	public DefaultSelectionPolicy(IDebugElement element) {
-		fDebugElement = element;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.IModelSelectionPolicy#contains(org.eclipse.jface.viewers.ISelection, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	public boolean contains(ISelection selection, IPresentationContext context) {
-		if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection) selection;
-				Object element = ss.getFirstElement();
-				if (element instanceof IDebugElement) {
-					IDebugElement debugElement = (IDebugElement) element;
-					return fDebugElement.getDebugTarget().equals(debugElement.getDebugTarget());
-				}
-			} 
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.IModelSelectionPolicy#overrides(org.eclipse.jface.viewers.ISelection, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	public boolean overrides(ISelection existing, ISelection candidate, IPresentationContext context) {
-		if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {	
-			if (existing instanceof IStructuredSelection && candidate instanceof IStructuredSelection) {
-				IStructuredSelection ssExisting = (IStructuredSelection) existing;
-				IStructuredSelection ssCandidate = (IStructuredSelection) candidate;
-				return overrides(ssExisting.getFirstElement(), ssCandidate.getFirstElement());
-			}
-		}
-		return true;
-	}
-	
-	protected boolean overrides(Object existing, Object candidate) {
-		if (existing == null) {
-			return true;
-		}
-		if (existing.equals(candidate)) {
-			return true;
-		}
-		if (existing instanceof IStackFrame && candidate instanceof IStackFrame) {
-			IStackFrame curr = (IStackFrame) existing;
-			IStackFrame next = (IStackFrame) candidate;
-			return curr.getThread().equals(next.getThread()) || !isSticky(existing);
-		}
-		return !isSticky(existing);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.viewers.IModelSelectionPolicy#isSticky(org.eclipse.jface.viewers.ISelection, org.eclipse.debug.ui.viewers.IPresentationContext)
-	 */
-	public boolean isSticky(ISelection selection, IPresentationContext context) {
-		if (IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {	
-			if (selection instanceof IStructuredSelection) {
-				return isSticky(((IStructuredSelection)selection).getFirstElement());
-			}
-		}
-		return false;
-	}
-	
-	protected boolean isSticky(Object element) {
-		if (element instanceof IStackFrame) {
-			IStackFrame frame = (IStackFrame) element;
-			return frame.isSuspended();
-		}
-		return false;
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy#handleInvalidSelection(org.eclipse.jface.viewers.ISelection, org.eclipse.jface.viewers.ISelection)
-     */
-    public ISelection replaceInvalidSelection(ISelection selection, ISelection newSelection) {
-        return newSelection;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultVariableViewModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultVariableViewModelProxy.java
deleted file mode 100644
index dbab964..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultVariableViewModelProxy.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IStackFrame;
-
-/**
- * Default update for variables view.
- * 
- * @since 3.2
- */
-public class DefaultVariableViewModelProxy extends EventHandlerModelProxy {
-
-	/**
-	 * Root model element for this update policy
-	 */
-	private IStackFrame fFrame;
-
-	/**
-	 * Constructs an update policy on the given target.
-	 * 
-	 * @param target
-	 */
-	public DefaultVariableViewModelProxy(IStackFrame frame) {
-		super();
-		fFrame = frame;
-	}
-
-	public void dispose() {
-		super.dispose();
-		fFrame = null;
-	}
-
-	protected DebugEventHandler[] createEventHandlers() {
-		return new DebugEventHandler[] { new VariablesViewEventHandler(this, fFrame) };
-	}
-	
-   /* (non-Javadoc)
-    * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#containsEvent(org.eclipse.debug.core.DebugEvent)
-    */
-	protected synchronized boolean containsEvent(DebugEvent event) {
-		if (!isDisposed()) {
-	        Object source = event.getSource();
-	        if (source instanceof IDebugElement) {
-	            IDebugTarget debugTarget = ((IDebugElement) source).getDebugTarget();
-	            if (debugTarget != null) {
-	            	// a debug target can be null for an IExpression
-	            	return debugTarget.equals(fFrame.getDebugTarget());
-	            }
-	        }
-		}
-        return false;
-    }
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultWatchExpressionModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultWatchExpressionModelProxy.java
deleted file mode 100644
index 3825d30..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/DefaultWatchExpressionModelProxy.java
+++ /dev/null
@@ -1,130 +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.debug.internal.ui.viewers.update;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Model proxy for the expressions view
- * 
- * @see org.eclipse.debug.internal.ui.views.expression.ExpressionView
- * @see org.eclipse.debug.internal.ui.model.elements.ExpressionContentProvider
- * @see org.eclipse.debug.internal.ui.model.elements.ExpressionsViewMementoProvider
- * 
- * @since 3.2
- */
-public class DefaultWatchExpressionModelProxy extends DefaultExpressionModelProxy implements IDebugContextListener {
-	
-	private IWorkbenchWindow fWindow;
-	
-	public DefaultWatchExpressionModelProxy(IWatchExpression expression) {
-		super(expression);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy#installed(org.eclipse.jface.viewers.Viewer)
-	 */
-	public void installed(final Viewer viewer) {
-		super.installed(viewer);
-		UIJob job = new UIJob("install watch expression model proxy") { //$NON-NLS-1$
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench().getWorkbenchWindows();
-				for (int i = 0; i < workbenchWindows.length; i++) {
-					IWorkbenchWindow window = workbenchWindows[i];
-					if (viewer.getControl().getShell().equals(window.getShell())) {
-						fWindow = window;
-						break;
-					}
-				}
-				if (fWindow == null) {
-					fWindow = DebugUIPlugin.getActiveWorkbenchWindow();
-				}
-				IDebugContextService contextService = DebugUITools.getDebugContextManager().getContextService(fWindow);
-				contextService.addDebugContextListener(DefaultWatchExpressionModelProxy.this);
-				ISelection activeContext = contextService.getActiveContext();
-				if (activeContext != null) {
-					contextActivated(activeContext);
-				}
-				return Status.OK_STATUS;
-			}
-		
-		};
-		job.setSystem(true);
-		job.schedule();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DefaultExpressionModelProxy#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		DebugUITools.getDebugContextManager().getContextService(fWindow).removeDebugContextListener(this);
-		fWindow = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#createEventHandlers()
-	 */
-	protected DebugEventHandler[] createEventHandlers() {
-		return new DebugEventHandler[]{new ExpressionEventHandler(this)};
-	}
-
-	/**
-	 * Handles the activation of the specified debug context (i.e. the selection)
-	 * @param selection the specified context to 'activate'
-	 */
-	protected void contextActivated(ISelection selection) {
-		if (fWindow != null) {
-			if (selection instanceof IStructuredSelection) {
-				IDebugElement context = null;
-				IStructuredSelection ss = (IStructuredSelection)selection;
-				if (ss.size() < 2) {
-					Object object = ss.getFirstElement();
-					if (object instanceof IDebugElement) {
-						context= (IDebugElement) object;
-					} else if (object instanceof ILaunch) {
-						context= ((ILaunch) object).getDebugTarget();
-					}
-				}
-				IWatchExpression expression = (IWatchExpression)getExpression();
-				if (expression != null){
-					expression.setExpressionContext(context);
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextListener#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			contextActivated(event.getContext());
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/EventHandlerModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/EventHandlerModelProxy.java
deleted file mode 100644
index d2ec1d9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/EventHandlerModelProxy.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.update;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-/**
- * @since 3.2
- */
-public abstract class EventHandlerModelProxy extends AbstractModelProxy implements IDebugEventSetListener {
-
-    /**
-     * Map of elements to timer tasks
-     */
-    private Map fTimerTasks = new HashMap();
-
-    /**
-     * Timer for timer tasks
-     */
-    private Timer fTimer = new Timer(true);
-
-    /**
-     * Map of event source to resume events with a pending suspend that timed
-     * out.
-     */
-    private Map fPendingSuspends = new HashMap();
-
-    /**
-     * Event handlers for specific elements
-     */
-    private DebugEventHandler[] fHandlers = new DebugEventHandler[0];
-
-    /**
-     * Task used to update an element that resumed for a step or evaluation that
-     * took too long to suspend.
-     */
-    private class PendingSuspendTask extends TimerTask {
-
-        private DebugEvent fEvent;
-
-        private DebugEventHandler fHandler;
-
-        /**
-         * Resume event for which there is a pending suspend.
-         * 
-         * @param resume
-         *            event
-         */
-        public PendingSuspendTask(DebugEventHandler handler, DebugEvent resume) {
-            fHandler = handler;
-            fEvent = resume;
-        }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see java.util.TimerTask#run()
-         */
-        public void run() {
-            synchronized (fPendingSuspends) {
-                fPendingSuspends.put(fEvent.getSource(), fEvent);
-            }
-            dispatchSuspendTimeout(fHandler, fEvent);
-        }
-
-    }
-
-    /**
-     * Adds the given handler to this event update policy.
-     * 
-     * @param handler
-     */
-    protected abstract DebugEventHandler[] createEventHandlers();
-
-    public synchronized void dispose() {
-    	super.dispose();
-        fTimer.cancel();
-        fTimerTasks.clear();
-        DebugPlugin.getDefault().removeDebugEventListener(this);
-        for (int i = 0; i < fHandlers.length; i++) {
-            DebugEventHandler handler = fHandlers[i];
-            handler.dispose();
-        }
-    }
-
-    public void init(IPresentationContext context) {
-    	super.init(context);
-        DebugPlugin.getDefault().addDebugEventListener(this);
-        fHandlers = createEventHandlers();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-     */
-    public final void handleDebugEvents(DebugEvent[] events) {
-        if (isDisposed()) {
-            return;
-        }
-        for (int i = 0; i < events.length; i++) {
-            DebugEvent event = events[i];
-            if (containsEvent(event)) {
-                for (int j = 0; j < fHandlers.length; j++) {
-                    DebugEventHandler handler = fHandlers[j];
-                    if (isDisposed()) {
-                    	return;
-                    }
-                    if (handler.handlesEvent(event)) {
-                        switch (event.getKind()) {
-	                        case DebugEvent.CREATE:
-	                            dispatchCreate(handler, event);
-	                            break;
-	                        case DebugEvent.TERMINATE:
-	                            dispatchTerminate(handler, event);
-	                            break;
-	                        case DebugEvent.SUSPEND:
-	                            dispatchSuspend(handler, event);
-	                            break;
-	                        case DebugEvent.RESUME:
-	                            dispatchResume(handler, event);
-	                            break;
-	                        case DebugEvent.CHANGE:
-	                            dispatchChange(handler, event);
-	                            break;
-	                        default:
-	                            dispatchOther(handler, event);
-	                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    protected boolean containsEvent(DebugEvent event) {
-        return true;
-    }
-
-    /**
-     * Dispatches a create event.
-     * 
-     * @param event
-     */
-    protected void dispatchCreate(DebugEventHandler handler, DebugEvent event) {
-        handler.handleCreate(event);
-    }
-
-    /**
-     * Dispatches a terminate event.
-     * 
-     * @param event
-     */
-    protected void dispatchTerminate(DebugEventHandler handler, DebugEvent event) {
-        handler.handleTerminate(event);
-    }
-
-    /**
-     * Dispatches a suspend event. Subclasses may override.
-     * 
-     * @param event
-     */
-    protected void dispatchSuspend(DebugEventHandler handler, DebugEvent event) {
-        // stop timer, if any
-        synchronized (this) {
-            TimerTask task = (TimerTask) fTimerTasks.remove(event.getSource());
-            if (task != null) {
-                task.cancel();
-            }
-        }
-        DebugEvent resume = null;
-        synchronized (this) {
-            resume = (DebugEvent) fPendingSuspends.remove(event.getSource());
-        }
-        if (resume == null) {
-            handler.handleSuspend(event);
-        } else {
-            handler.handleLateSuspend(event, resume);
-        }
-    }
-
-    /**
-     * Dispatches a resume event. By default, if the resume is for an evaluation
-     * or a step, a timer is started to update the event source if the step or
-     * evaluation takes more than 500ms. Otherwise the source is refreshed.
-     * Subclasses may override.
-     * 
-     * @param event
-     */
-    protected void dispatchResume(DebugEventHandler handler, DebugEvent event) {
-        if (event.isEvaluation() || event.isStepStart()) {
-            // start a timer to update if the corresponding suspend does not
-            // come quickly
-        	synchronized (this) {
-        		if (!isDisposed()) {
-                    PendingSuspendTask task = new PendingSuspendTask(handler, event);
-                    fTimerTasks.put(event.getSource(), task);
-                    fTimer.schedule(task, 500);
-        		}
-			}
-        	if (!isDisposed()) {
-        		handler.handleResumeExpectingSuspend(event);
-        	}
-        } else {
-            handler.handleResume(event);
-        }
-    }
-
-    /**
-     * Dispatches a change event.
-     * 
-     * @param event
-     */
-    protected void dispatchChange(DebugEventHandler handler, DebugEvent event) {
-        handler.handleChange(event);
-    }
-
-    /**
-     * Dispatches an unknown event.
-     * 
-     * @param event
-     */
-    protected void dispatchOther(DebugEventHandler handler, DebugEvent event) {
-        handler.handleOther(event);
-    }
-
-    /**
-     * Notification that a pending suspend event was not received for the given
-     * resume event and handler within the timeout period.
-     * 
-     * @param resume
-     *            resume event with missing suspend event
-     */
-    protected void dispatchSuspendTimeout(DebugEventHandler handler, DebugEvent resume) {
-        handler.handleSuspendTimeout(resume);
-    }
-    
-    /**
-     * Returns the index of the given element in the list or -1 if
-     * not present.
-     * 
-     * @param list
-     * @param element
-     * @return index or -1 if not present
-     */
-	protected int indexOf(Object[] list, Object element) {
-		for (int i = 0; i < list.length; i++) {
-			if (element.equals(list[i])) {
-				return i;
-			}
-		}
-		return -1;
-	}    
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ExpressionEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ExpressionEventHandler.java
deleted file mode 100644
index 9a2f40b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ExpressionEventHandler.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-/**
- * Event handler for an expression.
- * 
- * @since 3.2
- *
- */
-public class ExpressionEventHandler extends DebugEventHandler {
-
-    public ExpressionEventHandler(AbstractModelProxy proxy) {
-        super(proxy);
-    }
-
-    protected boolean handlesEvent(DebugEvent event) {
-        return event.getKind() == DebugEvent.CHANGE;
-    }
-
-    protected void handleChange(DebugEvent event) {
-    	ModelDelta delta = new ModelDelta(DebugPlugin.getDefault().getExpressionManager(), IModelDelta.NO_CHANGE);
-		IExpression expression = null;
-    	if (event.getSource() instanceof IExpression) {
-    		expression = (IExpression) event.getSource();
-		} else {
-			IModelProxy modelProxy = getModelProxy();
-			if (modelProxy instanceof DefaultExpressionModelProxy) {
-				DefaultExpressionModelProxy proxy = (DefaultExpressionModelProxy) modelProxy;
-				expression = proxy.getExpression();
-			}
-		}
-    	if (expression != null) {
-    		int flags = IModelDelta.NO_CHANGE;
-    		if ((event.getDetail() & DebugEvent.STATE) != 0) {
-    			flags = flags | IModelDelta.STATE;
-    		}
-    		if ((event.getDetail() & DebugEvent.CONTENT) != 0) {
-    			flags = flags | IModelDelta.CONTENT;
-    		} 
-	    	delta.addNode(expression, flags);
-			fireDelta(delta);
-    	}
-    }
-
-    protected void refreshRoot(DebugEvent event) {
-        ModelDelta delta = new ModelDelta(DebugPlugin.getDefault().getExpressionManager(), IModelDelta.CONTENT);
-        fireDelta(delta);
-    }
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ExpressionManagerModelProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ExpressionManagerModelProxy.java
deleted file mode 100644
index 686cd0d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ExpressionManagerModelProxy.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
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.internal.core.IExpressionsListener2;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-import org.eclipse.jface.viewers.Viewer;
-
-
-/**
- * Model proxy that fires model delta updates for the ExpressionManager.
- * 
- * @see org.eclipse.debug.internal.core.ExpressionManager
- */
-public class ExpressionManagerModelProxy extends AbstractModelProxy implements IExpressionsListener2 {
-        
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#init(org.eclipse.debug.internal.ui.viewers.IPresentationContext)
-	 */
-	public void init(IPresentationContext context) {
-		super.init(context);
-		getExpressionManager().addExpressionListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy#installed(org.eclipse.jface.viewers.Viewer)
-	 */
-	public void installed(Viewer viewer) {
-		updateExpressions(getExpressionManager().getExpressions(), IModelDelta.INSTALL);
-	}
-
-	/**
-	 * @return the default expression manager from the debug plugin
-	 */
-	protected IExpressionManager getExpressionManager() {
-		return DebugPlugin.getDefault().getExpressionManager();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		getExpressionManager().removeExpressionListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.IExpressionsListener2#expressionsMoved(org.eclipse.debug.core.model.IExpression[], int)
-	 */
-	public void expressionsMoved(IExpression[] expressions, int index){
-		ModelDelta delta = new ModelDelta(getExpressionManager(), IModelDelta.NO_CHANGE);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			delta.addNode(expression, IModelDelta.REMOVED);
-		}
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			delta.addNode(expression, index+i, IModelDelta.INSERTED);
-		}
-		fireModelChanged(delta);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.IExpressionsListener2#expressionsInserted(org.eclipse.debug.core.model.IExpression[], int)
-	 */
-	public void expressionsInserted(IExpression[] expressions, int index){
-		ModelDelta delta = new ModelDelta(getExpressionManager(), IModelDelta.NO_CHANGE);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			delta.addNode(expression, index+i, IModelDelta.INSERTED | IModelDelta.INSTALL);
-		}
-		fireModelChanged(delta);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsAdded(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsAdded(IExpression[] expressions) {
-		updateExpressions(expressions, IModelDelta.ADDED | IModelDelta.INSTALL);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsRemoved(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsRemoved(IExpression[] expressions) {
-		updateExpressions(expressions, IModelDelta.REMOVED | IModelDelta.UNINSTALL);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IExpressionsListener#expressionsChanged(org.eclipse.debug.core.model.IExpression[])
-	 */
-	public void expressionsChanged(IExpression[] expressions) {
-		updateExpressions(expressions, IModelDelta.CONTENT | IModelDelta.STATE);		
-	}
-    
-    private void updateExpressions(IExpression[] expressions, int flags) {
-		ModelDelta delta = new ModelDelta(getExpressionManager(), IModelDelta.NO_CHANGE);
-		for (int i = 0; i < expressions.length; i++) {
-			IExpression expression = expressions[i];
-			delta.addNode(expression, flags);
-		}
-		fireModelChanged(delta);
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java
deleted file mode 100644
index 29dba02..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Model proxy for launch manager.
- */
-public class LaunchManagerProxy extends AbstractModelProxy implements ILaunchesListener2 {
-
-	private ILaunchManager fLaunchManager;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AbstractModelProxy#init(org.eclipse.debug.internal.ui.viewers.IPresentationContext)
-	 */
-	public void init(IPresentationContext context) {
-		super.init(context);
-		fLaunchManager = DebugPlugin.getDefault().getLaunchManager();
-		fLaunchManager.addLaunchListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy#installed(org.eclipse.jface.viewers.Viewer)
-	 */
-	public void installed(Viewer viewer) {
-		// expand existing launches
-		ILaunch[] launches = fLaunchManager.getLaunches();
-		launchesAdded(launches);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AbstractModelProxy#dispose()
-	 */
-	public void dispose() {	
-		super.dispose();
-		fLaunchManager.removeLaunchListener(this);
-		fLaunchManager = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {
-		fireDelta(launches, IModelDelta.REMOVED);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-		fireDelta(launches, IModelDelta.ADDED | IModelDelta.INSTALL | IModelDelta.EXPAND);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {	
-	}
-	
-	/**
-	 * Convenience method for firing a delta 
-	 * @param launches the launches to set in the delta
-	 * @param launchFlags the flags for the delta
-	 */
-	protected void fireDelta(ILaunch[] launches, int launchFlags) {
-		ModelDelta delta = new ModelDelta(fLaunchManager, IModelDelta.NO_CHANGE);
-		for (int i = 0; i < launches.length; i++) {
-			delta.addNode(launches[i], launchFlags);	
-		}
-		fireModelChanged(delta);		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchProxy.java
deleted file mode 100644
index cde4632..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchProxy.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.debug.internal.ui.viewers.update;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Model proxy for launch object.
- * 
- * @since 3.3
- */
-public class LaunchProxy extends AbstractModelProxy implements ILaunchesListener2 {
-
-	private ILaunch fLaunch;
-	
-	/**
-	 * Set of launch's previous children. When a child is added,
-	 * its model proxy is installed.
-	 */
-	private Set fPrevChildren = new HashSet(); 
-
-	/**
-	 * Constructs a new model proxy for the given launch.
-	 * 
-	 * @param launch
-	 */
-	public LaunchProxy(ILaunch launch) {
-		fLaunch = launch;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AbstractModelProxy#init(org.eclipse.debug.internal.ui.viewers.IPresentationContext)
-	 */
-	public void init(IPresentationContext context) {
-		super.init(context);
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy#installed(org.eclipse.jface.viewers.Viewer)
-	 */
-	public void installed(Viewer viewer) {
-		// install model proxies for existing children
-		installModelProxies();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AbstractModelProxy#dispose()
-	 */
-	public void dispose() {	
-		super.dispose();
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-		fPrevChildren.clear();
-		fLaunch = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-		for (int i = 0; i < launches.length; i++) {
-			if (launches[i] == fLaunch) {
-				fireDelta(IModelDelta.STATE | IModelDelta.CONTENT | IModelDelta.UNINSTALL);
-			}
-		}		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {
-		for (int i = 0; i < launches.length; i++) {
-			if (launches[i] == fLaunch) {
-				fireDelta(IModelDelta.STATE | IModelDelta.CONTENT);
-				installModelProxies();
-			}
-		}
-	}
-	
-	/**
-	 * Installs model proxies for any new children in the given launch.
-	 * 
-	 * @param launch
-	 */
-	protected void installModelProxies() {
-		boolean changes = false;
-		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-		ILaunch[] allLaunches = manager.getLaunches();
-		ModelDelta root = new ModelDelta(manager, 0, IModelDelta.NO_CHANGE, allLaunches.length);
-		Object[] children = fLaunch.getChildren();
-		ModelDelta launchDelta = root.addNode(fLaunch, indexOf(fLaunch, allLaunches), IModelDelta.EXPAND, children.length);
-		for (int j = 0; j < children.length; j++) {
-			Object child = children[j];
-			if (fPrevChildren.add(child)) {
-				changes = true;
-				launchDelta.addNode(child, indexOf(child, children), IModelDelta.INSTALL, -1);
-			}
-		}
-		if (changes) {
-			fireModelChanged(root);
-		}
-	}
-	
-	/**
-	 * Finds the index of the selected element in the given list
-	 * @param element the element to get the index for
-	 * @param list the list to search for the index
-	 * @return the index of the specified element in the given array or -1 if not found
-	 */
-	protected int indexOf(Object element, Object[] list) {
-		for (int i = 0; i < list.length; i++) {
-			if (element == list[i]) {
-				return i;
-			}
-		}
-		return -1;
-	}
-	
-	/**
-	 * Convenience method to fire a delta
-	 * @param flags the flags to set on the delta
-	 */
-	protected void fireDelta(int flags) {
-		ModelDelta delta = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
-		delta.addNode(fLaunch, flags);	
-		fireModelChanged(delta);		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/MemoryBlockProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/MemoryBlockProxy.java
deleted file mode 100644
index 95c1c56..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/MemoryBlockProxy.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-
-public class MemoryBlockProxy extends EventHandlerModelProxy  {
-	
-	private IMemoryBlock fMemoryBlock;
-	private DebugEventHandler fDebugEventHandler = new DebugEventHandler(this)  {
-
-		protected boolean handlesEvent(DebugEvent event) {
-			if (event.getKind() == DebugEvent.CHANGE && event.getSource() == fMemoryBlock)
-				return true;
-			
-			Object src = event.getSource();
-			if (src instanceof IDebugElement)
-			{
-				if (event.getKind() == DebugEvent.SUSPEND && ((IDebugElement)src).getDebugTarget() == fMemoryBlock.getDebugTarget())
-					return true;
-			}
-			return false;
-		}
-
-		protected void handleChange(DebugEvent event) {
-			if (event.getDetail() == DebugEvent.STATE)
-			{	
-				ModelDelta delta = new ModelDelta(fMemoryBlock, IModelDelta.STATE);
-				fireModelChanged(delta);
-			}
-			else
-			{
-				ModelDelta delta = new ModelDelta(fMemoryBlock, IModelDelta.CONTENT);
-				fireModelChanged(delta);
-			}
-		}
-
-		protected void handleSuspend(DebugEvent event) {
-			ModelDelta delta = new ModelDelta(fMemoryBlock, IModelDelta.CONTENT);
-			fireModelChanged(delta);
-		}
-
-		public synchronized void dispose() {
-			super.dispose();
-		}};
-	
-	public MemoryBlockProxy(IMemoryBlock mb)
-	{
-		fMemoryBlock = mb;
-	}
-
-
-	protected DebugEventHandler[] createEventHandlers() {
-		return new DebugEventHandler[]{fDebugEventHandler};
-	}
-
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/MemoryRetrievalProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/MemoryRetrievalProxy.java
deleted file mode 100644
index e36cc47..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/MemoryRetrievalProxy.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
- 
-package org.eclipse.debug.internal.ui.viewers.update;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-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.jface.viewers.Viewer;
-import org.eclipse.ui.progress.UIJob;
-
-public class MemoryRetrievalProxy extends AbstractModelProxy implements IMemoryBlockListener {
-	private IMemoryBlockRetrieval fRetrieval;
-
-	public MemoryRetrievalProxy(IMemoryBlockRetrieval retrieval)
-	{
-		fRetrieval = retrieval;
-	
-	}
-	
-	public void memoryBlocksAdded(IMemoryBlock[] memory) {
-		IMemoryBlock[] allMB = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(fRetrieval);
-		int lastIndex = allMB.length - memory.length;
-		ModelDelta delta = new ModelDelta(fRetrieval, 0, IModelDelta.NO_CHANGE, allMB.length);
-		
-		for (int i=0; i<memory.length; i++){
-			IMemoryBlockRetrieval retrieval = (IMemoryBlockRetrieval)memory[i].getAdapter(IMemoryBlockRetrieval.class);
-			if (retrieval == null)
-				retrieval = memory[i].getDebugTarget();
-			
-			if (retrieval != null)
-			{
-				if (retrieval == fRetrieval)
-				{
-					// select the newly added memory block
-					delta.addNode(memory[i], lastIndex+i, IModelDelta.ADDED | IModelDelta.SELECT, 0);
-				}
-			}
-		}
-		
-		fireModelChanged(delta);
-	}
-
-	public void memoryBlocksRemoved(final IMemoryBlock[] memory) {
-		
-		UIJob job = new UIJob("memory blocks removed"){ //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				ModelDelta delta = new ModelDelta(fRetrieval, IModelDelta.NO_CHANGE);
-				
-				// find a memory block to select
-				
-				for (int i=0; i<memory.length; i++){
-					IMemoryBlockRetrieval retrieval = (IMemoryBlockRetrieval)memory[i].getAdapter(IMemoryBlockRetrieval.class);
-					if (retrieval == null)
-						retrieval = memory[i].getDebugTarget();
-					
-					if (retrieval != null)
-					{
-						if (retrieval == fRetrieval)
-						{
-							// do not change selection if the memory block removed is not 
-							// currently selected
-							// #getCurrentSelection must be run on the UI thread
-							if (isMemoryBlockSelected(getCurrentSelection(), memory[i]))
-								addSelectDeltaNode(delta);
-							delta.addNode(memory[i], IModelDelta.REMOVED);
-						}
-					}
-				}
-				
-				fireModelChanged(delta);
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-
-	public void init(IPresentationContext context) {
-		super.init(context);
-		DebugPlugin.getDefault().getMemoryBlockManager().addListener(this);
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		DebugPlugin.getDefault().getMemoryBlockManager().removeListener(this);
-	}
-
-	private void addSelectDeltaNode(ModelDelta delta)
-	{
-		IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(fRetrieval);
-		if (memoryBlocks != null && memoryBlocks.length > 0)
-		{
-			delta.addNode(memoryBlocks[0], IModelDelta.SELECT);
-		}
-	}
-	
-	private IStructuredSelection getCurrentSelection() {
-		Viewer viewer = getViewer();
-		if (viewer instanceof StructuredViewer) {
-			StructuredViewer sv = (StructuredViewer) viewer;
-			ISelection selection = sv.getSelection();
-			if (selection instanceof IStructuredSelection)
-				return (IStructuredSelection)selection;			
-		}
-		return StructuredSelection.EMPTY;
-	}
-	
-	private boolean isMemoryBlockSelected(IStructuredSelection selection, IMemoryBlock memoryBlock)
-	{
-		if (!selection.isEmpty())
-		{
-			Iterator iter = selection.iterator();
-			while (iter.hasNext())
-			{
-				Object sel = iter.next();
-				if (sel == memoryBlock)
-					return true;
-				
-				if (sel instanceof IMemoryRendering)
-				{
-					if (((IMemoryRendering)sel).getMemoryBlock() == memoryBlock)
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ProcessProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ProcessProxy.java
deleted file mode 100644
index 9644344..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ProcessProxy.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.jface.viewers.Viewer;
-
-public class ProcessProxy extends EventHandlerModelProxy {
-
-    private IProcess fProcess;
-
-    private DebugEventHandler fProcessEventHandler = new DebugEventHandler(this) {
-        protected boolean handlesEvent(DebugEvent event) {
-            return event.getSource().equals(fProcess);
-        }
-
-		protected void handleChange(DebugEvent event) {
-			fireDelta(IModelDelta.STATE);        			
-        }
-
-        protected void handleCreate(DebugEvent event) {
-        	// do nothing - Launch change notification handles this
-        }
-
-		protected void handleTerminate(DebugEvent event) {
-			fireDelta(IModelDelta.STATE | IModelDelta.UNINSTALL);
-		}
-        
-        private void fireDelta(int flags) {
-			ModelDelta delta = null;
-        	synchronized (ProcessProxy.this) {
-        		if (!isDisposed()) {
-                    delta = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
-                    ModelDelta node = delta;
-                    node = node.addNode(fProcess.getLaunch(), IModelDelta.NO_CHANGE);
-                    node.addNode(fProcess, flags);        			
-        		}
-			}
-        	if (delta != null && !isDisposed()) {
-        		fireModelChanged(delta);
-        	}        	
-        }
-        
-    };
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		fProcess = null;
-	}
-
-	public ProcessProxy(IProcess process) {
-        fProcess = process;
-    }
-
-    protected synchronized boolean containsEvent(DebugEvent event) {
-        return event.getSource().equals(fProcess);
-    }
-
-    protected DebugEventHandler[] createEventHandlers() {
-        return new DebugEventHandler[] {fProcessEventHandler};
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.AbstractModelProxy#installed()
-	 */
-	public void installed(Viewer viewer) {
-		super.installed(viewer);
-		// select process if in run mode
-		IProcess process = fProcess;
-		if (process != null) {
-			ILaunch launch = process.getLaunch();
-			if (launch != null && ILaunchManager.RUN_MODE.equals(launch.getLaunchMode())) {
-				// select the process
-				ModelDelta delta = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
-				ModelDelta node = delta.addNode(process.getLaunch(), IModelDelta.NO_CHANGE);
-				node = node.addNode(process, IModelDelta.SELECT);
-				fireModelChanged(delta);					
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/StackFrameEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/StackFrameEventHandler.java
deleted file mode 100644
index 39d5c95..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/StackFrameEventHandler.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-/**
- * Default stack frame event handler for the debug view.
- * 
- * @since 3.3
- */
-public class StackFrameEventHandler extends DebugEventHandler {
-	
-	ThreadEventHandler fThreadHandler = null;
-
-	/**
-	 * Constructs a new stack frame event handler
-	 */
-	public StackFrameEventHandler(AbstractModelProxy proxy, ThreadEventHandler threadHandler) {
-		super(proxy);
-		fThreadHandler = threadHandler;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handlesEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected boolean handlesEvent(DebugEvent event) {
-		return event.getSource() instanceof IStackFrame;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handleChange(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleChange(DebugEvent event) {
-		IStackFrame frame = (IStackFrame) event.getSource();
-		ModelDelta root = fThreadHandler.buildRootDelta();
-		ModelDelta delta = fThreadHandler.addPathToThread(root, frame.getThread());
-		delta = delta.addNode(frame.getThread(), IModelDelta.NO_CHANGE);
-		int flags = IModelDelta.NO_CHANGE;
-		if (event.getDetail() == DebugEvent.CONTENT) {
-			flags = flags | IModelDelta.CONTENT;
-		} else if (event.getDetail() == DebugEvent.STATE) {
-			flags = flags | IModelDelta.STATE;
-		}
-		delta = delta.addNode(frame, flags);
-		fireDelta(root);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ThreadEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ThreadEventHandler.java
deleted file mode 100644
index 2cfad00..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/ThreadEventHandler.java
+++ /dev/null
@@ -1,337 +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.debug.internal.ui.viewers.update;
-
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-/**
- * @since 3.2
- */
-public class ThreadEventHandler extends DebugEventHandler {
-	
-	/**
-	 * Queue of suspended threads to choose from when needing
-	 * to select a thread when another is resumed. Threads
-	 * are added in the order they suspend.
-	 */
-	private Set fThreadQueue = new LinkedHashSet();
-	
-	/** 
-	 * Map of previous TOS per thread
-	 */
-	private Map fLastTopFrame = new HashMap();
-	/**
-	 * Constructs and event handler for a threads in the given viewer.
-	 * 
-	 * @param viewer
-	 */
-	public ThreadEventHandler(AbstractModelProxy proxy) {
-		super(proxy);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#dispose()
-	 */
-	public synchronized void dispose() {
-		fLastTopFrame.clear();
-		fThreadQueue.clear();
-		super.dispose();
-	}
-
-	protected void handleSuspend(DebugEvent event) {
-        IThread thread = (IThread) event.getSource();
-		if (event.isEvaluation()) {
-        	ModelDelta delta = buildRootDelta();
-    		ModelDelta node = addPathToThread(delta, thread);
-    		node = node.addNode(thread, IModelDelta.NO_CHANGE);
-			try {
-				IStackFrame frame = thread.getTopStackFrame();
-                if (frame != null) {
-                	int flag = IModelDelta.NO_CHANGE;
-                	if (event.getDetail() == DebugEvent.EVALUATION) {
-                		// explicit evaluations can change content
-                		flag = flag | IModelDelta.CONTENT;
-                	} else if (event.getDetail() == DebugEvent.EVALUATION_IMPLICIT) {
-                		// implicit evaluations can change state
-                		flag = flag | IModelDelta.STATE;
-                	}
-                    node.addNode(frame, flag);
-                    fireDelta(delta);
-                }
-			} catch (DebugException e) {
-			}
-        } else {
-        	queueSuspendedThread(event);
-            int extras = IModelDelta.STATE;
-            if (event.getDetail() == DebugEvent.BREAKPOINT | event.getDetail() == DebugEvent.CLIENT_REQUEST) {
-                extras = IModelDelta.EXPAND;
-            }
-        	fireDeltaUpdatingTopFrame(thread, IModelDelta.NO_CHANGE | extras, event);
-        }
-	}
-	
-	private boolean isEqual(Object o1, Object o2) {
-		if (o1 == o2) {
-			return true;
-		}
-		if (o1 == null) {
-			return false;
-		}
-		return o1.equals(o2);
-	}
-
-	protected void handleResume(DebugEvent event) {
-		IThread thread = removeSuspendedThread(event);
-		fireDeltaAndClearTopFrame(thread, IModelDelta.STATE | IModelDelta.CONTENT | IModelDelta.SELECT);
-		thread = getNextSuspendedThread();
-		if (thread != null) {
-			fireDeltaUpdatingTopFrame(thread, IModelDelta.NO_CHANGE, event);
-		}
-	}
-
-	protected void handleCreate(DebugEvent event) {
-		fireDeltaAndClearTopFrame((IThread) event.getSource(), IModelDelta.ADDED | IModelDelta.STATE);
-	}
-
-	protected void handleTerminate(DebugEvent event) {
-		IThread thread = (IThread) event.getSource();
-		IDebugTarget target = thread.getDebugTarget();
-		// ignore thread termination if target is terminated/disconnected
-		if (!(target.isTerminated() || target.isDisconnected())) {
-			fireDeltaAndClearTopFrame(thread, IModelDelta.REMOVED);
-		}
-	}
-
-	protected void handleChange(DebugEvent event) {
-		if (event.getDetail() == DebugEvent.STATE) {
-			fireDeltaUpdatingThread((IThread) event.getSource(), IModelDelta.STATE);
-		} else {
-			fireDeltaUpdatingThread((IThread) event.getSource(), IModelDelta.CONTENT);
-		}
-	}
-
-	protected void handleLateSuspend(DebugEvent suspend, DebugEvent resume) {
-		IThread thread = queueSuspendedThread(suspend);
-		if (suspend.isEvaluation() && suspend.getDetail() == DebugEvent.EVALUATION_IMPLICIT) {
-			// late implicit evaluation - update thread and frame
-        	ModelDelta delta = buildRootDelta();
-    		ModelDelta node = addPathToThread(delta, thread);
-    		node = node.addNode(thread, IModelDelta.STATE);
-			try {
-				IStackFrame frame = thread.getTopStackFrame();
-                if (frame != null) {
-                    node.addNode(frame, IModelDelta.STATE);
-                    fireDelta(delta);
-                }
-			} catch (DebugException e) {
-			}
-        } else {	
-        	fireDeltaUpdatingTopFrame(thread, IModelDelta.CONTENT | IModelDelta.EXPAND, resume);
-        }
-	}
-
-	protected void handleSuspendTimeout(DebugEvent event) {
-		IThread thread = removeSuspendedThread(event);
-		// don't collapse thread when waiting for long step or evaluation to complete
-		fireDeltaUpdatingThread(thread, IModelDelta.STATE);
-	}
-	
-	protected ModelDelta buildRootDelta() {
-		return new ModelDelta(getLaunchManager(), IModelDelta.NO_CHANGE);
-	}
-
-	/**
-	 * Returns the launch manager.
-	 * 
-	 * @return the launch manager
-	 */
-	protected ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-	
-	/**
-	 * Adds nodes into the delta up to but not including the given thread.
-	 * 
-	 * @param delta root delta for the view (includes viewer input)
-	 * @param thread thread for which path is requested
-	 * @return
-	 */
-	protected ModelDelta addPathToThread(ModelDelta delta, IThread thread) {
-		ILaunch launch = thread.getLaunch();
-		Object[] children = launch.getChildren();
-		delta = delta.addNode(launch, indexOf(getLaunchManager().getLaunches(), launch), IModelDelta.NO_CHANGE, children.length);
-		IDebugTarget debugTarget = thread.getDebugTarget();
-		int numThreads = -1;
-		try {
-			numThreads = debugTarget.getThreads().length;
-		} catch (DebugException e) {
-		}
-		return delta.addNode(debugTarget, indexOf(children, debugTarget), IModelDelta.NO_CHANGE, numThreads);
-	}
-
-	private void fireDeltaAndClearTopFrame(IThread thread, int flags) {
-		ModelDelta delta = buildRootDelta();
-		ModelDelta node = addPathToThread(delta, thread);
-		node.addNode(thread, flags);
-		synchronized (this) {
-			fLastTopFrame.remove(thread);
-		}
-		fireDelta(delta);
-	}
-	
-	private void fireDeltaUpdatingTopFrame(IThread thread, int flags, DebugEvent event) {
-		ModelDelta delta = buildRootDelta();
-		ModelDelta node = addPathToThread(delta, thread);
-    	IStackFrame prev = null;
-    	synchronized (this) {
-    		 prev = (IStackFrame) fLastTopFrame.get(thread);
-		}
-    	IStackFrame frame = null;
-		try {
-			 frame = thread.getTopStackFrame();
-		} catch (DebugException e) {
-		}
-		int threadIndex = indexOf(thread);
-		int childCount = childCount(thread);
-    	if (isEqual(frame, prev)) {
-    		if (frame == null) {
-    			if (thread.isSuspended()) {
-	    			// no frames, but suspended - update & select
-	    			node = node.addNode(thread, threadIndex, flags | IModelDelta.STATE | IModelDelta.SELECT, childCount);
-    			}
-    		} else {
-    			node = node.addNode(thread, threadIndex, flags, childCount);
-    		}
-    	} else {
-    		if (prev == null && event.getDetail() == DebugEvent.STEP_END) {
-    			// see bug 166602 - expand the thread if this is a step end with no previous top frame
-    			flags = flags | IModelDelta.EXPAND;
-    		}
-			node = node.addNode(thread, threadIndex, flags | IModelDelta.CONTENT, childCount);
-    	}
-    	if (frame != null) {
-            node.addNode(frame, indexOf(frame), IModelDelta.STATE | IModelDelta.SELECT, childCount(frame));
-        }
-    	synchronized (this) {
-    		if (!isDisposed()) {
-    			fLastTopFrame.put(thread, frame);
-    		}
-		}
-    	fireDelta(delta);
-	}
-	
-	/**
-	 * Returns the index of the given thread, relative to its parent in the view.
-	 * 
-	 * @param thread thread
-	 * @return index of the thread, relative to its parent
-	 */
-	protected int indexOf(IThread thread) {
-		try {
-			return indexOf(thread.getDebugTarget().getThreads(), thread);
-		} catch (DebugException e) {
-		}
-		return -1;
-	}
-	
-	/**
-	 * Returns the index of the given frame, relative to its parent in the view.
-	 * 
-	 * @param frame frame
-	 * @return index of the frame, relative to its thread
-	 */
-	protected int indexOf(IStackFrame frame) {
-		return 0;
-	}
-	
-	/**
-	 * Returns the number of children the given thread has in the view.
-	 * 
-	 * @param thread thread
-	 * @return number of children
-	 */
-	protected int childCount(IThread thread) {
-		try {
-			return thread.getStackFrames().length;
-		} catch (DebugException e) {
-		}
-		return -1;
-	}
-	
-	/**
-	 * Returns the number of children the given frame has in the view.
-	 * 
-	 * @param frame frame
-	 * @return child count
-	 */
-	protected int childCount(IStackFrame frame) {
-		return 0;
-	}
-	
-	private void fireDeltaUpdatingThread(IThread thread, int flags) {
-		ModelDelta delta = buildRootDelta();
-		ModelDelta node = addPathToThread(delta, thread);
-	    node = node.addNode(thread, flags);
-    	fireDelta(delta);
-	}	
-	
-	protected boolean handlesEvent(DebugEvent event) {
-		return event.getSource() instanceof IThread;
-	}
-	
-	protected synchronized IThread queueSuspendedThread(DebugEvent event) {
-		IThread thread = (IThread) event.getSource();
-		if (!isDisposed()) {
-			fThreadQueue.add(thread);
-		}
-		return thread;
-	}
-	
-	protected synchronized IThread removeSuspendedThread(DebugEvent event) {
-		IThread thread = (IThread)event.getSource();
-		fThreadQueue.remove(thread);
-		return thread;
-	}
-	
-	protected synchronized IThread queueSuspendedThread(IThread thread) {
-		if (!isDisposed()) {
-			fThreadQueue.add(thread);
-		}
-		return thread;
-	}	
-	
-	protected synchronized void removeQueuedThread(IThread thread) {
-		fThreadQueue.remove(thread);
-	}
-	
-	protected synchronized IThread getNextSuspendedThread() {
-		if (!fThreadQueue.isEmpty()) {
-			return (IThread) fThreadQueue.iterator().next();
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/VariablesViewEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/VariablesViewEventHandler.java
deleted file mode 100644
index f72a851..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/VariablesViewEventHandler.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.debug.internal.ui.viewers.update;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-
-/**
- *
- * @since 3.2
- */
-public class VariablesViewEventHandler extends DebugEventHandler {
-
-	private IStackFrame fFrame;
-
-	public VariablesViewEventHandler(AbstractModelProxy proxy, IStackFrame frame) {
-		super(proxy);
-		fFrame = frame;
-	}
-
-	protected boolean handlesEvent(DebugEvent event) {
-		return true;
-	}
-
-	protected void refreshRoot(DebugEvent event) {
-		if (event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) {
-			// Don't refresh everytime an implicit evaluation finishes
-			if (event.getSource() instanceof ISuspendResume) {
-				if (!((ISuspendResume)event.getSource()).isSuspended()) {
-					// no longer suspended
-					return;
-				}
-			}
-			
-			ModelDelta delta = new ModelDelta(fFrame, IModelDelta.CONTENT);
-			fireDelta(delta);
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugModelPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugModelPresentationContext.java
deleted file mode 100644
index 5b4f63d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugModelPresentationContext.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views;
-
-import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-
-/**
- * A presentation context that has a debug model presentation.
- * 
- * @since 3.3
- */
-public class DebugModelPresentationContext extends PresentationContext {
-
-	private IDebugModelPresentation fPresentation;
-	
-	/**
-	 * Constructs a presentation context for the given id using the
-	 * specified model presentation.
-	 * 
-	 * @param id context id
-	 * @param presentation debug model presentation
-	 */
-	public DebugModelPresentationContext(String id, IDebugModelPresentation presentation) {
-		super(id);
-		fPresentation = presentation;
-	}
-	
-	public IDebugModelPresentation getModelPresentation() {
-		return fPresentation;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugUIViewsMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugUIViewsMessages.java
deleted file mode 100644
index 5de6573..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugUIViewsMessages.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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views;
-
-import org.eclipse.osgi.util.NLS;
-
-public class DebugUIViewsMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.views.DebugUIViewsMessages";//$NON-NLS-1$
-
-	public static String LaunchView_Error_1;
-	public static String LaunchView_Exception_occurred_opening_editor_for_debugger__2;
-	public static String LaunchView_Terminate_and_Remove_1;
-	public static String LaunchView_Terminate_and_remove_selected__2;
-	public static String LaunchView_Exceptions_occurred_attempting_to_terminate_and_remove_3;
-	public static String LaunchView_Terminate_and_Remove_4;
-	public static String LaunchView_Terminate_and_remove_failed_5;
-
-	public static String SourceNotFoundEditorInput_Source_Not_Found_1;
-	public static String SourceNotFoundEditorInput_Source_not_found_for__0__2;
-
-	public static String BreakpointsView_6;
-	public static String BreakpointsView_7;
-	public static String BreakpointsView_8;
-	public static String BreakpointsView_9;
-	public static String BreakpointsView_0;
-	public static String BreakpointsView_10;
-	public static String BreakpointsView_11;
-	public static String BreakpointsView_1;
-	public static String BreakpointWorkingSetPage_0;
-	public static String BreakpointWorkingSetPage_1;
-	public static String BreakpointWorkingSetPage_2;
-	public static String BreakpointWorkingSetPage_3;
-	public static String BreakpointWorkingSetPage_4;
-	public static String BreakpointWorkingSetPage_5;
-	public static String BreakpointWorkingSetPage_6;
-	public static String BreakpointWorkingSetPage_selectAll_label;
-	public static String BreakpointWorkingSetPage_selectAll_toolTip;
-	public static String BreakpointWorkingSetPage_deselectAll_label;
-	public static String BreakpointWorkingSetPage_deselectAll_toolTip;
-	public static String OtherBreakpointOrganizer_0;
-	public static String WorkingSetCategory_0;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, DebugUIViewsMessages.class);
-	}
-
-    public static String InspectPopupDialog_0;
-
-    public static String InspectPopupDialog_1;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugUIViewsMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugUIViewsMessages.properties
deleted file mode 100644
index dfbf22b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/DebugUIViewsMessages.properties
+++ /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
-###############################################################################
-
-LaunchView_Error_1=Error
-LaunchView_Exception_occurred_opening_editor_for_debugger__2=Exception occurred opening editor for debugger.
-LaunchView_Terminate_and_Remove_1=Terminate and Remove
-LaunchView_Terminate_and_remove_selected__2=Terminate and remove selected?
-LaunchView_Exceptions_occurred_attempting_to_terminate_and_remove_3=Exceptions occurred attempting to terminate and remove
-LaunchView_Terminate_and_Remove_4=Terminate and Remove
-LaunchView_Terminate_and_remove_failed_5=Terminate and remove failed
-
-SourceNotFoundEditorInput_Source_Not_Found_1=Source Not Found
-SourceNotFoundEditorInput_Source_not_found_for__0__2=Source not found for {0}
-
-BreakpointsView_6=Enabling
-BreakpointsView_7=Disabling
-BreakpointsView_8=enable
-BreakpointsView_9=disable
-BreakpointsView_0=Enable Breakpoint
-BreakpointsView_10=Error {0} Breakpoint
-BreakpointsView_11=An exception occurred while attempting to {0} the breakpoint.
-BreakpointsView_1=Disable Breakpoint
-BreakpointWorkingSetPage_0=Breakpoint Working Set
-BreakpointWorkingSetPage_1=Enter a working set name and select breakpoints.
-BreakpointWorkingSetPage_2=&Working set name:
-BreakpointWorkingSetPage_3=Brea&kpoints:
-BreakpointWorkingSetPage_4=The name must not have leading or trailing whitespace
-BreakpointWorkingSetPage_5=The name must not be empty
-BreakpointWorkingSetPage_6=A working set with that name already exists
-BreakpointWorkingSetPage_selectAll_label=Select &All
-BreakpointWorkingSetPage_selectAll_toolTip=Select all of the breakpoints for this working set.
-BreakpointWorkingSetPage_deselectAll_label=Dese&lect All
-BreakpointWorkingSetPage_deselectAll_toolTip=Deselect all of the breakpoints for this working set.
-OtherBreakpointOrganizer_0=Others
-WorkingSetCategory_0=\ (default)
-InspectPopupDialog_0=Move to Expressions View
-InspectPopupDialog_1=Press {0} to {1}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/IDebugExceptionHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/IDebugExceptionHandler.java
deleted file mode 100644
index 4bc7087..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/IDebugExceptionHandler.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.debug.internal.ui.views;
-
-
-import org.eclipse.debug.core.DebugException;
- 
-/**
- * A plugable  exception handler.
- */
-public interface IDebugExceptionHandler {
-	
-	/**
-	 * Handles the given debug exception.
-	 * 
-	 * @param e debug exception
-	 */
-	public abstract void handleException(DebugException e);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/ViewContextManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/ViewContextManager.java
deleted file mode 100644
index b02e0b5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/ViewContextManager.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Manages the view context services for each window.
- * 
- * @since 3.2
- */
-public class ViewContextManager implements IWindowListener {
-		
-	/**
-	 * Map of services
-	 */
-	private Map fWindowToService = new HashMap();
-	
-	// singleton manager
-	private static ViewContextManager fgManager;
-	
-	/**
-	 * Returns the singleton view context manager.
-	 * 
-	 * @return view manager
-	 */
-	public static ViewContextManager getDefault() {
-		if (fgManager == null) {
-			fgManager = new ViewContextManager();
-		}
-		return fgManager;
-	}
-	
-	
-	private ViewContextManager() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow[] workbenchWindows = workbench.getWorkbenchWindows();
-		for (int i = 0; i < workbenchWindows.length; i++) {
-			IWorkbenchWindow window = workbenchWindows[i];
-			windowOpened(window);
-		}
-		workbench.addWindowListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowActivated(IWorkbenchWindow window) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowDeactivated(IWorkbenchWindow window) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowClosed(IWorkbenchWindow window) {
-		ViewContextService service = (ViewContextService) fWindowToService.get(window);
-		if (service != null) {
-			service.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowOpened(IWorkbenchWindow window) {
-		ViewContextService service = (ViewContextService) fWindowToService.get(window);
-		if (service == null) {
-			service = new ViewContextService(window);
-			fWindowToService.put(window, service);
-		}
-	}
-	
-	/**
-	 * Returns the service for the given window, or <code>null</code> if none.
-	 * 
-	 * @param window
-	 * @return view context service or <code>null</code>
-	 */
-	public ViewContextService getService(IWorkbenchWindow window) {
-		return (ViewContextService) fWindowToService.get(window);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/ViewContextService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/ViewContextService.java
deleted file mode 100644
index 6d34ecc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/ViewContextService.java
+++ /dev/null
@@ -1,1080 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views;
-
-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 java.util.StringTokenizer;
-import java.util.Map.Entry;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.commands.contexts.ContextManagerEvent;
-import org.eclipse.core.commands.contexts.IContextManagerListener;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.contexts.DebugModelContextBindingManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener4;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.contexts.IContextService;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Performs view management for a window.
- * 
- * @since 3.2
- */
-public class ViewContextService implements IDebugContextListener, IPerspectiveListener4, IPropertyChangeListener, IContextManagerListener {
-	
-	/**
-	 * Maps the perspectives in this window to its last activated workbench context
-	 */
-	private Map fPerspectiveToActiveContext = new HashMap();
-	
-	/**
-	 * Map of the perspectives to all workbench contexts activated in that perspective 
-	 */
-	private Map fPerspectiveToActivatedContexts = new HashMap();
-	
-	/**
-	 * Map of context id's to context view bindings
-	 */
-	private Map fContextIdsToBindings;
-    	
-	/**
-	 * List of perspectives that debugging is allowed in
-	 */
-	private List fEnabledPerspectives = new ArrayList();	
-    
-    /**
-     * Whether to ignore perspective change call backs (set to 
-     * true when this class is modifying views). 
-     */
-    private boolean fIgnoreChanges = false;
-	
-	/**
-	 * The window this service is working for
-	 */
-	private IWorkbenchWindow fWindow;
-	
-	private IContextService fContextService;
-	
-	// base debug context
-	public static final String DEBUG_CONTEXT= "org.eclipse.debug.ui.debugging"; //$NON-NLS-1$
-	
-	// extension point
-	private static final String ID_CONTEXT_VIEW_BINDINGS= "contextViewBindings"; //$NON-NLS-1$
-	
-	// extension attributes
-	private static final String ATTR_CONTEXT_ID= "contextId"; //$NON-NLS-1$
-	private static final String ATTR_VIEW_ID= "viewId"; //$NON-NLS-1$
-	private static final String ATTR_AUTO_OPEN= "autoOpen"; //$NON-NLS-1$
-	private static final String ATTR_AUTO_CLOSE= "autoClose"; //$NON-NLS-1$	
-    
-    // XML tags
-    private static final String XML_ELEMENT_VIEW_BINDINGS ="viewBindings"; //$NON-NLS-1$
-    private static final String XML_ELEMENT_PERSPECTIVE ="perspective"; //$NON-NLS-1$
-    private static final String XML_ELEMENT_VIEW = "view"; //$NON-NLS-1$
-    private static final String XML_ATTR_ID = "id"; //$NON-NLS-1$
-    private static final String XML_ATTR_USER_ACTION = "userAction"; //$NON-NLS-1$
-    private static final String XML_VALUE_OPENED = "opened"; //$NON-NLS-1$
-    private static final String XML_VALUE_CLOSED = "closed"; //$NON-NLS-1$
-    
-    // ids of base debug views in debug perspective that should not be auto-closed
-    private static Set fgBaseDebugViewIds = null;
-    
-    static {
-        fgBaseDebugViewIds = new HashSet();
-        fgBaseDebugViewIds.add(IDebugUIConstants.ID_DEBUG_VIEW);
-        fgBaseDebugViewIds.add(IDebugUIConstants.ID_VARIABLE_VIEW);
-        fgBaseDebugViewIds.add(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-        fgBaseDebugViewIds.add(IConsoleConstants.ID_CONSOLE_VIEW);
-    }
-    
-    private static String[] EMPTY_IDS = new String[0];
-    
-    /**
-     * View bindings for a debug context
-     */
-    private class DebugContextViewBindings {
-    	
-    	// context id
-    	private String fId;
-    	
-    	// list of view bindings id's specific to this context
-    	private String[] fViewBindingIds = EMPTY_IDS;
-    	
-    	// all bindings including inherited bindings, top down in activation order
-    	private String[] fAllViewBindingIds = null;
-    	// associated binding to activate
-    	private Map fAllViewIdToBindings = new HashMap();
-    	// all context id's in this context hierarchy (top down order)
-    	private String[] fAllConetxtIds = null;
-
-    	// id of parent context
-    	private String fParentId;
-    	
-    	/**
-    	 * Constructs an empty view binding for the given context.
-    	 * 
-    	 * @param id context id
-    	 */
-    	public DebugContextViewBindings(String id) {
-    		fId = id;
-    	}
-    	
-    	/**
-    	 * Returns the context id for these view bindings
-    	 * 
-    	 * @return context id
-    	 */
-    	public String getId() {
-    		return fId;
-    	}
-    	
-    	/**
-    	 * Adds the given view binding to this context
-    	 * 
-    	 * @param binding view binding to add
-    	 */
-    	public void addBinding(ViewBinding binding) {
-    		String[] newBindings = new String[fViewBindingIds.length + 1];
-    		System.arraycopy(fViewBindingIds, 0, newBindings, 0, fViewBindingIds.length);
-    		newBindings[fViewBindingIds.length] = binding.getViewId();
-    		fAllViewIdToBindings.put(binding.getViewId(), binding);
-    		fViewBindingIds = newBindings;
-    	}
-    	
-    	/**
-    	 * Sets the parent id of this view bindings
-    	 * 
-    	 * @param id parent context id
-    	 */
-    	protected void setParentId(String id) {
-    		fParentId = id;
-    	}
-    	
-    	/**
-    	 * Returns the id of parent context
-    	 * 
-    	 * @return parent context id
-    	 */
-    	public DebugContextViewBindings getParentContext() {
-    		if (fParentId == null) {
-    			return null;
-    		}
-    		return (DebugContextViewBindings) fContextIdsToBindings.get(fParentId);
-    	}
-    	
-    	/**
-    	 * Activates the views in this context hierarchy. Views are activated top down, allowing
-    	 * sub-contexts to override settings in a parent context.
-    	 */
-    	public void activateChain(IWorkbenchPage page) {
-    		initializeChain();
-    		doActivation(page, fAllViewBindingIds, fAllConetxtIds);
-    	}	
-    	
-    	/**
-    	 * Activates the view bindings for the specified views and the 
-    	 * specified contexts in the given page.
-    	 *  
-    	 * @param page page to activate views in
-    	 * @param viewIds id's of views to activate
-    	 * @param contextIds associated contexts that are activated
-    	 */
-    	private void doActivation(IWorkbenchPage page, String[] viewIds, String[] contextIds) {
-    		// note activation of all the relevant contexts
-    		for (int i = 0; i < contextIds.length; i++) {
-				addActivated(contextIds[i]);
-			}
-    		// set the active context to be this
-    		setActive(page.getPerspective(), getId());
-    		// activate the view bindings
-    		for (int i = 0; i < viewIds.length; i++) {
-				String viewId = viewIds[i];
-				ViewBinding binding = (ViewBinding) fAllViewIdToBindings.get(viewId);
-				binding.activated(page);
-			}
-    		// bring most relevant views to top
-    		for (int i = 0; i < viewIds.length; i++) {
-				String viewId = viewIds[i];
-				ViewBinding binding = (ViewBinding) fAllViewIdToBindings.get(viewId);
-				binding.checkZOrder(page, fAllViewBindingIds);
-			}
-    	}
-    	
-    	/**
-    	 * Builds the top down ordered list of bindings for this context allowing sub-contexts
-    	 * to override parent settings.
-    	 */
-    	private synchronized void initializeChain() {
-    		if (fAllViewBindingIds == null) {
-    			List orderedIds = new ArrayList();
-    			List contexts = new ArrayList();
-    			DebugContextViewBindings context = this;
-    			while (context != null) {
-    				contexts.add(0, context);
-    				context = context.getParentContext();
-    			}
-    			Iterator iterator = contexts.iterator();
-    			fAllConetxtIds = new String[contexts.size()];
-    			int pos = 0;
-    			while (iterator.hasNext()) {
-    				DebugContextViewBindings bindings = (DebugContextViewBindings) iterator.next();
-    				fAllConetxtIds[pos] = bindings.getId();
-    				pos++;
-    				for (int i = 0; i < bindings.fViewBindingIds.length; i++) {
-						String viewId = bindings.fViewBindingIds[i];
-    					if (bindings == this) {
-    						orderedIds.add(viewId);
-    					}
-    					if (!fAllViewIdToBindings.containsKey(viewId)) {
-    						orderedIds.add(viewId);
-    						fAllViewIdToBindings.put(viewId, bindings.fAllViewIdToBindings.get(viewId));
-    					}
-					}
-    			}
-    			fAllViewBindingIds = (String[]) orderedIds.toArray(new String[orderedIds.size()]);
-    		}
-    	}
-    	
-    	/**
-    	 * Deactivates this context only (not parents)
-    	 * 
-    	 * @param page workbench page
-    	 */
-    	public void deactivate(IWorkbenchPage page) {
-			removeActivated(getId());
-			if (isActiveContext(getId())) {
-				setActive(page.getPerspective(), null);
-			}
-			for (int i = 0; i < fViewBindingIds.length; i++) {
-				String viewId = fViewBindingIds[i];
-				ViewBinding binding = (ViewBinding) fAllViewIdToBindings.get(viewId);
-				binding.deactivated(page);
-			}
-    	}
-    	
-    	/**
-    	 * Notes when a view is opened/closed manually.
-    	 * 
-    	 * @param opened opened or closed
-    	 * @param viewId
-    	 */
-    	public void setViewOpened(boolean opened, String viewId) {
-    		initializeChain();
-    		ViewBinding binding = (ViewBinding)fAllViewIdToBindings.get(viewId);
-    		if (binding != null) {
-    			if (opened) {
-    				binding.userOpened();
-    			} else {
-    				binding.userClosed();
-    			}
-    		}
-    	}
-
-        public void applyUserSettings(String viewId, Element viewElement) {
-        	initializeChain();
-        	ViewBinding binding = (ViewBinding) fAllViewIdToBindings.get(viewId);
-        	if (binding != null) {
-        		binding.applyUserSettings(viewElement);
-        	}
-        }    	
-    	
-        /**
-         * Save view binding settings into XML document.
-         * 
-         * @param document
-         * @param root
-         * @param alreadyDone views already done
-         */
-        public void saveBindings(Document document, Element root, Set alreadyDone) {
-        	for (int i = 0; i < fViewBindingIds.length; i++) {
-				String viewId = fViewBindingIds[i];
-        		if (!alreadyDone.contains(viewId)) {
-        			alreadyDone.add(viewId);
-        			ViewBinding binding = (ViewBinding) fAllViewIdToBindings.get(viewId);
-        			binding.saveBindings(document, root);
-        		}
-			}
-        }    	
-    }
-    
-    /**
-     * Information for a view
-     */
-    private class ViewBinding {
-        private IConfigurationElement fElement;
-        /**
-         * Set of perspectives this view was opened in by the user
-         */
-        private Set fUserOpened = new HashSet();
-        /**
-         * Set of perspectives this view was closed in by the user
-         */
-        private Set fUserClosed = new HashSet();
-        
-        public ViewBinding(IConfigurationElement element) {
-            fElement = element;
-        }
-        
-        /**
-         * Returns the id of the view this binding pertains to.
-         * 
-         * @return
-         */
-        public String getViewId() {
-            return fElement.getAttribute(ATTR_VIEW_ID);
-        }
-        
-        /**
-         * Returns whether this view binding is set for auto-open.
-         * 
-         * @return
-         */
-        public boolean isAutoOpen() {
-            String autoopen = fElement.getAttribute(ATTR_AUTO_OPEN);
-            return autoopen == null || "true".equals(autoopen); //$NON-NLS-1$
-        }
-        
-        /**
-         * Returns whether this view binding is set for auto-close.
-         * 
-         * @return
-         */
-        public boolean isAutoClose() {
-            String autoclose = fElement.getAttribute(ATTR_AUTO_CLOSE);
-            return autoclose == null || "true".equals(autoclose); //$NON-NLS-1$
-        }
-        
-        /**
-         * Returns whether this view was opened by the user in the active perspective.
-         * @return
-         */
-        public boolean isUserOpened() {
-            return fUserOpened.contains(getActivePerspective().getId());
-        }
-        
-        /**
-         * Returns whether this view was closed by the user in the active perspective
-         * @return
-         */
-        public boolean isUserClosed() {
-            return fUserClosed.contains(getActivePerspective().getId());
-        }
-        
-        /**
-         * Returns whether this view is part of the active perspective by default
-         * 
-         * TODO: we really need an API to determine which views are
-         * in a perspective by default, but it does not seem to exist.
-         * 
-         * @return
-         */
-        public boolean isDefault() {
-            String id = getActivePerspective().getId();
-            if (IDebugUIConstants.ID_DEBUG_PERSPECTIVE.equals(id)) {
-                return fgBaseDebugViewIds.contains(getViewId());
-            }
-            return false;
-        }
-        
-        protected void userOpened() {
-            if (isTrackingViews()) {
-                String id = getActivePerspective().getId();
-                fUserOpened.add(id);
-                fUserClosed.remove(id);
-                saveViewBindings();
-            }
-        }
-        
-        protected void userClosed() {
-            if (isTrackingViews()) {
-                String id = getActivePerspective().getId();
-                fUserClosed.add(id);
-                fUserOpened.remove(id);
-                saveViewBindings();
-            }
-        }
-        
-        /**
-         * Returns whether the preference is set to track user view open/close.
-         * 
-         * @return
-         */
-        protected boolean isTrackingViews() {
-            return DebugUITools.getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_TRACK_VIEWS);
-        }
-        
-        /**
-         * Context has been activated, open/show as required.
-         * 
-         * @param page
-         */
-        public void activated(IWorkbenchPage page) {
-            if (!isUserClosed()) {
-                if (isAutoOpen()) {
-                    try {
-                        fIgnoreChanges = true;
-                        page.showView(getViewId(), null, IWorkbenchPage.VIEW_CREATE);
-                    } catch (PartInitException e) {
-                        DebugUIPlugin.log(e);
-                    } finally {
-                        fIgnoreChanges = false;
-                    }
-                }
-            }
-        }
-        
-        /**
-         * Context has been activated. Check the view stack to see if this view
-         * should be made visible.
-         * 
-         * @param page
-         */
-        public void checkZOrder(IWorkbenchPage page, String[] relevantViews) {
-        	// see if view is open already
-        	IViewPart part = page.findView(getViewId());
-        	if (part != null) {
-        		IViewPart[] viewStack = page.getViewStack(part);
-        		if (viewStack != null && viewStack.length > 0) {
-        			String top = viewStack[0].getSite().getId();
-        			for (int i = 0; i < relevantViews.length; i++) {
-						if (relevantViews[i].equals(top)) {
-							// a relevant view is visible
-							return;
-						}
-					}
-        			// an irrelevant view is visible
-                    try {
-                        fIgnoreChanges = true;
-                        page.bringToTop(part);
-                    } finally {
-                        fIgnoreChanges = false;
-                    }
-        		}
-        	}
-        }        
-        
-        /**
-         * Context has been deactivated, close as required.
-         * 
-         * @param page
-         */
-        public void deactivated(IWorkbenchPage page) {
-            if (!isUserOpened()) {
-                if (isAutoClose() && !isDefault()) {
-                    IViewReference reference = page.findViewReference(getViewId());
-                    if (reference != null) {
-                        try {
-                            fIgnoreChanges = true;
-                            page.hideView(reference);
-                        } finally {
-                            fIgnoreChanges = false;
-                        }
-                    }
-                }
-            }
-        }
-
-        /**
-         * Save view binding settings into XML document.
-         * 
-         * @param document
-         * @param root
-         */
-        public void saveBindings(Document document, Element root) {
-            Element viewElement = document.createElement(XML_ELEMENT_VIEW);
-            viewElement.setAttribute(XML_ATTR_ID, getViewId());
-            appendPerspectives(document, viewElement, fUserOpened, XML_VALUE_OPENED);
-            appendPerspectives(document, viewElement, fUserClosed, XML_VALUE_CLOSED);
-            if (viewElement.hasChildNodes()) {
-                root.appendChild(viewElement);
-            }
-        }
-        
-        private void appendPerspectives(Document document, Element parent, Set perpectives, String xmlValue) {
-            String[] ids = (String[]) perpectives.toArray(new String[perpectives.size()]);
-            for (int i = 0; i < ids.length; i++) {
-                String id = ids[i];
-                Element element = document.createElement(XML_ELEMENT_PERSPECTIVE);
-                element.setAttribute(XML_ATTR_ID, id);
-                element.setAttribute(XML_ATTR_USER_ACTION, xmlValue);
-                parent.appendChild(element);
-            }
-        }
-        
-        public void applyUserSettings(Element viewElement) {
-            NodeList list = viewElement.getChildNodes();
-            int length = list.getLength();
-            for (int i = 0; i < length; ++i) {
-                Node node = list.item(i);
-                short type = node.getNodeType();
-                if (type == Node.ELEMENT_NODE) {
-                    Element entry = (Element) node;
-                    if(entry.getNodeName().equalsIgnoreCase(XML_ELEMENT_PERSPECTIVE)){
-                        String id = entry.getAttribute(XML_ATTR_ID);
-                        String setting = entry.getAttribute(XML_ATTR_USER_ACTION);
-                        if (id != null) {
-                            if (XML_VALUE_CLOSED.equals(setting)) {
-                                fUserClosed.add(id);
-                            } else if (XML_VALUE_OPENED.equals(setting)) {
-                                fUserOpened.add(id);
-                            }
-                        }
-                    }
-                }
-            }       
-        }
-    }
-    
-    private IDebugContextService getDebugContextService() {
-    	return DebugUITools.getDebugContextManager().getContextService(fWindow);
-    }
-	
-	/**
-	 * Creates a service for the given window
-	 * 
-	 * @param window
-	 */
-	ViewContextService(IWorkbenchWindow window) {
-		fWindow = window;
-		fContextService = (IContextService) PlatformUI.getWorkbench().getAdapter(IContextService.class);
-		loadContextToViewExtensions();
-        applyUserViewBindings();
-		loadPerspectives();
-		window.addPerspectiveListener(this);
-		getDebugContextService().addDebugContextListener(this);
-		DebugUIPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(this);
-		fContextService.addContextManagerListener(this);
-	}
-	
-	public void dispose() {
-		fWindow.removePerspectiveListener(this);
-		getDebugContextService().removeDebugContextListener(this);
-		DebugUIPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(this);
-		fContextService.removeContextManagerListener(this);
-	}
-	
-	/**
-	 * Loads extensions which map context id's to view bindings.
-	 */
-	private void loadContextToViewExtensions() {
-        fContextIdsToBindings = new HashMap();
-		IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), ID_CONTEXT_VIEW_BINDINGS);
-		IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
-		for (int i = 0; i < configurationElements.length; i++) {
-			IConfigurationElement element = configurationElements[i];
-			String viewId = element.getAttribute(ATTR_VIEW_ID);
-			String contextId = element.getAttribute(ATTR_CONTEXT_ID);
-			if (contextId == null || viewId == null) {
-				continue;
-			}
-            ViewBinding info = new ViewBinding(element);
-			DebugContextViewBindings bindings = (DebugContextViewBindings) fContextIdsToBindings.get(contextId);
-			if (bindings == null) {
-				bindings = new DebugContextViewBindings(contextId);
-				fContextIdsToBindings.put(contextId, bindings);
-			}
-			bindings.addBinding(info);
-		}
-		linkParentContexts();
-	}
-    
-    /**
-     * Applies user settings that modify view binding extensions.
-     */
-    private void applyUserViewBindings() {
-        String xml = DebugUITools.getPreferenceStore().getString(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS);
-        if (xml.length() > 0) {
-            try {
-                Element root = DebugPlugin.parseDocument(xml);
-                NodeList list = root.getChildNodes();
-                int length = list.getLength();
-                for (int i = 0; i < length; ++i) {
-                    Node node = list.item(i);
-                    short type = node.getNodeType();
-                    if (type == Node.ELEMENT_NODE) {
-                        Element entry = (Element) node;
-                        if(entry.getNodeName().equalsIgnoreCase(XML_ELEMENT_VIEW)){
-                            String id = entry.getAttribute(XML_ATTR_ID);
-                            Iterator bindings = fContextIdsToBindings.values().iterator();
-                            while (bindings.hasNext()) {
-                            	DebugContextViewBindings binding = (DebugContextViewBindings) bindings.next();
-                            	binding.applyUserSettings(id, entry);
-                            }
-                        }
-                    }
-                }                
-            } catch (CoreException e) {
-                DebugUIPlugin.log(e);
-            }
-        }
-    }
-	
-	/**
-	 * Load the collection of perspectives in which view management will occur from the preference store.
-	 */
-	private void loadPerspectives() {
-		String prefString = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES);
-		fEnabledPerspectives = parseList(prefString);
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Preferences.IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-        if (!fIgnoreChanges) {
-    		if (IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES.equals(event.getProperty())) {
-    			loadPerspectives();
-    		} else if (IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS.equals(event.getProperty())) {
-    		    loadContextToViewExtensions();
-                applyUserViewBindings();
-                // clear activations to re-enable activation based on new settings
-                fPerspectiveToActivatedContexts.clear();
-                ISelection selection = getDebugContextService().getActiveContext();
-                contextActivated(selection);
-            }
-        }
-	}	
-	
-	/**
-	 * Returns whether this service's window's active perspective supports view management.
-	 * 
-	 * @return whether this service's window's active perspective supports view management
-	 */
-	private boolean isEnabledPerspective() {
-		IPerspectiveDescriptor perspective = getActivePerspective();
-		if (perspective != null) {
-			return fEnabledPerspectives.contains(perspective.getId());
-		}
-		return false;
-	}	
-	
-	/**
-	 * Returns the active perspective in this service's window, or <code>null</code>
-	 * 
-	 * @return active perspective or <code>null</code>
-	 */
-	private IPerspectiveDescriptor getActivePerspective() {
-		IWorkbenchPage activePage = fWindow.getActivePage();
-		if (activePage != null) {
-			return activePage.getPerspective();
-		}
-		return null;
-	}
-	
-	/**
-	 * Parses the comma separated string into a list of strings
-	 * 
-	 * @return list
-	 */
-	public static List parseList(String listString) {
-		List list = new ArrayList(10);
-		StringTokenizer tokenizer = new StringTokenizer(listString, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken();
-			list.add(token);
-		}
-		return list;
-	}
-	
-	public void contextActivated(ISelection selection) {
-		if (isEnabledPerspective()) {
-			if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
-				IStructuredSelection ss = (IStructuredSelection) selection;
-				Iterator iterator = ss.iterator();
-				while (iterator.hasNext()) {
-					Object target = iterator.next();
-					ILaunch launch = DebugModelContextBindingManager.getLaunch(target);
-					if (launch != null) {
-						ILaunchConfiguration launchConfiguration = launch.getLaunchConfiguration();
-						if (launchConfiguration != null) {
-							try {
-								ILaunchConfigurationType type = launchConfiguration.getType();
-								// check if this perspective is enabled for the launch type
-								// Include the word '.internal.' so the context is filtered from the key binding pref page (Bug 144019) also see PerspectiveManager.handleBreakpointHit()
-								if (fContextService.getActiveContextIds().contains(type.getIdentifier() + ".internal." + getActivePerspective().getId())) { //$NON-NLS-1$
-									// get the leaf contexts to be activated
-									List workbenchContexts = DebugModelContextBindingManager.getDefault().getWorkbenchContextsForDebugContext(target);
-									// TODO: do we need to check if contexts are actually enabled in workbench first?
-									if (!workbenchContexts.isEmpty()) {
-										// if all contexts already activate and last context is already active context == done
-										Iterator contexts = workbenchContexts.iterator();
-										while (contexts.hasNext()) {
-											String contextId = (String)contexts.next();
-											if (!isActivated(contextId)) {
-												activateChain(contextId);
-											}
-											// ensure last context gets top priority
-											if (!contexts.hasNext()) {
-												if (!isActiveContext(contextId)) {
-													activateChain(contextId);
-												}
-											}
-										}
-									}
-									
-								}
-							} catch (CoreException e) {
-								DebugUIPlugin.log(e);
-							}
-						}												
-					}						
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Returns whether the given context is the active context in the active perspective.
-	 * 
-	 * @param contextId
-	 * @return
-	 */
-	private boolean isActiveContext(String contextId) {
-		IPerspectiveDescriptor activePerspective = getActivePerspective();
-		if (activePerspective != null) {
-			String activeId = (String) fPerspectiveToActiveContext.get(activePerspective);
-			return contextId.equals(activeId);
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns whether the given context is activated in the active perspective. 
-	 * 
-	 * @param contextId
-	 * @return
-	 */
-	private boolean isActivated(String contextId) {
-		IPerspectiveDescriptor activePerspective = getActivePerspective();
-		if (activePerspective != null) {
-			Set contexts = (Set) fPerspectiveToActivatedContexts.get(activePerspective); 
-			if (contexts != null) {
-				return contexts.contains(contextId);
-			}
-		}
-		return false;
-	}
-	
-	private void addActivated(String contextId) {
-		IPerspectiveDescriptor activePerspective = getActivePerspective();
-		if (activePerspective != null) {
-			Set contexts = (Set) fPerspectiveToActivatedContexts.get(activePerspective); 
-			if (contexts == null) {
-				contexts = new HashSet();
-				fPerspectiveToActivatedContexts.put(activePerspective, contexts);
-			}
-			contexts.add(contextId);
-		}
-	}
-	
-	private void removeActivated(String contextId) {
-		IPerspectiveDescriptor activePerspective = getActivePerspective();
-		if (activePerspective != null) {
-			Set contexts = (Set) fPerspectiveToActivatedContexts.get(activePerspective); 
-			if (contexts != null) {
-				contexts.remove(contextId);
-			}
-		}		
-	}
-
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			contextActivated(event.getContext());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener3#perspectiveOpened(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveOpened(IWorkbenchPage page, IPerspectiveDescriptor perspective) {        
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener3#perspectiveClosed(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveClosed(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener3#perspectiveDeactivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveDeactivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-	}
-	
-	/**
-	 * Closes all auto-opened views.
-	 * 
-	 * @param page
-	 * @param perspective
-	 */
-	private void clean(IPerspectiveDescriptor perspective) {
-		Set contexts = (Set) fPerspectiveToActivatedContexts.remove(perspective);
-		fPerspectiveToActiveContext.remove(perspective);
-		if (contexts != null) {
-			Iterator iterator = contexts.iterator();
-			while (iterator.hasNext()) {
-				String id = (String) iterator.next();
-				deactivate(id);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener3#perspectiveSavedAs(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveSavedAs(IWorkbenchPage page, IPerspectiveDescriptor oldPerspective, IPerspectiveDescriptor newPerspective) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference, java.lang.String)
-	 */
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {
-		if (!fIgnoreChanges && page.getWorkbenchWindow().equals(fWindow)) {
-			if(partRef != null) {
-                if (IWorkbenchPage.CHANGE_VIEW_SHOW == changeId || IWorkbenchPage.CHANGE_VIEW_HIDE == changeId) {
-                	Iterator iterator = fContextIdsToBindings.values().iterator();
-                	while (iterator.hasNext()) {
-                		DebugContextViewBindings bindings = (DebugContextViewBindings) iterator.next();
-                		bindings.setViewOpened(IWorkbenchPage.CHANGE_VIEW_SHOW == changeId, partRef.getId());
-                	}
-                }
-			}
-        }	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-		if (page.getWorkbenchWindow().equals(fWindow)) {
-			ISelection activeContext = getDebugContextService().getActiveContext();
-			if (activeContext != null) {
-				contextActivated(activeContext);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
-	 */
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
-	}
-	
-	/**
-	 * Activates all parent contexts of the given context, top down.
-	 * 
-	 * @param contextId
-	 */
-	private void activateChain(String contextId) {
-		IWorkbenchPage page = fWindow.getActivePage();
-		if (page != null) {
-			DebugContextViewBindings bindings= (DebugContextViewBindings) fContextIdsToBindings.get(contextId);
-			if (bindings != null) {
-				bindings.activateChain(page);
-			}
-		}
-	}
-	
-	/**
-	 * Links each debug context view bindings with its parent context bindings 
-	 */
-	private void linkParentContexts() {
-		Iterator iterator = fContextIdsToBindings.entrySet().iterator();
-		while (iterator.hasNext()) {
-			Entry entry = (Entry)iterator.next();
-			String contextId = (String) entry.getKey();
-			DebugContextViewBindings bindings = (DebugContextViewBindings) entry.getValue();
-			if (!bindings.getId().equals(DEBUG_CONTEXT)) {
-				Context context = fContextService.getContext(contextId);
-				try {
-					bindings.setParentId(context.getParentId());
-				} catch (NotDefinedException e) {
-					DebugUIPlugin.log(e);
-				}
-			}
-		}
-	}	
-	
-	/**
-	 * Sets the active context in the given perspective, or removes
-	 * when <code>null</code>.
-	 * 
-	 * @param perspective
-	 * @param contextId
-	 */
-	private void setActive(IPerspectiveDescriptor perspective, String contextId) {
-		if (contextId == null) {
-			fPerspectiveToActiveContext.remove(perspective);
-		} else {
-			fPerspectiveToActiveContext.put(perspective, contextId);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.contexts.IContextManagerListener#contextManagerChanged(org.eclipse.core.commands.contexts.ContextManagerEvent)
-	 */
-	public void contextManagerChanged(ContextManagerEvent event) {
-		if (event.isActiveContextsChanged()) {
-			Set disabledContexts = getDisabledContexts(event);
-			if (!disabledContexts.isEmpty()) {
-				Iterator contexts = disabledContexts.iterator();
-				while (contexts.hasNext()) {
-					String contextId = (String)contexts.next();
-					if (isViewConetxt(contextId)) {
-						if (isActivated(contextId)) {
-							deactivate(contextId);
-						}
-					}
-				}
-			}
-		}
-	}
-	
-	private void deactivate(String contextId) {
-		IWorkbenchPage page = fWindow.getActivePage();
-		if (page != null) {
-			DebugContextViewBindings bindings = (DebugContextViewBindings) fContextIdsToBindings.get(contextId);
-			if (bindings != null) {
-				bindings.deactivate(page);
-			}
-		}		
-	}
-	
-	/**
-	 * Returns a set of contexts disabled in the given event, possibly empty.
-	 * 
-	 * @param event
-	 * @return disabled context id's
-	 */
-	private Set getDisabledContexts(ContextManagerEvent event) {
-		Set prev = new HashSet(event.getPreviouslyActiveContextIds());
-		Set activeContextIds = event.getContextManager().getActiveContextIds();
-		if (activeContextIds != null) {
-			prev.removeAll(activeContextIds);
-		}
-		return prev;
-	}	
-
-	/**
-	 * Returns whether the given context has view bindings.
-	 * 
-	 * @param id
-	 * @return whether the given context has view bindings
-	 */
-	private boolean isViewConetxt(String id) {
-		return fContextIdsToBindings.containsKey(id);
-	}
-    
-    /**
-     * Save view binding settings that differ from extension settings
-     */
-    private void saveViewBindings() {
-        try {
-            Document document = DebugPlugin.newDocument();
-            Element root = document.createElement(XML_ELEMENT_VIEW_BINDINGS);
-            document.appendChild(root);
-            Set done = new HashSet();
-            Iterator bindings = fContextIdsToBindings.values().iterator();
-            while (bindings.hasNext()) {
-                DebugContextViewBindings binding = (DebugContextViewBindings) bindings.next();
-                binding.saveBindings(document, root, done);
-            }
-            String prefValue = ""; //$NON-NLS-1$
-            if (root.hasChildNodes()) {
-            	prefValue = DebugPlugin.serializeDocument(document);
-            }
-            fIgnoreChanges = true;
-            DebugUITools.getPreferenceStore().setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, prefValue);
-        } catch (CoreException e) {
-            DebugUIPlugin.log(e);
-        } finally {
-            fIgnoreChanges = false;
-        }
-
-    }    
-    
-    /**
-     * Returns the perspectives in which debugging is enabled.
-     * 
-     * @return
-     */
-    public String[] getEnabledPerspectives() {
-    	return (String[]) fEnabledPerspectives.toArray(new String[fEnabledPerspectives.size()]);
-    }
-    
-    /**
-     * Show the view without effecting user preferences
-     * 
-     * @param viewId
-     */
-    public void showViewQuiet(String viewId) {
-		IWorkbenchPage page = fWindow.getActivePage();
-		if (page != null) {
-			try {
-				fIgnoreChanges = true;
-				IViewPart part = page.showView(viewId, null, IWorkbenchPage.VIEW_VISIBLE);
-				if (!page.isPartVisible(part)) {
-					page.bringToTop(part);
-				}
-			} catch (PartInitException e) {
-				DebugUIPlugin.log(e);
-			} finally {
-				fIgnoreChanges = false;
-			}
-		}    	
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener4#perspectivePreDeactivate(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectivePreDeactivate(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-		if (page.getWorkbenchWindow().equals(fWindow)) {
-			clean(perspective);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointContainer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointContainer.java
deleted file mode 100644
index 6b852f3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointContainer.java
+++ /dev/null
@@ -1,199 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.model.IBreakpoint;
-
-/**
- * A container of breakpoints, based on a category.
- */
-public class BreakpointContainer extends PlatformObject    {
-
-    private IAdaptable fCategory;
-    private IBreakpointOrganizer fOrganizer;
-    private List fBreakpoints;
-    private Map fCategoriesToContainers;
-    private IBreakpointOrganizer[] fNesting;
-    
-    /**
-     * Constructs a container of breakpoints for the given category,
-     * created by the given organizer.
-     * 
-     * @param category breakpoint category
-     * @param organizer breakpoint organizer
-     * @param nesting nested organizers or <code>null</code> if none
-     */
-    public BreakpointContainer(IAdaptable category, IBreakpointOrganizer organizer, IBreakpointOrganizer[] nesting) {
-        fCategory = category;
-        fOrganizer = organizer;
-        fBreakpoints = new ArrayList();
-        fNesting = nesting;
-        fCategoriesToContainers = new HashMap();
-        // seed with all nested categories
-        if (nesting != null && nesting.length > 0) {
-            IAdaptable[] emptyCategories = nesting[0].getCategories();
-            if (emptyCategories != null) {
-                for (int i = 0; i < emptyCategories.length; i++) {
-                    IAdaptable empty = emptyCategories[i];
-                    BreakpointContainer container = (BreakpointContainer) fCategoriesToContainers.get(empty);
-                    if (container == null) {
-                        container = new BreakpointContainer(empty, nesting[0], null);
-                        fCategoriesToContainers.put(empty, container);
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * Adds a breakpoint to this container and its nested containers.
-     * 
-     * @param breakpoint breakpoint to add  
-     */
-    public void addBreakpoint(IBreakpoint breakpoint) {
-        fBreakpoints.add(breakpoint);
-        if (fNesting != null && fNesting.length > 0) {
-            IBreakpointOrganizer organizer = fNesting[0];
-            IAdaptable[] categories = organizer.getCategories(breakpoint);
-            if (categories== null || categories.length == 0) {
-            	categories = OtherBreakpointCategory.getCategories(organizer);
-            }
-            for (int i = 0; i < categories.length; i++) {
-                IAdaptable category = categories[i];
-                BreakpointContainer container = (BreakpointContainer) fCategoriesToContainers.get(category);
-                if (container == null) {
-                    IBreakpointOrganizer[] nesting = null;
-                    if (fNesting.length > 1) {
-                        nesting = new IBreakpointOrganizer[fNesting.length - 1];
-                        System.arraycopy(fNesting, 1, nesting, 0, nesting.length);
-                    }
-                    container = new BreakpointContainer(category, organizer, nesting);
-                    fCategoriesToContainers.put(category, container);
-                }
-                container.addBreakpoint(breakpoint);
-            }
-        }
-    }
-    
-    /**
-     * Returns the breakpoints in this container
-     * 
-     * @return the breakpoints in this container
-     */
-    public IBreakpoint[] getBreakpoints() {
-        return (IBreakpoint[]) fBreakpoints.toArray(new IBreakpoint[fBreakpoints.size()]);
-    }
-    
-    /**
-     * Returns this container's category.
-     * 
-     * @return container category
-     */
-    public IAdaptable getCategory() {
-        return fCategory;
-    }
-    
-    /**
-     * Returns children as breakpoints or nested containers.
-     * 
-     * @return children as breakpoints or nested containers
-     */
-    public Object[] getChildren() {
-        if (fCategoriesToContainers.isEmpty()) {
-            return getBreakpoints();
-        }
-        return getContainers(); 
-    }
-    
-    /**
-     * Returns the containers nested in this container, possibly empty.
-     * 
-     * @return the containers nested in this container, possibly empty
-     */
-    public BreakpointContainer[] getContainers() {
-        Collection collection = fCategoriesToContainers.values();
-        return (BreakpointContainer[]) collection.toArray(new BreakpointContainer[collection.size()]);
-    }
-    
-    /**
-     * Returns this container's organizer.
-     * 
-     * @return this container's organizer
-     */
-    public IBreakpointOrganizer getOrganizer() {
-        return fOrganizer;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object obj) {
-        if (obj instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) obj;
-            return getCategory().equals(container.getCategory());
-        }
-        return super.equals(obj);
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        return getCategory().hashCode();
-    }
-    
-    /**
-     * Returns whether this container contains the given breakpoint.
-     * 
-     * @param breakpoint
-     * @return whether this container contains the given breakpoint
-     */
-    public boolean contains(IBreakpoint breakpoint) {
-        return fBreakpoints.contains(breakpoint);
-    }
-    
-    /**
-     * Returns the leaf containers the given breakpoint is contained in, or <code>null</code>
-     * if none.
-     *  
-     * @param breakpoint
-     * @return leaf containers the given breakpoint is contained in, or <code>null</code>
-     * if none
-     */
-    public BreakpointContainer[] getContainers(IBreakpoint breakpoint) {
-        if (contains(breakpoint)) {
-            BreakpointContainer[] containers = getContainers();
-            if (containers.length == 0) {
-                return new BreakpointContainer[]{this};
-            }
-            List list = new ArrayList();
-            for (int i = 0; i < containers.length; i++) {
-                BreakpointContainer container = containers[i];
-                BreakpointContainer[] subcontainers = container.getContainers(breakpoint);
-                if (subcontainers != null) {
-                    for (int j = 0; j < subcontainers.length; j++) {
-                        list.add(subcontainers[j]);
-                    }
-                }
-            }
-            return (BreakpointContainer[]) list.toArray(new BreakpointContainer[list.size()]);
-        }
-        return null;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointContainerWorkbenchAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointContainerWorkbenchAdapter.java
deleted file mode 100644
index 9026b3d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointContainerWorkbenchAdapter.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.model.IWorkbenchAdapter2;
-
-/**
- * BreakpointContainerWorkbenchAdapter
- */
-public class BreakpointContainerWorkbenchAdapter implements IWorkbenchAdapter, IWorkbenchAdapter2{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object o) {
-        // not used
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        if (object instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) object;
-            IAdaptable category = container.getCategory();
-            IWorkbenchAdapter adapter = (IWorkbenchAdapter) category.getAdapter(IWorkbenchAdapter.class);
-            if (adapter != null) {
-                return adapter.getImageDescriptor(category);
-            }
-            return container.getOrganizer().getImageDescriptor();
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-     */
-    public String getLabel(Object object) {
-        if (object instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) object;
-            IAdaptable category = container.getCategory();
-            IWorkbenchAdapter adapter = (IWorkbenchAdapter) category.getAdapter(IWorkbenchAdapter.class);
-            if (adapter != null) {
-                return adapter.getLabel(category);
-            }
-            return container.getOrganizer().getLabel();
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-     */
-    public Object getParent(Object o) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getForeground(java.lang.Object)
-     */
-    public RGB getForeground(Object object) {
-        if (object instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) object;
-            IAdaptable category = container.getCategory();
-            IWorkbenchAdapter2 adapter = (IWorkbenchAdapter2) category.getAdapter(IWorkbenchAdapter2.class);
-            if (adapter != null) {
-                return adapter.getForeground(category);
-            }
-        }        
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getBackground(java.lang.Object)
-     */
-    public RGB getBackground(Object object) {
-        if (object instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) object;
-            IAdaptable category = container.getCategory();
-            IWorkbenchAdapter2 adapter = (IWorkbenchAdapter2) category.getAdapter(IWorkbenchAdapter2.class);
-            if (adapter != null) {
-                return adapter.getBackground(category);
-            }
-        }        
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getFont(java.lang.Object)
-     */
-    public FontData getFont(Object object) {
-        if (object instanceof BreakpointContainer) {
-            BreakpointContainer container = (BreakpointContainer) object;
-            IAdaptable category = container.getCategory();
-            IWorkbenchAdapter2 adapter = (IWorkbenchAdapter2) category.getAdapter(IWorkbenchAdapter2.class);
-            if (adapter != null) {
-                return adapter.getFont(category);
-            }
-        }        
-        return null;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointFactory.java
deleted file mode 100644
index 221587f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointFactory.java
+++ /dev/null
@@ -1,54 +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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Factory to restore breakpoints from mementos for breakpoint working sets.
- */
-public class BreakpointFactory implements IElementFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IElementFactory#createElement(org.eclipse.ui.IMemento)
-     */
-    public IAdaptable createElement(IMemento memento) {
-        String longString = memento.getString(BreakpointPersistableElementAdapter.TAG_MARKER_ID);
-        String factoryId = memento.getString(BreakpointPersistableElementAdapter.TAG_RESOURCE_FACTORY_ID);
-        if (factoryId != null && longString != null) {
-            IElementFactory elementFactory = PlatformUI.getWorkbench().getElementFactory(factoryId);
-            if (elementFactory != null) {
-                IAdaptable adaptable = elementFactory.createElement(memento);
-                if (adaptable instanceof IResource) {
-                    IResource resource = (IResource) adaptable;
-                    try {
-                        long id = Long.parseLong(longString);
-                        IMarker marker = resource.findMarker(id);
-                        if (marker != null) {
-                            return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
-                        }
-                    } catch (NumberFormatException e) {
-                    } catch (CoreException e) {
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerExtension.java
deleted file mode 100644
index 3108687..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerExtension.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.ui.IBreakpointOrganizerDelegate;
-import org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-/**
- * A contributed breakpoint organizer.
- */
-public class BreakpointOrganizerExtension implements IBreakpointOrganizer, IBreakpointOrganizerDelegateExtension {
-	
-	private IConfigurationElement fElement;
-	private IBreakpointOrganizerDelegate fDelegate;
-	private ImageDescriptor fDescriptor;
-	
-	// attributes
-	public static final String ATTR_LABEL = "label"; //$NON-NLS-1$
-	public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-	public static final String ATTR_ID = "id"; //$NON-NLS-1$
-	public static final String ATTR_ICON = "icon"; //$NON-NLS-1$
-    public static final String ATTR_OTHERS_LABEL = "othersLabel"; //$NON-NLS-1$
-	
-	public BreakpointOrganizerExtension(IConfigurationElement element) {
-		fElement = element;
-	}
-	
-	/**
-	 * Returns the image descriptor for this organizer.
-	 * 
-	 * @return image descriptor
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		if (fDescriptor == null) {
-			fDescriptor = DebugUIPlugin.getImageDescriptor(fElement, ATTR_ICON);
-			if (fDescriptor == null) {
-				fDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-		}
-		return fDescriptor;		
-	}
-	
-	/**
-	 * Returns this organizer's label.
-	 * 
-	 * @return this organizer's label
-	 */
-	public String getLabel() {
-		return fElement.getAttribute(ATTR_LABEL);
-	}
-    
-    /**
-     * Returns this organizer's identifier.
-     * 
-     * @return this organizer's identifier
-     */
-    public String getIdentifier() {
-        return fElement.getAttribute(ATTR_ID);
-    }
-	
-	/**
-	 * Returns this organizer's delegate, instantiating it if required.
-	 * 
-	 * @return this organizer's delegate
-	 */
-	protected IBreakpointOrganizerDelegate getOrganizer() {
-		if (fDelegate == null) {
-			try {
-				fDelegate = (IBreakpointOrganizerDelegate) fElement.createExecutableExtension(ATTR_CLASS);
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-			}
-		}
-		return fDelegate;
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories(org.eclipse.debug.core.model.IBreakpoint)
-     */
-    public IAdaptable[] getCategories(IBreakpoint breakpoint) {
-        return getOrganizer().getCategories(breakpoint);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener) {
-        getOrganizer().addPropertyChangeListener(listener);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener) {
-        getOrganizer().removePropertyChangeListener(listener);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#addBreakpoint(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public void addBreakpoint(IBreakpoint breakpoint, IAdaptable category) {
-        getOrganizer().addBreakpoint(breakpoint, category);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#removeBreakpoint(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public void removeBreakpoint(IBreakpoint breakpoint, IAdaptable category) {
-        getOrganizer().removeBreakpoint(breakpoint, category);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#canAdd(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public boolean canAdd(IBreakpoint breakpoint, IAdaptable category) {
-        return getOrganizer().canAdd(breakpoint, category);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#canRemove(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public boolean canRemove(IBreakpoint breakpoint, IAdaptable category) {
-        return getOrganizer().canRemove(breakpoint, category);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#dispose()
-     */
-    public void dispose() {
-    	// don't instantiate the delegate if it has not been used
-    	if (fDelegate != null) {
-    		fDelegate.dispose();
-    	}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer#getOthersLabel()
-     */
-    public String getOthersLabel() {
-        String attribute = fElement.getAttribute(ATTR_OTHERS_LABEL);
-        if (attribute == null) {
-            return DebugUIViewsMessages.OtherBreakpointOrganizer_0; 
-        }
-        return attribute;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories()
-     */
-    public IAdaptable[] getCategories() {
-        return getOrganizer().getCategories();
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension#addBreakpoints(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.runtime.IAdaptable)
-	 */
-	public void addBreakpoints(IBreakpoint[] breakpoints, IAdaptable category) {
-		IBreakpointOrganizerDelegate organizer = getOrganizer();
-		if (organizer instanceof IBreakpointOrganizerDelegateExtension) {
-			((IBreakpointOrganizerDelegateExtension)organizer).addBreakpoints(breakpoints, category);
-		} else {
-			for (int i = 0; i < breakpoints.length; i++) {
-				addBreakpoint(breakpoints[i], category);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension#removeBreakpoints(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.runtime.IAdaptable)
-	 */
-	public void removeBreakpoints(IBreakpoint[] breakpoints, IAdaptable category) {
-		IBreakpointOrganizerDelegate organizer = getOrganizer();
-		if (organizer instanceof IBreakpointOrganizerDelegateExtension) {
-			((IBreakpointOrganizerDelegateExtension)organizer).removeBreakpoints(breakpoints, category);
-		} else {
-			for (int i = 0; i < breakpoints.length; i++) {
-				removeBreakpoint(breakpoints[i], category);
-			}
-		}
-		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java
deleted file mode 100644
index 617ff70..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java
+++ /dev/null
@@ -1,156 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Manager which provides access to the breakpoint organizers
- * contributed via the org.eclipse.debug.ui.breakpointOrganizers
- * extension point.
- * <p>
- * Manages the default breakpoint working set and places newly
- * create breakpoints in to that set.
- * </p>
- * @since 3.1
- */
-public class BreakpointOrganizerManager {
-	
-	private static BreakpointOrganizerManager fgManager;
-	
-	// map for lookup by id
-    private Map fOrganizers = new HashMap();
-    // cached sorted list by label
-    private List fSorted = null;
-
-	/**
-	 * Returns the singleton instance of the breakpoint container
-	 * factory manager.
-	 */
-	public static BreakpointOrganizerManager getDefault() {
-		if (fgManager == null) {
-			fgManager= new BreakpointOrganizerManager();
-		}
-		return fgManager;
-	}
-	
-	/**
-	 * Creates and initializes a new breakpoint container factory.
-	 */
-	private BreakpointOrganizerManager() {
-        loadOrganizers();
-        // force the working set organizers to initialize their listeners
-        start("org.eclipse.debug.ui.workingSetOrganizer"); //$NON-NLS-1$
-        start("org.eclipse.debug.ui.breakpointWorkingSetOrganizer"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Forces instantiation of orgranizer delegate.
-	 * 
-	 * @param organizerId organizer to start
-	 */
-	private void start(String organizerId) {
-        IBreakpointOrganizer organizer = getOrganizer(organizerId);
-        IPropertyChangeListener listener = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-            }
-        };
-        organizer.addPropertyChangeListener(listener);
-        organizer.removePropertyChangeListener(listener);		
-	}
-    
-    /**
-     * Loads all contributed breakpoint organizers.
-     */
-    private void loadOrganizers() {
-        IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_BREAKPOINT_ORGANIZERS);
-        IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
-        for (int i = 0; i < configurationElements.length; i++) {
-            IConfigurationElement element= configurationElements[i];
-            IBreakpointOrganizer organizer = new BreakpointOrganizerExtension(element);
-            if (validateOrganizer(organizer)) {
-                fOrganizers.put(organizer.getIdentifier(), organizer);
-            }
-        }
-    }    
-	
-    /**
-     * Validates the given organizer. Checks that certain required attributes
-     * are available.
-     * @param extension the organizer to validate
-     * @return whether the given organizer is valid
-     */
-    protected static boolean validateOrganizer(IBreakpointOrganizer organizer) {
-        String id = organizer.getIdentifier();
-        String label = organizer.getLabel();
-        return id != null && id.length() > 0 && label != null && label.length() > 0;
-    }    
-	
-    /**
-     * Returns all contributed breakpoint organizers.
-     * 
-     * @return all contributed breakpoint organizers
-     */
-    public IBreakpointOrganizer[] getOrganizers() {
-    	if (fSorted == null) {
-	        Collection collection = fOrganizers.values();
-	        fSorted = new ArrayList();
-	        fSorted.addAll(collection);
-	        Collections.sort(fSorted, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					IBreakpointOrganizer b1 = (IBreakpointOrganizer)o1;
-					IBreakpointOrganizer b2 = (IBreakpointOrganizer)o2;
-					return b1.getLabel().compareTo(b2.getLabel());
-				}
-
-				public boolean equals(Object obj) {
-					return this == obj;
-				}
-			});
-    	}
-    	return (IBreakpointOrganizer[]) fSorted.toArray(new IBreakpointOrganizer[fSorted.size()]);
-    }
-    
-    /**
-     * Returns the specified breakpoint organizer or <code>null</code>
-     * @param id organizer identifier
-     * @return breakpoint organizer or <code>null</code>
-     */
-    public IBreakpointOrganizer getOrganizer(String id) {
-        return (IBreakpointOrganizer) fOrganizers.get(id);
-    }
-    
-    /**
-     * Shuts down the organizer manager, disposing organizers.
-     */
-    public void shutdown() {
-        IBreakpointOrganizer[] organizers = getOrganizers();
-        for (int i = 0; i < organizers.length; i++) {
-            IBreakpointOrganizer organizer = organizers[i];
-            organizer.dispose();
-        }
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointPersistableElementAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointPersistableElementAdapter.java
deleted file mode 100644
index d0c8361..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointPersistableElementAdapter.java
+++ /dev/null
@@ -1,63 +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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * Adapter to save and restore breakpoints for a working set.
- */
-public class BreakpointPersistableElementAdapter implements IPersistableElement {
-    
-    private IBreakpoint fBreakpoint;
-    
-    public static final String TAG_MARKER_ID = "TAG_MARKER_ID"; //$NON-NLS-1$
-    public static final String TAG_RESOURCE_FACTORY_ID = "TAG_RESOURCE_FACTORY_ID"; //$NON-NLS-1$
-    
-    /**
-     * Constructs a new persitable element adapter for the given breakpoint.
-     * 
-     * @param breakpoint
-     */
-    public BreakpointPersistableElementAdapter(IBreakpoint breakpoint) {
-        fBreakpoint = breakpoint;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPersistableElement#getFactoryId()
-     */
-    public String getFactoryId() {
-        return "org.eclipse.debug.ui.elementFactory.breakpoints"; //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPersistableElement#saveState(org.eclipse.ui.IMemento)
-     */
-    public void saveState(IMemento memento) {
-        IMarker marker = fBreakpoint.getMarker();
-        if (marker != null) {
-            IResource resource = marker.getResource();
-            IPersistableElement pe = (IPersistableElement) resource.getAdapter(IPersistableElement.class);
-            if (pe != null) {
-                long id = marker.getId();
-                String longString = Long.toString(id);
-                memento.putString(TAG_MARKER_ID, longString);
-                memento.putString(TAG_RESOURCE_FACTORY_ID, pe.getFactoryId());
-                pe.saveState(memento);
-            }            
-        }
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java
deleted file mode 100644
index b736b65..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointSetOrganizer.java
+++ /dev/null
@@ -1,451 +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.debug.internal.ui.views.breakpoints;
-
-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 java.util.Map.Entry;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.IImportExportConstants;
-import org.eclipse.debug.ui.AbstractBreakpointOrganizerDelegate;
-import org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Breakpoint organizers for breakpoint working sets.
- * 
- * @since 3.1
- */
-public class BreakpointSetOrganizer extends AbstractBreakpointOrganizerDelegate implements IBreakpointOrganizerDelegateExtension, IPropertyChangeListener, IBreakpointsListener {
-
-	private IWorkingSetManager fWorkingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
-	
-	/**
-	 * A cache for mapping markers to the working set they belong to
-	 * @since 3.2
-	 */
-	private BreakpointWorkingSetCache fCache = null;
-	
-	// Cache of the default working set, so we can know when it changes name
-	private static IWorkingSet fDefaultWorkingSet = null;
-	
-	
-	/**
-	 * Constructs a working set breakpoint organizer. Listens for changes in
-	 * working sets and fires property change notification.
-	 */
-	public BreakpointSetOrganizer() {
-		fWorkingSetManager.addPropertyChangeListener(this);
-		fCache = new BreakpointWorkingSetCache();
-		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-		DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
-		fDefaultWorkingSet = getDefaultWorkingSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories(org.eclipse.debug.core.model.IBreakpoint)
-	 */
-	public IAdaptable[] getCategories(IBreakpoint breakpoint) {
-		List result = new ArrayList();
-		IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets();
-		for (int i = 0; i < workingSets.length; i++) {
-			IWorkingSet set = workingSets[i];
-			if (IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(set.getId())) {
-				IAdaptable[] elements = set.getElements();
-				for (int j = 0; j < elements.length; j++) {
-					IAdaptable adaptable = elements[j];
-					if (adaptable.equals(breakpoint)) {
-						result.add(new WorkingSetCategory(set));
-						break;
-					}
-				}
-			}
-		}
-		return (IAdaptable[]) result.toArray(new IAdaptable[result.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#dispose()
-	 */
-	public void dispose() {
-		fWorkingSetManager.removePropertyChangeListener(this);
-		fWorkingSetManager = null;
-		DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
-		DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		IWorkingSet set = null;
-		Object newValue = event.getNewValue();
-		if (newValue instanceof IWorkingSet) {
-			set = (IWorkingSet) newValue;
-		}
-		else if (event.getOldValue() instanceof IWorkingSet) {
-			set = (IWorkingSet) event.getOldValue();
-		}
-		String property = event.getProperty();
-		//fix for bug 103731
-		if (property.equals(IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE)) {
-			if (newValue.equals(fDefaultWorkingSet)) {
-				setDefaultWorkingSet((IWorkingSet) newValue);
-			}
-		}
-		if (property.equals(IWorkingSetManager.CHANGE_WORKING_SET_REMOVE)) {
-			if (event.getOldValue().equals(fDefaultWorkingSet)) {
-				setDefaultWorkingSet(null);
-			}
-		}
-		if(property.equals(IWorkingSetManager.CHANGE_WORKING_SET_ADD)) {
-			IAdaptable[] breakpoints = set.getElements();
-			for (int i = 0; i < breakpoints.length; i++) {
-				if (breakpoints[i] instanceof IBreakpoint) {
-					IMarker marker = ((IBreakpoint)breakpoints[i]).getMarker();
-					fCache.addEntry(marker, set.getName());
-					fCache.flushMarkerCache(marker);
-				}
-			}
-		}
-		if (set != null	&& IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(set.getId())) {
-			fireCategoryChanged(new WorkingSetCategory(set));
-		}
-		if (property.equals(IInternalDebugUIConstants.MEMENTO_BREAKPOINT_WORKING_SET_NAME)) {
-			IWorkingSet defaultWorkingSet = getDefaultWorkingSet();
-			if (defaultWorkingSet != null) {
-				fireCategoryChanged(new WorkingSetCategory(defaultWorkingSet));
-			} else {
-				fireCategoryChanged(null);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
-	 */
-	public void breakpointsAdded(IBreakpoint[] breakpoints) {
-		Map setToBreakpoints = new HashMap();
-		for (int i = 0; i < breakpoints.length; i++) {
-			IMarker marker = breakpoints[i].getMarker();
-			String[] names = getWorkingsetAttributeFromMarker(marker, IInternalDebugUIConstants.WORKING_SET_NAME);
-			//add it to the default set if the listing is empty
-			if (names.length == 0) {
-				queueToSet(breakpoints[i], getDefaultWorkingSet(), setToBreakpoints);
-			} else {
-				for (int j = 1; j < names.length; j++) {
-					IWorkingSet set = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(names[j]);
-					// if we cannot find the one we want, try to get the default
-					if (set == null) {
-						set = getDefaultWorkingSet();
-					}
-					queueToSet(breakpoints[i], set, setToBreakpoints);
-				}
-			}
-		}
-		Iterator iterator = setToBreakpoints.entrySet().iterator();
-		while (iterator.hasNext()) {
-			Entry entry = (Entry) iterator.next();
-			IWorkingSet set = (IWorkingSet) entry.getKey();
-			List list = (List) entry.getValue();
-			addBreakpointsToSet((IBreakpoint[]) list.toArray(new IBreakpoint[list.size()]), set);
-		}
-	}
-	
-	private void queueToSet(IBreakpoint breakpoint, IWorkingSet set, Map queue) {
-		List list = (List) queue.get(set);
-		if (list == null) {
-			list = new ArrayList();
-			queue.put(set, list);
-		}
-		list.add(breakpoint);
-	}
-	
-	/**
-	 * Adds a breakpoint to a working set
-	 * @param breakpoint the breakpoint to add
-	 * @param set the set to add it to or <code>null</code> if none
-	 * 
-	 * @since 3.2
-	 */
-	private void addBreakpointsToSet(IBreakpoint[] breakpoints, IWorkingSet set) {
-		if (set != null) {
-			IAdaptable[] elements = set.getElements();
-			Set collection = new HashSet(elements.length);
-			List list = new ArrayList(elements.length + breakpoints.length);
-			for(int i = 0; i < elements.length; i++) {
-				collection.add(elements[i]);
-				list.add(elements[i]);
-			}
-			for (int i = 0; i < breakpoints.length; i++) {
-				IBreakpoint breakpoint = breakpoints[i];
-				if (!collection.contains(breakpoint)) {
-					list.add(breakpoint);
-					fCache.addEntry(breakpoint.getMarker(), set.getName()); //fix for bug 103731	
-					fCache.flushMarkerCache(breakpoint.getMarker());
-				}
-			}
-			set.setElements((IAdaptable[]) list.toArray(new IAdaptable[list.size()]));
-		}
-	}	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[],
-	 *      org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsRemoved(IBreakpoint[] breakpoints,
-			IMarkerDelta[] deltas) {
-		IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets();
-		IWorkingSet set = null;
-		for (int i = 0; i < workingSets.length; i++) {
-			set = workingSets[i];
-			if (IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(set.getId())) {
-				clean(set);
-			}
-		}
-	}
-
-	/**
-	 * Removes deleted breakpoints from the given working set.
-	 * 
-	 * @param workingSet
-	 *            breakpoint working set
-	 */
-	private void clean(IWorkingSet workingSet) {
-		IAdaptable[] elements = workingSet.getElements();
-		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
-		boolean update = false;
-		for (int i = 0; i < elements.length; i++) {
-			IAdaptable adaptable = elements[i];
-			if (adaptable instanceof IBreakpoint) {
-				IBreakpoint breakpoint = (IBreakpoint) adaptable;
-				if (!manager.isRegistered(breakpoint)) {
-					update = true;
-					elements[i] = null;
-				}
-			}
-		}
-		if (update) {
-			List newElements = new ArrayList(elements.length);
-			for (int i = 0; i < elements.length; i++) {
-				IAdaptable adaptable = elements[i];
-				if (adaptable != null) {
-					newElements.add(adaptable);
-				}
-			}
-			workingSet.setElements((IAdaptable[]) newElements.toArray(new IAdaptable[newElements.size()]));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[],
-	 *      org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-	}
-
-	/**
-	 * Returns the active default breakpoint working set, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the active default breakpoint working set, or <code>null</code>
-	 */
-	public static IWorkingSet getDefaultWorkingSet() {
-		IPreferenceStore preferenceStore = DebugUIPlugin.getDefault().getPreferenceStore();
-		String name = preferenceStore.getString(IInternalDebugUIConstants.MEMENTO_BREAKPOINT_WORKING_SET_NAME);
-		if (name != null) {
-			return PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(name);
-		}
-		return null;
-	}
-
-	/**
-	 * Sets the active default breakpoint working set, or <code>null</code> if
-	 * none.
-	 * 
-	 * @param set
-	 *            default working set or <code>null</code>
-	 */
-	public static void setDefaultWorkingSet(IWorkingSet set) {
-		String name = ""; //$NON-NLS-1$
-		if (set != null) {
-			// only consider breakpoint working sets
-			if (IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(set.getId())) {
-				name = set.getName();
-			}
-		}
-		fDefaultWorkingSet = set;
-		DebugUIPlugin.getDefault().getPluginPreferences().setValue(IInternalDebugUIConstants.MEMENTO_BREAKPOINT_WORKING_SET_NAME, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#canRemove(org.eclipse.debug.core.model.IBreakpoint,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public boolean canRemove(IBreakpoint breakpoint, IAdaptable category) {
-		if (category instanceof WorkingSetCategory) {
-			WorkingSetCategory wsc = (WorkingSetCategory) category;
-			return IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(wsc.getWorkingSet().getId());
-		}
-		return super.canRemove(breakpoint, category);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#canAdd(org.eclipse.debug.core.model.IBreakpoint,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public boolean canAdd(IBreakpoint breakpoint, IAdaptable category) {
-		if (category instanceof WorkingSetCategory) {
-			WorkingSetCategory wsc = (WorkingSetCategory) category;
-			return IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(wsc.getWorkingSet().getId());
-		}
-		return super.canAdd(breakpoint, category);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#addBreakpoint(org.eclipse.debug.core.model.IBreakpoint,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public void addBreakpoint(IBreakpoint breakpoint, IAdaptable category) {
-		addBreakpoints(new IBreakpoint[]{breakpoint}, category);
-	}
-	
-	/**
-	 * Gets the working set names from the marker
-	 * 
-	 * @param marker
-	 *            them marker to get the names from
-	 * @return the listing of markers or an empty String array, never null
-	 * 
-	 * @since 3.2
-	 */
-	private String[] getWorkingsetAttributeFromMarker(IMarker marker, String type) {
-		try {
-			String name = (String) marker.getAttribute(type);
-			if (name != null) {
-				return name.split("\\" + IImportExportConstants.DELIMITER); //$NON-NLS-1$
-			}
-		}
-		catch (CoreException e) {DebugPlugin.log(e);}
-		return new String[] {};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#removeBreakpoint(org.eclipse.debug.core.model.IBreakpoint,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public void removeBreakpoint(IBreakpoint breakpoint, IAdaptable category) {
-		if (category instanceof WorkingSetCategory) {
-			IWorkingSet set = ((WorkingSetCategory) category).getWorkingSet();
-			IAdaptable[] elements = set.getElements();
-			List list = new ArrayList();
-			for (int i = 0; i < elements.length; i++) {
-				IAdaptable adaptable = elements[i];
-				if (!adaptable.equals(breakpoint)) {
-					list.add(adaptable);
-				}
-			}
-			fCache.removeMappedEntry(breakpoint.getMarker(), set.getName());
-			fCache.flushMarkerCache(breakpoint.getMarker());
-			set.setElements((IAdaptable[]) list.toArray(new IAdaptable[list.size()]));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories()
-	 */
-	public IAdaptable[] getCategories() {
-		IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets();
-		List all = new ArrayList();
-		for (int i = 0; i < workingSets.length; i++) {
-			IWorkingSet set = workingSets[i];
-			if (IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(set
-					.getId())) {
-				all.add(new WorkingSetCategory(set));
-			}
-		}
-		return (IAdaptable[]) all.toArray(new IAdaptable[all.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension#addBreakpoints(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.runtime.IAdaptable)
-	 */
-	public void addBreakpoints(IBreakpoint[] breakpoints, IAdaptable category) {
-		if (category instanceof WorkingSetCategory) {
-			IWorkingSet set = ((WorkingSetCategory) category).getWorkingSet();
-			addBreakpointsToSet(breakpoints, set);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension#removeBreakpoints(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.runtime.IAdaptable)
-	 */
-	public void removeBreakpoints(IBreakpoint[] breakpoints, IAdaptable category) {
-		if (category instanceof WorkingSetCategory) {
-			IWorkingSet set = ((WorkingSetCategory) category).getWorkingSet();
-			IAdaptable[] elements = set.getElements();
-			List list = new ArrayList(elements.length);
-			for (int i = 0; i < elements.length; i++) {
-				list.add(elements[i]);
-			}
-			for (int i = 0; i < breakpoints.length; i++) {
-				IBreakpoint breakpoint = breakpoints[i];
-				fCache.removeMappedEntry(breakpoint.getMarker(), set.getName());
-				fCache.flushMarkerCache(breakpoint.getMarker());
-				list.remove(breakpoint);
-			}
-			set.setElements((IAdaptable[]) list.toArray(new IAdaptable[list.size()]));
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointTypeOrganizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointTypeOrganizer.java
deleted file mode 100644
index 6130725..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointTypeOrganizer.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.debug.internal.ui.views.breakpoints;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.AbstractBreakpointOrganizerDelegate;
-import org.eclipse.debug.ui.BreakpointTypeCategory;
-import org.eclipse.debug.ui.IBreakpointTypeCategory;
-
-/**
- * Breakpoint organizers for breakpoint types.
- * 
- * @since 3.1
- */
-public class BreakpointTypeOrganizer extends AbstractBreakpointOrganizerDelegate {
-	
-	private Map fTypes = new HashMap();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories(org.eclipse.debug.core.model.IBreakpoint)
-     */
-    public IAdaptable[] getCategories(IBreakpoint breakpoint) {
-        IBreakpointTypeCategory category = (IBreakpointTypeCategory) breakpoint.getAdapter(IBreakpointTypeCategory.class);
-        if (category != null) {
-            return new IAdaptable[]{category};
-        }
-    	String name = DebugPlugin.getDefault().getBreakpointManager().getTypeName(breakpoint);
-    	if (name != null) {
-    		IAdaptable[] categories = (IAdaptable[]) fTypes.get(name);
-    		if (categories == null) {
-    			categories = new IAdaptable[]{new BreakpointTypeCategory(name)};
-    			fTypes.put(name, categories);
-    		}
-    		return categories;
-    	}
-    	return null;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#dispose()
-     */
-    public void dispose() {
-    	fTypes.clear();
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetCache.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetCache.java
deleted file mode 100644
index 85682f4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetCache.java
+++ /dev/null
@@ -1,108 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.HashMap;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.IImportExportConstants;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Class to cache the breakpoint to workingset information in its underlying
- * marker as breakpoints are moved between breakpoint working sets.
- * It resolves the need for constant attribute lookup and parsing to 
- * fix bug 103731
- * 
- * @since 3.2
- */
-public class BreakpointWorkingSetCache {
-
-	/**
-	 * the entire cache
-	 * key: marker
-	 * value: vector of workingsets the marker belongs to
-	 */
-	HashMap fCache = null;
-	
-	/**
-	 * Default constructor
-	 * @param organizer the oprganizer that owns this cache
-	 */
-	public BreakpointWorkingSetCache() {
-		fCache = new HashMap(15);
-	}
-	
-	/**
-	 * Adds an entry into the cache
-	 * @param marker the marker to add the workingset information about
-	 * @param entry the entry to add to the cache
-	 */
-	public void addEntry(IMarker marker, Object entry) {
-		Vector list = (Vector)fCache.get(marker);
-		if (list == null) {
-			list = new Vector();
-			list.addElement(entry);
-			fCache.put(marker, list);
-		}
-		else {
-			if(!list.contains(entry)) {
-				list.addElement(entry);
-			}
-		}
-	}
-	
-	/**
-	 * Removes an item from the list contained under the marker key, not the marker entry
-	 * @param marker the marker key to remove the item from
-	 * @param entry the entry to remove
-	 */
-	public void removeMappedEntry(IMarker marker, Object entry) {
-		Vector list = (Vector)fCache.get(marker);
-		if(list != null) {
-			list.remove(entry);
-		}
-	}
-	
-	/**
-	 * Flushes the cache of only the specified marker
-	 * @param marker the marker whose cache is to be flushed
-	 */
-	public void flushMarkerCache(IMarker marker) {
-		IWorkingSetManager manager = PlatformUI.getWorkbench().getWorkingSetManager();
-		Vector list = (Vector)fCache.get(marker);
-		if(list != null) {
-			String names = IImportExportConstants.DELIMITER;
-			String ids = IImportExportConstants.DELIMITER;
-			for(int i = 0; i < list.size(); i++) {
-				String name = (String)list.elementAt(i);
-				IWorkingSet ws = manager.getWorkingSet(name);
-				if(ws != null) {
-					names += name+IImportExportConstants.DELIMITER;
-					ids += ws.getId()+IImportExportConstants.DELIMITER;
-				}
-			}
-			try {
-				marker.setAttribute(IInternalDebugUIConstants.WORKING_SET_NAME, names);
-				marker.setAttribute(IInternalDebugUIConstants.WORKING_SET_ID, ids);
-			}
-			catch(CoreException e) {DebugPlugin.log(e);}
-		}
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetElementAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetElementAdapter.java
deleted file mode 100644
index bc7e5fb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetElementAdapter.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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetElementAdapter;
-
-/**
- * Consulted by workbench pull down actions that add/remove selected elements to/from
- * working sets. Allows breakpoint working sets to select which elements are applicable
- * for adding/removing.
- *  
- * @since 3.3
- */
-public class BreakpointWorkingSetElementAdapter implements IWorkingSetElementAdapter {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkingSetElementAdapter#adaptElements(org.eclipse.ui.IWorkingSet, org.eclipse.core.runtime.IAdaptable[])
-	 */
-	public IAdaptable[] adaptElements(IWorkingSet ws, IAdaptable[] elements) {
-		for (int i = 0; i < elements.length; i++) {
-			IAdaptable adaptable = elements[i];
-			if (!(adaptable instanceof IBreakpoint)) {
-				return selectBreakpoints(elements);
-			}
-		}
-		return elements;
-	}
-	
-	private IAdaptable[] selectBreakpoints(IAdaptable[] elements) {
-		List breakpoints = new ArrayList(elements.length);
-		for (int i = 0; i < elements.length; i++) {
-			IAdaptable adaptable = elements[i];
-			if (adaptable instanceof IBreakpoint) {
-				breakpoints.add(adaptable);
-			}
-		}
-		return (IAdaptable[]) breakpoints.toArray(new IAdaptable[breakpoints.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkingSetElementAdapter#dispose()
-	 */
-	public void dispose() {
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetPage.java
deleted file mode 100644
index f93d1fe..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointWorkingSetPage.java
+++ /dev/null
@@ -1,209 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.EmbeddedBreakpointsViewer;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetPage;
-
-/**
- * The Breakpoint working set page allows the user to create
- * and edit a Breakpoint working set.
- * 
- * @since 3.1
- */
-public class BreakpointWorkingSetPage extends WizardPage implements IWorkingSetPage {
-
-	final private static String PAGE_TITLE= DebugUIViewsMessages.BreakpointWorkingSetPage_0; 
-	final private static String PAGE_ID= "breakpointWorkingSetPage"; //$NON-NLS-1$
-	
-	private Text fWorkingSetName;
-	private EmbeddedBreakpointsViewer fTViewer;
-	private boolean fFirstCheck;
-	private IWorkingSet fWorkingSet;
-
-	/**
-	 * Default constructor.
-	 */
-	public BreakpointWorkingSetPage() {
-		super(PAGE_ID, PAGE_TITLE, DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_DEBUG));
-		setDescription(DebugUIViewsMessages.BreakpointWorkingSetPage_1); 
-		fFirstCheck= true;
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		Composite composite= new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-		setControl(composite);
-		Label label= new Label(composite, SWT.WRAP);
-		label.setText(DebugUIViewsMessages.BreakpointWorkingSetPage_2); 
-		GridData gd= new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
-		label.setLayoutData(gd);
-		fWorkingSetName= new Text(composite, SWT.SINGLE | SWT.BORDER);
-		fWorkingSetName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
-		fWorkingSetName.addModifyListener(
-			new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					validateInput();
-				}
-			}
-		);
-		fWorkingSetName.setFocus();
-		label= new Label(composite, SWT.WRAP);
-		label.setText(DebugUIViewsMessages.BreakpointWorkingSetPage_3); 
-		gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
-		label.setLayoutData(gd);
-		IViewPart viewpart = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-		IStructuredSelection selection; 
-		if (viewpart == null) {
-			selection = new StructuredSelection();
-		} else {
-			selection = (IStructuredSelection)viewpart.getViewSite().getSelectionProvider().getSelection();
-		}
-		fTViewer = new EmbeddedBreakpointsViewer(composite, DebugPlugin.getDefault().getBreakpointManager(), selection);
-		// Add select / deselect all buttons for bug 46669
-		Composite buttonComposite = new Composite(composite, SWT.NONE);
-		buttonComposite.setLayout(new GridLayout(2, false));
-		buttonComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-		Button selectAllButton = SWTFactory.createPushButton(buttonComposite, DebugUIViewsMessages.BreakpointWorkingSetPage_selectAll_label, null);
-		selectAllButton.setToolTipText(DebugUIViewsMessages.BreakpointWorkingSetPage_selectAll_toolTip);
-		selectAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent selectionEvent) {
-				BreakpointsViewer viewer = fTViewer.getViewer();
-				viewer.getTree().selectAll();
-				viewer.setCheckedElements(((IStructuredSelection)viewer.getSelection()).toArray());
-				viewer.setGrayedElements(new Object[] {});
-				viewer.getTree().deselectAll();
-				validateInput();
-			}
-		});
-		Button deselectAllButton = SWTFactory.createPushButton(buttonComposite, DebugUIViewsMessages.BreakpointWorkingSetPage_deselectAll_label, null);
-		deselectAllButton.setToolTipText(DebugUIViewsMessages.BreakpointWorkingSetPage_deselectAll_toolTip);
-		deselectAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent selectionEvent) {
-				BreakpointsViewer viewer = fTViewer.getViewer();
-				viewer.setCheckedElements(new Object[] {});
-				validateInput();
-			}
-		});
-		if (fWorkingSet != null)
-			fWorkingSetName.setText(fWorkingSet.getName());
-		validateInput();
-		Dialog.applyDialogFont(composite);
-	}
-
-	/*
-	 * Implements method from IWorkingSetPage
-	 */
-	public IWorkingSet getSelection() {
-		return fWorkingSet;
-	}
-
-	/*
-	 * Implements method from IWorkingSetPage
-	 */
-	public void setSelection(IWorkingSet workingSet) {
-		Assert.isNotNull(workingSet, "Working set must not be null"); //$NON-NLS-1$
-		fWorkingSet= workingSet;
-		if (getContainer() != null && getShell() != null && fWorkingSetName != null) {
-			fFirstCheck= false;
-			fWorkingSetName.setText(fWorkingSet.getName());
-			validateInput();
-		}
-	}
-
-	/*
-	 * Implements method from IWorkingSetPage
-	 */
-	public void finish() {
-		String workingSetName = fWorkingSetName.getText();
-		Object[] adaptable = fTViewer.getCheckedElements().toArray();
-		ArrayList elements = new ArrayList();
-		//weed out non-breakpoint elements since 3.2
-		for(int i = 0; i < adaptable.length; i++) {
-			if(adaptable[i] instanceof IBreakpoint) {
-				elements.add(adaptable[i]);
-			}//end if
-		}//end for
-		if (fWorkingSet == null) {
-			IWorkingSetManager workingSetManager= PlatformUI.getWorkbench().getWorkingSetManager();
-			fWorkingSet = workingSetManager.createWorkingSet(workingSetName, (IAdaptable[])elements.toArray(new IAdaptable[elements.size()]));
-		} else {
-			fWorkingSet.setName(workingSetName);
-			fWorkingSet.setElements((IAdaptable[])elements.toArray(new IAdaptable[elements.size()]));
-		}
-	}
-
-	/**
-	 * validates the current input of the page to determine if the finish button can be enabled
-	 */
-	private void validateInput() {
-		String errorMessage= null; 
-		String newText= fWorkingSetName.getText();
-
-		if (newText.equals(newText.trim()) == false)
-			errorMessage = DebugUIViewsMessages.BreakpointWorkingSetPage_4; 
-		if (newText.equals("")) { //$NON-NLS-1$
-			if (fFirstCheck) {
-				setPageComplete(false);
-				fFirstCheck= false;
-				return;
-			}		
-			errorMessage= DebugUIViewsMessages.BreakpointWorkingSetPage_5; 
-		}
-		fFirstCheck= false;
-		if (errorMessage == null && (fWorkingSet == null || newText.equals(fWorkingSet.getName()) == false)) {
-			IWorkingSet[] workingSets= PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
-			for (int i= 0; i < workingSets.length; i++) {
-				if (newText.equals(workingSets[i].getName())) {
-					errorMessage= DebugUIViewsMessages.BreakpointWorkingSetPage_6; 
-				}
-			}
-		}
-		setErrorMessage(errorMessage);
-		setPageComplete(errorMessage == null);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsComparator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsComparator.java
deleted file mode 100644
index 1877964..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsComparator.java
+++ /dev/null
@@ -1,134 +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.debug.internal.ui.views.breakpoints;
-
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.ILineBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-/**
- * @since 3.3
- */
-public class BreakpointsComparator extends ViewerComparator {
-		/**
-		 * @see ViewerSorter#isSorterProperty(Object, String)
-		 */
-		public boolean isSorterProperty(Object element,String propertyId) {
-			return propertyId.equals(IBasicPropertyConstants.P_TEXT);
-		}
-		
-		/**
-		 * Returns a negative, zero, or positive number depending on whether
-		 * the first element is less than, equal to, or greater than
-		 * the second element.
-		 * <p>
-		 * Group breakpoints by debug model
-		 * 	within debug model, group breakpoints by type 
-		 * 		within type groups, sort by line number (if applicable) and then
-		 * 		alphabetically by label
-		 * 
-		 * @param viewer the viewer
-		 * @param e1 the first element
-		 * @param e2 the second element
-		 * @return a negative number if the first element is less than the 
-		 *  second element; the value <code>0</code> if the first element is
-		 *  equal to the second element; and a positive number if the first
-		 *  element is greater than the second element
-		 */
-		public int compare(Viewer viewer, Object e1, Object e2) {
-            if (!(e1 instanceof IBreakpoint)) {
-                return super.compare(viewer, e1, e2);
-            }
-	
-			IBreakpoint b1= (IBreakpoint)e1;
-			IBreakpoint b2= (IBreakpoint)e2;
-			String modelId1= b1.getModelIdentifier();
-			String modelId2= b2.getModelIdentifier();
-			int result= modelId1.compareTo(modelId2);
-			if (result != 0) {
-				return result;
-			}
-			String type1= ""; //$NON-NLS-1$
-			String type2= ""; //$NON-NLS-1$
-			IMarker marker1= b1.getMarker();
-			if (!marker1.exists()) {
-				return 0;
-			}
-			try {
-				type1= marker1.getType();
-			} catch (CoreException ce) {
-				DebugUIPlugin.log(ce);
-			}
-			try {
-				IMarker marker2= b2.getMarker();
-				if (!marker2.exists()) {
-					return 0;
-				}
-				type2= marker2.getType();	
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-			}
-		
-			result= type1.compareTo(type2);
-			if (result != 0) {
-				return result;
-			}
-			// model and type are the same
-		
-			ILabelProvider lprov = (ILabelProvider) ((StructuredViewer)viewer).getLabelProvider();
-			String name1= lprov.getText(e1);
-			String name2= lprov.getText(e2);
-	
-			boolean lineBreakpoint= false;
-			try {
-				lineBreakpoint= marker1.isSubtypeOf(IBreakpoint.LINE_BREAKPOINT_MARKER);
-			} catch (CoreException ce) {
-			}
-			if (lineBreakpoint) {
-				return compareLineBreakpoints(b1, b2, name1,name2);
-			} 
-			
-			return name1.compareTo(name2);		
-		}
-		
-		protected int compareLineBreakpoints(IBreakpoint b1, IBreakpoint b2, String name1, String name2) {
-			int colon1= name1.indexOf(':');
-			if (colon1 != -1) {
-				int colon2= name2.indexOf(':');
-				if (colon2 != -1) {
-					String upToColon1= name1.substring(0, colon1);
-					if (name2.startsWith(upToColon1)) {
-						int l1= 0;
-						int l2= 0;
-						try {
-							l1= ((ILineBreakpoint)b1).getLineNumber();	
-						} catch (CoreException e) {
-							DebugUIPlugin.log(e);
-						}
-						try {
-							l2= ((ILineBreakpoint)b2).getLineNumber();	
-						} catch (CoreException e) {
-							DebugUIPlugin.log(e);
-						}
-						return l1 - l2;
-					}
-				}
-			}
-			return name1.compareTo(name2);
-		}
-	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsContentProvider.java
deleted file mode 100644
index 827add9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsContentProvider.java
+++ /dev/null
@@ -1,269 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.IBreakpointOrganizerDelegate;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Content provider for the breakpoints view
- */
-public class BreakpointsContentProvider implements ITreeContentProvider, IPropertyChangeListener {
-    
-    private IBreakpointOrganizer[] fOrganizers = null;
-    private BreakpointsViewer fViewer;
-    private Object[] fElements;
-    private boolean fDisposed = false;
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object parentElement) {
-        if (parentElement.equals(DebugPlugin.getDefault().getBreakpointManager())) {
-        	return fElements;
-        } else if (parentElement instanceof BreakpointContainer) {
-        	return ((BreakpointContainer)parentElement).getChildren();
-        }
-        return new Object[0];
-    }
-
-    /* (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 getChildren(element).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() {
-        fDisposed = true;
-        fElements = null;
-        setOrganizers(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) {
-    	fViewer = (BreakpointsViewer)viewer;
-        if (newInput != null) {
-            reorganize();
-        }
-    }
-    
-    /**
-     * Sets the nested order of breakpoint organizers, or <code>null</code>
-     * if none.
-     * 
-     * @param organizers the nested order of breakpoint organizers, or <code>null</code>
-     * if none 
-     */
-    public void setOrganizers(IBreakpointOrganizer[] organizers) {
-        if (organizers != null && organizers.length == 0) {
-            organizers = null;
-        }
-    	// remove previous listeners
-    	if (fOrganizers != null) {
-    		for (int i = 0; i < fOrganizers.length; i++) {
-				fOrganizers[i].removePropertyChangeListener(this);
-			}
-    	}
-        fOrganizers = organizers;
-        // add listeners
-        if (fOrganizers != null) {
-        	for (int i = 0; i < fOrganizers.length; i++) {
-				fOrganizers[i].addPropertyChangeListener(this);
-			}
-        }
-        if (!fDisposed) {
-            fViewer.getControl().setRedraw(false);
-            // maintain expandsion based on visible breakpoints
-            IBreakpoint[] breakpoints = null;
-            if (isShowingGroups()) {
-                breakpoints = fViewer.getVisibleBreakpoints();
-            }
-            reorganize();
-            if (isShowingGroups()) {
-                // restore expansion
-                for (int i = 0; i < fElements.length; i++) {
-                    BreakpointContainer container = (BreakpointContainer) fElements[i];
-                    for (int j = 0; j < breakpoints.length; j++) {
-                        if (container.contains(breakpoints[j])) {
-                            fViewer.expandToLevel(container, AbstractTreeViewer.ALL_LEVELS);
-                            fViewer.updateCheckedState(container);
-                            break;
-                        }
-                    }
-                    
-                }
-            }
-            fViewer.getControl().setRedraw(true);
-        }
-    }
-    
-    /**
-     * Returns the root containers containing the given breakpoint, or <code>null</code>
-     * if none
-     * 
-     * @param breakpoint
-     * @return root containers containing the given breakpoint or <code>null</code>
-     */
-    public BreakpointContainer[] getRoots(IBreakpoint breakpoint) {
-        if (isShowingGroups()) {
-            List list = new ArrayList();
-            for (int i = 0; i < fElements.length; i++) {
-                BreakpointContainer container = (BreakpointContainer) fElements[i];
-                if (container.contains(breakpoint)) {
-                    list.add(container);
-                }
-            }
-            return (BreakpointContainer[]) list.toArray(new BreakpointContainer[list.size()]);
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the nested order of breakpoint organizers being used, or <code>null</code>
-     * if none.
-     * 
-     * @return the nested order of breakpoint organizers being used, or <code>null</code>
-     * if none
-     */
-    IBreakpointOrganizer[] getOrganizers() {
-        return fOrganizers;
-    }
-    
-    /**
-     * Organizes the breakpoints based on nested categories, if any.
-     */
-    protected void reorganize() {
-        IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
-        if (fOrganizers == null) {
-            fElements = breakpoints;
-        } else {
-            IBreakpointOrganizer organizer = fOrganizers[0];
-            Map categoriesToContainers = new HashMap();
-            for (int i = 0; i < breakpoints.length; i++) {
-                IBreakpoint breakpoint = breakpoints[i];
-                IAdaptable[] categories = organizer.getCategories(breakpoint);
-                if (categories == null || categories.length == 0) {
-                	categories = OtherBreakpointCategory.getCategories(organizer);
-                }
-                for (int j = 0; j < categories.length; j++) {
-                    IAdaptable category = categories[j];
-                    BreakpointContainer container = (BreakpointContainer) categoriesToContainers.get(category);
-                    if (container == null) {
-                        IBreakpointOrganizer[] nesting = null;
-                        if (fOrganizers.length > 1) {
-                            nesting = new IBreakpointOrganizer[fOrganizers.length - 1];
-                            System.arraycopy(fOrganizers, 1, nesting, 0, nesting.length);
-                        }
-                        container = new BreakpointContainer(category, organizer, nesting);
-                        categoriesToContainers.put(category, container);
-                    }
-                    container.addBreakpoint(breakpoint);
-                }
-            }
-            // add empty categories
-            IAdaptable[] emptyCategories = organizer.getCategories();
-            if (emptyCategories != null) {
-                for (int i = 0; i < emptyCategories.length; i++) {
-                    IAdaptable category = emptyCategories[i];
-                    BreakpointContainer container = (BreakpointContainer) categoriesToContainers.get(category);
-                    if (container == null) {
-                        container = new BreakpointContainer(category, organizer, null);
-                        categoriesToContainers.put(category, container);
-                    }
-                }
-            }
-            fElements = categoriesToContainers.values().toArray();
-        }
-        fViewer.getControl().setRedraw(false);
-        fViewer.refresh();
-        fViewer.getControl().setRedraw(true);
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().equals(IBreakpointOrganizerDelegate.P_CATEGORY_CHANGED)) {
-			// TODO: only re-organize if showing the changed category
-			reorganize();
-		}
-	}
-    
-    /**
-     * Returns the existing containers the given breakpoint is contained in, or <code>null</code>.
-     * 
-     * @param breakpoint
-     * @return the existing containers the given breakpoint is contained in, or <code>null</code>
-     */
-    protected BreakpointContainer[] getContainers(IBreakpoint breakpoint) {
-        if (isShowingGroups()) {
-            IAdaptable[] categories = fOrganizers[0].getCategories(breakpoint);
-            if (categories == null || categories.length == 0) {
-                categories = OtherBreakpointCategory.getCategories(fOrganizers[0]);
-            }
-            BreakpointContainer[] containers = new BreakpointContainer[categories.length];
-            int index = 0;
-            for (int i = 0; i < fElements.length; i++) {
-                BreakpointContainer container = (BreakpointContainer)fElements[i];
-                for (int j = 0; j < categories.length; j++) {
-                    IAdaptable category = categories[j];
-                    if (container.getCategory().equals(category)) {
-                        containers[index] = container;
-                        index++;
-                    }
-                }
-            }
-            return containers;
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether content is grouped by categories.
-     * 
-     * @return whether content is grouped by categories
-     */
-    protected boolean isShowingGroups() {
-        return fOrganizers != null;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsDragAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsDragAdapter.java
deleted file mode 100644
index e3b498a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsDragAdapter.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.TransferDragSourceListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * A drag adapter for the breakpoints viewer
- */
-public class BreakpointsDragAdapter extends DragSourceAdapter implements TransferDragSourceListener {
-    
-    /**
-     * the associated viewer for the adapter
-     */
-    private BreakpointsViewer fViewer;
-    private Item[] fItems = null;
-    
-    /**
-     * Constructor
-     * @param view the associiated view, which acts as the selection provider and therefore <b>must</b> implement <code>ISelectionProvider</code>
-     */
-    public BreakpointsDragAdapter(BreakpointsViewer viewer) {
-        Assert.isNotNull(viewer);
-        fViewer = viewer;
-    }
-
-    /**
-     * @see TransferDragSourceListener#getTransfer
-     */
-    public Transfer getTransfer() {
-        return LocalSelectionTransfer.getInstance();
-    }
-    
-    /* non Java-doc
-     * @see org.eclipse.swt.dnd.DragSourceListener#dragStart
-     */
-    public void dragStart(DragSourceEvent event) {
-        ISelection selection = fViewer.getSelection();
-        LocalSelectionTransfer.getInstance().setSelection(selection);
-        LocalSelectionTransfer.getInstance().setSelectionSetTime(event.time & 0xFFFFFFFFL);
-        event.doit = fViewer.canDrag(fViewer.getSelectedItems());
-        fItems = fViewer.getSelectedItems();
-    }
-   
-    /* non Java-doc
-     * @see org.eclipse.swt.dnd.DragSourceListener#dragSetData
-     */     
-    public void dragSetData(DragSourceEvent event) {
-        // For consistency set the data to the selection even though
-        // the selection is provided by the LocalSelectionTransfer
-        // to the drop target adapter.
-        event.data = LocalSelectionTransfer.getInstance().getSelection();
-    }
-
-    /* non Java-doc
-     * @see org.eclipse.swt.dnd.DragSourceListener#dragFinished
-     */ 
-    public void dragFinished(DragSourceEvent event) {
-        if (event.detail == DND.DROP_MOVE) {
-            // remove from source on move operation
-        	fViewer.performDrag(fItems);
-        }
-        fItems = null;
-        LocalSelectionTransfer.getInstance().setSelection(null);
-        LocalSelectionTransfer.getInstance().setSelectionSetTime(0);
-    }   
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsDropAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsDropAdapter.java
deleted file mode 100644
index cd4096d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsDropAdapter.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * BreakpointsDropAdapter
- */
-public class BreakpointsDropAdapter extends ViewerDropAdapter {
-
-	private Item fTarget = null;
-	
-    /**
-     * @param viewer
-     */
-    protected BreakpointsDropAdapter(BreakpointsViewer viewer) {
-        super(viewer);
-        setFeedbackEnabled(false);
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
-     */
-    public boolean performDrop(Object data) {
-    	return ((BreakpointsViewer)getViewer()).performDrop(fTarget, (IStructuredSelection) LocalSelectionTransfer.getInstance().getSelection());
-    }
-
-	/**
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#determineTarget(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	protected Object determineTarget(DropTargetEvent event) {
-		fTarget = (Item) event.item;
-		return fTarget;
-	}
-	
-    /**
-     * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
-     */
-    public boolean validateDrop(Object target, int operation, TransferData transferType) {
-    	return ((BreakpointsViewer)getViewer()).canDrop(fTarget, (IStructuredSelection) LocalSelectionTransfer.getInstance().getSelection());
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsLabelProvider.java
deleted file mode 100644
index e18e8c5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsLabelProvider.java
+++ /dev/null
@@ -1,109 +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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.CompositeDebugImageDescriptor;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Label provider for the breakpoints view
- */
-public class BreakpointsLabelProvider extends LabelProvider implements IFontProvider {
-
-    private WorkbenchLabelProvider fWorkbenchLabelProvider;
-    private IDebugModelPresentation fPresentation;
-    
-    /**
-     * Constructs a new label provide for the breakpoints view.
-     */
-    public BreakpointsLabelProvider() {
-        fWorkbenchLabelProvider = new WorkbenchLabelProvider();
-        fPresentation = DebugUITools.newDebugModelPresentation();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        fWorkbenchLabelProvider.dispose();
-        fPresentation.dispose();
-        super.dispose();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-     */
-    public Image getImage(Object element) {
-        if (element instanceof IBreakpoint) {
-            return fPresentation.getImage(element);
-        }
-        Image image = fWorkbenchLabelProvider.getImage(element);
-        if (image != null) {
-            int flags= computeAdornmentFlags();
-            if (flags > 0) {
-                CompositeDebugImageDescriptor descriptor= new CompositeDebugImageDescriptor(image, flags);
-                return DebugUIPlugin.getImageDescriptorRegistry().get(descriptor);
-            }
-        }
-        return image;        
-    }
-    
-	/**
-     * Computes and return common adornment flags for the given category.
-     * 
-     * @param element breakpoint category
-     * @return adornment flags defined in CompositeDebugImageDescriptor
-     */
-    private int computeAdornmentFlags() {
-        if (!DebugPlugin.getDefault().getBreakpointManager().isEnabled()) {
-            return CompositeDebugImageDescriptor.SKIP_BREAKPOINT;
-        }
-        return 0;
-    }    
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-     */
-    public String getText(Object element) {
-        if (element instanceof IBreakpoint) {
-            return fPresentation.getText(element);
-        }
-        return fWorkbenchLabelProvider.getText(element);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-     */
-    public Font getFont(Object element) {
-        if (element instanceof IBreakpoint) {
-            return null;
-        }
-        return fWorkbenchLabelProvider.getFont(element);
-    }
-    
-    /**
-     * Returns the debug model presentation used by this label provider.
-     * 
-     * @return the debug model presentation used by this label provider
-     */
-    protected IDebugModelPresentation getPresentation() {
-        return fPresentation;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
deleted file mode 100644
index 09785be..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
+++ /dev/null
@@ -1,780 +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
- *     Brock Janiczak - bug 78494
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.breakpoints;
-
- 
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManagerListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.LazyModelPresentation;
-import org.eclipse.debug.internal.ui.actions.breakpointGroups.CopyBreakpointsAction;
-import org.eclipse.debug.internal.ui.actions.breakpointGroups.PasteBreakpointsAction;
-import org.eclipse.debug.internal.ui.actions.breakpointGroups.RemoveFromWorkingSetAction;
-import org.eclipse.debug.internal.ui.actions.breakpoints.OpenBreakpointMarkerAction;
-import org.eclipse.debug.internal.ui.actions.breakpoints.ShowSupportedBreakpointsAction;
-import org.eclipse.debug.internal.ui.actions.breakpoints.SkipAllBreakpointsAction;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.ui.AbstractDebugView;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-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.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener2;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.progress.IProgressService;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This view shows the breakpoints registered with the breakpoint manager
- */
-public class BreakpointsView extends AbstractDebugView implements ISelectionListener, IBreakpointManagerListener, IPerspectiveListener2 {
-
-    private BreakpointsViewEventHandler fEventHandler;
-	private ICheckStateListener fCheckListener= new ICheckStateListener() {
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			Object source = event.getElement();
-			if (source instanceof BreakpointContainer) {
-				handleContainerChecked(event, (BreakpointContainer) source);
-			} else if (source instanceof IBreakpoint) {
-				handleBreakpointChecked(event, (IBreakpoint) source);
-			}
-		}
-	};
-	private boolean fIsTrackingSelection= false;
-	// Persistence constants
-	private static String KEY_IS_TRACKING_SELECTION= "isTrackingSelection"; //$NON-NLS-1$
-	private static String KEY_VALUE="value"; //$NON-NLS-1$
-    private static final String ACTION_REMOVE_FROM_GROUP = "RemoveFromGroup"; //$NON-NLS-1$
-	private BreakpointsContentProvider fContentProvider;
-    private Clipboard fClipboard;
-    private IContextActivation fActivatedContext;
-    
-	/**
-	 * This memento allows the Breakpoints view to save and restore state
-	 * when it is closed and opened within a session. A different
-	 * memento is supplied by the platform for persistence at
-	 * workbench shutdown.
-	 */
-	private static IMemento fgMemento;
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		DebugPlugin.getDefault().getBreakpointManager().addBreakpointManagerListener(this);
-		getSite().getWorkbenchWindow().addPerspectiveListener(this);
-	}
-
-	/**
-	 * @see AbstractDebugView#createViewer(Composite)
-	 */
-	protected Viewer createViewer(Composite parent) {
-		fContentProvider= new BreakpointsContentProvider();
-		CheckboxTreeViewer viewer = new BreakpointsViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK));
-        setViewer(viewer);
-        viewer.setUseHashlookup(true);
-		viewer.setContentProvider(fContentProvider);
-		viewer.setComparator(new BreakpointsComparator());
-		viewer.setInput(DebugPlugin.getDefault().getBreakpointManager());
-		viewer.addCheckStateListener(fCheckListener);
-		viewer.addTreeListener(new ITreeViewerListener() {
-			public void treeExpanded(TreeExpansionEvent event) {
-				((BreakpointsViewer)getViewer()).updateCheckedState(event.getElement());
-			}
-			public void treeCollapsed(TreeExpansionEvent event) {
-			}
-		});
-	    viewer.setLabelProvider(new BreakpointsLabelProvider());
-		// Necessary so that the PropertySheetView hears about selections in this view
-		getSite().setSelectionProvider(viewer);
-		initIsTrackingSelection();
-		initBreakpointOrganizers();
-		setEventHandler(new BreakpointsViewEventHandler(this));
-        initDragAndDrop();
-		return viewer;
-	}
-    
-    /**
-     * Initializes drag and drop for the breakpoints viewer
-     */
-    private void initDragAndDrop() {
-        BreakpointsViewer viewer = (BreakpointsViewer) getViewer();
-        int ops = DND.DROP_MOVE | DND.DROP_COPY;
-        // drop
-        viewer.addDropSupport(ops, new Transfer[] {LocalSelectionTransfer.getInstance()}, new BreakpointsDropAdapter(viewer));
-        // Drag 
-        viewer.addDragSupport(ops, new Transfer[] {LocalSelectionTransfer.getInstance()}, new BreakpointsDragAdapter(viewer));
-    }    
-	
-	/**
-	 * Initializes whether this view tracks selection in the
-	 * debug view from the persisted state.
-	 */
-	private void initIsTrackingSelection() {
-		IMemento memento= getMemento();
-		if (memento != null) {
-			IMemento node= memento.getChild(KEY_IS_TRACKING_SELECTION);
-			if (node != null) {
-				setTrackSelection(Boolean.valueOf(node.getString(KEY_VALUE)).booleanValue());
-				return;
-			}
-		}
-		setTrackSelection(false);
-	}
-	
-	/**
-	 * Initializes the persisted breakpoints organizers
-	 */
-	private void initBreakpointOrganizers() {
-		IMemento memento = getMemento();
-		if (memento != null) {
-			IMemento node = memento.getChild(IDebugUIConstants.EXTENSION_POINT_BREAKPOINT_ORGANIZERS);
-			if (node == null) {
-                fContentProvider.setOrganizers(null);
-            } else {
-				String value = node.getString(KEY_VALUE);
-                if (value != null) {
-                    String[] ids = value.split(","); //$NON-NLS-1$
-    				BreakpointOrganizerManager manager = BreakpointOrganizerManager.getDefault();
-    				List organziers= new ArrayList();
-                    for (int i = 0; i < ids.length; i++) {
-                        IBreakpointOrganizer organizer = manager.getOrganizer(ids[i]);
-                        if (organizer != null) {
-                            organziers.add(organizer);
-                        }
-                    }
-    				fContentProvider.setOrganizers((IBreakpointOrganizer[]) organziers.toArray(new IBreakpointOrganizer[organziers.size()]));
-                }
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getMemento()
-	 */
-	protected IMemento getMemento() {
-		if (fgMemento != null) {
-		    return fgMemento;
-		}
-		return super.getMemento();
-	}
-	
-    /**
-     * Update the checked state up the given element and all of its children.
-     * 
-     * @param element
-     */
-	public void updateCheckedState(Object element) {
-        ((BreakpointsViewer)getViewer()).updateCheckedState(element);
-	}
-		
-	/**
-	 * Returns this view's viewer as a checkbox tree viewer.
-	 * @return this view's viewer as a checkbox tree viewer
-	 */
-	public CheckboxTreeViewer getCheckboxViewer() {
-		return (CheckboxTreeViewer) getViewer();
-	}
-	
-	/**
-	 * Returns this view's content provider as a tree content provider.
-	 * @return this view's content provider as a tree content provider
-	 */
-	public ITreeContentProvider getTreeContentProvider() {
-	    return fContentProvider;
-	}
-
-	/**
-	 * A breakpoint has been checked/unchecked. Update the group
-	 * element's checked/grayed state as appropriate.
-	 */
-	private void handleBreakpointChecked(final CheckStateChangedEvent event, final IBreakpoint breakpoint) {
-		final boolean enable= event.getChecked();
-        String jobName = enable ? DebugUIViewsMessages.BreakpointsView_0 : DebugUIViewsMessages.BreakpointsView_1; // 
-        new Job(jobName) {
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    breakpoint.setEnabled(enable);
-                    return Status.OK_STATUS;
-                } catch (final CoreException e) {
-                    Display.getDefault().asyncExec(new Runnable() {
-                        public void run() {
-                            String titleState= enable ? DebugUIViewsMessages.BreakpointsView_6 : DebugUIViewsMessages.BreakpointsView_7; // 
-                            String messageState= enable ? DebugUIViewsMessages.BreakpointsView_8 : DebugUIViewsMessages.BreakpointsView_9;  // 
-                            DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), MessageFormat.format(DebugUIViewsMessages.BreakpointsView_10, new String[] { titleState }), MessageFormat.format(DebugUIViewsMessages.BreakpointsView_11, new String[] { messageState }), e); // 
-                            // If the breakpoint fails to update, reset its check state.
-                            getCheckboxViewer().removeCheckStateListener(fCheckListener);
-                            event.getCheckable().setChecked(breakpoint, !event.getChecked());
-                            getCheckboxViewer().addCheckStateListener(fCheckListener);                            
-                        }
-                    });
-                }
-                return Status.CANCEL_STATUS;
-            }
-        }.schedule();
-    }
-
-	/**
-	 * A group has been checked or unchecked. Enable/disable all of the
-	 * breakpoints in that group to match.
-	 */
-	private void handleContainerChecked(CheckStateChangedEvent event, BreakpointContainer container) {
-		final IBreakpoint[] breakpoints = container.getBreakpoints();
-		final boolean enable= event.getChecked();
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-            public void run(IProgressMonitor monitor) {
-                try {
-                    for (int i = 0; i < breakpoints.length; i++) {
-                        IBreakpoint breakpoint = breakpoints[i];
-                        breakpoint.setEnabled(enable);
-                    }
-                } catch (CoreException e) {
-                    DebugUIPlugin.log(e);
-                }
-            }
-        };
-        // TODO: should use scheduling rule
-        IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
-        try {
-            progressService.busyCursorWhile(runnable);
-        } 
-        catch (InvocationTargetException e) {} 
-        catch (InterruptedException e) {}
-	}
-
-	/**
-	 * @see AbstractDebugView#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.BREAKPOINT_VIEW;
-	}
-
-	/**
-	 * @see IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-        disposeAction(IWorkbenchActionDefinitionIds.COPY);
-        disposeAction(IWorkbenchActionDefinitionIds.PASTE);
-        disposeAction(ACTION_REMOVE_FROM_GROUP); 
-        
-	    if (getCheckboxViewer() != null) {
-	        getCheckboxViewer().removeCheckStateListener(fCheckListener);
-	    }
-		IAction action= getAction("ShowBreakpointsForModel"); //$NON-NLS-1$
-		if (action != null) {
-			((ShowSupportedBreakpointsAction)action).dispose(); 
-		}
-		getSite().getPage().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-		DebugPlugin.getDefault().getBreakpointManager().removeBreakpointManagerListener(this);
-		super.dispose();
-		
-		if (getEventHandler() != null) {
-			getEventHandler().dispose();
-		}
-        
-        if (fClipboard != null) {
-            fClipboard.dispose();
-        }
-        
-		getSite().getWorkbenchWindow().removePerspectiveListener(this);
-	}
-
-	/**
-	 * @see AbstractDebugView#createActions()
-	 */
-	protected void createActions() {
-		IAction action = new OpenBreakpointMarkerAction(getViewer());
-		setAction("GotoMarker", action); //$NON-NLS-1$
-		setAction(DOUBLE_CLICK_ACTION, action);
-		setAction("ShowBreakpointsForModel", new ShowSupportedBreakpointsAction(getStructuredViewer(),this)); //$NON-NLS-1$
-		setAction("SkipBreakpoints", new SkipAllBreakpointsAction()); //$NON-NLS-1$
-        
-        fClipboard= new Clipboard(getSite().getShell().getDisplay());
-        
-        PasteBreakpointsAction paste = new PasteBreakpointsAction(this);
-        configure(paste, IWorkbenchActionDefinitionIds.PASTE, ActionFactory.PASTE.getId(),ISharedImages.IMG_TOOL_PASTE);
-        SelectionListenerAction copy = new CopyBreakpointsAction(this, fClipboard, paste);
-        configure(copy, IWorkbenchActionDefinitionIds.COPY, ActionFactory.COPY.getId(), ISharedImages.IMG_TOOL_COPY);
-        
-        SelectionListenerAction remove = new RemoveFromWorkingSetAction(this);
-        setAction(ACTION_REMOVE_FROM_GROUP, remove); 
-        getViewer().addSelectionChangedListener(remove);
-	}
-
-	/**
-     * Configures the action to override the global action, registers
-     * the action for selection change notification, and registers
-     * the action with this view.
-     * 
-     * @param sla action
-     * @param defId action definition id
-     * @param globalId global action id
-     * @param imgId image identifier
-     */
-    private void configure(SelectionListenerAction action, String defId, String globalId, String imgId) {
-        setAction(defId, action);
-        action.setActionDefinitionId(defId);
-        getViewSite().getActionBars().setGlobalActionHandler(globalId, action);
-        getViewer().addSelectionChangedListener(action);
-        action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(imgId));
-    }
-    
-    /**
-     * Cleans up selection listener action
-     * 
-     * @param id action id
-     */
-    private void disposeAction(String id) {
-        IAction action = getAction(id);
-        if (action instanceof SelectionListenerAction) {
-            SelectionListenerAction sla = (SelectionListenerAction) action;
-            if (getViewer() != null) {
-                getViewer().removeSelectionChangedListener(sla);
-            }
-        }
-    }
-
-    /**
-	 * Adds items to the context menu.
-	 * 
-	 * @param menu The menu to contribute to
-	 */
-	protected void fillContextMenu(IMenuManager menu) {
-		updateObjects();
-		menu.add(new Separator(IDebugUIConstants.EMPTY_NAVIGATION_GROUP));
-		menu.add(new Separator(IDebugUIConstants.NAVIGATION_GROUP));
-		menu.add(getAction("GotoMarker")); //$NON-NLS-1$
-		menu.add(new Separator(IDebugUIConstants.EMPTY_BREAKPOINT_GROUP));
-		menu.add(new Separator(IDebugUIConstants.BREAKPOINT_GROUP));
-        menu.add(getAction(IWorkbenchActionDefinitionIds.COPY));
-        menu.add(getAction(IWorkbenchActionDefinitionIds.PASTE));
-        IAction action = getAction(ACTION_REMOVE_FROM_GROUP);
-        if (action.isEnabled()) {
-            menu.add(action);
-        }
-		menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
-		menu.add(new Separator(IDebugUIConstants.BREAKPOINT_GROUP_GROUP));
-		
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-	
-	/**
-	 * @see AbstractDebugView#configureToolBar(IToolBarManager)
-	 */
-	protected void configureToolBar(IToolBarManager tbm) {
-		tbm.add(new Separator(IDebugUIConstants.BREAKPOINT_GROUP));
-		tbm.add(getAction("ShowBreakpointsForModel")); //$NON-NLS-1$
-		tbm.add(getAction("GotoMarker")); //$NON-NLS-1$
-		tbm.add(getAction("SkipBreakpoints")); //$NON-NLS-1$
-		tbm.add(new Separator(IDebugUIConstants.RENDER_GROUP));
-	}
-	
-	/**
-	 * Returns this view's event handler
-	 * 
-	 * @return a breakpoint view event handler
-	 */
-	protected BreakpointsViewEventHandler getEventHandler() {
-		return fEventHandler;
-	}
-
-	/**
-	 * Sets this view's event handler.
-	 * 
-	 * @param eventHandler a breakpoint view event handler
-	 */
-	private void setEventHandler(BreakpointsViewEventHandler eventHandler) {
-		fEventHandler = eventHandler;
-	}
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#becomesVisible()
-	 */
-	protected void becomesVisible() {
-		super.becomesVisible();
-        CheckboxTreeViewer viewer = getCheckboxViewer();
-        ISelection selection = viewer.getSelection();
-        viewer.getControl().setRedraw(false);
-        ((BreakpointsContentProvider)viewer.getContentProvider()).reorganize();
-        viewer.setSelection(new StructuredSelection(selection));
-        viewer.getControl().setRedraw(true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection sel) {
-		if (sel.isEmpty() || !isTrackingSelection()) {
-			return;
-		}
-		IStructuredSelection selection= (IStructuredSelection) sel;
-		Iterator iter= selection.iterator();
-		Object firstElement= iter.next();
-		if (firstElement == null || iter.hasNext()) {
-			return;
-		}
-		IThread thread= null;
-		if (firstElement instanceof IStackFrame) {
-			thread= ((IStackFrame) firstElement).getThread();
-		} else if (firstElement instanceof IThread) {
-			thread= (IThread) firstElement;
-		} else {
-			return;
-		}
-		IBreakpoint[] breakpoints= thread.getBreakpoints();
-		getViewer().setSelection(new StructuredSelection(breakpoints), true);
-	}
-	
-	/**
-	 * Returns whether this view is currently tracking the
-	 * selection from the debug view.
-	 * 
-	 * @return whether this view is currently tracking the
-	 *   debug view's selection
-	 */
-	public boolean isTrackingSelection() {
-		return fIsTrackingSelection;
-	}
-	
-	/**
-	 * Sets whether this view should track the selection from
-	 * the debug view.
-	 * 
-	 * @param trackSelection whether or not this view should
-	 *   track the debug view's selection.
-	 */
-	public void setTrackSelection(boolean trackSelection) {
-		fIsTrackingSelection= trackSelection;
-		if (trackSelection) {
-			getSite().getPage().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-		} else {
-			getSite().getPage().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewPart#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		super.saveState(memento);
-		IMemento node= memento.createChild(KEY_IS_TRACKING_SELECTION);
-		node.putString(KEY_VALUE, String.valueOf(fIsTrackingSelection));
-		
-		StringBuffer buffer= new StringBuffer();
-		IBreakpointOrganizer[] organizers = fContentProvider.getOrganizers();
-        if (organizers != null) {
-            for (int i = 0; i < organizers.length; i++) {
-                IBreakpointOrganizer organizer = organizers[i];
-                buffer.append(organizer.getIdentifier());
-                if (i < (organizers.length - 1)) {
-                    buffer.append(',');
-                }
-            }
-            node = memento.createChild(IDebugUIConstants.EXTENSION_POINT_BREAKPOINT_ORGANIZERS);
-            node.putString(KEY_VALUE, buffer.toString());
-        }
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManagerListener#breakpointManagerEnablementChanged(boolean)
-	 */
-	public void breakpointManagerEnablementChanged(boolean enabled) {
-		DebugUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
-			public void run() {
-				IAction action = getAction("SkipBreakpoints"); //$NON-NLS-1$
-				if (action != null) {
-					((SkipAllBreakpointsAction) action).updateActionCheckedState();
-				}
-			}
-		});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		  IStructuredSelection selection= (IStructuredSelection) event.getSelection();
-          if (selection.size() == 1) {
-              Object element = selection.getFirstElement();
-              if (element instanceof BreakpointContainer) {
-                  getCheckboxViewer().setExpandedState(element, !getCheckboxViewer().getExpandedState(element));
-                  return;
-              }
-          }
-		super.doubleClick(event);
-	}
-
-	/**
-	 * @param selectedContainers
-	 */
-	public void setBreakpointOrganizers(IBreakpointOrganizer[] organizers) {
-        Viewer viewer = getViewer();
-        ISelection selection = viewer.getSelection();
-		fContentProvider.setOrganizers(organizers);
-		viewer.setSelection(selection);
-	}
-	
-	/**
-	 * returns the complete listing of breakpoints organizers
-	 * @return the complete listing of breakpoint organizers
-	 */
-	public IBreakpointOrganizer[] getBreakpointOrganizers() {
-		return fContentProvider.getOrganizers();
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference, java.lang.String)
-     */
-    public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {
-		if (partRef instanceof IViewReference && changeId.equals(IWorkbenchPage.CHANGE_VIEW_HIDE)) {
-			String id = ((IViewReference) partRef).getId();
-			if (id.equals(getViewSite().getId())) {
-				// BreakpointsView closed. Persist settings.
-				fgMemento= XMLMemento.createWriteRoot("BreakpointsViewMemento"); //$NON-NLS-1$
-				saveState(fgMemento);
-			}
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-     */
-    public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
-     */
-    public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IDebugView#getPresentation(java.lang.String)
-     */
-    public IDebugModelPresentation getPresentation(String id) {
-        if (getViewer() instanceof StructuredViewer) {
-            IBaseLabelProvider lp = ((StructuredViewer)getViewer()).getLabelProvider();
-            if (lp instanceof BreakpointsLabelProvider) {
-                BreakpointsLabelProvider blp = (BreakpointsLabelProvider) lp;
-                lp = blp.getPresentation();
-            }
-            if (lp instanceof DelegatingModelPresentation) {
-                return ((DelegatingModelPresentation)lp).getPresentation(id);
-            }
-            if (lp instanceof LazyModelPresentation) {
-                if (((LazyModelPresentation)lp).getDebugModelIdentifier().equals(id)) {
-                    return (IDebugModelPresentation)lp;
-                }
-            }
-        }
-        return null;
-    }    
-    
-    /**
-	 * This method is used solely to preserve the selection state of the viewer in the event that the current selection is to be removed
-	 * @param selection the selection to be removed
-	 * 
-	 * @since 3.3
-	 */
-	public void preserveSelection(IStructuredSelection selection) {
-		if(selection != null && !selection.isEmpty()) {
-	    	TreeItem item = (TreeItem) ((BreakpointsViewer)getCheckboxViewer()).searchItem(selection.getFirstElement());
-	    	Object toselect = null;
-	    	if(item != null) {
-	    		TreeItem parent = item.getParentItem();
-	    		if(parent != null) {
-	    			int idx = 0;
-	    			if(parent.getItemCount() == 1) {
-	    				toselect = parent.getData();
-	    			}
-	    			idx = parent.indexOf(item);
-	    			if(idx == 0) {
-	    				if(parent.getItemCount() > 1) {
-	    					toselect = parent.getItem(1).getData();
-	    				}
-	    				else {
-	    					toselect = parent.getItem(0).getData();
-	    				}
-	    			}
-	    			if(idx > 0) {
-	    				toselect = parent.getItem(idx-1).getData();
-	    			}
-	    		}
-	    		else {
-	    			Tree tree = item.getParent();
-	    			TreeItem[] items = tree.getItems();
-	    			for(int i = 0; i < items.length; i++) {
-	    				if(item.equals(items[i])) {
-	    					if(i - 1 < 0 && items.length > 1) {
-	    						toselect = items[i+1];
-	    						break;
-	    					}
-	    					else if(items.length > 1){
-	    						toselect = items[i-1].getData();
-	    						break;
-	    					}
-	    				}
-	    			}
-	    		}
-	    	}
-	    	if(toselect != null) {
-	    		getViewer().setSelection(new StructuredSelection(toselect), true);
-	    	}
-		}
-    }
-    
-    /**
-     * Returns whether the given selection can be pasted into the given target.
-     * <p>
-     * Scheme:
-     * <ul>
-     * <li>Breakpoints can only be pasted into allowable containers (i..e. like workings sets)</li>
-     * <li>Breakpoints can only be pasted into containers that they do not already reside in</li>
-     * <li>Breakpoints can only be pasted into containers, not other breakpoints</li>
-     * </ul>
-     * </p>
-     * 
-     * @param target target of the paste
-     * @param selection the selection to paste
-     * @return whether the given selection can be pasted into the given target
-     * 
-     * TODO Remove in favour of using <code>TreeItem</code>s and <code>TreePath</code>s to determine paste targets
-     */
-    public boolean canPaste(Object target, ISelection selection) {
-    	if(!(target instanceof BreakpointContainer)) {
-    		return false;
-    	}
-    	if(selection.isEmpty()) {
-    		return false;
-    	}
-    	IStructuredSelection ss = (IStructuredSelection) selection;
-    	BreakpointContainer container = (BreakpointContainer) target;
-    	IBreakpoint breakpoint = null;
-    	Object element = null;
-    	for(Iterator iter = ss.iterator(); iter.hasNext();) {
-    		element = iter.next();
-    		if(!(element instanceof IBreakpoint)) {
-    			return false;
-    		}
-    		breakpoint = (IBreakpoint) element;
-    		if (container.contains(breakpoint) || !container.getOrganizer().canAdd(breakpoint, container.getCategory())) {
-                return false;
-            }
-    	}
-        return true;
-    }   
-	
-    /** 
-     * Pastes the selection into the given target
-     * 
-     * @param target target of the paste, either a BreakpointContainer,
-     * or a Breakpoint within a BreakpointContainer
-     * @param selection breakpoints
-     * @return whether successful
-     * 
-     * TODO remove in favour of using <code>TreeItem</code> as paste target 
-     */
-    public boolean performPaste(Object target, ISelection selection) {
-        if (target instanceof BreakpointContainer && selection instanceof IStructuredSelection) {
-            BreakpointContainer container = (BreakpointContainer) target;
-            Object[] objects = ((IStructuredSelection)selection).toArray();
-            for (int i = 0; i < objects.length; i++) {
-                container.getOrganizer().addBreakpoint((IBreakpoint)objects[i], container.getCategory());
-            }
-            return true;
-        }
-        return false;
-    }        
-    
-    /**
-     * Returns if the breakpoints view is currently showing groups or not
-     * @return true of the breakpoints view showing groups, false otherwise
-     */
-    public boolean isShowingGroups() {
-        return fContentProvider.isShowingGroups();
-    }
-
-	/**
-	 * @see org.eclipse.ui.part.PageBookView#partActivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-		IContextService contextService = (IContextService)getSite().getService(IContextService.class);
-		fActivatedContext = contextService.activateContext(IDebugUIConstants.ID_BREAKPOINT_VIEW);
-		super.partActivated(part);
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.PageBookView#partDeactivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-		IContextService contextService = (IContextService)getSite().getService(IContextService.class);
-	    contextService.deactivateContext(fActivatedContext);
-		super.partDeactivated(part);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsViewEventHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsViewEventHandler.java
deleted file mode 100644
index 300bc1a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsViewEventHandler.java
+++ /dev/null
@@ -1,186 +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
- *     Brock Janiczak - bug 57999
- *     Michael Fraenkel - bug 84385
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.breakpoints;
-
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointManagerListener;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.ActivityManagerEvent;
-import org.eclipse.ui.activities.IActivityManagerListener;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-
-/**
- * Handles breakpoint events and activity manager events (which can affect grouping),
- * updating the breakpoints view and viewer.
- */
-public class BreakpointsViewEventHandler implements IBreakpointsListener, IActivityManagerListener, IBreakpointManagerListener {
-
-	private BreakpointsView fView;
-
-	/**
-	 * Constructs an event handler for the breakpoints view.
-	 */
-	public BreakpointsViewEventHandler(BreakpointsView view) {
-		fView= view;
-		IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
-		breakpointManager.addBreakpointListener(this);
-		breakpointManager.addBreakpointManagerListener(this);
-		IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench().getActivitySupport();
-		if (activitySupport != null) {
-			activitySupport.getActivityManager().addActivityManagerListener(this);
-		}
-	}
-	
-	/**
-	 * When this event handler is disposed, remove it as a listener.
-	 */
-	public void dispose() {
-		IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
-		breakpointManager.removeBreakpointListener(this);
-		breakpointManager.removeBreakpointManagerListener(this);
-		IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench().getActivitySupport();
-		if (activitySupport != null) {
-			activitySupport.getActivityManager().removeActivityManagerListener(this);
-		}
-	}
-
-	/**
-	 * @see IBreakpointsListener#breakpointsAdded(IBreakpoint[])
-	 */
-	public void breakpointsAdded(final IBreakpoint[] breakpoints) {
-		if (fView.isAvailable() && fView.isVisible()) {		
-			fView.asyncExec(new Runnable() {
-				public void run() {
-					if (fView.isAvailable()) {
-						CheckboxTreeViewer viewer = fView.getCheckboxViewer();
-                        viewer.getControl().setRedraw(false);
-                        BreakpointsContentProvider provider = (BreakpointsContentProvider)viewer.getContentProvider();
-                        provider.reorganize();
-                        
-						// This code is left in as a test case for platform bug 77075
-						//for (int i = 0; i < breakpoints.length; i++) { 
-							//viewer.expandToLevel(breakpoints[i], AbstractTreeViewer.ALL_LEVELS);
-						//}
-                        // expand as required
-                        for (int i = 0; i < breakpoints.length; i++) {
-                            IBreakpoint breakpoint = breakpoints[i];
-                            BreakpointContainer[] roots = provider.getRoots(breakpoint);
-                            if (roots != null) {
-                                for (int j = 0; j < roots.length; j++) {
-                                    viewer.expandToLevel(roots[j], AbstractTreeViewer.ALL_LEVELS);
-                                }
-                            }
-                        }
-                        fView.getViewer().refresh();
-                        viewer.setSelection(new StructuredSelection(breakpoints));
-                        viewer.getControl().setRedraw(true);
-						fView.updateObjects();
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * @see IBreakpointsListener#breakpointsRemoved(IBreakpoint[], IMarkerDelta[])
-	 */
-	public void breakpointsRemoved(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-		if (fView.isAvailable() && fView.isVisible()) {
-			fView.asyncExec(new Runnable() {
-				public void run() {
-					if (fView.isAvailable()) {
-						CheckboxTreeViewer viewer= (CheckboxTreeViewer)fView.getViewer();
-                        viewer.getControl().setRedraw(false);
-                        ((BreakpointsContentProvider)viewer.getContentProvider()).reorganize();
-                        viewer.getControl().setRedraw(true);
-						fView.updateObjects();
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * @see IBreakpointsListener#breakpointsChanged(IBreakpoint[], IMarkerDelta[])
-	 */
-	public void breakpointsChanged(final IBreakpoint[] breakpoints, final IMarkerDelta[] deltas) {
-		if (fView.isAvailable() & fView.isVisible()) {
-			fView.asyncExec(new Runnable() {
-				public void run() {
-					if (fView.isAvailable()) {
-						CheckboxTreeViewer viewer = (CheckboxTreeViewer)fView.getViewer();
-                        viewer.getControl().setRedraw(false);
-                        BreakpointsContentProvider provider = (BreakpointsContentProvider) viewer.getContentProvider();
-                        Set updates = new HashSet();
-						for (int i = 0; i < breakpoints.length; i++) {
-							IBreakpoint breakpoint = breakpoints[i];
-                            viewer.update(breakpoint, null);
-                            BreakpointContainer[] containers = provider.getContainers(breakpoint);
-                            if (containers != null) {
-                                for (int j = 0; j < containers.length; j++ ) {
-                                    updates.add(containers[j]);
-                                }
-                            } else {
-                            	updates.add(breakpoint);
-                            }
-						}
-                        Object[] objects = updates.toArray();
-                        for (int i = 0; i < objects.length; i++) {
-                            fView.updateCheckedState(objects[i]);
-                        }
-                        viewer.getControl().setRedraw(true);
-						fView.updateObjects();
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * When new activities are added or enabled, refresh the view contents to add/remove
-	 * breakpoints related to the affected activities.
-	 */
-	public void activityManagerChanged(final ActivityManagerEvent activityManagerEvent) {
-		if (fView.isAvailable() & fView.isVisible() && activityManagerEvent.haveEnabledActivityIdsChanged()) {
-			fView.asyncExec(new Runnable() {
-				public void run() {
-					fView.getViewer().refresh();
-				}
-			});
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointManagerListener#breakpointManagerEnablementChanged(boolean)
-	 */
-	public void breakpointManagerEnablementChanged(boolean enabled) {
-		if (fView.isAvailable() & fView.isVisible()) {
-			fView.asyncExec(new Runnable() {
-				public void run() {
-					fView.getViewer().refresh();
-				}
-			});
-		}		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsViewer.java
deleted file mode 100644
index 3afbf40..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsViewer.java
+++ /dev/null
@@ -1,447 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IBreakpointOrganizerDelegateExtension;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Breakpoints viewer.
- */
-public class BreakpointsViewer extends CheckboxTreeViewer {
-	
-    /**
-     * Constructs a new breakpoints viewer with the given tree.
-     * 
-     * @param tree
-     */
-    public BreakpointsViewer(Tree tree) {
-        super(tree);
-    }
-    
-    /**
-     * Returns the selected items.
-     * 
-     * @return seleted items
-     */
-    public Item[] getSelectedItems() {
-        return getSelection(getControl());
-    }
-    
-    /**
-     * Returns the item assocaited with the given element, or <code>null</code>.
-     * 
-     * @param element element in breakpoints view
-     * @return item assocaited with the given element, or <code>null</code>
-     */
-    public Widget searchItem(Object element) {
-        return findItem(element);
-    }
-    
-    /**
-     * Refreshes the given item in the tree.
-     * 
-     * @param item item to refresh
-     */
-    public void refreshItem(TreeItem item) {
-        updateItem(item, item.getData());
-    }
-    
-    /**
-     * Returns a collection of currently visible breakpoints.
-     * 
-     * @return collection of currently visible breakpoints
-     */
-    public IBreakpoint[] getVisibleBreakpoints() {
-        IBreakpointManager manager= DebugPlugin.getDefault().getBreakpointManager();
-        Object[] elements= ((ITreeContentProvider)getContentProvider()).getElements(manager);
-        List list = new ArrayList();
-        for (int i = 0; i < elements.length; i++) {
-            TreeItem item = (TreeItem) searchItem(elements[i]);
-            if (item != null) {
-                collectExpandedBreakpoints(item, list);
-            }
-        }
-        return (IBreakpoint[]) list.toArray(new IBreakpoint[list.size()]);
-    }
-
-    /**
-     * Adds expanded breakpoints to the list. Traverses children of the given
-     * tree item if any.
-     * 
-     * @param item  
-     * @param list collection of visible breakpoints
-     */
-    private void collectExpandedBreakpoints(TreeItem item, List list) {
-        Object data = item.getData();
-        if (data instanceof IBreakpoint) {
-            list.add(data);
-            return;
-        }
-        if (item.getExpanded()) {
-            TreeItem[] items = item.getItems();
-            for (int i = 0; i < items.length; i++) {
-                collectExpandedBreakpoints(items[i], list);
-            }
-        }
-    }
-
-    /**
-     * Sets the selection to a specific tree item
-     * 
-     * @param item
-     */
-    protected void setSelection(TreeItem item) {
-    	getTree().setSelection(new TreeItem[]{item});
-    	updateSelection(getSelection());
-    }
-
-	/**
-     * Returns the container from within the specified path that is the container the breakpoint can be removed from
-     * @param breakpoint the breakpoint to get the container for
-     * @return the first found container that includes the breakpoint that allows removal, or <code>null</code> if none found
-     * @since 3.3
-     */
-    public BreakpointContainer getRemovableContainer(Item item) {
-    	if(item == null) {
-    		return null;
-    	}
-    	if(item.getData() instanceof IBreakpoint) {
-	    	TreePath path = getTreePathFromItem(item);
-	    	if(path != null) {
-		    	IBreakpoint breakpoint = (IBreakpoint) path.getLastSegment();
-		    	BreakpointContainer container = null;
-		    	for(int i = path.getSegmentCount()-2; i > -1; i--) {
-		    		container = (BreakpointContainer) path.getSegment(i);
-		    		if(container.contains(breakpoint) && container.getOrganizer().canRemove(breakpoint, container.getCategory())) {
-		    			return container;
-		    		}
-		    	}
-	    	}
-    	}
-    	return null;
-    }
-	
-    /**
-     * Returns the addable breakpoint container of the specified breakpoint
-     * @param breakpoint the breakpoint to get the container for
-     * @return the first found addable container for the specified breakpoint or <code>null</code> if none found
-     * @since 3.3
-     */
-    public BreakpointContainer getAddableContainer(Item item) {
-    	TreePath path = getTreePathFromItem(item);
-    	if(path != null) {
-	    	Object element = path.getLastSegment();
-	    	if(element instanceof IBreakpoint) {
-		    	BreakpointContainer container = null;
-		    	IBreakpoint breakpoint = (IBreakpoint) element;
-		    	for(int i = path.getSegmentCount()-2; i > -1; i--) {
-		    		container = (BreakpointContainer) path.getSegment(i);
-		    		if(container.contains(breakpoint) && container.getOrganizer().canAdd(breakpoint, container.getCategory())) {
-		    			return container;
-		    		}
-		    	}
-	    	}
-    	}
-    	return null;
-    }
-    
-    /**
-     * Returns if the selected item in the tree can be dragged
-     * <p>
-     * Scheme:
-     * <ul>
-     * <li>breakpoint containers cannot be dragged</li>
-     * <li>breakpoints can be dragged iff the container they reside in supports the removal of breakpoints</li>
-     * </ul>
-     * </p>
-     * @param element the element to test if it can be dragged
-     * @return true if the selected element can be dragged, false otherwise
-     * @since 3.3
-     */
-    public boolean canDrag(Item[] items) {
-    	if(items == null) {
-    		return false;
-    	}
-    	if(items.length == 0) {
-    		return false;
-    	}
-    	for(int i = 0; i < items.length; i++) {
-    		if(getRemovableContainer(items[i]) == null) {
-    			return false;
-    		}
-    	}
-    	return true;
-    }
-    
-    /**
-     * Performs the actual removal of breakpoints from their respective (removable) containers on a successful drag operation
-     * @param selection the selection of breakpoints involved in the drag
-     * @since 3.3
-     */
-    public void performDrag(Item[] items) {
-    	if(items == null) {
-    		return;
-    	}
-    	Map containersToBreakpoints = new HashMap();
-		BreakpointContainer container = null;
-    	IBreakpoint breakpoint = null;
-    	for(int i = 0; i < items.length; i++) {
-    		if(!items[i].isDisposed()) {
-	    		breakpoint = (IBreakpoint)items[i].getData();
-	    		container = getRemovableContainer(items[i]);
-	    		if(container != null) {
-	    			List list = (List) containersToBreakpoints.get(container);
-	    			if (list == null) {
-	    				list = new ArrayList();
-	    				containersToBreakpoints.put(container, list);
-	    			}
-	    			list.add(breakpoint);
-	    		}
-    		}
-    	}
-    	Iterator iterator = containersToBreakpoints.entrySet().iterator();
-    	while (iterator.hasNext()) {
-    		Entry entry = (Entry) iterator.next();
-    		container = (BreakpointContainer) entry.getKey();
-    		List list = (List) entry.getValue();
-    		IBreakpointOrganizer organizer = container.getOrganizer();
-    		IBreakpoint[] breakpoints = (IBreakpoint[]) list.toArray(new IBreakpoint[list.size()]);
-    		if (organizer instanceof IBreakpointOrganizerDelegateExtension) {
-				IBreakpointOrganizerDelegateExtension extension = (IBreakpointOrganizerDelegateExtension) organizer;
-				extension.removeBreakpoints(breakpoints, container.getCategory());
-			} else {
-				for (int i = 0; i < breakpoints.length; i++) {
-					organizer.removeBreakpoint(breakpoints[i], container.getCategory());
-				}
-			}
-    	}
-    }
-    
-    /**
-     * Determines if the specified element can be dropped into the specified target
-     * <p>
-     * Scheme:
-     * <ul>
-     * <li>Breakpoints can be dropped into working sets</li>
-     * <li>Breakpoints can be dropped into breakpoints, provided there is a droppable parent of the target breakpoint</li>
-     * </ul>
-     * </p>
-     * @param target the target for the drop
-     * @param element the element we want to drop
-     * @return true if the specified element can be dropped into the specified target, false otherwise
-     * @since 3.3
-     */
-    public boolean canDrop(Item target, IStructuredSelection selection) {
-    	if(selection == null  || target == null) {
-    		return false;
-    	}
-    	for(Iterator iter = selection.iterator(); iter.hasNext();) {
-    		Object currentObject = iter.next();
-    		if (!(currentObject instanceof IBreakpoint) || !checkAddableParentContainers(target, (IBreakpoint)currentObject)){
-    			return false;
-    		}
-    	}
-    	return true;
-    }
-
-	/**
-	 * This method is used to determine if there is an addable parent container available for the specified drop target.
-	 * <p>
-	 * A drop target can be either a <code>BreakpointContainer</code> or an <code>IBreakpoint</code>. This method always checks the entire heirarchy
-	 * of the tree path for the specified target in the event one of the parent element does not support dropping. 
-	 * </p>
-	 * @param target
-	 * @param breakpoint
-	 * @return
-	 */
-	private boolean checkAddableParentContainers(Item target, IBreakpoint breakpoint) {
-		BreakpointContainer container = null;
-		TreePath path = getTreePathFromItem(target);
-		if(path != null) {
-			Object element = null;
-			for(int i = path.getSegmentCount()-1; i > -1; i--) {
-				element = path.getSegment(i);
-				if(element instanceof BreakpointContainer) {
-					container = (BreakpointContainer) element;
-					if(container.contains(breakpoint) || !container.getOrganizer().canAdd(breakpoint, container.getCategory())) {
-		    			return false;
-		    		}
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-     * Performs the actual addition of the selected breakpoints to the specified target
-     * @param target the target to add the selection of breakpoints to
-     * @param selection the selection of breakpoints
-     * @return true if the drop occurred, false otherwise
-     * @since 3.3
-     */
-    public boolean performDrop(Item target, IStructuredSelection selection) {
-		if(target == null || selection == null) {
-    		return false;
-    	}
-    	IBreakpoint breakpoint = null;
-    	Object element = target.getData();
-    	BreakpointContainer container = (element instanceof BreakpointContainer ? (BreakpointContainer)element : getAddableContainer(target));
-    	if(container == null) {
-			return false;
-		}
-    	IBreakpointOrganizer organizer = container.getOrganizer();
-    	if (organizer instanceof IBreakpointOrganizerDelegateExtension) {
-    		IBreakpointOrganizerDelegateExtension extension = (IBreakpointOrganizerDelegateExtension) organizer;
-    		Object[] array = selection.toArray();
-    		IBreakpoint[] breakpoints = new IBreakpoint[array.length];
-    		System.arraycopy(array, 0, breakpoints, 0, array.length);
-    		extension.addBreakpoints(breakpoints, container.getCategory());
-    	} else {
-	    	for(Iterator iter = selection.iterator(); iter.hasNext();) {
-	    		breakpoint = (IBreakpoint) iter.next();
-				organizer.addBreakpoint(breakpoint, container.getCategory());
-	    	}
-    	}
-    	expandToLevel(target.getData(), ALL_LEVELS);
-    	return true;
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#refresh()
-	 */
-	public void refresh() {
-		super.refresh();
-		initializeCheckedState();
-	}
-
-	/**
-	 * Sets the initial checked state of the items in the viewer.
-	 */
-	private void initializeCheckedState() {
-		TreeItem[] items = getTree().getItems();
-		for (int i = 0; i < items.length; i++) {
-			updateCheckedState(items[i]);
-		}
-	}    
-    
-    /**
-     * Update the checked state up the given element and all of its children.
-     * 
-     * @param element
-     */
-	public void updateCheckedState(Object element) {
-        Widget[] widgets = searchItems(element);
-        for (int i = 0; i < widgets.length; i++) {
-            Widget widget = widgets[i];
-            if (widget != null) {
-                updateCheckedState((TreeItem)widget);
-            }
-        }
-	}
-   
-	/**
-	 * finds all occurrences of a widget to update
-	 * @param element the element to search for when finding occurrences
-	 * @return a list of widget occurrences to update or an empty list
-	 */
-    private Widget[] searchItems(Object element) {
-        ArrayList list = new ArrayList();
-        TreeItem[] items = getTree().getItems();
-        for (int i = 0; i < items.length; i++) {
-        	findAllOccurrences(items[i], element, list);
-        }
-        return (Widget[]) list.toArray(new Widget[0]);
-    }
-    
-    /**
-     * performs the actual search for items in the tree
-     * @param list the list to add matches to
-     * @param item the item in the tree
-     * @param element the element to compare
-     */
-    private void findAllOccurrences(TreeItem item, Object element, ArrayList list) {
-        if (element.equals(item.getData())) {
-                list.add(item);
-        }
-        TreeItem[] items = item.getItems();
-        for (int i = 0; i < items.length; i++) {
-        	findAllOccurrences(items[i], element, list);
-        }
-    }
-    
-    /**
-     * Update the checked state up the given element and all of its children.
-     * 
-     * @param element
-     */
-    public void updateCheckedState(TreeItem item) {
-        Object element = item.getData();
-        if (element instanceof IBreakpoint) {
-            try {
-                item.setChecked(((IBreakpoint) element).isEnabled());
-                refreshItem(item);
-            } catch (CoreException e) {
-                DebugUIPlugin.log(e);
-            }
-        } else if (element instanceof BreakpointContainer) {
-            IBreakpoint[] breakpoints = ((BreakpointContainer) element).getBreakpoints();
-            int enabledChildren= 0;
-            for (int i = 0; i < breakpoints.length; i++) {
-                IBreakpoint breakpoint = breakpoints[i];
-                try {
-                    if (breakpoint.isEnabled()) {
-                        enabledChildren++;
-                    }
-                } catch (CoreException e) {
-                    DebugUIPlugin.log(e);
-                }
-            }
-            if (enabledChildren == 0) {
-                // Uncheck the container node if no children are enabled
-                item.setGrayed(false);
-                item.setChecked(false);
-            } else if (enabledChildren == breakpoints.length) {
-                // Check the container if all children are enabled
-                item.setGrayed(false);
-                item.setChecked(true);
-            } else {
-                // If some but not all children are enabled, gray the container node
-                item.setGrayed(true);
-                item.setChecked(true);
-            }
-            // Update any children (breakpoints and containers)
-            TreeItem[] items = item.getItems();
-            for (int i = 0; i < items.length; i++) {
-                updateCheckedState(items[i]);
-            }
-        }
-    }        
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/FileBreakpointOrganizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/FileBreakpointOrganizer.java
deleted file mode 100644
index bf2a4b3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/FileBreakpointOrganizer.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.AbstractBreakpointOrganizerDelegate;
-
-/**
- * Breakpoint organizers for files.
- * 
- * @since 3.1
- */
-public class FileBreakpointOrganizer extends AbstractBreakpointOrganizerDelegate {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories(org.eclipse.debug.core.model.IBreakpoint)
-     */
-    public IAdaptable[] getCategories(IBreakpoint breakpoint) {
-        IMarker marker = breakpoint.getMarker();
-        if (marker != null) {
-            IResource resource = marker.getResource();
-            if (resource.getType() == IResource.FILE) {
-                return new IAdaptable[]{(IFile)resource};
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizer.java
deleted file mode 100644
index eefe1f7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizer.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.debug.ui.IBreakpointOrganizerDelegate;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * A breakpoint organizer is used to categorize breakpoints and provides
- * change notification when categorization has changed. Breakpoint organizers
- * are contributed via the <code>breakpointOrganizers</code> extension point.
- * <p>
- * This interface is not intended to be implemented. Clients contributing a breakpoint
- * organizer are intended to implement <code>IBreakpointOrganizerDelegate</code>.
- * </p>
- * @since 3.1
- */
-public interface IBreakpointOrganizer extends IBreakpointOrganizerDelegate {
-    
-    /**
-     * Returns a label for this breakpoint organizer.
-     * 
-     * @return a label for this breakpoint organizer
-     */
-    public String getLabel();
-    
-    /**
-     * Returns an image descriptor for this breakpoint organizer or <code>null</code>.
-     * 
-     * @return an image descriptor for this breakpoint organizer or <code>null</code>
-     */
-    public ImageDescriptor getImageDescriptor();
-    
-    /**
-     * Returns a unique identifier for this breakpoint organizer.
-     * 
-     * @return a unique identifier for this breakpoint organizer
-     */
-    public String getIdentifier();
-    
-    /**
-     * Returns the label for breakpoints that do not fall into a category
-     * for this organizer.
-     * 
-     * @return label for breakpoints that do not fall into a category
-     * for this organizer
-     */
-    public String getOthersLabel();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/OtherBreakpointCategory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/OtherBreakpointCategory.java
deleted file mode 100644
index 388bb54..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/OtherBreakpointCategory.java
+++ /dev/null
@@ -1,95 +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.debug.internal.ui.views.breakpoints;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Category for breakpoints in "other" categories.
- */
-public class OtherBreakpointCategory extends PlatformObject implements IWorkbenchAdapter {
-    
-    private static Map fOthers = new HashMap();
-    private IBreakpointOrganizer fOrganizer;
-    
-    
-    public static IAdaptable[] getCategories(IBreakpointOrganizer organizer) {
-        IAdaptable[] others = (IAdaptable[]) fOthers.get(organizer);
-        if (others == null) {
-            others = new IAdaptable[]{new OtherBreakpointCategory(organizer)};
-            fOthers.put(organizer, others);
-        }
-        return others;
-    }
-    
-    /**
-     * Constructs an 'other' category for the given organizer.
-     * 
-     * @param organizer breakpoint organizer
-     */
-    private OtherBreakpointCategory(IBreakpointOrganizer organizer) {
-        fOrganizer = organizer;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object o) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_VIEW_BREAKPOINTS);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-     */
-    public String getLabel(Object o) {
-        return fOrganizer.getOthersLabel();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-     */
-    public Object getParent(Object o) {
-        return null;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object obj) {
-        if (obj instanceof OtherBreakpointCategory) {
-            OtherBreakpointCategory category = (OtherBreakpointCategory) obj;
-            return fOrganizer.equals(category.fOrganizer);
-        }
-        return false;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        return fOrganizer.hashCode();
-    }    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/ProjectBreakpointOrganizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/ProjectBreakpointOrganizer.java
deleted file mode 100644
index 03d8ebd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/ProjectBreakpointOrganizer.java
+++ /dev/null
@@ -1,40 +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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.AbstractBreakpointOrganizerDelegate;
-
-/**
- * Breakpoint organizers for projects.
- * 
- * @since 3.1
- */
-public class ProjectBreakpointOrganizer extends AbstractBreakpointOrganizerDelegate {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories(org.eclipse.debug.core.model.IBreakpoint)
-     */
-    public IAdaptable[] getCategories(IBreakpoint breakpoint) {
-        IMarker marker = breakpoint.getMarker();
-        if (marker != null) {
-            IProject project = marker.getResource().getProject();
-            if (project != null) {
-                return new IAdaptable[]{project};
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.java
deleted file mode 100644
index ce9671e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetBreakpointOrganizer.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.debug.internal.ui.views.breakpoints;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.AbstractBreakpointOrganizerDelegate;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Breakpoint organizers for resource working sets.
- * 
- * @since 3.1
- */
-public class WorkingSetBreakpointOrganizer extends AbstractBreakpointOrganizerDelegate implements IPropertyChangeListener {
-    
-    IWorkingSetManager fWorkingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
-    
-    /**
-     * Constructs a working set breakpoint organizer. Listens for changes in
-     * working sets and fires property change notification.
-     */
-    public WorkingSetBreakpointOrganizer() {    
-        fWorkingSetManager.addPropertyChangeListener(this);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories(org.eclipse.debug.core.model.IBreakpoint)
-     */
-    public IAdaptable[] getCategories(IBreakpoint breakpoint) {
-    	List result = new ArrayList();
-        List parents = new ArrayList();
-        IResource res = breakpoint.getMarker().getResource();
-        parents.add(res);
-        while (res != null) {
-            res = res.getParent();
-            if (res != null) {
-                parents.add(res);
-            }
-        }
-        IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets();
-        for (int i = 0; i < workingSets.length; i++) {
-            if (!IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(workingSets[i].getId())) {
-		        IAdaptable[] elements = workingSets[i].getElements();
-		        for (int j = 0; j < elements.length; j++) {
-		            IResource resource = (IResource) elements[j].getAdapter(IResource.class);
-		            if (resource != null) {
-		                if (parents.contains(resource)) {
-		                	result.add(new WorkingSetCategory(workingSets[i]));
-		                	break;
-		                }
-		            }
-		        }
-            }
-        }
-        return (IAdaptable[]) result.toArray(new IAdaptable[result.size()]);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#dispose()
-     */
-    public void dispose() {
-        fWorkingSetManager.removePropertyChangeListener(this);
-        fWorkingSetManager = null;
-        super.dispose();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent event) {
-        IWorkingSet set = null;
-        if (event.getNewValue() instanceof IWorkingSet) {
-            set = (IWorkingSet) event.getNewValue();
-        } else if (event.getOldValue() instanceof IWorkingSet) {
-            set = (IWorkingSet) event.getOldValue();
-        }
-        if (set != null && !IInternalDebugUIConstants.ID_BREAKPOINT_WORKINGSET.equals(set.getId())) {
-            fireCategoryChanged(new WorkingSetCategory(set));
-        }
-    }
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java
deleted file mode 100644
index 99293d4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.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.debug.internal.ui.views.breakpoints;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.model.IWorkbenchAdapter2;
-
-/**
- * Represents a breakpoint category for a specific working set.
- */
-public class WorkingSetCategory extends PlatformObject implements IWorkbenchAdapter, IWorkbenchAdapter2 {
-    
-    private IWorkingSet fWorkingSet;
-
-    /**
-     * Constructs a new workings set category for the given working set.
-     * 
-     * @param workingSet
-     */
-    public WorkingSetCategory(IWorkingSet workingSet) {
-        fWorkingSet = workingSet;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object o) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return fWorkingSet.getImageDescriptor();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-     */
-    public String getLabel(Object o) {
-        StringBuffer name = new StringBuffer(fWorkingSet.getName());
-        if (isDefault()) {
-            name.append(DebugUIViewsMessages.WorkingSetCategory_0); 
-        }
-        return name.toString();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-     */
-    public Object getParent(Object o) {
-        return null;
-    }
-    
-    /**
-     * Returns the working set for this category.
-     * 
-     * @return
-     */
-    public IWorkingSet getWorkingSet() {
-        return fWorkingSet;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object obj) {
-        if (obj instanceof WorkingSetCategory) {
-            WorkingSetCategory category = (WorkingSetCategory) obj;
-            return category.getWorkingSet().equals(fWorkingSet);
-        }
-        return false;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        return fWorkingSet.hashCode();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getForeground(java.lang.Object)
-     */
-    public RGB getForeground(Object element) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getBackground(java.lang.Object)
-     */
-    public RGB getBackground(Object element) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getFont(java.lang.Object)
-     */
-    public FontData getFont(Object element) {
-        if (isDefault()) {
-            FontData[] fontData = JFaceResources.getDefaultFont().getFontData();
-            if (fontData != null && fontData.length > 0) {
-                FontData data = fontData[0];
-                data.setStyle(SWT.BOLD);
-                return data;
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * Whether this is the default breakpoint working set.
-     * 
-     * @return whether this is the default breakpoint working set
-     */
-    private boolean isDefault() {
-        return fWorkingSet.equals(BreakpointSetOrganizer.getDefaultWorkingSet());
-    }
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java
deleted file mode 100644
index a51c68d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.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.debug.internal.ui.views.console;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.console.IConsoleLineTracker;
-import org.eclipse.debug.ui.console.IConsoleLineTrackerExtension;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IPatternMatchListener;
-import org.eclipse.ui.console.PatternMatchEvent;
-import org.eclipse.ui.console.TextConsole;
-
-/**
- * Tracks text appended to the console and notifies listeners in terms of whole
- * lines.
- */
-public class ConsoleLineNotifier implements IPatternMatchListener, IPropertyChangeListener {
-	/**
-	 * Console listeners
-	 */
-	private List fListeners = new ArrayList(2);
-
-	/**
-	 * The console this notifier is tracking 
-	 */
-	private ProcessConsole fConsole = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IPatternMatchListenerDelegate#connect(org.eclipse.ui.console.TextConsole)
-	 */
-	public void connect(TextConsole console) {
-	    if (console instanceof ProcessConsole) {
-	        fConsole = (ProcessConsole)console;
-
-	        IConsoleLineTracker[] lineTrackers = DebugUIPlugin.getDefault().getProcessConsoleManager().getLineTrackers(fConsole.getProcess());
-	        for (int i = 0; i < lineTrackers.length; i++) {
-	            lineTrackers[i].init(fConsole);
-                addConsoleListener(lineTrackers[i]);
-            }
-	        
-	        fConsole.addPropertyChangeListener(this);
-	    }
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IPatternMatchListener#disconnect()
-	 */
-	public synchronized void disconnect() {
-        try {
-            IDocument document = fConsole.getDocument();
-            if (document != null) {
-                int lastLine = document.getNumberOfLines() - 1;
-                if (document.getLineDelimiter(lastLine) == null) {
-                    IRegion lineInformation = document.getLineInformation(lastLine);
-                    lineAppended(lineInformation);
-                }
-            }
-        } catch (BadLocationException e) {
-        }
-    }
-
-    /**
-     * Notification the console's streams have been closed
-     */
-    public synchronized void consoleClosed() {
-        int size = fListeners.size();
-        for (int i = 0; i < size; i++) {
-            IConsoleLineTracker tracker = (IConsoleLineTracker) fListeners.get(i);
-            if (tracker instanceof IConsoleLineTrackerExtension) {
-                ((IConsoleLineTrackerExtension) tracker).consoleClosed();
-            }
-            tracker.dispose();
-        }
-
-        fConsole = null;
-        fListeners = null;
-    }
-	
-	/**
-     * Adds the given listener to the list of listeners notified when a line of
-     * text is appended to the console.
-     * 
-     * @param listener
-     */
-	public void addConsoleListener(IConsoleLineTracker listener) {
-        if (!fListeners.contains(listener))
-            fListeners.add(listener);
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#matchFound(org.eclipse.ui.console.PatternMatchEvent)
-     */
-    public void matchFound(PatternMatchEvent event) {
-        try  {
-            IDocument document = fConsole.getDocument();
-            int lineOfOffset = document.getLineOfOffset(event.getOffset());
-            String delimiter = document.getLineDelimiter(lineOfOffset);
-            int strip = delimiter==null ? 0 : delimiter.length();
-            Region region = new Region(event.getOffset(), event.getLength()-strip); 
-            lineAppended(region);
-        } catch (BadLocationException e) {}
-    }
-    
-    public void lineAppended(IRegion region) {
-        int size = fListeners.size();
-        for (int i=0; i<size; i++) {
-            IConsoleLineTracker tracker = (IConsoleLineTracker) fListeners.get(i);
-            tracker.lineAppended(region);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent event) {
-        if(event.getProperty().equals(IConsoleConstants.P_CONSOLE_OUTPUT_COMPLETE)) {
-            fConsole.removePropertyChangeListener(this);
-            consoleClosed();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#getPattern()
-     */
-    public String getPattern() {
-        return ".*\\r(\\n?)|.*\\n"; //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#getCompilerFlags()
-     */
-    public int getCompilerFlags() {
-        return 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#getLineQualifier()
-     */
-    public String getLineQualifier() {
-        return "\\n|\\r"; //$NON-NLS-1$
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.java
deleted file mode 100644
index 069b807..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.java
+++ /dev/null
@@ -1,43 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ConsoleMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.views.console.ConsoleMessages";//$NON-NLS-1$
-
-	public static String ConsoleRemoveAllTerminatedAction_0;
-	public static String ConsoleRemoveAllTerminatedAction_1;
-
-	public static String ConsoleTerminateAction_0;
-	public static String ConsoleTerminateAction_1;
-
-	public static String ProcessConsole_0;
-
-	public static String ProcessConsole_1;
-	public static String ProcessConsole_2;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, ConsoleMessages.class);
-	}
-
-    public static String ConsoleRemoveTerminatedAction_0;
-
-    public static String ConsoleRemoveTerminatedAction_1;
-
-	public static String ConsoleShowPreferencesAction__run_debug_console;
-
-	public static String ShowStandardErrorAction_0;
-
-	public static String ShowStandardOutAction_0;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties
deleted file mode 100644
index 878228f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties
+++ /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
-###############################################################################
-
-ConsoleRemoveAllTerminatedAction_0=&Remove All Terminated
-ConsoleRemoveAllTerminatedAction_1=Remove All Terminated Launches
-ConsoleRemoveTerminatedAction_0=Remove Launch
-ConsoleRemoveTerminatedAction_1=Remove Launch
-
-ConsoleTerminateAction_0=&Terminate
-ConsoleTerminateAction_1=Terminate
-
-ProcessConsole_0=<terminated> {0}
-
-ProcessConsole_1=[Console output redirected to file:{0}]\n
-ProcessConsole_2=[Invalid file specified for console output: {0}]\n
-ConsoleShowPreferencesAction__run_debug_console=Run/Debug Console
-ShowStandardErrorAction_0=Show Console When Standard Error Changes
-ShowStandardOutAction_0=Show Console When Standard Out Changes
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleRemoveAllTerminatedAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleRemoveAllTerminatedAction.java
deleted file mode 100644
index 9d3a049..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleRemoveAllTerminatedAction.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.debug.internal.ui.views.console;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.RemoveAllTerminatedAction;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * ConsoleRemoveAllTerminatedAction
- */
-public class ConsoleRemoveAllTerminatedAction extends Action implements IUpdate, ILaunchesListener2 {
-
-	public void dispose() {
-		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-		for (int i = 0; i < launches.length; i++) {
-			ILaunch launch = launches[i];
-			if (launch.isTerminated()) {
-				setEnabled(true);
-				return;
-			}
-		}
-		setEnabled(false);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-		RemoveAllTerminatedAction.removeTerminatedLaunches(launches);
-	}
-	
-	public ConsoleRemoveAllTerminatedAction() {
-		super(ConsoleMessages.ConsoleRemoveAllTerminatedAction_0); 
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONSOLE_REMOVE_ALL_TERMINATED);
-		setToolTipText(ConsoleMessages.ConsoleRemoveAllTerminatedAction_1); 
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE_ALL));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_ALL));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE_ALL));
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-		update();
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-     */
-    public void launchesRemoved(ILaunch[] launches) {
-       if (isEnabled()) {
-           update();
-       }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-     */
-    public void launchesAdded(ILaunch[] launches) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-     */
-    public void launchesChanged(ILaunch[] launches) {
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-		update();
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleRemoveLaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleRemoveLaunchAction.java
deleted file mode 100644
index dcd6847..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleRemoveLaunchAction.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-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.PlatformUI;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleListener;
-import org.eclipse.ui.console.IConsoleView;
-
-/**
- * ConsoleRemoveTerminatedAction
- */
-public class ConsoleRemoveLaunchAction extends Action implements IViewActionDelegate, IConsoleListener, ILaunchesListener2 {
-
-    private ILaunch fLaunch;
-    
-    // only used when a view action delegate
-    private IConsoleView fConsoleView;
-
-    public ConsoleRemoveLaunchAction() {
-        super(ConsoleMessages.ConsoleRemoveTerminatedAction_0);
-        setToolTipText(ConsoleMessages.ConsoleRemoveTerminatedAction_1);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONSOLE_REMOVE_LAUNCH);
-        setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE));
-        setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE));
-        setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE));
-        DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
-        ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(this);
-    }
-    
-    public ConsoleRemoveLaunchAction(ILaunch launch) {
-    	this();
-        fLaunch = launch;
-        update();
-    }
-
-    public void dispose() {
-    	DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
-        ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(this);
-    }
-
-    public synchronized void update() {
-    	ILaunch launch = getLaunch();
-    	if (launch != null) {
-    		setEnabled(launch.isTerminated());
-    	} else {
-    		setEnabled(false);
-    	}
-    }
-
-    public synchronized void run() {
-    	ILaunch launch = getLaunch();
-    	if (launch != null) {
-	        ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-	        launchManager.removeLaunch(launch);
-    	}
-    }
-
-    public void init(IViewPart view) {
-    	if (view instanceof IConsoleView) {
-			fConsoleView = (IConsoleView) view;			
-		}
-    	update();
-    }
-
-    public void run(IAction action) {
-        run();
-    }
-
-    public void selectionChanged(IAction action, ISelection selection) {
-    }
-
-    public void consolesAdded(IConsole[] consoles) {
-    }
-
-    public void consolesRemoved(IConsole[] consoles) {
-        update();
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener2#launchesTerminated(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesTerminated(ILaunch[] launches) {
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesRemoved(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesRemoved(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesAdded(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesAdded(ILaunch[] launches) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchesListener#launchesChanged(org.eclipse.debug.core.ILaunch[])
-	 */
-	public void launchesChanged(ILaunch[] launches) {
-	}
-	
-	protected ILaunch getLaunch() {
-		if (fConsoleView == null) {
-			return fLaunch;
-		}
-		// else get dynmically, as this action was created via plug-in XML view contribution
-		IConsole console = fConsoleView.getConsole();
-		if (console instanceof ProcessConsole) {
-			ProcessConsole pconsole = (ProcessConsole) console;
-			return pconsole.getProcess().getLaunch();
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleShowPreferencesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleShowPreferencesAction.java
deleted file mode 100644
index 7ff97a2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleShowPreferencesAction.java
+++ /dev/null
@@ -1,52 +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.debug.internal.ui.views.console;
-
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * ConsoleShowPreferencesAction Displays the Console's Preference page
- * 
- * @since 3.2
- */
-public class ConsoleShowPreferencesAction extends Action implements IViewActionDelegate {
-
-    /*
-     * (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) {
-    	SWTFactory.showPreferencePage("org.eclipse.debug.ui.ConsolePreferencePage"); //$NON-NLS-1$
-    }
-
-    /*
-     * (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
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleTerminateAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleTerminateAction.java
deleted file mode 100644
index 641354c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleTerminateAction.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.debug.internal.ui.views.console;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * ConsoleTerminateAction
- */
-public class ConsoleTerminateAction extends Action implements IUpdate {
-
-	private ProcessConsole fConsole;
-
-	/**
-	 * Creates a terminate action for the console 
-	 */
-	public ConsoleTerminateAction(ProcessConsole console) {
-		super(ConsoleMessages.ConsoleTerminateAction_0); 
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONSOLE_TERMINATE_ACTION);
-		fConsole = console;
-		setToolTipText(ConsoleMessages.ConsoleTerminateAction_1); 
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_TERMINATE));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_TERMINATE));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.CONSOLE_TERMINATE_ACTION);
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		IProcess process = fConsole.getProcess(); 
-		setEnabled(process.canTerminate());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		try {
-			IProcess process = fConsole.getProcess();
-            killTargets(process);
-            process.terminate();
-		} catch (DebugException e) {
-			// TODO: report exception
-		}
-	}
-	
-	private void killTargets(IProcess process) throws DebugException {
-        ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-        ILaunch[] launches = launchManager.getLaunches();
-
-        for (int i = 0; i < launches.length; i++) {
-            ILaunch launch = launches[i];
-            IProcess[] processes = launch.getProcesses();
-            for (int j = 0; j < processes.length; j++) {
-                IProcess process2 = processes[j];
-                if (process2.equals(process)) {
-                    IDebugTarget[] debugTargets = launch.getDebugTargets();
-                    for (int k = 0; k < debugTargets.length; k++) {
-                        IDebugTarget target = debugTargets[k];
-                        if (target.canTerminate()) {
-                            target.terminate();
-                        }
-                    }
-                    return; // all possible targets have been terminated for the launch.
-                }
-            }
-        }
-    }
-
-    public void dispose() {
-	    fConsole = null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
deleted file mode 100644
index d1749e0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
+++ /dev/null
@@ -1,828 +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.debug.internal.ui.views.console;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IStorage;
-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.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IFlushableStreamMonitor;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.console.IConsole;
-import org.eclipse.debug.ui.console.IConsoleColorProvider;
-import org.eclipse.debug.ui.console.IConsoleHyperlink;
-import org.eclipse.debug.ui.console.IConsoleLineTracker;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IHyperlink;
-import org.eclipse.ui.console.IOConsole;
-import org.eclipse.ui.console.IOConsoleInputStream;
-import org.eclipse.ui.console.IOConsoleOutputStream;
-import org.eclipse.ui.console.IPatternMatchListener;
-import org.eclipse.ui.console.PatternMatchEvent;
-import org.eclipse.ui.console.TextConsole;
-import org.eclipse.ui.editors.text.EditorsUI;
-import org.eclipse.ui.part.FileEditorInput;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * A console for a system process with standard I/O streams.
- * 
- * @since 3.0
- */
-public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSetListener, IPropertyChangeListener {
-    private IProcess fProcess = null;
-
-    private List fStreamListeners = new ArrayList();
-
-    private IConsoleColorProvider fColorProvider;
-
-    private IOConsoleInputStream fInput;
-
-    private FileOutputStream fFileOutputStream;
-
-    private boolean fAllocateConsole = true;
-
-    private boolean fStreamsClosed = false;
-    
-    /**
-     * Proxy to a console document
-     */
-    public ProcessConsole(IProcess process, IConsoleColorProvider colorProvider) {
-        this(process, colorProvider, null);
-    }
-
-    /**
-     * Constructor
-     * @param process the process to associate with this console
-     * @param colorProvider the colour provider for this console
-     * @param encoding the desired encoding for this console
-     */
-    public ProcessConsole(IProcess process, IConsoleColorProvider colorProvider, String encoding) {
-        super("", IDebugUIConstants.ID_PROCESS_CONSOLE_TYPE, null, encoding, true); //$NON-NLS-1$
-        fProcess = process;
-
-        ILaunchConfiguration configuration = process.getLaunch().getLaunchConfiguration();
-        String file = null;
-        boolean append = false;
-        if (configuration != null) {
-            try {
-                file = configuration.getAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_FILE, (String) null);
-                if (file != null) {
-                    IStringVariableManager stringVariableManager = VariablesPlugin.getDefault().getStringVariableManager();
-                    file = stringVariableManager.performStringSubstitution(file);
-                    append = configuration.getAttribute(IDebugUIConstants.ATTR_APPEND_TO_FILE, false);
-                }
-            } catch (CoreException e) {
-            }
-        }
-
-        if (file != null) {
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IWorkspaceRoot root = workspace.getRoot();
-            Path path = new Path(file);
-            IFile ifile = root.getFileForLocation(path);
-            String message = null;
-            
-            try {
-                String fileLoc = null;
-                if (ifile != null) {
-                    if (append && ifile.exists()) {
-                        ifile.appendContents(new ByteArrayInputStream(new byte[0]), true, true, new NullProgressMonitor());
-                    } else {
-                        if (ifile.exists()) {
-                            ifile.delete(true, new NullProgressMonitor());
-                        }
-                        ifile.create(new ByteArrayInputStream(new byte[0]), true, new NullProgressMonitor());
-                    }
-                }
-                
-                File outputFile = new File(file);
-                fFileOutputStream = new FileOutputStream(outputFile, append);
-                fileLoc = outputFile.getAbsolutePath();
-                
-                message = MessageFormat.format(ConsoleMessages.ProcessConsole_1, new String[] {fileLoc}); 
-                addPatternMatchListener(new ConsoleLogFilePatternMatcher(fileLoc));
-            } catch (FileNotFoundException e) {
-                message = MessageFormat.format(ConsoleMessages.ProcessConsole_2, new String[] {file}); 
-            } catch (CoreException e) {
-                DebugUIPlugin.log(e);
-            }
-            if (message != null) { 
-                try { 
-                    IOConsoleOutputStream stream = newOutputStream();                    
-                    stream.write(message);
-                    stream.close();
-                } catch (IOException e) {
-                    DebugUIPlugin.log(e);
-                }
-            }
-            try {
-                fAllocateConsole = configuration.getAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, true);
-            } catch (CoreException e) {
-            }
-        }
-
-        fColorProvider = colorProvider;
-        fInput = getInputStream();
-        colorProvider.connect(fProcess, this);
-
-        setName(computeName());
-
-        Color color = fColorProvider.getColor(IDebugUIConstants.ID_STANDARD_INPUT_STREAM);
-        fInput.setColor(color);
-
-        IConsoleLineTracker[] lineTrackers = DebugUIPlugin.getDefault().getProcessConsoleManager().getLineTrackers(process);
-        if (lineTrackers.length > 0) {
-            addPatternMatchListener(new ConsoleLineNotifier());
-        }
-    }
-
-    /**
-     * Computes and returns the image descriptor for this console.
-     * 
-     * @return an image descriptor for this console or <code>null</code>
-     */
-    protected ImageDescriptor computeImageDescriptor() {
-        ILaunchConfiguration configuration = getProcess().getLaunch().getLaunchConfiguration();
-        if (configuration != null) {
-            ILaunchConfigurationType type;
-            try {
-                type = configuration.getType();
-                return DebugPluginImages.getImageDescriptor(type.getIdentifier());
-            } catch (CoreException e) {
-                DebugUIPlugin.log(e);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Computes and returns the current name of this console.
-     * 
-     * @return a name for this console
-     */
-    protected String computeName() {
-        String label = null;
-        IProcess process = getProcess();
-        ILaunchConfiguration config = process.getLaunch().getLaunchConfiguration();
-
-        label = process.getAttribute(IProcess.ATTR_PROCESS_LABEL);
-        if (label == null) {
-            if (config == null) {
-                label = process.getLabel();
-            } else {
-                // check if PRIVATE config
-                if (DebugUITools.isPrivate(config)) {
-                    label = process.getLabel();
-                } else {
-                    String type = null;
-                    try {
-                        type = config.getType().getName();
-                    } catch (CoreException e) {
-                    }
-                    StringBuffer buffer = new StringBuffer();
-                    buffer.append(config.getName());
-                    if (type != null) {
-                        buffer.append(" ["); //$NON-NLS-1$
-                        buffer.append(type);
-                        buffer.append("] "); //$NON-NLS-1$
-                    }
-                    buffer.append(process.getLabel());
-                    label = buffer.toString();
-                }
-            }
-        }
-
-        if (process.isTerminated()) {
-            return MessageFormat.format(ConsoleMessages.ProcessConsole_0, new String[] { label }); 
-        }
-        return label;
-    }
-
-    /**
-     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent evt) {
-        String property = evt.getProperty();
-        IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-        if (property.equals(IDebugPreferenceConstants.CONSOLE_WRAP) || property.equals(IDebugPreferenceConstants.CONSOLE_WIDTH)) {
-            boolean fixedWidth = store.getBoolean(IDebugPreferenceConstants.CONSOLE_WRAP);
-            if (fixedWidth) {
-                int width = store.getInt(IDebugPreferenceConstants.CONSOLE_WIDTH);
-                setConsoleWidth(width);
-            } else {
-                setConsoleWidth(-1);
-            }
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT) || property.equals(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK) || property.equals(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK)) {
-            boolean limitBufferSize = store.getBoolean(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT);
-            if (limitBufferSize) {
-                int highWater = store.getInt(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK);
-                int lowWater = store.getInt(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK);
-                if (highWater > lowWater) {
-                    setWaterMarks(lowWater, highWater);
-                }
-            } else {
-                setWaterMarks(-1, -1);
-            }
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH)) {
-            int tabWidth = store.getInt(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH);
-            setTabWidth(tabWidth);
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT)) {
-            boolean activateOnOut = store.getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT);
-            IOConsoleOutputStream stream = getStream(IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM);
-            if (stream != null) {
-                stream.setActivateOnWrite(activateOnOut);
-            }
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR)) {
-            boolean activateOnErr = store.getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR);
-            IOConsoleOutputStream stream = getStream(IDebugUIConstants.ID_STANDARD_ERROR_STREAM);
-            if (stream != null) {
-                stream.setActivateOnWrite(activateOnErr);
-            }
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR)) {
-            IOConsoleOutputStream stream = getStream(IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM);
-            if (stream != null) {
-                stream.setColor(fColorProvider.getColor(IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM));
-            }
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR)) {
-            IOConsoleOutputStream stream = getStream(IDebugUIConstants.ID_STANDARD_ERROR_STREAM);
-            if (stream != null) {
-                stream.setColor(fColorProvider.getColor(IDebugUIConstants.ID_STANDARD_ERROR_STREAM));
-            }
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR)) {
-            if (fInput != null) {
-                fInput.setColor(fColorProvider.getColor(IDebugUIConstants.ID_STANDARD_INPUT_STREAM));
-            }
-        } else if (property.equals(IDebugUIConstants.PREF_CONSOLE_FONT)) {
-            setFont(JFaceResources.getFont(IDebugUIConstants.PREF_CONSOLE_FONT));
-        } else if (property.equals(IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR)) {
-        	setBackground(DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR));
-        }
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#getStream(java.lang.String)
-     */
-    public IOConsoleOutputStream getStream(String streamIdentifier) {
-        for (Iterator i = fStreamListeners.iterator(); i.hasNext();) {
-            StreamListener listener = (StreamListener) i.next();
-            if (listener.fStreamId.equals(streamIdentifier)) {
-                return listener.fStream;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#getProcess()
-     */
-    public IProcess getProcess() {
-        return fProcess;
-    }
-
-    /**
-     * @see org.eclipse.ui.console.IOConsole#dispose()
-     */
-    protected void dispose() {
-        super.dispose();
-        fColorProvider.disconnect();
-        closeStreams();
-        disposeStreams();
-        DebugPlugin.getDefault().removeDebugEventListener(this);
-        DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-        JFaceResources.getFontRegistry().removeListener(this);
-    }
-
-    /**
-     * cleanup method to clsoe all of the open stream to this console 
-     */
-    private synchronized void closeStreams() {
-        if (fStreamsClosed) {
-            return;
-        }
-        for (Iterator i = fStreamListeners.iterator(); i.hasNext();) {
-            StreamListener listener = (StreamListener) i.next();
-            listener.closeStream();
-        }
-        if (fFileOutputStream != null) {
-	        synchronized (fFileOutputStream) {
-	            try {
-	                fFileOutputStream.flush();
-	                fFileOutputStream.close();
-	            } catch (IOException e) {
-	            }
-	        }
-        }
-        try {
-            fInput.close();
-        } catch (IOException e) {
-        }
-        fStreamsClosed  = true;
-    }
-
-    /**
-     * disposes ofthe listeners for each of the stream associated with this console
-     */
-    private synchronized void disposeStreams() {
-        for (Iterator i = fStreamListeners.iterator(); i.hasNext();) {
-            StreamListener listener = (StreamListener) i.next();
-            listener.dispose();
-        }
-        fFileOutputStream = null;
-        fInput = null;
-    }
-
-    /**
-     * @see org.eclipse.ui.console.AbstractConsole#init()
-     */
-    protected void init() {
-        super.init();
-        if (fProcess.isTerminated()) {
-            closeStreams();
-            resetName();
-        } else {
-            DebugPlugin.getDefault().addDebugEventListener(this);
-        }
-        IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-        store.addPropertyChangeListener(this);
-        JFaceResources.getFontRegistry().addListener(this);
-        if (store.getBoolean(IDebugPreferenceConstants.CONSOLE_WRAP)) {
-            setConsoleWidth(store.getInt(IDebugPreferenceConstants.CONSOLE_WIDTH));
-        }
-        setTabWidth(store.getInt(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH));
-
-        if (store.getBoolean(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT)) {
-            int highWater = store.getInt(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK);
-            int lowWater = store.getInt(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK);
-            setWaterMarks(lowWater, highWater);
-        }
-
-        DebugUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
-            public void run() {
-                setFont(JFaceResources.getFont(IDebugUIConstants.PREF_CONSOLE_FONT));
-                setBackground(DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_BAKGROUND_COLOR));
-            }
-        });
-    }
-
-    /**
-     * Notify listeners when name changes.
-     * 
-     * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-     */
-    public void handleDebugEvents(DebugEvent[] events) {
-        for (int i = 0; i < events.length; i++) {
-            DebugEvent event = events[i];
-            if (event.getSource().equals(getProcess())) {
-
-                if (event.getKind() == DebugEvent.TERMINATE) {
-                    closeStreams();
-                    DebugPlugin.getDefault().removeDebugEventListener(this);
-                }
-
-                resetName();
-            }
-        }
-    }
-
-    /**
-     * resets the name of this console to the original computed name 
-     */
-    private void resetName() {
-        final String newName = computeName();
-        String name = getName();
-        if (!name.equals(newName)) {
-            Runnable r = new Runnable() {
-                public void run() {
-                    setName(newName);
-                    warnOfContentChange();
-                }
-            };
-            DebugUIPlugin.getStandardDisplay().asyncExec(r);
-        }
-    }
-
-    /**
-     * send notification of a change of content in this console
-     */
-    private void warnOfContentChange() {
-        ConsolePlugin.getDefault().getConsoleManager().warnOfContentChange(DebugUITools.getConsole(fProcess));
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#connect(org.eclipse.debug.core.model.IStreamsProxy)
-     */
-    public void connect(IStreamsProxy streamsProxy) {
-        IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-        IStreamMonitor streamMonitor = streamsProxy.getErrorStreamMonitor();
-        if (streamMonitor != null) {
-            connect(streamMonitor, IDebugUIConstants.ID_STANDARD_ERROR_STREAM,
-            		store.getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR));
-        }
-        streamMonitor = streamsProxy.getOutputStreamMonitor();
-        if (streamMonitor != null) {
-            connect(streamMonitor, IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM, 
-            		store.getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT));
-        }
-        InputReadJob readJob = new InputReadJob(streamsProxy);
-        readJob.setSystem(true);
-        readJob.schedule();
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#connect(org.eclipse.debug.core.model.IStreamMonitor, java.lang.String)
-     */
-    public void connect(IStreamMonitor streamMonitor, String streamIdentifier) {
-        connect(streamMonitor, streamIdentifier, false);
-    }
-    
-    /**
-     * Connects the given stream monitor to a new output stream with the given identifier.
-     * 
-     * @param streamMonitor stream monitor
-     * @param streamIdentifier stream identifier
-     * @param activateOnWrite whether the stream should displayed when written to 
-     */
-    private void connect(IStreamMonitor streamMonitor, String streamIdentifier, boolean activateOnWrite) {
-        IOConsoleOutputStream stream = null;
-        if (fAllocateConsole) {
-            stream = newOutputStream();
-            Color color = fColorProvider.getColor(streamIdentifier);
-            stream.setColor(color);
-            stream.setActivateOnWrite(activateOnWrite);
-        }
-        synchronized (streamMonitor) {
-            StreamListener listener = new StreamListener(streamIdentifier, streamMonitor, stream);
-            fStreamListeners.add(listener);
-        }
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#addLink(org.eclipse.debug.ui.console.IConsoleHyperlink, int, int)
-     */
-    public void addLink(IConsoleHyperlink link, int offset, int length) {
-        try {
-            addHyperlink(link, offset, length);
-        } catch (BadLocationException e) {
-            DebugUIPlugin.log(e);
-        }
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#addLink(org.eclipse.ui.console.IHyperlink, int, int)
-     */
-    public void addLink(IHyperlink link, int offset, int length) {
-        try {
-            addHyperlink(link, offset, length);
-        } catch (BadLocationException e) {
-            DebugUIPlugin.log(e);
-        }
-    }
-
-    /**
-     * @see org.eclipse.debug.ui.console.IConsole#getRegion(org.eclipse.debug.ui.console.IConsoleHyperlink)
-     */
-    public IRegion getRegion(IConsoleHyperlink link) {
-        return super.getRegion(link);
-    }
-
-    /**
-     * This class listens to a specified IO stream
-     */
-    private class StreamListener implements IStreamListener {
-
-        private IOConsoleOutputStream fStream;
-
-        private IStreamMonitor fStreamMonitor;
-
-        private String fStreamId;
-
-        private boolean fFlushed = false;
-
-        private boolean fListenerRemoved = false;
-
-        public StreamListener(String streamIdentifier, IStreamMonitor monitor, IOConsoleOutputStream stream) {
-            this.fStreamId = streamIdentifier;
-            this.fStreamMonitor = monitor;
-            this.fStream = stream;
-            fStreamMonitor.addListener(this);  
-            //fix to bug 121454. Ensure that output to fast processes is processed.
-            streamAppended(null, monitor);
-        }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see org.eclipse.debug.core.IStreamListener#streamAppended(java.lang.String,
-         *      org.eclipse.debug.core.model.IStreamMonitor)
-         */
-        public void streamAppended(String text, IStreamMonitor monitor) {
-            String encoding = getEncoding();
-            if (fFlushed) {
-                try {
-                    if (fStream != null) {
-                    	if (encoding == null)
-                    		fStream.write(text);
-                    	else 
-                    		fStream.write(text.getBytes(encoding));
-                    }
-                    if (fFileOutputStream != null) {
-                        synchronized (fFileOutputStream) {
-                        	if (encoding == null)
-                        		fFileOutputStream.write(text.getBytes());
-                        	else 
-                        		fFileOutputStream.write(text.getBytes(encoding));
-                        }
-                    }
-                } catch (IOException e) {
-                    DebugUIPlugin.log(e);
-                }
-            } else {
-                String contents = null;
-                synchronized (fStreamMonitor) {
-                    fFlushed = true;
-                    contents = fStreamMonitor.getContents();
-                    if (fStreamMonitor instanceof IFlushableStreamMonitor) {
-                        IFlushableStreamMonitor m = (IFlushableStreamMonitor) fStreamMonitor;
-                        m.flushContents();
-                        m.setBuffered(false);
-                    }
-                }
-                try {
-                    if (contents != null && contents.length() > 0) {
-                        if (fStream != null) {
-                            fStream.write(contents);
-                        }
-                        if (fFileOutputStream != null) {
-                            synchronized (fFileOutputStream) {
-                                fFileOutputStream.write(contents.getBytes());
-                            }
-                        }
-                    }
-                } catch (IOException e) {
-                    DebugUIPlugin.log(e);
-                }
-            }
-        }
-
-        public IStreamMonitor getStreamMonitor() {
-            return fStreamMonitor;
-        }
-
-        public void closeStream() {
-            if (fStreamMonitor == null) {
-                return;
-            }
-            synchronized (fStreamMonitor) {
-                fStreamMonitor.removeListener(this);
-                if (!fFlushed) {
-                    String contents = fStreamMonitor.getContents();
-                    streamAppended(contents, fStreamMonitor);
-                }
-                fListenerRemoved = true;
-                try {
-                    if (fStream != null) {
-                        fStream.close();
-                    }
-                } catch (IOException e) {
-                }
-            }
-        }
-
-        public void dispose() {
-            if (!fListenerRemoved) {
-                closeStream();
-            }
-            fStream = null;
-            fStreamMonitor = null;
-            fStreamId = null;
-        }
-    }
-
-    private class InputReadJob extends Job {
-
-        private IStreamsProxy streamsProxy;
-
-        InputReadJob(IStreamsProxy streamsProxy) {
-            super("Process Console Input Job"); //$NON-NLS-1$
-            this.streamsProxy = streamsProxy;
-        }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-         */
-        protected IStatus run(IProgressMonitor monitor) {
-            try {
-                byte[] b = new byte[1024];
-                int read = 0;
-                while (fInput != null && read >= 0) {
-                    read = fInput.read(b);
-                    if (read > 0) {
-                        String s = new String(b, 0, read);
-                        streamsProxy.write(s);
-                    }
-                }
-            } catch (IOException e) {
-                DebugUIPlugin.log(e);
-            }
-            return Status.OK_STATUS;
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.console.IConsole#getImageDescriptor()
-     */
-    public ImageDescriptor getImageDescriptor() {
-        if (super.getImageDescriptor() == null) {
-            setImageDescriptor(computeImageDescriptor());
-        }
-        return super.getImageDescriptor();
-    }
-
-    private class ConsoleLogFilePatternMatcher implements IPatternMatchListener {
-        String fFilePath;
-
-        public ConsoleLogFilePatternMatcher(String filePath) {
-            fFilePath = escape(filePath);
-        }
-        
-    	private String escape(String path) {
-    		StringBuffer buffer = new StringBuffer(path);
-    		int index = buffer.indexOf("\\"); //$NON-NLS-1$
-    		while (index >= 0) {
-    			buffer.insert(index, '\\');
-    			index = buffer.indexOf("\\", index+2); //$NON-NLS-1$
-    		}
-    		return buffer.toString();
-    	}
-    	
-        public String getPattern() {
-            return fFilePath;
-        }
-
-        public void matchFound(PatternMatchEvent event) {
-            try {
-                addHyperlink(new ConsoleLogFileHyperlink(fFilePath), event.getOffset(), event.getLength());
-                removePatternMatchListener(this);
-            } catch (BadLocationException e) {
-            }
-        }
-
-        public int getCompilerFlags() {
-            return 0;
-        }
-
-        public String getLineQualifier() {
-            return null;
-        }
-
-        public void connect(TextConsole console) {
-        }
-
-        public void disconnect() {
-        }
-    }
-
-    private class ConsoleLogFileHyperlink implements IHyperlink {
-        String fFilePath;
-        ConsoleLogFileHyperlink(String filePath) {
-            fFilePath = filePath;
-        }
-        
-        public void linkActivated() {
-            IEditorInput input;
-            Path path = new Path(fFilePath);
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            IFile ifile = root.getFileForLocation(path);
-            if (ifile == null) { // The file is not in the workspace
-                File file = new File(fFilePath);
-                LocalFileStorage lfs = new LocalFileStorage(file);
-                input = new StorageEditorInput(lfs, file);
-
-            } else {
-                input = new FileEditorInput(ifile);
-            }
-            
-            IWorkbenchPage activePage = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage();
-            try {
-                activePage.openEditor(input, EditorsUI.DEFAULT_TEXT_EDITOR_ID, true);
-            } catch (PartInitException e) {
-            }
-        }
-        public void linkEntered() {
-        }
-        public void linkExited() {
-        }
-    }
-    
-    class StorageEditorInput extends PlatformObject implements IStorageEditorInput {
-        private File fFile;
-        private IStorage fStorage;
-        
-        public StorageEditorInput(IStorage storage, File file) {
-            fStorage = storage;
-            fFile = file;
-        }
-        
-        public IStorage getStorage() {
-            return fStorage;
-        }
-
-        public ImageDescriptor getImageDescriptor() {
-            return null;
-        }
-
-        public String getName() {
-            return getStorage().getName();
-        }
-
-        public IPersistableElement getPersistable() {
-            return null;
-        }
-
-        public String getToolTipText() {
-            return getStorage().getFullPath().toOSString();
-        }
-        
-        public boolean equals(Object object) {
-            return object instanceof StorageEditorInput &&
-             getStorage().equals(((StorageEditorInput)object).getStorage());
-        }
-        
-        public int hashCode() {
-            return getStorage().hashCode();
-        }
-
-        public boolean exists() {
-            return fFile.exists();
-        }
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.AbstractConsole#getHelpContextId()
-	 */
-	public String getHelpContextId() {
-		return IDebugHelpContextIds.PROCESS_CONSOLE;
-	} 
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java
deleted file mode 100644
index df8479f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.console.ConsoleColorProvider;
-import org.eclipse.debug.ui.console.IConsoleColorProvider;
-import org.eclipse.debug.ui.console.IConsoleLineTracker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleManager;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Creates documents for processes as they are registered with a launch.
- * The singleton manager is accessible from the debug UI plugin.
- */
-public class ProcessConsoleManager implements ILaunchListener {
-    
-    /**
-     * Console document content provider extensions, keyed by extension id
-     */
-    private Map fColorProviders;
-    
-    /**
-     * The default color provider. Used if no color provider is contributed
-     * for the given process type.
-     */
-    private IConsoleColorProvider fDefaultColorProvider;
-    
-    /**
-     * Console line trackers; keyed by process type to list of trackers (1:N) 
-     */
-    private Map fLineTrackers;
-    
-    /**
-     * Map of processes for a launch to compute removed processes
-     */
-    private Map fProcesses;
-    
-    
-    
-    /**
-     * @see ILaunchListener#launchRemoved(ILaunch)
-     */
-    public void launchRemoved(ILaunch launch) {
-        removeLaunch(launch);
-    }
-    
-    protected void removeLaunch(ILaunch launch) {
-        IProcess[] processes= launch.getProcesses(); 
-        for (int i= 0; i < processes.length; i++) {
-            IProcess iProcess = processes[i];
-            removeProcess(iProcess);
-        }		
-        if (fProcesses != null) {
-            fProcesses.remove(launch);
-        }
-    }
-    
-    /**
-     * Removes the console and document associated with the given process.
-     * 
-     * @param iProcess process to clean up
-     */
-    private void removeProcess(IProcess iProcess) {
-        IConsole console = getConsole(iProcess);
-        
-        if (console != null) {
-            IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
-            manager.removeConsoles(new IConsole[]{console});
-        }
-    }
-    
-    /**
-     * Returns the console for the given process, or <code>null</code> if none.
-     * 
-     * @param process
-     * @return the console for the given process, or <code>null</code> if none
-     */
-    public IConsole getConsole(IProcess process) {
-        IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); 
-        IConsole[] consoles = manager.getConsoles();
-        for (int i = 0; i < consoles.length; i++) {
-            IConsole console = consoles[i];
-            if (console instanceof ProcessConsole) {
-                ProcessConsole pc = (ProcessConsole)console;
-                if (pc.getProcess().equals(process)) {
-                    return pc;
-                }
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * @see ILaunchListener#launchAdded(ILaunch)
-     */
-    public void launchAdded(ILaunch launch) {
-        launchChanged(launch);
-    }
-    
-    /**
-     * @see ILaunchListener#launchChanged(ILaunch)
-     */
-    public void launchChanged(final ILaunch launch) {
-        IProcess[] processes= launch.getProcesses();
-        for (int i= 0; i < processes.length; i++) {
-            if (getConsoleDocument(processes[i]) == null) {
-                IProcess process = processes[i];
-                if (process.getStreamsProxy() == null) {
-                    continue;
-                }
-
-                //create a new console.
-                IConsoleColorProvider colorProvider = getColorProvider(process.getAttribute(IProcess.ATTR_PROCESS_TYPE));
-                String encoding = launch.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING);
-                ProcessConsole pc = new ProcessConsole(process, colorProvider, encoding);
-                pc.setAttribute(IDebugUIConstants.ATTR_CONSOLE_PROCESS, process);
-
-                //add new console to console manager.
-                ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{pc});
-            }
-        }
-        List removed = getRemovedProcesses(launch);
-        if (removed != null) {
-            Iterator iterator = removed.iterator();
-            while (iterator.hasNext()) {
-                IProcess p = (IProcess) iterator.next();
-                removeProcess(p);
-            }
-        }
-    }
-    
-    /**
-     * Returns the document for the process, or <code>null</code>
-     * if none.
-     */
-    public IDocument getConsoleDocument(IProcess process) {
-        ProcessConsole console = (ProcessConsole) getConsole(process);
-        return (console != null ? console.getDocument() : null);
-    } 
-    
-    /**
-     * Called by the debug ui plug-in on startup.
-     * The console document manager starts listening for
-     * launches to be registered and initializes if any launches
-     * already exist.
-     */
-    public void startup() {
-        ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-        launchManager.addLaunchListener(this);	
-        
-        //set up the docs for launches already registered
-        ILaunch[] launches= launchManager.getLaunches();
-        for (int i = 0; i < launches.length; i++) {
-            launchAdded(launches[i]);
-        }
-    }
-    
-    /**
-     * Called by the debug ui plug-in on shutdown.
-     * The console document manager de-registers as a 
-     * launch listener and kills all existing console documents.
-     */
-    public void shutdown() {
-        ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-        ILaunch[] launches = launchManager.getLaunches();
-        for (int i = 0; i < launches.length; i++) {
-            ILaunch launch = launches[i];
-            removeLaunch(launch);
-        }
-        launchManager.removeLaunchListener(this);
-        if (fProcesses != null) {
-            fProcesses.clear();
-        }
-    }
-          
-    /**
-     * Returns a new console document color provider extension for the given
-     * process type, or <code>null</code> if none.
-     * 
-     * @param type corresponds to <code>IProcess.ATTR_PROCESS_TYPE</code>
-     * @return IConsoleColorProvider
-     */
-    public IConsoleColorProvider getColorProvider(String type) {
-        if (fColorProviders == null) {
-            fColorProviders = new HashMap();
-            IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_COLOR_PROVIDERS);
-            IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-            for (int i = 0; i < elements.length; i++) {
-                IConfigurationElement extension = elements[i];
-                fColorProviders.put(extension.getAttribute("processType"), extension); //$NON-NLS-1$
-            }
-        }
-        IConfigurationElement extension = (IConfigurationElement)fColorProviders.get(type);
-        if (extension != null) {
-            try {
-                Object colorProvider = extension.createExecutableExtension("class"); //$NON-NLS-1$
-                if (colorProvider instanceof IConsoleColorProvider) {
-                    return (IConsoleColorProvider)colorProvider;
-                } 
-                DebugUIPlugin.logErrorMessage(MessageFormat.format(
-                		"Extension {0} must specify an instanceof IConsoleColorProvider for class attribute.", //$NON-NLS-1$
-                		new String[]{extension.getDeclaringExtension().getUniqueIdentifier()}));
-            } catch (CoreException e) {
-                DebugUIPlugin.log(e);
-            }
-        }
-        //no color provider found of specified type, return default color provider.
-        if (fDefaultColorProvider == null) {
-            fDefaultColorProvider = new ConsoleColorProvider();
-        }
-        return fDefaultColorProvider;
-    } 
-    
-    /**
-     * Returns the Line Trackers for a given process type.
-     * @param process The process for which line trackers are required.
-     * @return An array of line trackers which match the given process type.
-     */
-    public IConsoleLineTracker[] getLineTrackers(IProcess process) {
-        String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE);
-        
-        if (fLineTrackers == null) {
-            fLineTrackers = new HashMap();
-            IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_LINE_TRACKERS);
-            IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-            for (int i = 0; i < elements.length; i++) {
-                IConfigurationElement extension = elements[i];
-                String processType = extension.getAttribute("processType"); //$NON-NLS-1$
-                List list = (List)fLineTrackers.get(processType);
-                if (list == null) {
-                    list = new ArrayList();
-                    fLineTrackers.put(processType, list);
-                }
-                list.add(extension);
-            }
-        }
-        
-        ArrayList trackers = new ArrayList();
-        if (type != null) {
-            List lineTrackerExtensions = (List) fLineTrackers.get(type);
-            if(lineTrackerExtensions != null) {   
-                for(Iterator i = lineTrackerExtensions.iterator(); i.hasNext(); ) {
-                    IConfigurationElement element = (IConfigurationElement) i.next();
-                    try {
-                        trackers.add(element.createExecutableExtension("class")); //$NON-NLS-1$
-                    } catch (CoreException e) {
-                        DebugUIPlugin.log(e);
-                    }
-                }
-            }
-        }
-        return (IConsoleLineTracker[]) trackers.toArray(new IConsoleLineTracker[0]);
-    }
-    
-    /**
-     * Returns the processes that have been removed from the given
-     * launch, or <code>null</code> if none.
-     * 
-     * @param launch launch that has changed
-     * @return removed processes or <code>null</code>
-     */
-    private List getRemovedProcesses(ILaunch launch) {
-        List removed = null;
-        if (fProcesses == null) {
-            fProcesses = new HashMap();
-        }
-        IProcess[] old = (IProcess[]) fProcesses.get(launch);
-        IProcess[] curr = launch.getProcesses();
-        if (old != null) {
-            for (int i = 0; i < old.length; i++) {
-                IProcess process = old[i];
-                if (!contains(curr, process)) {
-                    if (removed == null) {
-                        removed = new ArrayList();
-                    }
-                    removed.add(process);
-                }
-            }
-        }
-        // update cache with current processes
-        fProcesses.put(launch, curr);
-        return removed;
-    }
-    
-    /**
-     * Returns whether the given object is contained in the list.
-     * 
-     * @param list list to search
-     * @param object object to search for
-     * @return whether the given object is contained in the list
-     */
-    private boolean contains(Object[] list, Object object) {
-        for (int i = 0; i < list.length; i++) {
-            Object object2 = list[i];
-            if (object2.equals(object)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java
deleted file mode 100644
index 92788bf..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java
+++ /dev/null
@@ -1,270 +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.debug.internal.ui.views.console;
-
-import java.io.IOException;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.core.model.IStreamsProxy2;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsolePageParticipant;
-import org.eclipse.ui.console.IConsoleView;
-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.part.IPageBookViewPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTargetList;
-import org.eclipse.ui.part.ShowInContext;
-
-/**
- * Creates and manages process console specific actions
- * 
- * @since 3.1
- */
-public class ProcessConsolePageParticipant implements IConsolePageParticipant, IShowInSource, IShowInTargetList, IDebugEventSetListener, IDebugContextListener {
-	
-	// actions
-	private ConsoleTerminateAction fTerminate;
-    private ConsoleRemoveLaunchAction fRemoveTerminated;
-	private ConsoleRemoveAllTerminatedAction fRemoveAllTerminated;
-	private ShowWhenContentChangesAction fStdOut;
-	private ShowWhenContentChangesAction fStdErr;
-
-    private ProcessConsole fConsole;
-
-    private IPageBookViewPage fPage;
-
-    private IConsoleView fView;
-    
-    private EOFHandler fEOFHandler;
-    private String fContextId = "org.eclipse.debug.ui.console"; //$NON-NLS-1$;
-    private IContextActivation fActivatedContext;
-    private IHandlerActivation fActivatedHandler;
-	/**
-	 * Handler to send EOF
-	 */	
-	private class EOFHandler extends AbstractHandler {
-        public Object execute(ExecutionEvent event) throws org.eclipse.core.commands.ExecutionException {
-            IStreamsProxy proxy = getProcess().getStreamsProxy();
-            if (proxy instanceof IStreamsProxy2) {
-                IStreamsProxy2 proxy2 = (IStreamsProxy2) proxy;
-                try {
-                    proxy2.closeInputStream();
-                } catch (IOException e1) {
-                }
-            }
-            return null;
-        }
-		
-	}    
-    		
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsolePageParticipant#init(IPageBookViewPage, IConsole)
-     */
-    public void init(IPageBookViewPage page, IConsole console) {
-        fPage = page;
-        fConsole = (ProcessConsole) console;
-        
-        fRemoveTerminated = new ConsoleRemoveLaunchAction(fConsole.getProcess().getLaunch());
-        fRemoveAllTerminated = new ConsoleRemoveAllTerminatedAction();
-        fTerminate = new ConsoleTerminateAction(fConsole);
-        fStdOut = new ShowStandardOutAction();
-        fStdErr = new ShowStandardErrorAction();
-        
-        fView = (IConsoleView) fPage.getSite().getPage().findView(IConsoleConstants.ID_CONSOLE_VIEW);
-        
-        DebugPlugin.getDefault().addDebugEventListener(this);
-        DebugUITools.getDebugContextManager().getContextService(fPage.getSite().getWorkbenchWindow()).addDebugContextListener(this);
-        
-        // contribute to toolbar
-        IActionBars actionBars = fPage.getSite().getActionBars();
-        configureToolBar(actionBars.getToolBarManager());
-        
-        // create handler and submissions for EOF
-        fEOFHandler = new EOFHandler();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsolePageParticipant#dispose()
-     */
-    public void dispose() {
-        deactivated();
-        DebugUITools.getDebugContextManager().getContextService(fPage.getSite().getWorkbenchWindow()).removeDebugContextListener(this);
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-        if (fRemoveTerminated != null) {
-            fRemoveTerminated.dispose();
-            fRemoveTerminated = null;
-        }
-		if (fRemoveAllTerminated != null) {
-			fRemoveAllTerminated.dispose();
-			fRemoveAllTerminated = null;
-		}
-		if (fTerminate != null) {
-		    fTerminate.dispose();
-		    fTerminate = null;
-		}
-		if (fStdOut != null) {
-			fStdOut.dispose();
-			fStdOut = null;
-		}
-		if (fStdErr != null) {
-			fStdErr.dispose();
-			fStdErr = null;
-		}
-		fConsole = null;
-    }
-
-    /**
-     * Contribute actions to the toolbar
-     */
-    protected void configureToolBar(IToolBarManager mgr) {
-		mgr.appendToGroup(IConsoleConstants.LAUNCH_GROUP, fTerminate);
-        mgr.appendToGroup(IConsoleConstants.LAUNCH_GROUP, fRemoveTerminated);
-		mgr.appendToGroup(IConsoleConstants.LAUNCH_GROUP, fRemoveAllTerminated);
-		mgr.appendToGroup(IConsoleConstants.OUTPUT_GROUP, fStdOut);
-		mgr.appendToGroup(IConsoleConstants.OUTPUT_GROUP, fStdErr);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class required) {
-        if (IShowInSource.class.equals(required)) {
-            return this;
-        }
-        if (IShowInTargetList.class.equals(required)) {
-            return this; 
-        }
-        //CONTEXTLAUNCHING
-        if(ILaunchConfiguration.class.equals(required)) {
-        	ILaunch launch = getProcess().getLaunch();
-        	if(launch != null) {
-        		return launch.getLaunchConfiguration();
-        	}
-        	return null;
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.IShowInSource#getShowInContext()
-     */
-    public ShowInContext getShowInContext() {
-        IProcess process = getProcess();
-        if (process == null) {
-            return null;
-        } 
-        IDebugTarget target = (IDebugTarget)process.getAdapter(IDebugTarget.class);
-        ISelection selection = null;
-        if (target == null) {
-            selection = new TreeSelection(new TreePath(new Object[]{
-            		DebugPlugin.getDefault().getLaunchManager(),
-            		process.getLaunch(),
-            		process}));
-        } else {
-        	selection = new TreeSelection(new TreePath(new Object[]{
-            		DebugPlugin.getDefault().getLaunchManager(),
-            		target.getLaunch(),
-            		target}));
-        }
-        return new ShowInContext(null, selection);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.IShowInTargetList#getShowInTargetIds()
-     */
-    public String[] getShowInTargetIds() {
-        return new String[] {IDebugUIConstants.ID_DEBUG_VIEW};
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-     */
-    public void handleDebugEvents(DebugEvent[] events) {
-        for (int i = 0; i < events.length; i++) {
-            DebugEvent event = events[i];
-            if (event.getSource().equals(getProcess())) {
-                Runnable r = new Runnable() {
-                    public void run() {
-                        if (fTerminate != null) {
-                            fTerminate.update();
-                        }
-                    }
-                };
-                
-                DebugUIPlugin.getStandardDisplay().asyncExec(r);           
-            }
-        }
-    }
-    
-    protected IProcess getProcess() {
-        return fConsole != null ? fConsole.getProcess() : null;
-    }
-
-	/* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsolePageParticipant#activated()
-     */
-    public void activated() {
-        // add EOF submissions
-        IPageSite site = fPage.getSite();
-        IHandlerService handlerService = (IHandlerService)site.getService(IHandlerService.class);
-        IContextService contextService = (IContextService)site.getService(IContextService.class);
-        fActivatedContext = contextService.activateContext(fContextId);
-        fActivatedHandler = handlerService.activateHandler("org.eclipse.debug.ui.commands.eof", fEOFHandler); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsolePageParticipant#deactivated()
-     */
-    public void deactivated() {
-        // remove EOF submissions
-        IPageSite site = fPage.getSite();
-        IHandlerService handlerService = (IHandlerService)site.getService(IHandlerService.class);
-        IContextService contextService = (IContextService)site.getService(IContextService.class);
-        handlerService.deactivateHandler(fActivatedHandler);
-		contextService.deactivateContext(fActivatedContext);
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextListener#contextEvent(org.eclipse.debug.internal.ui.contexts.provisional.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			if (fView != null && getProcess().equals(DebugUITools.getCurrentProcess())) {
-	            fView.display(fConsole);
-	        }
-		}
-		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessTypePropertyTester.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessTypePropertyTester.java
deleted file mode 100644
index a525977..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessTypePropertyTester.java
+++ /dev/null
@@ -1,40 +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.debug.internal.ui.views.console;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.ui.console.TextConsole;
-
-/**
- * Tests if a process type matches the expected value.
- * 
- * @since 3.1
- */
-public class ProcessTypePropertyTester extends PropertyTester {
-
-    /* (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 TextConsole) {
-            TextConsole console = (TextConsole) receiver;
-            IProcess process = (IProcess) console.getAttribute(IDebugUIConstants.ATTR_CONSOLE_PROCESS);
-            if (process != null) {
-                String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE);
-                return (type != null && type.equals(expectedValue));
-            }//end if
-        }//end if
-        return false;
-    }//end test
-
-}//end class
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowStandardErrorAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowStandardErrorAction.java
deleted file mode 100644
index ff2f6a0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowStandardErrorAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Toggles preference show the console when output is written
- * to standard error stream.
- * 
- * @since 3.3
- */
-public class ShowStandardErrorAction extends ShowWhenContentChangesAction {
-	
-	/**
-	 * Constructs an action to toggle console auto activation preferences
-	 */
-	public ShowStandardErrorAction() {
-		super(ConsoleMessages.ShowStandardErrorAction_0);
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ShowWhenStderrChangesAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.SHOW_WHEN_STDERR_CHANGES_ACTION);
-		setImageDescriptor(DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STANDARD_ERR));
-	}
-
-	protected String getKey() {
-		return IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowStandardOutAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowStandardOutAction.java
deleted file mode 100644
index 0bd2b96..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowStandardOutAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Toggles preference show the console when output is written
- * to standard output stream.
- * 
- * @since 3.3
- */
-public class ShowStandardOutAction extends ShowWhenContentChangesAction {
-	
-	/**
-	 * Constructs an action to toggle console auto activation preferences
-	 */
-	public ShowStandardOutAction() {
-		super(ConsoleMessages.ShowStandardOutAction_0);
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ShowWhenStdoutChangesAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.SHOW_WHEN_STDOUT_CHANGES_ACTION);
-		setImageDescriptor(DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STANDARD_OUT));
-	}
-
-	protected String getKey() {
-		return IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowWhenContentChangesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowWhenContentChangesAction.java
deleted file mode 100644
index bfe1825..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ShowWhenContentChangesAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Abstract action for toggling preference to automatically show
- * the console when a streams content changes.
- * 
- * @since 3.3
- */
-public abstract class ShowWhenContentChangesAction extends Action implements IPropertyChangeListener{
-	
-	/**
-	 * Constructs an action to toggle console auto activation preferences
-	 */
-	public ShowWhenContentChangesAction(String name) {
-		super(name, IAction.AS_CHECK_BOX);
-		setToolTipText(name);  
-		getPreferenceStore().addPropertyChangeListener(this);
-		update();
-	}
-
-	/* (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(getKey())) {
-             update();
-        }
-	}
-	
-	protected abstract String getKey();
-	
-	private void update() {
-		IPreferenceStore store = getPreferenceStore();
-		if (store.getBoolean(getKey())) {
-        	// on
-        	setChecked(true);
-         } else {
-        	// off
-        	setChecked(false);
-         }
-	}
-
-	/**
-	 * @return
-	 */
-	private IPreferenceStore getPreferenceStore() {
-		return DebugUIPlugin.getDefault().getPreferenceStore();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IPreferenceStore store = getPreferenceStore();
-		boolean show = isChecked();
-		store.removePropertyChangeListener(this);
-		store.setValue(getKey(), show);
-		store.addPropertyChangeListener(this);
-	}
-	
-	/**
-	 * Must be called to dispose this action.
-	 */
-	public void dispose() {
-		getPreferenceStore().removePropertyChangeListener(this);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java
deleted file mode 100644
index fc7bb99..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 	   Wind River - Pawel Piech - Initial Implementation - Drag/Drop to Expressions View (Bug 184057)
- *     IBM Corporation - further implementation and documentation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.expression;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.debug.internal.core.ExpressionManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.internal.ui.views.variables.IndexedVariablePartition;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapter;
-import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapterExtension;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * Drop Adapter allowing expressions, variables and text to be dropped in the Expression View.
- * When IVariables or text is dropped new watch expressions are created at the drop location.
- * When IExpressions are dropped, they are moved to the drop location
- * 
- * @see org.eclipse.debug.internal.ui.views.variables.VariablesDragAdapter
- * @see ExpressionManager
- * @since 3.4
- */
-public class ExpressionDropAdapter extends ViewerDropAdapter {
-
-	private TransferData fCurrentTransferType = null;
-	private boolean fInsertBefore;
-	private int fDropType;
-	
-	private static final int DROP_TYPE_DEFAULT = 0;
-	private static final int DROP_TYPE_VARIABLE = 1;
-	private static final int DROP_TYPE_EXPRESSION = 2;
-
-    /**
-     * Constructor takes the viewer this drop adapter applies to.
-     * @param viewer the viewer to add drop to
-     */
-    protected ExpressionDropAdapter(TreeModelViewer viewer) {
-        super(viewer);
-        setFeedbackEnabled(true);
-        setSelectionFeedbackEnabled(false);
-        setScrollExpandEnabled(false);
-    }
-
-    /* (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])) {
-            	if (isVariableDrop()){
-                    event.currentDataType = event.dataTypes[i];
-                    event.detail = DND.DROP_COPY;
-                    fDropType = DROP_TYPE_VARIABLE;
-                    return;
-                } else if (isExpressionDrop()){
-                	event.currentDataType = event.dataTypes[i];
-                    event.detail = DND.DROP_MOVE;
-                    fDropType = DROP_TYPE_EXPRESSION;
-                    return;
-                }
-            }
-        }
-
-        for (int i = 0; i < event.dataTypes.length; i++) {
-            if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
-                event.currentDataType = event.dataTypes[i];
-                event.detail = DND.DROP_COPY;
-                fDropType = DROP_TYPE_DEFAULT;
-                return;
-            }
-        }
-
-        fDropType = DROP_TYPE_DEFAULT;
-        event.detail = DND.DROP_NONE;
-    }
-    
-    /**
-     * @return whether the selection transfer contains only IExpressions
-     */
-    private boolean isExpressionDrop() {
-	    IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
-	    Iterator iterator = selection.iterator();
-	    while (iterator.hasNext()) {
-	    	Object element = iterator.next();
-	        if (!(element instanceof IExpression)){
-	        	return false;
-	        }
-	    }
-	    return true;
-	}
-
-	/**
-	 * @return whether the selection transfer contains only IVariables
-	 */
-	private boolean isVariableDrop() {
-	    IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
-	    Iterator iterator = selection.iterator();
-	    while (iterator.hasNext()) {
-	    	Object element = iterator.next();
-	        if (!(element instanceof IVariable)){
-	        	return false;
-	        }
-	    }
-	    return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOver(DropTargetEvent event) {
-    	super.dragOver(event);
-        // Allow scrolling (but not expansion)
-    	event.feedback |= DND.FEEDBACK_SCROLL;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
-     */
-    public boolean validateDrop(Object target, int operation, TransferData transferType) {
-        if (LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) {
-        	if (fDropType == DROP_TYPE_EXPRESSION){
-        		return validateExpressionDrop(target);
-        	} else if (fDropType == DROP_TYPE_VARIABLE){
-        		return validateVariableDrop(target);
-        	}
-        } else if (TextTransfer.getInstance().isSupportedType(transferType)) {
-            return true;
-        }
-        return false;
-    }
-
-	/**
-	 * Validates if an IExpression drop is valid by checking if the target
-	 * is an IExpression.
-	 * @param target target of the drop
-	 * @return whether the drop is valid
-	 */
-	private boolean validateExpressionDrop(Object target){
-		return target instanceof IExpression;
-	}
-
-	/**
-	 * Validates if the drop is valid by validating the local selection transfer 
-	 * to ensure that a watch expression can be created for each contained IVariable.
-	 * @param target target of the drop
-	 * @return whether the drop is valid
-	 */
-	private boolean validateVariableDrop(Object target) {
-		// Target must be null or an IExpression, you cannot add a new watch expression inside another
-		if (target != null && !(target instanceof IExpression)){
-			return false;
-		}
-	    IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
-	    int enabled = 0;
-	    int size = -1;
-	    if (selection != null) {
-	        size = selection.size();
-	        IExpressionManager manager = DebugPlugin.getDefault().getExpressionManager();
-	        Iterator iterator = selection.iterator();
-	        while (iterator.hasNext()) {
-	            Object element = iterator.next();
-	            if (element instanceof IVariable){
-	                IVariable variable = (IVariable) element;
-	                if (variable instanceof IndexedVariablePartition) {
-	                    break;
-	                } else if (manager.hasWatchExpressionDelegate(variable.getModelIdentifier()) && isFactoryEnabled(variable)) {
-	                    enabled++;
-	                } else {
-	                    break;
-	                }
-	            }
-	        }
-	    }
-	    return enabled == size;
-	}
-
-	/**
-	 * Returns whether the factory adapter for the given variable is currently enabled.
-	 * 
-	 * @param variable the variable to ask for the adapter
-	 * @return whether the factory is enabled
-	 */
-	private boolean isFactoryEnabled(IVariable variable) {
-	    IWatchExpressionFactoryAdapter factory = getFactory(variable);
-	    if (factory instanceof IWatchExpressionFactoryAdapterExtension) {
-	        IWatchExpressionFactoryAdapterExtension ext = (IWatchExpressionFactoryAdapterExtension) factory;
-	        return ext.canCreateWatchExpression(variable);
-	    }
-	    return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-	    fCurrentTransferType = event.currentDataType;
-	    // Unless insert after is explicitly set, insert before
-	    fInsertBefore = getCurrentLocation() != LOCATION_AFTER;
-	    super.drop(event);
-	}
-
-	/* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
-     */
-    public boolean performDrop(Object data) {
-        if (LocalSelectionTransfer.getTransfer().isSupportedType(fCurrentTransferType)) {
-            IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
-            if (fDropType == DROP_TYPE_EXPRESSION){
-            	return performExpressionDrop(selection);
-            } else if (fDropType == DROP_TYPE_VARIABLE){
-            	return performVariableDrop(selection);
-            }
-        } else if (TextTransfer.getInstance().isSupportedType(fCurrentTransferType)) {
-            if (data != null) {
-            	return performTextDrop((String)data);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Performs the drop when the selection is a collection of IExpressions.
-     * Moves the given expressions from their original locations to the
-     * location of the current target.
-     * @param selection the dragged selection
-     * @return whether the drop could be completed
-     */
-    private boolean performExpressionDrop(IStructuredSelection selection) {
-		if (getCurrentTarget() instanceof IExpression){
-			IExpression[] expressions = new IExpression[selection.size()];
-	    	System.arraycopy(selection.toArray(), 0, expressions, 0, expressions.length);
-	    	
-	    	IExpressionManager manager = DebugPlugin.getDefault().getExpressionManager();
-	    	if (manager instanceof ExpressionManager){
-	    		((ExpressionManager)manager).moveExpressions(expressions, (IExpression)getCurrentTarget(), fInsertBefore);
-	    	}
-	    	return true;
-		}
-		return false;
-		
-	}
-
-	/**
-     * If the dragged data is a structured selection, get any IVariables in it 
-     * and create expressions for each of them.  Insert the created expressions
-     * at the currently selected target or add them to the end of the collection
-     * if no target is selected.
-     * 
-     * @param selection Structured selection containing IVariables
-     * @return whether the drop was successful
-     */
-    private boolean performVariableDrop(IStructuredSelection selection) {
-        List expressions = new ArrayList(selection.size());
-    	for (Iterator itr = selection.iterator(); itr.hasNext(); ) {
-            Object element = itr.next();
-            if (element instanceof IVariable) {
-            	String expressionText = createExpressionString((IVariable)element);
-            	if (expressionText != null){
-	            	IExpression expression = createExpression(expressionText);
-	            	if (expression != null){
-	            		expressions.add(expression);
-	            	} else {
-	            		DebugUIPlugin.log(new Status(IStatus.ERROR,DebugUIPlugin.getUniqueIdentifier(),"Drop failed.  Watch expression could not be created for the text " + expressionText)); //$NON-NLS-1$
-	            		return false;
-	            	}
-            	} else {
-            		return false;
-            	}
-            }
-        }
-    	if (expressions.size() == selection.size()){
-    		IExpressionManager manager = DebugPlugin.getDefault().getExpressionManager();
-	    	if (manager instanceof ExpressionManager){
-	    		if (getCurrentTarget() != null){
-	    			((ExpressionManager)manager).insertExpressions((IExpression[])expressions.toArray(new IExpression[expressions.size()]), (IExpression)getCurrentTarget(), fInsertBefore);
-	    		} else {
-	    			((ExpressionManager)manager).addExpressions((IExpression[])expressions.toArray(new IExpression[expressions.size()]));
-	    		}
-	    		return true;
-	    	}
-    	}
-    	return false;
-    }
-    
-    /**
-     * Performs the drop when text was dragged.  Creates a new watch expression from
-     * the text.  Inserts the expression at the currently selected target or adds it
-     * to the end of the collection if no target is selected.
-     * 
-     * @param text string to use to create the expression
-     * @return whether the drop was successful
-     */
-    private boolean performTextDrop(String text){
-    	IExpression expression = createExpression(text);
-    	if (expression != null){
-    		IExpressionManager manager = DebugPlugin.getDefault().getExpressionManager();
-	    	if (manager instanceof ExpressionManager){
-		    	if (getCurrentTarget() != null){
-	    			((ExpressionManager)manager).insertExpressions(new IExpression[]{expression}, (IExpression)getCurrentTarget(), fInsertBefore);
-	    		} else {
-	    			((ExpressionManager)manager).addExpression(expression);
-	    		}
-	    		return true;
-	    	}
-    	}
-    	DebugUIPlugin.log(new Status(IStatus.ERROR,DebugUIPlugin.getUniqueIdentifier(),"Drop failed.  Watch expression could not be created for the text " + text)); //$NON-NLS-1$
-    	return false;
-    }
-    
-    /**
-     * Creates a new watch expression from an IVariable using the watch expression factory
-     * adapter for that variable.
-     * 
-     * @param variable the variable to use to create the watch expression
-     * @return whether the creation was successful
-     */
-    private String createExpressionString(IVariable variable) {
-        IWatchExpressionFactoryAdapter factory = getFactory(variable);
-        try {
-            String exp = variable.getName();
-            if (factory != null) {
-                exp = factory.createWatchExpression(variable);
-                return exp;
-            } else {
-            	DebugUIPlugin.log(new Status(IStatus.ERROR,DebugUIPlugin.getUniqueIdentifier(),"Drop failed.  Watch Expression Factory could not be found for variable " + variable)); //$NON-NLS-1$
-            }
-        } catch (CoreException e) {
-        	DebugUIPlugin.log(e.getStatus());
-        }
-        return null;
-    }
-
-    /**
-     * Creates a new watch expression from a string using the default expression manager.
-     * 
-     * @param exp the string to use to create the expression
-     */
-    private IExpression createExpression(String exp) {
-        IWatchExpression expression = DebugPlugin.getDefault().getExpressionManager().newWatchExpression(exp);
-        IAdaptable object = DebugUITools.getDebugContext();
-        IDebugElement context = null;
-        if (object instanceof IDebugElement) {
-            context = (IDebugElement) object;
-        } else if (object instanceof ILaunch) {
-            context = ((ILaunch) object).getDebugTarget();
-        }
-        expression.setExpressionContext(context);
-        return expression;
-    }
-    
-   
-    /**
-     * Returns the factory adapter for the given variable or <code>null</code> if none.
-     * 
-     * @param variable
-     * @return factory or <code>null</code>
-     */
-    private IWatchExpressionFactoryAdapter getFactory(IVariable variable) {
-        return (IWatchExpressionFactoryAdapter) variable.getAdapter(IWatchExpressionFactoryAdapter.class);      
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionView.java
deleted file mode 100644
index ca3e219..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionView.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
- *     Wind River - Pawel Piech - Drag/Drop to Expressions View (Bug 184057)
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.expression;
-
- 
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.internal.ui.views.variables.AvailableLogicalStructuresAction;
-import org.eclipse.debug.internal.ui.views.variables.SelectionDragAdapter;
-import org.eclipse.debug.internal.ui.views.variables.VariablesView;
-import org.eclipse.debug.internal.ui.views.variables.VariablesViewMessages;
-import org.eclipse.debug.internal.ui.views.variables.details.AvailableDetailPanesAction;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.IWorkbenchActionConstants;
- 
-/**
- * Displays expressions and their values with a detail
- * pane.
- */
-public class ExpressionView extends VariablesView {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.EXPRESSION_VIEW;		
-	}	
-	
-	/**
-	 * Initializes the viewer input on creation
-	 */
-	protected void setInitialContent() {
-		getViewer().setInput(DebugPlugin.getDefault().getExpressionManager());
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#configureToolBar(org.eclipse.jface.action.IToolBarManager)
-	 */
-	protected void configureToolBar(IToolBarManager tbm) {
-		super.configureToolBar(tbm);
-		tbm.add(new Separator(IDebugUIConstants.EMPTY_EXPRESSION_GROUP));		
-		tbm.add(new Separator(IDebugUIConstants.EXPRESSION_GROUP));
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void fillContextMenu(IMenuManager menu) {
-
-		menu.add(new Separator(IDebugUIConstants.EMPTY_EXPRESSION_GROUP));
-		menu.add(new Separator(IDebugUIConstants.EXPRESSION_GROUP));
-		menu.add(getAction(VARIABLES_FIND_ELEMENT_ACTION));
-		menu.add(getAction("ChangeVariableValue")); //$NON-NLS-1$
-		menu.add(new Separator());
-		IAction action = new AvailableLogicalStructuresAction(this);
-        if (action.isEnabled()) {
-            menu.add(action);
-        }
-		action = new AvailableDetailPanesAction(this);
-		if (isDetailPaneVisible() && action.isEnabled()) {
-			menu.add(action);
-		}
-		menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#contextActivated(org.eclipse.jface.viewers.ISelection)
-	 */
-	protected void contextActivated(ISelection selection) {
-		if (!isVisible()) {
-			return;
-		}
-		// update actions
-		updateAction("ContentAssist"); //$NON-NLS-1$
-		updateAction(VARIABLES_FIND_ELEMENT_ACTION);
-		updateAction(FIND_ACTION);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getDetailPanePreferenceKey()
-	 */
-	protected String getDetailPanePreferenceKey() {
-		return IDebugPreferenceConstants.EXPRESSIONS_DETAIL_PANE_ORIENTATION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getToggleActionLabel()
-	 */
-	protected String getToggleActionLabel() {
-		return VariablesViewMessages.ExpressionView_4; 
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#becomesVisible()
-	 */
-	protected void becomesVisible() {
-		setInitialContent();
-		super.becomesVisible();
-	}
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getViewerStyle()
-	 */
-	protected int getViewerStyle() {
-		return SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getPresentationContextId()
-	 */
-	protected String getPresentationContextId() {
-		return IDebugUIConstants.ID_EXPRESSION_VIEW;
-	}	
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#initDragAndDrop(org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer)
-     */
-    protected void initDragAndDrop(TreeModelViewer viewer) {
-        viewer.addDragSupport(DND.DROP_MOVE, new Transfer[] {LocalSelectionTransfer.getTransfer()}, new SelectionDragAdapter(viewer));
-        viewer.addDropSupport(DND.DROP_MOVE|DND.DROP_COPY, new Transfer[] {LocalSelectionTransfer.getTransfer(), TextTransfer.getInstance()}, new ExpressionDropAdapter(viewer));
-    }    	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DebugElementAdapterFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DebugElementAdapterFactory.java
deleted file mode 100644
index 1988119..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DebugElementAdapterFactory.java
+++ /dev/null
@@ -1,257 +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.debug.internal.ui.views.launch;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.debug.core.IExpressionManager;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IRegisterGroup;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.elements.adapters.AsynchronousDebugLabelAdapter;
-import org.eclipse.debug.internal.ui.elements.adapters.MemoryBlockContentAdapter;
-import org.eclipse.debug.internal.ui.elements.adapters.MemoryBlockLabelAdapter;
-import org.eclipse.debug.internal.ui.elements.adapters.MemoryRetrievalContentAdapter;
-import org.eclipse.debug.internal.ui.elements.adapters.MemorySegmentLabelAdapter;
-import org.eclipse.debug.internal.ui.elements.adapters.StackFrameSourceDisplayAdapter;
-import org.eclipse.debug.internal.ui.elements.adapters.VariableColumnFactoryAdapter;
-import org.eclipse.debug.internal.ui.model.elements.DebugElementLabelProvider;
-import org.eclipse.debug.internal.ui.model.elements.DebugTargetContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.ExpressionContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.ExpressionLabelProvider;
-import org.eclipse.debug.internal.ui.model.elements.ExpressionManagerContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.ExpressionsViewMementoProvider;
-import org.eclipse.debug.internal.ui.model.elements.LaunchContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.LaunchManagerContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.MemoryBlockContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.MemoryBlockLabelProvider;
-import org.eclipse.debug.internal.ui.model.elements.MemoryRetrievalContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.MemoryViewElementMementoProvider;
-import org.eclipse.debug.internal.ui.model.elements.RegisterGroupContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.RegisterGroupLabelProvider;
-import org.eclipse.debug.internal.ui.model.elements.StackFrameContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.ThreadContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.VariableContentProvider;
-import org.eclipse.debug.internal.ui.model.elements.VariableEditor;
-import org.eclipse.debug.internal.ui.model.elements.VariableLabelProvider;
-import org.eclipse.debug.internal.ui.model.elements.VariablesViewElementMementoProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousContentAdapter;
-import org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousLabelAdapter;
-import org.eclipse.debug.internal.ui.viewers.update.DefaultModelProxyFactory;
-import org.eclipse.debug.internal.ui.viewers.update.DefaultModelSelectionPolicyFactory;
-import org.eclipse.debug.internal.ui.views.memory.renderings.MemorySegment;
-import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
-
-/**
- * DebugElementAdapterFactory
- */
-public class DebugElementAdapterFactory implements IAdapterFactory {
-	
-	private static IModelProxyFactory fgModelProxyFactoryAdapter = new DefaultModelProxyFactory();
-	private static ISourceDisplay fgStackFrameSourceDisplayAdapter = new StackFrameSourceDisplayAdapter();
-	private static IModelSelectionPolicyFactory fgModelSelectionPolicyFactoryAdapter = new DefaultModelSelectionPolicyFactory();
-    
-    private static IAsynchronousLabelAdapter fgDebugLabelAdapter = new AsynchronousDebugLabelAdapter();
-    private static IAsynchronousLabelAdapter fgMemoryBlockLabelAdapter = new MemoryBlockLabelAdapter();
-    private static IAsynchronousLabelAdapter fgTableRenderingLineLabelAdapter = new MemorySegmentLabelAdapter();
-    
-    private static IElementLabelProvider fgLPDebugElement = new DebugElementLabelProvider();
-    private static IElementLabelProvider fgLPVariable = new VariableLabelProvider();
-    private static IElementLabelProvider fgLPExpression = new ExpressionLabelProvider();
-    private static IElementLabelProvider fgLPRegisterGroup = new RegisterGroupLabelProvider();
-    private static IElementLabelProvider fgLPMemoryBlock = new MemoryBlockLabelProvider();
-    
-    private static IElementEditor fgEEVariable = new VariableEditor();
-    
-    private static IAsynchronousContentAdapter fgAsyncMemoryRetrieval = new MemoryRetrievalContentAdapter();
-    private static IAsynchronousContentAdapter fgAsyncMemoryBlock = new MemoryBlockContentAdapter();
-    
-    private static IElementContentProvider fgCPLaunchManger = new LaunchManagerContentProvider();
-    private static IElementContentProvider fgCPLaunch = new LaunchContentProvider();
-    private static IElementContentProvider fgCPTarget = new DebugTargetContentProvider();
-    private static IElementContentProvider fgCPThread = new ThreadContentProvider();
-    private static IElementContentProvider fgCPFrame = new StackFrameContentProvider();
-    private static IElementContentProvider fgCPVariable = new VariableContentProvider();
-    private static IElementContentProvider fgCPExpressionManager = new ExpressionManagerContentProvider();
-    private static IElementContentProvider fgCPExpression = new ExpressionContentProvider();
-    private static IElementContentProvider fgCPRegisterGroup = new RegisterGroupContentProvider();
-    private static IElementContentProvider fgCPMemoryRetrieval = new MemoryRetrievalContentProvider();
-    private static IElementContentProvider fgCPMemoryBlock = new MemoryBlockContentProvider();
-    
-    private static IElementMementoProvider fgMPFrame = new VariablesViewElementMementoProvider();
-    private static IElementMementoProvider fgMPExpressions = new ExpressionsViewMementoProvider();
-    private static IElementMementoProvider fgMPMemory = new MemoryViewElementMementoProvider();
-    
-    private static IColumnPresentationFactory fgVariableColumnFactory = new VariableColumnFactoryAdapter();
-    
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-     */
-    public Object getAdapter(Object adaptableObject, Class adapterType) {
-        if (adapterType.isInstance(adaptableObject)) {
-			return adaptableObject;
-		}
-        
-        if (adapterType.equals(IAsynchronousContentAdapter.class)) {
-            if (adaptableObject instanceof IMemoryBlockRetrieval) {
-            	return fgAsyncMemoryRetrieval;
-            }
-            if (adaptableObject instanceof IMemoryBlock) {
-            	return fgAsyncMemoryBlock;
-            }
-        }
-        
-        if (adapterType.equals(IElementContentProvider.class)) {
-            if (adaptableObject instanceof ILaunchManager) {
-                return fgCPLaunchManger;
-            }
-            if (adaptableObject instanceof ILaunch) {
-                return fgCPLaunch;
-            }
-            if (adaptableObject instanceof IDebugTarget) {
-            	return fgCPTarget;
-            }
-            if (adaptableObject instanceof IMemoryBlockRetrieval)
-            {
-            	return fgCPMemoryRetrieval;
-            }
-            if (adaptableObject instanceof IThread) {
-            	return fgCPThread;
-            }
-            if (adaptableObject instanceof IStackFrame) {
-            	return fgCPFrame;
-            }
-            if (adaptableObject instanceof IVariable) {
-            	return fgCPVariable;
-            }
-            if (adaptableObject instanceof IExpressionManager) {
-            	return fgCPExpressionManager;
-            }
-            if (adaptableObject instanceof IExpression) {
-            	return fgCPExpression;
-            }
-            if (adaptableObject instanceof IRegisterGroup) {
-            	return fgCPRegisterGroup;
-            }
-            if (adaptableObject instanceof IMemoryBlock) {
-            	return fgCPMemoryBlock;
-            }
-        }        
-        
-        if (adapterType.equals(IAsynchronousLabelAdapter.class)) {
-        	if (adaptableObject instanceof IMemoryBlock) {
-        		return fgMemoryBlockLabelAdapter;
-        	}
-        	
-        	if (adaptableObject instanceof MemorySegment) {
-        		return fgTableRenderingLineLabelAdapter;
-        	}
-        	return fgDebugLabelAdapter;
-        }
-        
-        if (adapterType.equals(IElementLabelProvider.class)) {
-        	if (adaptableObject instanceof IVariable) {
-        		return fgLPVariable;
-        	}
-        	if (adaptableObject instanceof IExpression) {
-        		return fgLPExpression;
-        	}
-        	if (adaptableObject instanceof IRegisterGroup) {
-        		return fgLPRegisterGroup;
-        	}
-        	if (adaptableObject instanceof IMemoryBlock) {
-        		return fgLPMemoryBlock;
-        	}
-        	return fgLPDebugElement;
-        }        
-        
-        if (adapterType.equals(IModelProxyFactory.class)) {
-        	if (adaptableObject instanceof ILaunch || adaptableObject instanceof IDebugTarget ||
-        			adaptableObject instanceof IProcess || adaptableObject instanceof ILaunchManager ||
-        			adaptableObject instanceof IStackFrame || adaptableObject instanceof IExpressionManager ||
-        			adaptableObject instanceof IExpression || adaptableObject instanceof IMemoryBlockRetrieval ||
-        			adaptableObject instanceof IMemoryBlock)
-        	return fgModelProxyFactoryAdapter;
-        }
-        
-        if (adapterType.equals(ISourceDisplay.class)) {
-        	if (adaptableObject instanceof IStackFrame) {
-        		return fgStackFrameSourceDisplayAdapter;
-        	}
-        }
-        
-        if (adapterType.equals(IModelSelectionPolicyFactory.class)) {
-        	if (adaptableObject instanceof IDebugElement) {
-        		return fgModelSelectionPolicyFactoryAdapter;
-        	}
-        }
-        
-        if (adapterType.equals(IColumnPresentationFactory.class)) {
-        	if (adaptableObject instanceof IStackFrame) {
-        		return fgVariableColumnFactory;
-        	}
-        }   
-        
-        if (adapterType.equals(IElementMementoProvider.class)) {
-        	if (adaptableObject instanceof IStackFrame) {
-        		return fgMPFrame;
-        	}
-        	if (adaptableObject instanceof IExpressionManager) {
-        		return fgMPExpressions;
-        	}
-        	if (adaptableObject instanceof IMemoryBlockRetrieval) {
-        		return fgMPMemory;
-        	}
-        }
-        
-        if (adapterType.equals(IElementEditor.class)) {
-        	if (adaptableObject instanceof IVariable) {
-        		return fgEEVariable;
-        	}
-        }
-        
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-     */
-    public Class[] getAdapterList() {
-        return new Class[] {
-        		IAsynchronousLabelAdapter.class,
-        		IAsynchronousContentAdapter.class,
-        		IModelProxyFactory.class,
-        		ISourceDisplay.class,
-        		IModelSelectionPolicyFactory.class,
-        		IColumnPresentationFactory.class,
-        		IElementContentProvider.class,
-        		IElementLabelProvider.class,
-        		IElementMementoProvider.class,
-        		IElementEditor.class};
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DebugElementHelper.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DebugElementHelper.java
deleted file mode 100644
index 27f4f01..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DebugElementHelper.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.launch;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-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.graphics.RGB;
-
-/**
- * Translates images, colors, and fonts into image descriptors, RGBs, and font
- * datas for workbench adapaters. Also provides labels. 
- * 
- * @since 3.1
- */
-public class DebugElementHelper {
-    
-    // a model presentation that can provide images & labels for debug elements
-    private static DelegatingModelPresentation fgPresenetation;
-    
-    // map of images to image descriptors
-    private static Map fgImages = new HashMap();
-    
-    /**
-     * Disposes this adapater
-     */
-    public static void dispose() {
-        fgImages.clear();
-        if (fgPresenetation != null) {
-            fgPresenetation.dispose();
-            fgPresenetation = null;
-        }
-    }
-    
-    
-    public static boolean isInitialized(Object object) {
-    	DelegatingModelPresentation presentation = getPresentation();
-    	return presentation.isInitialized(object);
-    }
-
-    /**
-     * Returns an image descriptor for the given debug element.
-     * 
-     * @param object object for which an image descriptor is required
-     */
-    public static ImageDescriptor getImageDescriptor(Object object) {
-        Image image = getPresentation().getImage(object);
-        return getImageDescriptor(image);
-    }
-    
-    /**
-     * Returns an image descriptor for the given debug element.
-     *
-     * @param presentation presentation to obtain image from
-     * @param object object for which an image descriptor is required
-     * @since 3.3
-     */
-    public static ImageDescriptor getImageDescriptor(Object object, IDebugModelPresentation presentation) {
-    	Image image = presentation.getImage(object);
-        return getImageDescriptor(image);
-    }    
-    
-    public static ImageDescriptor getImageDescriptor(Image image)
-    {
-    	if (image != null) {
-            ImageDescriptor descriptor = (ImageDescriptor) fgImages.get(image);
-            if (descriptor == null) {
-                descriptor = new ImageImageDescriptor(image);
-                fgImages.put(image, descriptor);
-            }
-            return descriptor;
-        }
-    	return null;
-    }
-
-    /**
-     * Returns a label for the given debug element.
-     * 
-     * @param o object for which a label is required
-     */
-    public static String getLabel(Object o) {
-        return getPresentation().getText(o);
-    }
-    
-    /**
-     * Returns a model presentation to use to retrieve lables & images.
-     * 
-     * @return a model presentation to use to retrieve lables & images
-     */
-    public static DelegatingModelPresentation getPresentation() {
-        if (fgPresenetation == null) {
-            fgPresenetation = new DelegatingModelPresentation();
-        }
-        return fgPresenetation;
-    }
-
-    /**
-     * Returns the RGB of the foreground color for the given element, or
-     * <code>null</code> if none.
-     * 
-     * @param element object for which a foreground color is required
-     * @return the RGB of the foreground color for the given element, or
-     * <code>null</code> if none
-     */
-    public static RGB getForeground(Object element) {
-        Color color = getPresentation().getForeground(element);
-        if (color != null) {
-            return color.getRGB();
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the RGB of the foreground color for the given element, or
-     * <code>null</code> if none.
-     * 
-     * @param element object for which a foreground color is required
-     * @param presentation presentation to obtain color from
-     * @return the RGB of the foreground color for the given element, or
-     * <code>null</code> if none
-     * @since 3.3
-     */
-    public static RGB getForeground(Object element, IDebugModelPresentation presentation) {
-    	Color color = null;
-    	if (presentation instanceof IColorProvider) {
-			IColorProvider colorProvider = (IColorProvider) presentation;
-			color = colorProvider.getForeground(element);
-		} else {
-			color = getPresentation().getForeground(element);
-		}
-        if (color != null) {
-            return color.getRGB();
-        }
-        return null;
-    }    
-
-    /**
-     * Returns the RGB of the background color for the given element, or
-     * <code>null</code> if none.
-     * 
-     * @param element object for which a background color is required
-     * @return the RGB of the background color for the given element, or
-     * <code>null</code> if none
-     */
-    public static RGB getBackground(Object element) {
-        Color color = getPresentation().getBackground(element);
-        if (color != null) {
-            return color.getRGB();
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the RGB of the background color for the given element, or
-     * <code>null</code> if none.
-     * 
-     * @param element object for which a background color is required
-     * @param presentation presentation to use to retrieve color
-     * @return the RGB of the background color for the given element, or
-     * <code>null</code> if none
-     * @since 3.3
-     */
-    public static RGB getBackground(Object element, IDebugModelPresentation presentation) {
-    	Color color = null;
-    	if (presentation instanceof IColorProvider) {
-			IColorProvider colorProvider = (IColorProvider) presentation;
-			color = colorProvider.getBackground(element);
-		} else {
-			color = getPresentation().getBackground(element);
-		}
-        if (color != null) {
-            return color.getRGB();
-        }
-        return null;
-    }    
-
-    /**
-     * Returns the font data for the given element, or
-     * <code>null</code> if none.
-     * 
-     * @param element object for which font data is required
-     * @return the font data for the given element, or
-     * <code>null</code> if none
-     */
-    public static FontData getFont(Object element) {
-        Font font = getPresentation().getFont(element);
-        if (font != null) {
-            return font.getFontData()[0];
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the font data for the given element, or
-     * <code>null</code> if none.
-     * 
-     * @param element object for which font data is required
-     * @param presentation presentation to obtain font from
-     * @return the font data for the given element, or
-     * <code>null</code> if none
-     * @since 3.3
-     */
-    public static FontData getFont(Object element, IDebugModelPresentation presentation) {
-    	Font font = null;
-    	if (presentation instanceof IFontProvider) {
-    		IFontProvider provider = (IFontProvider) presentation;
-    		font = provider.getFont(element);
-    	} else {
-    		font = getPresentation().getFont(element);
-    	}
-        if (font != null) {
-            return font.getFontData()[0];
-        }
-        return null;
-    }    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/Decoration.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/Decoration.java
deleted file mode 100644
index 6f5cc4c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/Decoration.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.debug.internal.ui.views.launch;
-
-import org.eclipse.debug.core.model.IThread;
-
-/**
- * A decoration in an editor, created by the debugger.
- */
-public abstract class Decoration {
-	
-	/**
-	 * Removes this decoration
-	 */
-	public abstract void remove();
-	
-	/**
-	 * Returns the thread this decoration decorates.
-	 * 
-	 * @return thread associated with this decoration
-	 */
-	public abstract IThread getThread();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DecorationManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DecorationManager.java
deleted file mode 100644
index 49938fd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/DecorationManager.java
+++ /dev/null
@@ -1,95 +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.debug.internal.ui.views.launch;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IThread;
-
-/**
- * Manages source selections and decorated editors for launch views.
- */
-public class DecorationManager {
-
-    // map of targets to lists of active decorations
-    private static Map fDecorations = new HashMap(10);
-
-    /**
-     * Adds the given decoration for the given stack frame.
-     * 
-     * @param decoration
-     * @param frame
-     */
-    public static void addDecoration(Decoration decoration) {
-        synchronized (fDecorations) {
-            IDebugTarget target = decoration.getThread().getDebugTarget();
-            List list = (List) fDecorations.get(target);
-            if (list == null) {
-                list = new ArrayList();
-                fDecorations.put(target, list);
-            }
-            list.add(decoration);
-        }
-    }
-
-    /**
-     * Removes any decorations for the given debug target.
-     * 
-     * @param target
-     *            to remove editor decorations for
-     */
-    public static void removeDecorations(IDebugTarget target) {
-    	doRemoveDecorations(target, null);
-    }
-    
-    /**
-     * Removes any decorations for the given thread
-     * 
-     * @param thread
-     *            thread to remove decorations for
-     */
-    public static void removeDecorations(IThread thread) {
-    	doRemoveDecorations(thread.getDebugTarget(), thread);
-    }
-
-	private static void doRemoveDecorations(IDebugTarget target, IThread thread) {
-		ArrayList decorationsToRemove = new ArrayList();
-        synchronized (fDecorations) {
-            List list = (List) fDecorations.get(target);
-            if (list != null) {
-                ListIterator iterator = list.listIterator();
-                while (iterator.hasNext()) {
-                    Decoration decoration = (Decoration) iterator.next();
-                    if (thread == null || thread.equals(decoration.getThread())) {
-	                    decorationsToRemove.add(decoration);
-	                    iterator.remove();
-                    }
-                }
-                if (list.isEmpty()) {
-                	fDecorations.remove(target);
-                }
-            }
-        }
-        Iterator iter = decorationsToRemove.iterator();
-        while (iter.hasNext())
-        {
-        	Decoration decoration = (Decoration)iter.next();
-        	decoration.remove();
-        }
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/ImageImageDescriptor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/ImageImageDescriptor.java
deleted file mode 100644
index 57f8fb6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/ImageImageDescriptor.java
+++ /dev/null
@@ -1,51 +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.debug.internal.ui.views.launch;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * Image descriptor for an image.
- */
-public class ImageImageDescriptor extends ImageDescriptor {
-	private Image fImage;
-
-	/**
-	 * Constructor for ImagImageDescriptor.
-	 */
-	public ImageImageDescriptor(Image image) {
-		super();
-		fImage= image;
-	}
-
-	/* (non-Javadoc)
-	 * @see ImageDescriptor#getImageData()
-	 */
-	public ImageData getImageData() {
-		return fImage.getImageData();
-	}
-
-	/* (non-Javadoc)
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object obj) {
-		return (obj != null) && getClass().equals(obj.getClass()) && fImage.equals(((ImageImageDescriptor)obj).fImage);
-	}
-
-	/* (non-Javadoc)
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return fImage.hashCode();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
deleted file mode 100644
index e6c5b93..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
+++ /dev/null
@@ -1,803 +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.debug.internal.ui.views.launch;
-
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IAdaptable;
-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.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.AddToFavoritesAction;
-import org.eclipse.debug.internal.ui.actions.EditLaunchConfigurationAction;
-import org.eclipse.debug.internal.ui.commands.actions.DebugCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.DisconnectCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.DropToFrameCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.ResumeCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.StepIntoCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.StepOverCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.StepReturnCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.SuspendCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.TerminateAllAction;
-import org.eclipse.debug.internal.ui.commands.actions.TerminateAndRelaunchAction;
-import org.eclipse.debug.internal.ui.commands.actions.TerminateAndRemoveAction;
-import org.eclipse.debug.internal.ui.commands.actions.TerminateCommandAction;
-import org.eclipse.debug.internal.ui.commands.actions.ToggleStepFiltersAction;
-import org.eclipse.debug.internal.ui.sourcelookup.EditSourceLookupPathAction;
-import org.eclipse.debug.internal.ui.sourcelookup.LookupSourceAction;
-import org.eclipse.debug.internal.ui.viewers.model.InternalTreeModelViewer;
-import org.eclipse.debug.internal.ui.viewers.model.VirtualFindAction;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.internal.ui.views.DebugModelPresentationContext;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.ui.AbstractDebugView;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.AbstractDebugContextProvider;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-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.StructuredViewer;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener2;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTarget;
-import org.eclipse.ui.part.IShowInTargetList;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.progress.UIJob;
-
-public class LaunchView extends AbstractDebugView implements ISelectionChangedListener, IPerspectiveListener2, IPageListener, IShowInTarget, IShowInSource, IShowInTargetList, IPartListener2 {
-	
-	public static final String ID_CONTEXT_ACTIVITY_BINDINGS = "contextActivityBindings"; //$NON-NLS-1$
-
-    private static final String TERMINATE = "terminate"; //$NON-NLS-1$
-
-    private static final String DISCONNECT = "disconnect"; //$NON-NLS-1$
-
-    private static final String SUSPEND = "suspend"; //$NON-NLS-1$
-
-    private static final String RESUME = "resume"; //$NON-NLS-1$
-
-    private static final String STEP_RETURN = "step_return"; //$NON-NLS-1$
-
-    private static final String STEP_OVER = "step_over"; //$NON-NLS-1$
-
-    private static final String DROP_TO_FRAME = "drop_to_frame"; //$NON-NLS-1$
-
-    private static final String STEP_INTO = "step_into"; //$NON-NLS-1$
-
-    private static final String TERMINATE_AND_REMOVE = "terminate_and_remove"; //$NON-NLS-1$
-    
-    private static final String TERMINATE_ALL = "terminate_all"; //$NON-NLS-1$
-
-    private static final String TERMINATE_AND_RELAUNCH = "terminate_relaunch"; //$NON-NLS-1$
-    
-    private static final String TOGGLE_STEP_FILTERS = "toggle_step_filters"; //$NON-NLS-1$
-			
-	/**
-	 * Whether this view is in the active page of a perspective.
-	 */
-	private boolean fIsActive = true; 	
-		
-	/**
-	 * Model presentation or <code>null</code> if none
-	 */
-	private IDebugModelPresentation fPresentation = null;
-	
-	private EditLaunchConfigurationAction fEditConfigAction = null;
-	private AddToFavoritesAction fAddToFavoritesAction = null;
-	private EditSourceLookupPathAction fEditSourceAction = null;
-	private LookupSourceAction fLookupAction = null;
-
-	class ContextProvider extends AbstractDebugContextProvider implements IModelChangedListener {
-		
-		private ISelection fContext = null;
-		private TreeModelViewer fViewer = null;
-		private Visitor fVisitor = new Visitor();
-		
-		class Visitor implements IModelDeltaVisitor {
-			public boolean visit(IModelDelta delta, int depth) {
-				Object element = delta.getElement();
-				if ((delta.getFlags() & (IModelDelta.STATE | IModelDelta.CONTENT)) > 0) {
-					// state and/or content change
-					if ((delta.getFlags() & IModelDelta.SELECT) == 0) {
-						// no select flag
-						if ((delta.getFlags() & IModelDelta.CONTENT) > 0) {
-							// content has changed without select >> possible re-activation
-							possibleChange(element, DebugContextEvent.ACTIVATED);
-						} else if ((delta.getFlags() & IModelDelta.STATE) > 0) {
-							// state has changed without select >> possible state change of active context
-							possibleChange(element, DebugContextEvent.STATE);
-						}
-					}
-				}
-				return true;
-			}	
-		}
-		
-		public ContextProvider(TreeModelViewer viewer) {
-			super(LaunchView.this);
-			fViewer = viewer;
-			fViewer.addModelChangedListener(this);
-		}
-		
-		protected void dispose() { 
-			fContext = null;
-			fViewer.removeModelChangedListener(this);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.ui.contexts.IDebugContextProvider#getActiveContext()
-		 */
-		public synchronized ISelection getActiveContext() {
-			return fContext;
-		}	
-		
-		protected void activate(ISelection selection) {
-			synchronized (this) {
-				fContext = selection;
-			}
-			fire(new DebugContextEvent(this, selection, DebugContextEvent.ACTIVATED));
-		}
-		
-		protected void possibleChange(Object element, int type) {
-			DebugContextEvent event = null;
-			synchronized (this) {
-				if (fContext instanceof IStructuredSelection) {
-					IStructuredSelection ss = (IStructuredSelection) fContext;
-					if (!(ss.size() == 1 && ss.getFirstElement().equals(element))) {
-						return;
-					}
-				} else {
-					return;
-				}
-				event = new DebugContextEvent(this, fContext, type);
-			}
-			if (getControl().getDisplay().getThread() == Thread.currentThread()) {
-				fire(event);
-			} else {
-				final DebugContextEvent finalEvent = event;
-				Job job = new UIJob("context change") { //$NON-NLS-1$
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						// verify selection is still the same context since job was scheduled
-						synchronized (ContextProvider.this) {
-							if (fContext instanceof IStructuredSelection) {
-								IStructuredSelection ss = (IStructuredSelection) fContext;
-								Object changed = ((IStructuredSelection)finalEvent.getContext()).getFirstElement();
-								if (!(ss.size() == 1 && ss.getFirstElement().equals(changed))) {
-									return Status.OK_STATUS;
-								}
-							}
-						}
-						fire(finalEvent);
-						return Status.OK_STATUS;
-					}
-				};
-				job.setSystem(true);
-				job.schedule();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener#modelChanged(org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta)
-		 */
-		public void modelChanged(IModelDelta delta, IModelProxy proxy) {
-			delta.accept(fVisitor);
-		}
-		
-	}
-	
-	/**
-	 * Context provider
-	 */
-	private ContextProvider fProvider;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.DEBUG_VIEW;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createActions()
-	 */
-	protected void createActions() {
-		setAction("Properties", new PropertyDialogAction(getSite(), getSite().getSelectionProvider())); //$NON-NLS-1$
-		fEditConfigAction = new EditLaunchConfigurationAction();
-		fAddToFavoritesAction = new AddToFavoritesAction();
-		fEditSourceAction = new EditSourceLookupPathAction(this);
-		fLookupAction = new LookupSourceAction(this);
-		setAction(FIND_ACTION, new VirtualFindAction((InternalTreeModelViewer) getViewer())); 
-        
-        addCapabilityAction(new TerminateCommandAction(), TERMINATE);
-        addCapabilityAction(new DisconnectCommandAction(), DISCONNECT);
-        addCapabilityAction(new SuspendCommandAction(), SUSPEND);
-        addCapabilityAction(new ResumeCommandAction(), RESUME);
-        addCapabilityAction(new StepReturnCommandAction(), STEP_RETURN);
-        addCapabilityAction(new StepOverCommandAction(), STEP_OVER);
-        addCapabilityAction(new StepIntoCommandAction(), STEP_INTO);
-        addCapabilityAction(new DropToFrameCommandAction(), DROP_TO_FRAME);
-        addCapabilityAction(new TerminateAndRemoveAction(), TERMINATE_AND_REMOVE);
-        addCapabilityAction(new TerminateAndRelaunchAction(), TERMINATE_AND_RELAUNCH);
-        addCapabilityAction(new TerminateAllAction(), TERMINATE_ALL);
-        addCapabilityAction(new ToggleStepFiltersAction(), TOGGLE_STEP_FILTERS);
-	}
-	
-
-	/**
-	 * Initializes the action and associates it with the given id.
-	 * 
-	 * @param capability
-	 * @param actionID
-	 */
-	private void addCapabilityAction(DebugCommandAction capability, String actionID) {
-		capability.init(this);
-		setAction(actionID, capability);
-	}
-	
-	/**
-	 * Disposes the given action.
-	 * 
-	 * @param actionID
-	 */
-	private void disposeCommandAction(String actionID) {
-		DebugCommandAction action = (DebugCommandAction) getAction(actionID);
-		action.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Viewer createViewer(Composite parent) {
-		fPresentation = new DelegatingModelPresentation();
-		TreeModelViewer viewer = new TreeModelViewer(parent,
-				SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL,
-				new DebugModelPresentationContext(IDebugUIConstants.ID_DEBUG_VIEW, fPresentation));
-        
-        viewer.addSelectionChangedListener(this);
-        viewer.getControl().addKeyListener(new KeyAdapter() {
-        	public void keyPressed(KeyEvent event) {
-        		if (event.character == SWT.DEL && event.stateMask == 0) {
-        			handleDeleteKeyPressed();
-        		}
-        	}
-        });
-        // add my viewer as a selection provider, so selective re-launch works
-		getSite().setSelectionProvider(viewer);
-		viewer.setInput(DebugPlugin.getDefault().getLaunchManager());
-		//setEventHandler(new LaunchViewEventHandler(this));
-		fProvider = new ContextProvider(viewer);
-		DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).addDebugContextProvider(fProvider);
-		return viewer;
-	}
-		
-	private void handleDeleteKeyPressed() {
-		IStructuredSelection selection= (IStructuredSelection) getViewer().getSelection();
-		Iterator iter= selection.iterator();
-		Object item;
-		boolean itemsToTerminate= false;
-		ITerminate terminable;
-		while (iter.hasNext()) {
-			item= iter.next();
-			if (item instanceof ITerminate) {
-				terminable= (ITerminate) item;
-				if (terminable.canTerminate() && !terminable.isTerminated()) {
-					itemsToTerminate= true;
-					break;
-				}
-			}
-		}
-		if (itemsToTerminate) {
-			// Prompt the user to proceed with termination
-			if (!MessageDialog.openQuestion(getSite().getShell(), DebugUIViewsMessages.LaunchView_Terminate_and_Remove_1, DebugUIViewsMessages.LaunchView_Terminate_and_remove_selected__2)) {  
-				return;
-			}
-		}
-		MultiStatus status= new MultiStatus(DebugUIPlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, DebugUIViewsMessages.LaunchView_Exceptions_occurred_attempting_to_terminate_and_remove_3, null); 
-		iter= selection.iterator(); 
-		while (iter.hasNext()) {
-			try {
-				terminateAndRemove(iter.next());
-			} catch (DebugException exception) {
-				status.merge(exception.getStatus());				
-			}
-		}
-		if (!status.isOK()) {
-			IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-			if (window != null) {
-				DebugUIPlugin.errorDialog(window.getShell(), DebugUIViewsMessages.LaunchView_Terminate_and_Remove_4, DebugUIViewsMessages.LaunchView_Terminate_and_remove_failed_5, status);  
-			} else {
-				DebugUIPlugin.log(status);
-			}
-		}
-	}
-	
-	/**
-	 * Terminates and removes the given element from the launch manager
-	 */
-	public static void terminateAndRemove(Object element) throws DebugException {
-		ILaunch launch= null;
-		ITerminate terminable = null;
-		if (element instanceof ILaunch) {
-			launch= (ILaunch) element;
-		} else if (element instanceof IDebugElement) {
-			launch= ((IDebugElement) element).getLaunch();
-		} else if (element instanceof IProcess) {
-			launch= ((IProcess) element).getLaunch();
-		}		
-		terminable = launch;
-		if (terminable == null) {
-			if (element instanceof ITerminate) {
-				terminable = (ITerminate) element;
-			}
-		}
-		if (terminable == null) {
-			return;
-		}
-		if (!(terminable.canTerminate() || terminable.isTerminated())) {
-			// Don't try to terminate or remove attached launches
-			return;
-		}
-		try {
-			if (!terminable.isTerminated()) {
-				terminable.terminate();
-			}
-		} finally {
-			if (launch != null) {
-				ILaunchManager lManager= DebugPlugin.getDefault().getLaunchManager();
-				lManager.removeLaunch(launch);		
-			}
-		}
-	}
-
-	private void commonInit(IViewSite site) {
-		site.getPage().addPartListener((IPartListener2) this);
-		site.getWorkbenchWindow().addPageListener(this);
-		site.getWorkbenchWindow().addPerspectiveListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
-		super.init(site);
-		commonInit(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 {
-		super.init(site, memento);
-		commonInit(site);
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#configureToolBar(org.eclipse.jface.action.IToolBarManager)
-	 */
-	protected void configureToolBar(IToolBarManager tbm) {
-		tbm.add(new Separator(IDebugUIConstants.THREAD_GROUP));
-		tbm.add(new Separator(IDebugUIConstants.STEP_GROUP));
-		tbm.add(new GroupMarker(IDebugUIConstants.STEP_INTO_GROUP));
-		tbm.add(new GroupMarker(IDebugUIConstants.STEP_OVER_GROUP));
-		tbm.add(new GroupMarker(IDebugUIConstants.STEP_RETURN_GROUP));
-		tbm.add(new GroupMarker(IDebugUIConstants.EMPTY_STEP_GROUP));
-		tbm.add(new Separator(IDebugUIConstants.RENDER_GROUP));
-        
-        tbm.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(RESUME));
-        tbm.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(SUSPEND));
-        tbm.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(TERMINATE));
-        tbm.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(DISCONNECT));
-        
-        tbm.appendToGroup(IDebugUIConstants.STEP_INTO_GROUP, getAction(STEP_INTO));
-        tbm.appendToGroup(IDebugUIConstants.STEP_OVER_GROUP, getAction(STEP_OVER));
-        tbm.appendToGroup(IDebugUIConstants.STEP_RETURN_GROUP, getAction(STEP_RETURN));
-        
-        tbm.appendToGroup(IDebugUIConstants.EMPTY_STEP_GROUP, getAction(DROP_TO_FRAME));
-        
-        tbm.appendToGroup(IDebugUIConstants.RENDER_GROUP, getAction(TOGGLE_STEP_FILTERS));
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).removeDebugContextProvider(fProvider);
-        disposeActions();
-		fProvider.dispose();
-	    Viewer viewer = getViewer();
-		if (viewer != null) {
-			viewer.removeSelectionChangedListener(this);
-		}
-		IWorkbenchPage page = getSite().getPage();
-		page.removePartListener((IPartListener2) this);
-		IWorkbenchWindow window = getSite().getWorkbenchWindow();
-		window.removePerspectiveListener(this);
-		window.removePageListener(this);
-		
-		super.dispose();
-	}
-		
-	private void disposeActions() {
-        PropertyDialogAction properties = (PropertyDialogAction) getAction("Properties"); //$NON-NLS-1$
-        properties.dispose();
-        
-        disposeCommandAction(TERMINATE);
-        disposeCommandAction(DISCONNECT);
-        disposeCommandAction(SUSPEND);
-        disposeCommandAction(RESUME);
-        disposeCommandAction(STEP_RETURN);
-        disposeCommandAction(STEP_OVER);
-        disposeCommandAction(STEP_INTO);
-        disposeCommandAction(DROP_TO_FRAME);
-        disposeCommandAction(TERMINATE_AND_REMOVE);
-        disposeCommandAction(TERMINATE_AND_RELAUNCH);
-        disposeCommandAction(TERMINATE_ALL);
-    }
-
-    /**
-	 * The selection has changed in the viewer. Show the
-	 * associated source code if it is a stack frame.
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		fProvider.activate(event.getSelection());
-		updateObjects();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		ISelection selection= event.getSelection();
-		if (!(selection instanceof IStructuredSelection)) {
-			return;
-		}
-		IStructuredSelection ss= (IStructuredSelection)selection;
-		Object o= ss.getFirstElement();
-		if (o == null || o instanceof IStackFrame) {
-			return;
-		} 
-		StructuredViewer viewer = (StructuredViewer) getViewer();
-		viewer.refresh(o);
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-		setActive(page.findView(getSite().getId()) != null);
-		updateObjects();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
-	 */
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
-		setActive(page.findView(getSite().getId()) != null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference, java.lang.String)
-	 */
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPageListener#pageActivated(org.eclipse.ui.IWorkbenchPage)
-	 */
-	public void pageActivated(IWorkbenchPage page) {
-		if (getSite().getPage().equals(page)) {
-			setActive(true);
-			updateObjects();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPageListener#pageClosed(org.eclipse.ui.IWorkbenchPage)
-	 */
-	public void pageClosed(IWorkbenchPage page) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPageListener#pageOpened(org.eclipse.ui.IWorkbenchPage)
-	 */
-	public void pageOpened(IWorkbenchPage page) {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugView#getPresentation(java.lang.String)
-	 */
-	public IDebugModelPresentation getPresentation(String id) {
-		return ((DelegatingModelPresentation)fPresentation).getPresentation(id);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void fillContextMenu(IMenuManager menu) {
-		
-		menu.add(new Separator(IDebugUIConstants.EMPTY_EDIT_GROUP));
-		menu.add(new Separator(IDebugUIConstants.EDIT_GROUP));
-		menu.add(getAction(FIND_ACTION));
-		menu.add(new Separator(IDebugUIConstants.EMPTY_STEP_GROUP));
-		menu.add(new Separator(IDebugUIConstants.STEP_GROUP));
-		menu.add(new GroupMarker(IDebugUIConstants.STEP_INTO_GROUP));
-		menu.add(new GroupMarker(IDebugUIConstants.STEP_OVER_GROUP));
-		menu.add(new GroupMarker(IDebugUIConstants.STEP_RETURN_GROUP));
-		menu.add(new Separator(IDebugUIConstants.RENDER_GROUP));
-		menu.add(new Separator(IDebugUIConstants.EMPTY_THREAD_GROUP));
-		menu.add(new Separator(IDebugUIConstants.THREAD_GROUP));
-		menu.add(new Separator(IDebugUIConstants.EMPTY_LAUNCH_GROUP));
-		menu.add(new Separator(IDebugUIConstants.LAUNCH_GROUP));
-		IStructuredSelection selection = (IStructuredSelection) getSite().getSelectionProvider().getSelection();
-		updateAndAdd(menu, fEditConfigAction, selection);
-		updateAndAdd(menu, fAddToFavoritesAction, selection);
-		updateAndAdd(menu, fEditSourceAction, selection);
-		updateAndAdd(menu, fLookupAction, selection);
-		menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
-		menu.add(new Separator(IDebugUIConstants.RENDER_GROUP));
-		menu.add(new Separator(IDebugUIConstants.PROPERTY_GROUP));
-		PropertyDialogAction action = (PropertyDialogAction)getAction("Properties"); //$NON-NLS-1$
-		/**
-		 * TODO hack to get around bug 148424, remove if UI ever fixes the PropertyDialogAction to respect enablesWhen conditions
-		 */
-		TreeSelection sel = (TreeSelection) fProvider.getActiveContext();
-		boolean enabled = true;
-		if(sel != null && sel.size() > 0) {
-			enabled = !(sel.getFirstElement() instanceof ILaunch);
-		}
-		action.setEnabled(action.isApplicableForSelection() && enabled);
-		menu.add(action);
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        
-        menu.appendToGroup(IDebugUIConstants.LAUNCH_GROUP, getAction(TERMINATE_AND_REMOVE));
-        menu.appendToGroup(IDebugUIConstants.LAUNCH_GROUP, getAction(TERMINATE_ALL));
-		
-        menu.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(RESUME));
-        menu.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(SUSPEND));
-        menu.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(TERMINATE));
-        menu.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(TERMINATE_AND_RELAUNCH));
-        menu.appendToGroup(IDebugUIConstants.THREAD_GROUP, getAction(DISCONNECT));
-        
-        menu.appendToGroup(IDebugUIConstants.STEP_INTO_GROUP, getAction(STEP_INTO));
-        menu.appendToGroup(IDebugUIConstants.STEP_OVER_GROUP, getAction(STEP_OVER));
-        menu.appendToGroup(IDebugUIConstants.STEP_RETURN_GROUP, getAction(STEP_RETURN));
-        
-        menu.appendToGroup(IDebugUIConstants.EMPTY_STEP_GROUP, getAction(DROP_TO_FRAME));
-        
-        menu.appendToGroup(IDebugUIConstants.RENDER_GROUP, getAction(TOGGLE_STEP_FILTERS));
-    }
-	
-	/**
-	 * Updates the enabled state of the given action based on the selection
-	 * and adds to the menu if enabled.
-	 * 
-	 * @param menu menu to add the action to
-	 * @param action action to add if enabled
-	 * @param selection selection to update enabled state for
-	 */
-	private void updateAndAdd(IMenuManager menu, SelectionListenerAction action, IStructuredSelection selection) {
-		action.selectionChanged(selection);
-		if (action.isEnabled()) {
-			menu.add(action);
-		}		
-	}
-		
-	/**
-	 * Sets whether this view is in the active page of a
-	 * perspective. Since a page can have more than one
-	 * perspective, this view only show's source when in
-	 * the active perspective/page.
-	 * 
-	 * @param active whether this view is in the active page of a
-	 * perspective
-	 */
-	protected void setActive(boolean active) {
-		fIsActive = active;
-	} 
-
-	/**
-	 * Returns whether this view is in the active page of
-	 * the active perspective and has been fully created.
-	 * 
-	 * @return whether this view is in the active page of
-	 * the active perspective and has been fully created.
-	 */
-	protected boolean isActive() {
-		return fIsActive && getViewer() != null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IShowInTarget#show(org.eclipse.ui.part.ShowInContext)
-	 */
-	public boolean show(ShowInContext context) {
-		ISelection selection = context.getSelection();
-		if (selection != null) {
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection)selection;
-				if (ss.size() == 1) {
-					Object obj = ss.getFirstElement();
-					if (obj instanceof IDebugTarget || obj instanceof IProcess) {
-						Viewer viewer = getViewer();
-						if (viewer instanceof InternalTreeModelViewer) {
-							InternalTreeModelViewer tv = (InternalTreeModelViewer) viewer;
-							tv.setSelection(selection, true, true);
-						} else {
-							viewer.setSelection(selection, true);
-						}
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IShowInSource#getShowInContext()
-	 */
-	public ShowInContext getShowInContext() {
-		if (isActive()) { 
-			IStructuredSelection selection = (IStructuredSelection)getViewer().getSelection();
-			if (selection.size() == 1) { 
-				Object object = selection.getFirstElement();
-				if (object instanceof IAdaptable) {
-					IAdaptable adaptable = (IAdaptable) object;
-					IShowInSource show = (IShowInSource) adaptable.getAdapter(IShowInSource.class);
-					if (show != null) {
-						return show.getShowInContext();
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IShowInTargetList#getShowInTargetIds()
-	 */
-	public String[] getShowInTargetIds() {
-		if (isActive()) { 
-			IStructuredSelection selection = (IStructuredSelection)getViewer().getSelection();
-			if (selection.size() == 1) { 
-				Object object = selection.getFirstElement();
-				if (object instanceof IAdaptable) {
-					IAdaptable adaptable = (IAdaptable) object;
-					IShowInTargetList show = (IShowInTargetList) adaptable.getAdapter(IShowInTargetList.class);
-					if (show != null) {
-						return show.getShowInTargetIds();
-					}
-				}
-			}
-		}
-		return new String[0];
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partClosed(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partVisible(IWorkbenchPartReference partRef) {
-		IWorkbenchPart part = partRef.getPart(false);
-		if (part == this) {
-			setActive(true);
-// TODO: Workaround for Bug #63332. Reexamine after M9.
-//			updateContextListener();
-			// When the launch view becomes visible, turn on the
-			// debug action set. Note that the workbench will handle the
-			// case where the user really doesn't want the action set
-			// enabled - showActionSet(String) will do nothing for an
-			// action set that's been manually disabled.
-			getSite().getPage().showActionSet(IDebugUIConstants.DEBUG_ACTION_SET);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partOpened(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partActivated(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partBroughtToTop(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partDeactivated(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partHidden(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partInputChanged(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#becomesVisible()
-	 */
-	protected void becomesVisible() {
-		super.becomesVisible();
-		getViewer().refresh();
-	}
-	
-	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/SourceNotFoundEditor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/SourceNotFoundEditor.java
deleted file mode 100644
index b25295f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/SourceNotFoundEditor.java
+++ /dev/null
@@ -1,109 +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.debug.internal.ui.views.launch;
-
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.swt.SWT;
-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.IReusableEditor;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * Editor used when no source if found for a stack frame.
- * 
- * @since 2.1
- */
-public class SourceNotFoundEditor extends EditorPart implements IReusableEditor {
-	
-	/**
-	 * Text widget used for this editor
-	 */
-	private Text fText;
-
-	/**
-	 * @see org.eclipse.ui.IEditorPart#doSave(IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorPart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorPart#gotoMarker(IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorPart#init(IEditorSite, IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-			setSite(site);
-			setInput(input);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		fText = new Text(parent,SWT.MULTI|SWT.READ_ONLY|SWT.WRAP);
-		fText.setForeground(JFaceColors.getErrorText(fText.getDisplay()));
-		fText.setBackground(fText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		if (getEditorInput() != null) {
-			setInput(getEditorInput());
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		if (fText != null) {
-			fText.setFocus();
-		}
-	}
-
-	/**
-	 * @see IReusableEditor#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	public void setInput(IEditorInput input) {
-		super.setInput(input);
-		setPartName(input.getName());
-		if (fText != null) {
-			fText.setText(input.getToolTipText());
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/SourceNotFoundEditorInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/SourceNotFoundEditorInput.java
deleted file mode 100644
index daa0f90..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/SourceNotFoundEditorInput.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.debug.internal.ui.views.launch;
-
-
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * Editor input for a stack frame for which source could not be located.
- * 
- * @since 2.1
- */
-public class SourceNotFoundEditorInput extends PlatformObject implements IEditorInput {
-	
-	/**
-	 * Associated stack frame
-	 */
-	private IStackFrame fFrame;
-	
-	/**
-	 * Stack frame text (cached on creation)
-	 */
-	private String fFrameText;
-
-	/**
-	 * Constructs an editor input for the given stack frame,
-	 * to indicate source could not be found.
-	 * 
-	 * @param frame stack frame
-	 */
-	public SourceNotFoundEditorInput(IStackFrame frame) {
-		fFrame = frame;
-		IDebugModelPresentation pres = DebugUITools.newDebugModelPresentation(frame.getModelIdentifier());
-		fFrameText = pres.getText(frame);
-		pres.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getDefaultImageDescriptor(fFrame);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		try {
-			return fFrame.getName();
-		} catch (DebugException e) {
-			return DebugUIViewsMessages.SourceNotFoundEditorInput_Source_Not_Found_1; 
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getPersistable()
-	 */
-	public IPersistableElement getPersistable() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return MessageFormat.format(DebugUIViewsMessages.SourceNotFoundEditorInput_Source_not_found_for__0__2,new String[] {fFrameText}); 
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/StandardDecoration.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/StandardDecoration.java
deleted file mode 100644
index ea33cf2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/StandardDecoration.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.debug.internal.ui.views.launch;
-
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.ui.IDebugEditorPresentation;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A reminder to remove any annotations created by an editor presentation
- */
-public class StandardDecoration extends Decoration {
-	
-	private IThread fThread;
-	private IEditorPart fEditor;
-	private IDebugEditorPresentation fPresentation;
-	
-	public StandardDecoration(IDebugEditorPresentation presentation, IEditorPart editorPart, IThread thread) {
-		fThread = thread;
-		fEditor = editorPart;
-		fPresentation = presentation;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.launch.Decoration#remove()
-	 */
-	public void remove() {
-		fPresentation.removeAnnotations(fEditor, fThread);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.launch.Decoration#getThread()
-	 */
-	public IThread getThread() {
-		return fThread;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AbstractMemoryViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AbstractMemoryViewPane.java
deleted file mode 100644
index 6b28317..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AbstractMemoryViewPane.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory;
-
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.jface.action.IAction;
-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.custom.StackLayout;
-import org.eclipse.swt.events.SelectionListener;
-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.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-public abstract class AbstractMemoryViewPane implements IMemoryBlockListener, ISelectionListener, SelectionListener, IMemoryView, ISelectionChangedListener, IMemoryViewPane, IDebugContextListener{
-	
-	public static final String BEGINNING_POPUP = "popUpBegin"; //$NON-NLS-1$
-	protected static final StructuredSelection EMPTY = new StructuredSelection();
-	
-	protected Composite fViewPaneCanvas;
-	protected StackLayout fStackLayout;
-	protected ViewTabEnablementManager fViewTabEnablementManager;
-	protected TabFolder fEmptyTabFolder;
-	protected Hashtable fTabFolderForDebugView = new Hashtable(); 
-	protected boolean fVisible;
-	protected Hashtable fRenderingInfoTable;
-	protected IMemoryBlockRetrieval fKey;  // store the key for current tab folder
-	protected ViewPaneSelectionProvider fSelectionProvider;
-	protected IViewPart fParent;
-	protected String fPaneId;
-	private Composite fCanvas;
-	protected String fLabel;
-	
-	public AbstractMemoryViewPane(IViewPart parent)
-	{
-		super();
-		fParent = parent;
-		fSelectionProvider = new ViewPaneSelectionProvider();
-	}
-	
-	/**
-	 * Create the content of the view pane
-	 * @param parent
-	 * @return the control of the view pane
-	 */
-	public Control createViewPane(Composite parent, String paneId, String label)
-	{	
-		fPaneId = paneId;
-		fLabel = label;
-		fCanvas = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.makeColumnsEqualWidth = false;
-		layout.numColumns = 1;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		GridData data = new GridData();
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		data.verticalAlignment = SWT.BEGINNING;
-		data.horizontalAlignment = SWT.BEGINNING;
-		fCanvas.setLayout(layout);
-		fCanvas.setLayoutData(data);
-
-		// memory view area
-		Composite memoryViewAreaParent = fCanvas;
-		Composite subCanvas = new Composite(memoryViewAreaParent, SWT.NONE);	
-		fViewPaneCanvas = subCanvas;
-		fStackLayout = new StackLayout();
-		GridData memoryAreaData = new GridData();
-		memoryAreaData.grabExcessHorizontalSpace = true;
-		memoryAreaData.grabExcessVerticalSpace = true;
-		memoryAreaData.verticalAlignment = SWT.FILL;
-		memoryAreaData.horizontalAlignment = SWT.FILL;
-		fViewPaneCanvas.setLayout(fStackLayout);
-		fViewPaneCanvas.setLayoutData(memoryAreaData);
-		
-		fViewTabEnablementManager = new ViewTabEnablementManager();
-		
-		fEmptyTabFolder = new TabFolder(fViewPaneCanvas, SWT.NULL);
-		setTabFolder(fEmptyTabFolder);
-		
-		addListeners();
-		
-		Object context = DebugUITools.getDebugContext();
-		if (context != null)
-		{
-			IMemoryBlockRetrieval retrieval = MemoryViewUtil.getMemoryBlockRetrieval(context);
-			if (retrieval != null)
-				createFolder(retrieval);
-		}
-		
-		fVisible = true;
-		
-		return fCanvas;
-	}
-	
-	protected void addListeners()
-	{
-		MemoryViewUtil.getMemoryBlockManager().addListener(this);
-		fParent.getViewSite().getPage().addSelectionListener(this);
-		DebugUITools.getDebugContextManager().getContextService(fParent.getSite().getWorkbenchWindow()).addDebugContextListener(this);
-	}
-	
-	protected void removeListeners()
-	{
-		MemoryViewUtil.getMemoryBlockManager().removeListener(this);
-		fParent.getViewSite().getPage().removeSelectionListener(this);
-		DebugUITools.getDebugContextManager().getContextService(fParent.getSite().getWorkbenchWindow()).removeDebugContextListener(this);
-		
-		if (fStackLayout.topControl != null)
-		{
-			TabFolder old = (TabFolder)fStackLayout.topControl;
-			
-			if (!old.isDisposed())
-			{	
-				old.removeSelectionListener(this);
-				old.removeSelectionListener(fViewTabEnablementManager);
-			}
-		}
-	}
-	
-	protected void setTabFolder(TabFolder folder)
-	{
-		if (fStackLayout.topControl != null)
-		{
-			TabFolder old = (TabFolder)fStackLayout.topControl;
-			
-			if (!old.isDisposed())
-			{	
-				old.removeSelectionListener(this);
-				old.removeSelectionListener(fViewTabEnablementManager);
-			}
-		}
-		
-		fStackLayout.topControl = folder;
-		
-		if (folder.getItemCount() > 0)
-		{
-			TabItem[] selectedItem = folder.getSelection();
-			
-			if (selectedItem.length > 0)
-			{
-				Object selected = getCurrentSelection();
-				if (selected != null)
-				{
-					fSelectionProvider.setSelection(new StructuredSelection(selected));
-				}
-				else
-				{
-					fSelectionProvider.setSelection(AbstractMemoryViewPane.EMPTY);
-				}
-			}
-		}
-		else
-		{
-			fSelectionProvider.setSelection(AbstractMemoryViewPane.EMPTY);
-		}
-		
-		folder.addSelectionListener(this);
-		folder.addSelectionListener(fViewTabEnablementManager);
-	}	
-	
-	
-	private void createFolder(IMemoryBlockRetrieval memRetrieval)
-	{	
-		//if we've got a tabfolder to go with the IMemoryBlockRetrieval, display it
-		if (fTabFolderForDebugView.containsKey(memRetrieval)) {
-			if (fStackLayout.topControl != (TabFolder)fTabFolderForDebugView.get(memRetrieval)) {
-				setTabFolder((TabFolder)fTabFolderForDebugView.get(memRetrieval));
-				fViewPaneCanvas.layout();
-			}
-		} else {	//otherwise, add a new one
-			fTabFolderForDebugView.put(memRetrieval, new TabFolder(fViewPaneCanvas, SWT.NULL));
-			setTabFolder((TabFolder)fTabFolderForDebugView.get(memRetrieval));
-			fViewPaneCanvas.layout();
-		}
-	}
-
-	public IMemoryViewTab getTopMemoryTab() {
-		
-		if (fStackLayout.topControl instanceof TabFolder)
-		{
-			TabFolder folder = (TabFolder)fStackLayout.topControl;
-			if (!folder.isDisposed())
-			{
-				int index = folder.getSelectionIndex();
-				if (index >= 0) {
-					TabItem tab = folder.getItem(index);
-					return (IMemoryViewTab)tab.getData();
-				}
-			}
-		}
-		return null;
-	}
-	
-	protected void disposeTab(TabItem tabItem)
-	{
-		if (tabItem == null)
-			return;
-		
-		// dispose the tab item in case the view tab has not 
-		// cleaned up the tab item
-		if (!tabItem.isDisposed())
-		{	
-			tabItem.dispose();
-		}			
-	}
-
-	protected void emptyFolder()
-	{		
-		setTabFolder(fEmptyTabFolder);
-		if (!fViewPaneCanvas.isDisposed()) {
-			fViewPaneCanvas.layout();
-		}
-	}
-	
-	public void addSelectionListener(ISelectionChangedListener listener)
-	{
-		if (fSelectionProvider == null)
-			fSelectionProvider = new ViewPaneSelectionProvider();
-		
-		fSelectionProvider.addSelectionChangedListener(listener);
-	}
-	
-	public void removeSelctionListener(ISelectionChangedListener listener)
-	{
-		if (fSelectionProvider == null)
-			return;
-		
-		fSelectionProvider.removeSelectionChangedListener(listener);
-	}
-	
-	public ISelectionProvider getSelectionProvider()
-	{
-		return fSelectionProvider;
-	}
-	
-	public void dispose()
-	{
-		removeListeners();
-		
-		// dispose empty folders
-		fEmptyTabFolder.dispose();
-		
-		// dispose all other folders
-		try {
-			
-			if (fTabFolderForDebugView != null) {
-				Enumeration enumeration = fTabFolderForDebugView.elements();
-				
-				while (enumeration.hasMoreElements())
-				{
-					TabFolder tabFolder = (TabFolder)enumeration.nextElement();
-					
-					if (tabFolder.isDisposed())
-						continue;
-					
-					// if tab folder is not empty, dipose view tabs
-					TabItem[] tabs = tabFolder.getItems();
-					
-					for (int i=0; i<tabs.length; i++)
-					{
-						disposeTab(tabs[i]);
-					}
-					
-					tabFolder.dispose();
-				}
-				
-				// set to null so that clean up is only done once
-				fTabFolderForDebugView.clear();
-				fTabFolderForDebugView = null;
-			}
-		} catch (Exception e) {		
-			
-			DebugUIPlugin.logErrorMessage("Exception occurred when the Memory View is disposed."); //$NON-NLS-1$
-		}		
-	}
-	
-	public void setVisible(boolean visible)
-	{
-		fVisible = visible;
-		
-		IMemoryViewTab currentTab = getTopMemoryTab();
-		if (currentTab != null)
-			currentTab.setEnabled(visible);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection selection = event.getSelection();
-		selectionChanged(fParent,selection);
-		
-		fSelectionProvider.setSelection(selection);
-	}
-	
-	/**
-	 * @return the unique identifier of the view pane
-	 */
-	public String getPaneId()
-	{
-		return fPaneId;
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#getControl()
-	 */
-	public Control getControl() {
-		return fCanvas;
-	}
-	
-	public boolean isVisible()
-	{
-		return fVisible;
-	}
-	
-	public String getLabel()
-	{
-		return fLabel;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.memory.IMemoryBlockListener#MemoryBlockAdded(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	abstract public void  memoryBlocksAdded(IMemoryBlock[] memoryBlocks);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.memory.IMemoryBlockListener#MemoryBlockRemoved(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	abstract public void memoryBlocksRemoved(final IMemoryBlock[] memoryBlocks);
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	abstract public void selectionChanged(IWorkbenchPart part, ISelection selection);
-	
-	/**
-	 * @return current selection from the view pane
-	 */
-	abstract public Object getCurrentSelection();
-	
-	/**
-	 * retore the view pane based on current selection from the debug view
-	 * and the memory blocks and renderings currently exist 
-	 */
-	abstract public void restoreViewPane();
-	
-	/**
-	 * @return actions to be contributed to the view pane's toolbar
-	 */
-	abstract public IAction[] getActions();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java
deleted file mode 100644
index 9893687..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java
+++ /dev/null
@@ -1,421 +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.debug.internal.ui.views.memory;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-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.Job;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Action for adding memory block.
- * 
- * @since 3.0
- */
-public class AddMemoryBlockAction extends Action implements IDebugContextListener, IDebugEventSetListener{
-	
-	protected IAdaptable fCurrentContext = null;
-	protected IMemoryBlock fLastMemoryBlock;
-	private boolean fAddDefaultRenderings = true;
-	protected IMemoryRenderingSite fSite;
-	
-	public AddMemoryBlockAction(IMemoryRenderingSite site)
-	{
-		initialize(site);
-	}
-	
-	/**
-	 * @param addDefaultRenderings - specify if the action should add
-	 * default renderings for the new memory block when it is run
-	 */
-	AddMemoryBlockAction(IMemoryRenderingSite site, boolean addDefaultRenderings)
-	{
-		initialize(site);
-		fAddDefaultRenderings = addDefaultRenderings;
-	}
-	
-	/**
-	 * 
-	 */
-	private void initialize(IMemoryRenderingSite site) {
-		setText(DebugUIMessages.AddMemoryBlockAction_title);
-		doInitialization(site);
-	}
-
-
-	public AddMemoryBlockAction(String text, int style, IMemoryRenderingSite site)
-	{
-		super(text, style);
-		doInitialization(site);	
-	}
-	
-	/**
-	 * 
-	 */
-	private void doInitialization(IMemoryRenderingSite site) {
-		fSite = site;
-		setToolTipText(DebugUIMessages.AddMemoryBlockAction_tooltip);
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_MONITOR_EXPRESSION));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_MONITOR_EXPRESSION));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_MONITOR_EXPRESSION));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".addMemoryMonitorAction_context"); //$NON-NLS-1$		
-		
-		// listen for context changed
-		DebugUITools.getDebugContextManager().getContextService(site.getSite().getWorkbenchWindow()).addDebugContextListener(this);
-		
-		// get current context
-		fCurrentContext = DebugUITools.getDebugContext();
-		
-		// set up enablement based on current selection
-		updateAction(fCurrentContext);
-		
-		DebugPlugin.getDefault().addDebugEventListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		boolean exit = false;
-		String prefillExp = null;
-		String prefillLength = null;
-		while (!exit)
-		{
-			exit = true;
-			
-			Object elem = DebugUITools.getDebugContext();
-			
-			IMemoryBlockRetrieval retrieval = MemoryViewUtil.getMemoryBlockRetrieval(elem);
-			
-			if (retrieval == null)
-				return;
-			
-			Shell shell= DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
-			// create dialog to ask for expression/address to block
-			MonitorMemoryBlockDialog dialog = new MonitorMemoryBlockDialog(shell, retrieval, prefillExp, prefillLength);
-			dialog.open();
-			int returnCode = dialog.getReturnCode();
-			if (returnCode == Window.CANCEL)
-			{
-				return;
-			}
-			// get expression entered in dialog
-			String input = dialog.getExpression();
-			
-			// remember expression and length
-			prefillExp = input;
-			prefillLength = dialog.getLength();
-			
-			ArrayList expressions = new ArrayList();
-			
-			if (input.length() == 0)
-			{
-				expressions.add(""); //$NON-NLS-1$
-			}
-			else
-			{
-				StringTokenizer tokenizer = new StringTokenizer(input, ","); //$NON-NLS-1$
-				while (tokenizer.hasMoreTokens())
-				{
-					expressions.add(tokenizer.nextToken());
-				}
-			}	
-			final String[] expressionsArray = (String[])expressions.toArray(new String[expressions.size()]);
-			exit = true;
-			
-			final boolean finalExit = exit;
-			final Object finalElement = elem;
-			final IMemoryBlockRetrieval finalRetrieval = retrieval;
-			final MonitorMemoryBlockDialog finalDialog = dialog;
-			Job job = new Job("Add Memory Block") { //$NON-NLS-1$
-				protected IStatus run(IProgressMonitor monitor) {
-					addMemoryBlocks(finalExit, finalElement, finalRetrieval, finalDialog, expressionsArray);
-					return Status.OK_STATUS;
-				}};
-			job.setSystem(true);
-			job.schedule();
-		}
-	}
-
-	/**
-	 * @param exit
-	 * @param elem
-	 * @param standardMemRetrieval
-	 * @param dialog
-	 * @param expressionsArray
-	 * @return
-	 */
-	private boolean addMemoryBlocks(boolean exit, Object elem, IMemoryBlockRetrieval standardMemRetrieval, MonitorMemoryBlockDialog dialog, final String[] expressionsArray) {
-		for (int i=0; i<expressionsArray.length; i++)
-		{
-			String expression = expressionsArray[i].trim();
-			try {
-				if (standardMemRetrieval instanceof IMemoryBlockRetrievalExtension)
-				{
-					// if the debug session supports IMemoryBlockExtensionRetrieval
-					IMemoryBlockRetrievalExtension memRetrieval = (IMemoryBlockRetrievalExtension)standardMemRetrieval;
-					
-					// get extended memory block with the expression entered
-					IMemoryBlockExtension memBlock = memRetrieval.getExtendedMemoryBlock(expression, elem);
-					
-					// add block to memory block manager
-					if (memBlock != null)
-					{
-						fLastMemoryBlock = memBlock;
-						
-						IMemoryBlock[] memArray = new IMemoryBlock[]{memBlock};
-						
-						MemoryViewUtil.getMemoryBlockManager().addMemoryBlocks(memArray);
-						if (fAddDefaultRenderings)
-							addDefaultRenderings(memBlock);
-					}
-					else
-					{
-						// open error if it failed to retrieve a memory block
-						MemoryViewUtil.openError(DebugUIMessages.AddMemoryBlockAction_title, DebugUIMessages.AddMemoryBlockAction_noMemoryBlock, null);
-						exit = false;
-					}
-				}
-				else
-				{
-					// if the debug session does not support IMemoryBlockExtensionRetrieval
-					expression = expression.toUpperCase();
-					String hexPrefix = "0X"; //$NON-NLS-1$
-					if (expression.startsWith(hexPrefix))
-					{
-						expression = expression.substring(hexPrefix.length());
-					}
-					
-					// convert the expression to an address
-					BigInteger address = new BigInteger(expression, 16);
-
-					long longAddress = address.longValue();
-
-					// get the length of memory to block
-					String strLength = dialog.getLength();
-					
-					long length = Long.parseLong(strLength);
-					
-					// must monitor at least one line
-					if (length <= 0)
-					{
-						String message = DebugUIMessages.AddMemoryBlockAction_failed + "\n" + DebugUIMessages.AddMemoryBlockAction_input_invalid; //$NON-NLS-1$
-						MemoryViewUtil.openError(DebugUIMessages.AddMemoryBlockAction_title, message, null); 
-						exit = false;
-						continue;
-					}
-					
-					// get standard memory block
-					IMemoryBlock memBlock = standardMemRetrieval.getMemoryBlock(longAddress, length);
-					
-					// make sure the memory block returned is not an instance of IMemoryBlockExtension
-					if (memBlock instanceof IMemoryBlockExtension)
-					{
-						Status status = new Status(IStatus.WARNING, DebugUIPlugin.getUniqueIdentifier(),	0, 
-							"IMemoryBlockRetrieval returns IMemoryBlockExtension.  This may result in unexpected behavior.", null); //$NON-NLS-1$
-						DebugUIPlugin.log(status);
-					}
-					
-					if (memBlock != null)
-					{
-						// add memory block to memory block manager
-						fLastMemoryBlock = memBlock;	
-						IMemoryBlock[] memArray = new IMemoryBlock[]{memBlock};
-						
-						MemoryViewUtil.getMemoryBlockManager().addMemoryBlocks(memArray);
-						if (fAddDefaultRenderings)
-							addDefaultRenderings(memBlock);
-					}
-					else
-					{
-						// otherwise open up an error doalog
-						MemoryViewUtil.openError(DebugUIMessages.AddMemoryBlockAction_title, DebugUIMessages.AddMemoryBlockAction_noMemoryBlock, null);
-						exit = false;
-					}
-				}
-			} catch (DebugException e1) {
-				MemoryViewUtil.openError(DebugUIMessages.AddMemoryBlockAction_title, DebugUIMessages.AddMemoryBlockAction_failed, e1);
-				exit = false;
-			}
-			catch(NumberFormatException e2)
-			{
-				String message = DebugUIMessages.AddMemoryBlockAction_failed + "\n" + DebugUIMessages.AddMemoryBlockAction_input_invalid; //$NON-NLS-1$
-				MemoryViewUtil.openError(DebugUIMessages.AddMemoryBlockAction_title, message, null); 
-				exit = false;
-			}
-		}
-		return exit;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i=0; i < events.length; i++)
-				handleDebugEvent(events[i]);
-	} 
-	
-	private void handleDebugEvent(DebugEvent event)
-	{
-		// update action enablement based on debug event
-		Object src = event.getSource();
-		IDebugTarget srcDT = null;
-		IDebugTarget selectionDT = null;
-		
-		if (event.getKind() == DebugEvent.TERMINATE)
-		{
-			if (src instanceof ITerminate && src instanceof IDebugElement)
-			{
-				srcDT = ((IDebugElement)src).getDebugTarget();
-			}
-			
-			if (fCurrentContext instanceof IDebugElement)
-			{
-				selectionDT = ((IDebugElement)fCurrentContext).getDebugTarget();
-			}
-
-			// disable action if the debug target is terminated.
-			if (srcDT == selectionDT)
-			{
-				setEnabled(false);
-			}
-		}
-	}
-	
-	/**
-	 * Return the last memory block added to memory block manager via this action.
-	 * @return Returns the fLastMemoryBlock.
-	 */
-	public IMemoryBlock getLastMemoryBlock() {
-		return fLastMemoryBlock;
-	}
-	
-	protected void dispose() {
-		
-		// remove listeners
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-		DebugUITools.getDebugContextManager().getContextService(fSite.getSite().getWorkbenchWindow()).removeDebugContextListener(this);
-	}
-	
-	private void addDefaultRenderings(IMemoryBlock memoryBlock)
-	{
-		IMemoryRenderingType primaryType = DebugUITools.getMemoryRenderingManager().getPrimaryRenderingType(memoryBlock);
-		IMemoryRenderingType renderingTypes[] = DebugUITools.getMemoryRenderingManager().getDefaultRenderingTypes(memoryBlock);
-		
-		// create primary rendering
-		try {
-			if (primaryType != null)
-			{
-				createRenderingInContainer(memoryBlock, primaryType, IDebugUIConstants.ID_RENDERING_VIEW_PANE_1);
-			}
-			else if (renderingTypes.length > 0)
-			{
-				primaryType = renderingTypes[0];
-				createRenderingInContainer(memoryBlock, renderingTypes[0], IDebugUIConstants.ID_RENDERING_VIEW_PANE_1);
-			}
-		} catch (CoreException e1) {
-			DebugUIPlugin.log(e1);	
-		}
-		
-		for (int i = 0; i<renderingTypes.length; i++)
-		{
-			try {
-				boolean create = true;
-				if (primaryType != null)
-				{
-					if (primaryType.getId().equals(renderingTypes[i].getId()))
-						create = false;
-				}
-				if (create)
-					createRenderingInContainer(memoryBlock, renderingTypes[i], IDebugUIConstants.ID_RENDERING_VIEW_PANE_2);
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-			}
-		}
-	}
-
-	/**
-	 * @param memoryBlock
-	 * @param primaryType
-	 * @throws CoreException
-	 */
-	private void createRenderingInContainer(IMemoryBlock memoryBlock, IMemoryRenderingType primaryType, String paneId) throws CoreException {
-		IMemoryRendering rendering = primaryType.createRendering();
-		IMemoryRenderingContainer container = fSite.getContainer(paneId);
-		rendering.init(container, memoryBlock);
-		container.addMemoryRendering(rendering);
-	}
-	
-	protected MemoryView getMemoryView()
-	{
-		if (fSite instanceof MemoryView)
-			return (MemoryView)fSite;
-		return null;
-	}
-	
-	protected void updateAction(final Object debugContext)
-	{
-		Job job = new Job("Update Add Memory Block Action") { //$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				setEnabled(MemoryViewUtil.isValidContext(debugContext));
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextListener#contextEvent(org.eclipse.debug.internal.ui.contexts.provisional.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			IAdaptable context = DebugUITools.getDebugContext();
-			updateAction(context);
-			fCurrentContext = context;			
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingAction.java
deleted file mode 100644
index 2cfb6ae..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingAction.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Toolbar "Add Memory Rendering Action" from Memory Rendering Pane
- */
-public class AddMemoryRenderingAction extends AddMemoryBlockAction {
-	
-	private IMemoryRenderingContainer fContainer;
-	
-	public AddMemoryRenderingAction(IMemoryRenderingContainer container)
-	{
-		super(DebugUIMessages.AddMemoryRenderingAction_Add_renderings, AS_PUSH_BUTTON, container.getMemoryRenderingSite()); 
-		setToolTipText(DebugUIMessages.AddMemoryRenderingAction_Add_renderings); 
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, DebugUIPlugin.getUniqueIdentifier() + ".AddRenderingContextAction_context"); //$NON-NLS-1$
-		fContainer = container;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		
-		// pop up dialog and ask what renderings to create
-		Shell shell = DebugUIPlugin.getShell();
-		
-		IDebugElement elem = getDebugElement(fCurrentContext); 
-		
-		if (elem != null)
-		{	
-			AddMemoryRenderingDialog dialog = new AddMemoryRenderingDialog(shell, fSite);
-			dialog.open();
-			
-			// get a list of renderings to create
-			Object[] renderings = dialog.getResult();
-			
-			IMemoryBlock blk = dialog.getMemoryBlock();
-			
-			if (blk == null)
-				return;
-			
-			// ask for debug target and memory block retrieval
-			IDebugTarget debugTarget = elem.getDebugTarget();
-			IMemoryBlockRetrieval standardMemRetrieval = (IMemoryBlockRetrieval)elem.getAdapter(IMemoryBlockRetrieval.class);
-			
-			if (standardMemRetrieval == null)
-			{	
-				standardMemRetrieval = debugTarget;
-			}
-			
-			if (standardMemRetrieval == null)
-				return;
-			
-			// add memory renderings to Memory Rendering Manager
-			for (int i=0; i<renderings.length; i++)
-			{	
-				if (renderings[i] instanceof IMemoryRenderingType)
-				{
-					try {
-						IMemoryRendering rendering = ((IMemoryRenderingType)renderings[i]).createRendering();
-						if (rendering != null)
-						{
-							rendering.init(fContainer, blk);
-							fContainer.addMemoryRendering(rendering);
-						}
-					} catch (CoreException e) {
-						MemoryViewUtil.openError(DebugUIMessages.AddMemoryRenderingAction_Add_rendering_failed, DebugUIMessages.AddMemoryRenderingAction_Unable_to_add_selected_renderings, e); 
-					}
-				}					
-			}
-		}
-	}
-	
-	private IDebugElement getDebugElement(Object elem)
-	{
-		// if not debug element
-		if (!(elem instanceof IDebugElement))
-			return null;
-        return (IDebugElement)elem;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingContextAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingContextAction.java
deleted file mode 100644
index 2e002b9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingContextAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-
-public class AddMemoryRenderingContextAction implements IViewActionDelegate {
-
-	private IMemoryRenderingSite fMemoryView;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		
-		if (view instanceof IMemoryRenderingSite)
-		{
-			fMemoryView = (IMemoryRenderingSite)view;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-	
-		if (fMemoryView == null)
-			return;
-		
-		IMemoryRenderingContainer[] viewPanes = fMemoryView.getMemoryRenderingContainers();
-		String actionId = action.getId();
-		IMemoryRenderingContainer selectedPane = null;
-		
-		for (int i=0; i<viewPanes.length; i++)
-		{
-			if (actionId.indexOf(viewPanes[i].getId()) != -1)
-			{
-				selectedPane = viewPanes[i];
-				break;
-			}
-		}
-		
-		if (selectedPane == null)
-			return;
-		
-		AddMemoryRenderingAction addAction = new AddMemoryRenderingAction(selectedPane);
-		addAction.run();
-		
-		addAction.dispose();
-	}
-
-	/* (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/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
deleted file mode 100644
index 3c27300..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory;
-
-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.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-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.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.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.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Dialog allowing user to add a memory rendering
- */
-public class AddMemoryRenderingDialog extends SelectionDialog {
-	
-	private IMemoryBlock[] fMemoryBlocks;
-	private Combo memoryBlock;
-	private ListViewer fViewer;
-	private IMemoryBlock fSelectedMemoryBlock;
-	private Button addNew;
-	
-	private ISelectionChangedListener fSelectionChangedListener;
-	private SelectionListener fSelectionListener;
-	private SelectionAdapter fAddNewSelectionAdapter;
-	private IMemoryRenderingSite fSite;
-	
-	private IMemoryBlockListener fMemoryBlockListener = new IMemoryBlockListener(){
-		
-		public void memoryBlocksAdded(final IMemoryBlock[] memory)
-		{
-			if (memory.length > 0)
-			{
-				IMemoryBlock currentBlock = getMemoryBlockToSelect(memory[0]);
-				if (currentBlock == null)
-				{
-					addNew();
-				}
-				else
-				{
-					populateDialog(currentBlock);
-				}
-			}
-		}
-		public void memoryBlocksRemoved(IMemoryBlock[] memory)
-		{
-		}
-	};
-	
-	private IMemoryRenderingBindingsListener fBindingListener = new IMemoryRenderingBindingsListener()
-	{
-		public void memoryRenderingBindingsChanged() {
-			UIJob job = new UIJob("refresh"){ //$NON-NLS-1$
-			
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					fViewer.refresh();
-					return Status.OK_STATUS;
-				}
-			};
-			job.setSystem(true);
-			job.schedule();
-		}
-		
-	};
-
-	class MemoryRenderingLabelProvider implements ILabelProvider
-	{
-		
-		/* (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) {
-			if (element instanceof IMemoryRenderingType)
-			{	
-				String label = ((IMemoryRenderingType)element).getLabel();
-				return label;
-			}
-            return element.toString();
-		}
-
-		/* (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) {
-		}
-
-	}
-	
-	class MemoryRenderingContentProvider implements IStructuredContentProvider
-	{
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			IMemoryRenderingType[] renderings = DebugUITools.getMemoryRenderingManager().getRenderingTypes((IMemoryBlock)inputElement);
-			return renderings;
-		}
-
-		/* (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.window.Window#close()
-	 */
-	public boolean close() {
-		
-		fViewer.removeSelectionChangedListener(fSelectionChangedListener);
-		memoryBlock.removeSelectionListener(fSelectionListener);
-		addNew.removeSelectionListener(fAddNewSelectionAdapter);
-		DebugPlugin.getDefault().getMemoryBlockManager().removeListener(fMemoryBlockListener);
-		DebugUITools.getMemoryRenderingManager().removeListener(fBindingListener);
-		
-		return super.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		getButton(IDialogConstants.OK_ID).setEnabled(false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		
-		Object[] results = super.getResult();
-		
-		if (results != null)
-		{	
-			Object[] renderings = ((IStructuredSelection)results[0]).toArray();
-			return renderings;
-		}
-        return new Object[0];
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
-	 */
-	protected void cancelPressed() {
-		
-		setResult(null);
-		
-		super.cancelPressed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		
-		ISelection select = fViewer.getSelection();
-		setSelectionResult(new Object[]{select});
-		
-		super.okPressed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, DebugUIPlugin.getUniqueIdentifier() + ".AddMemoryRenderingDialog_context"); //$NON-NLS-1$
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout compositeLayout = new GridLayout();
-		compositeLayout.numColumns = 3;
-		compositeLayout.makeColumnsEqualWidth = true;
-		composite.setLayout(compositeLayout);
-		
-		GridData comositeSpec= new GridData();
-		comositeSpec.grabExcessVerticalSpace= true;
-		comositeSpec.grabExcessHorizontalSpace= true;
-		comositeSpec.horizontalAlignment= GridData.FILL;
-		comositeSpec.verticalAlignment= GridData.CENTER;
-		composite.setLayoutData(comositeSpec);
-		
-		Label textLabel = new Label(composite, SWT.NONE);
-		textLabel.setText(DebugUIMessages.AddMemoryRenderingDialog_Memory_Monitor); 
-		GridData textLayout = new GridData();
-		textLayout.verticalAlignment=GridData.CENTER;
-		textLayout.horizontalAlignment=GridData.BEGINNING;
-		textLabel.setLayoutData(textLayout);
-		
-		memoryBlock = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
-		GridData spec= new GridData(GridData.FILL_HORIZONTAL);
-		spec.grabExcessVerticalSpace= false;
-		spec.grabExcessHorizontalSpace= false;
-		spec.horizontalAlignment= GridData.FILL;
-		spec.verticalAlignment= GridData.FILL;
-		spec.horizontalSpan = 4;
-		memoryBlock.setLayoutData(spec);
-		
-		Label filler = new Label(composite, SWT.NONE);
-		filler.setText(" "); //$NON-NLS-1$
-		GridData fillerData = new GridData(GridData.FILL_HORIZONTAL);
-		fillerData.horizontalSpan = 2;
-		filler.setLayoutData(fillerData);
-		
-		addNew = new Button(composite, SWT.NONE);
-		addNew.setText(DebugUIMessages.AddMemoryRenderingDialog_Add_New); 
-		GridData specButton= new GridData();
-		specButton.horizontalAlignment= GridData.END;
-		specButton.verticalAlignment= GridData.CENTER;
-		addNew.setLayoutData(specButton);
-		
-		fAddNewSelectionAdapter = new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				RetargetAddMemoryBlockAction action = new RetargetAddMemoryBlockAction(fSite, false);
-				action.run();
-				action.dispose();
-			}};
-		
-		addNew.addSelectionListener(fAddNewSelectionAdapter);
-		
-		fSelectionListener = new SelectionListener(){
-
-			public void widgetSelected(SelectionEvent e) {
-				
-				int idx = memoryBlock.getSelectionIndex();
-				
-				// avoid null pointer exception
-				if (fMemoryBlocks == null)
-					return;
-				
-				fSelectedMemoryBlock = fMemoryBlocks[idx];
-				
-				fViewer.setInput(fSelectedMemoryBlock);			
-				
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}};
-		
-		memoryBlock.addSelectionListener(fSelectionListener);
-		
-		Label renderingLabel = new Label(composite, SWT.NONE);
-		renderingLabel.setText(DebugUIMessages.AddMemoryRenderingDialog_Memory_renderings); 
-		GridData renderingLayout = new GridData();
-		renderingLayout.horizontalAlignment = GridData.BEGINNING;
-		renderingLayout.verticalAlignment = GridData.CENTER;
-		renderingLayout.horizontalSpan = 3;
-		renderingLabel.setLayoutData(renderingLayout);
-		
-		fViewer = new ListViewer(composite);
-		fViewer.setContentProvider(new MemoryRenderingContentProvider());
-		fViewer.setLabelProvider(new MemoryRenderingLabelProvider());
-		
-		GridData listLayout = new GridData(GridData.FILL_BOTH);
-		listLayout.horizontalSpan = 3;
-		listLayout.heightHint =140;
-		fViewer.getControl().setLayoutData(listLayout);
-		
-		fViewer.addDoubleClickListener(new IDoubleClickListener (){
-
-			public void doubleClick(DoubleClickEvent event) {
-				okPressed();
-			}});
-		
-		IMemoryBlock currentBlock = getMemoryBlockToSelect(null);
-		if (currentBlock == null)
-		{
-			addNew();
-		}
-		else
-		{
-			populateDialog(currentBlock);
-		}
-		
-		
-		fSelectionChangedListener = new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection selection  = fViewer.getSelection();
-				
-				if (selection.isEmpty())
-				{	
-					getButton(IDialogConstants.OK_ID).setEnabled(false);
-				}
-				else
-				{	
-					getButton(IDialogConstants.OK_ID).setEnabled(true);
-				}
-			}};
-		
-		fViewer.addSelectionChangedListener(fSelectionChangedListener);
-		
-		DebugPlugin.getDefault().getMemoryBlockManager().addListener(fMemoryBlockListener);
-		DebugUITools.getMemoryRenderingManager().addListener(fBindingListener);
-		
-		return composite;
-	}
-
-	public AddMemoryRenderingDialog(Shell parent, IMemoryRenderingSite site) {
-		super(parent);
-		super.setTitle(DebugUIMessages.AddMemoryRenderingDialog_Add_memory_rendering); 
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		fSite = site;
-	}
-	
-	
-	private void doPopulateDialog(Combo combo, ListViewer viewer, String[] labels, int selectionIdx, IMemoryBlock currentBlock)
-	{	
-		// clean up
-		combo.removeAll();
-		
-		for (int i=0; i<labels.length; i++)
-		{
-			combo.add(labels[i]);
-		}
-
-		combo.select(selectionIdx);
-		fSelectedMemoryBlock = currentBlock;
-		
-		viewer.setInput(currentBlock);
-	}
-	
-	private IMemoryBlock getMemoryBlockToSelect(IMemoryBlock lastAdded)
-	{
-		IMemoryBlock currentBlock = null;
-		
-		if (lastAdded != null)
-			currentBlock = lastAdded;
-		else
-		{
-			// take Memory View's selection if possible
-			ISelectionProvider selectionProvider = fSite.getSite().getSelectionProvider();
-			ISelection selection = null;
-			
-			if (selectionProvider != null)
-				selection = selectionProvider.getSelection();
-			else // otherwise, take selection from selection service
-				selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IDebugUIConstants.ID_MEMORY_VIEW); 
-			
-			IDebugElement element = getMemoryBlock(selection);
-			
-			if (!(element instanceof IMemoryBlock))
-			{
-				
-				IAdaptable context = DebugUITools.getDebugContext();	
-				
-				if (context != null)
-				{
-					IDebugElement debugElement = (IDebugElement)context.getAdapter(IDebugElement.class);
-					
-					if (debugElement != null)
-					{
-						IMemoryBlock[] blocks = MemoryViewUtil.getMemoryBlockManager().getMemoryBlocks(debugElement.getDebugTarget());
-						
-						if (blocks.length > 0)
-							currentBlock = blocks[0];
-					}
-				}
-			}
-			else
-			{	
-				currentBlock = (IMemoryBlock)element;
-			}
-		}
-		return currentBlock;
-	}
-	
-	private String[] getLabels(IMemoryBlock[] memoryBlocks)
-	{
-		String[] labels = new String[memoryBlocks.length];
-		for (int i=0; i<memoryBlocks.length; i++)
-		{	
-			String text = ""; //$NON-NLS-1$
-			if (memoryBlocks[i] instanceof IMemoryBlockExtension)
-			{
-				try {
-					text = ((IMemoryBlockExtension)memoryBlocks[i]).getExpression();
-					
-					if (text == null)
-						text = DebugUIMessages.AddMemoryRenderingDialog_Unknown; 
-					
-					if (((IMemoryBlockExtension)memoryBlocks[i]).getBigBaseAddress() != null)
-					{
-						text += " : 0x"; //$NON-NLS-1$
-						text += ((IMemoryBlockExtension)memoryBlocks[i]).getBigBaseAddress().toString(16);
-					}	
-				} catch (DebugException e) {
-					long address = memoryBlocks[i].getStartAddress();
-					text = Long.toHexString(address);
-				}
-			}
-			else
-			{
-				long address = memoryBlocks[i].getStartAddress();
-				text = Long.toHexString(address);
-			}
-			
-			// ask decorator to decorate to ensure consistent label
-			ILabelDecorator decorator = (ILabelDecorator)fMemoryBlocks[i].getAdapter(ILabelDecorator.class);
-			if (decorator != null)
-				text = decorator.decorateText(text, fMemoryBlocks[i]);
-			
-			labels[i] = text;
-		}
-		return labels;
-	}
-	
-	private IMemoryBlock getMemoryBlock(ISelection selection)
-	{
-		if (!(selection instanceof IStructuredSelection))
-			return null;
-
-		//only single selection of PICLDebugElements is allowed for this action
-		if (selection.isEmpty() || ((IStructuredSelection)selection).size() > 1)
-		{
-			return null;
-		}
-
-		Object elem = ((IStructuredSelection)selection).getFirstElement();
-		
-		if (elem instanceof IMemoryBlock)
-			return (IMemoryBlock)elem;
-		else if (elem instanceof IMemoryRendering)
-			return ((IMemoryRendering)elem).getMemoryBlock();
-		else
-			return null;
-	}
-	
-	public IMemoryBlock getMemoryBlock()
-	{
-		return fSelectedMemoryBlock;
-	}
-	
-	/**
-	 * @param currentBlock
-	 */
-	private void populateDialog(IMemoryBlock currentBlock) {
-		final IMemoryBlock selectMB = currentBlock;
-		Job job = new Job("Populate dialog") //$NON-NLS-1$
-		{
-			protected IStatus run(IProgressMonitor monitor) {
-				fMemoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(selectMB.getDebugTarget());
-				int selectionIdx = 0;
-				for (int i=0; i<fMemoryBlocks.length; i++)
-				{
-					if (fMemoryBlocks[i] == selectMB)
-					{
-						selectionIdx = i;
-						break;
-					}
-				}
-				
-				final String[] labels = getLabels(fMemoryBlocks);
-				final int idx = selectionIdx;
-				final IMemoryBlock selectedBlk = selectMB;
-				WorkbenchJob wbJob = new WorkbenchJob("populate dialog"){ //$NON-NLS-1$
-
-					public IStatus runInUIThread(IProgressMonitor wbMonitor) {
-						doPopulateDialog(memoryBlock, fViewer, labels, idx, selectedBlk);	
-						return Status.OK_STATUS;
-					}};
-					wbJob.setSystem(true);
-					wbJob.schedule();		
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-
-	/**
-	 * 
-	 */
-	private void addNew() {
-		WorkbenchJob job = new WorkbenchJob("populate dialog"){ //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				memoryBlock.add(DebugUIMessages.AddMemoryRenderingDialog_Add_New);
-				memoryBlock.select(0);
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/CodePagesPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/CodePagesPreferencePage.java
deleted file mode 100644
index 0e9a103..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/CodePagesPreferencePage.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.debug.internal.ui.views.memory;
-
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-public class CodePagesPreferencePage extends FieldEditorPreferencePage {
-
-	private StringFieldEditor fEbcdicCodePage;
-	private StringFieldEditor fAsciiCodePage;
-
-	protected CodePagesPreferencePage() {
-		super(FieldEditorPreferencePage.GRID);
-		setPreferenceStore(DebugUITools.getPreferenceStore());
-		setTitle(DebugUIMessages.CodePagesPrefDialog_1);
-	}
-
-	protected void createFieldEditors() {
-		fAsciiCodePage = new StringFieldEditor(IDebugUIConstants.PREF_DEFAULT_ASCII_CODE_PAGE, DebugUIMessages.CodePagesPrefDialog_2, getFieldEditorParent());
-		fAsciiCodePage.setEmptyStringAllowed(false);
-		addField(fAsciiCodePage);
-		
-		fEbcdicCodePage = new StringFieldEditor(IDebugUIConstants.PREF_DEFAULT_EBCDIC_CODE_PAGE, DebugUIMessages.CodePagesPrefDialog_4, getFieldEditorParent());
-		fEbcdicCodePage.setEmptyStringAllowed(false);
-		addField(fEbcdicCodePage);
-	}
-
-	public boolean performOk() {
-		
-		if (fAsciiCodePage == null || fEbcdicCodePage == null)
-			return super.performOk();
-		
-		// check that the codepages are supported
-		String asciiCodePage = fAsciiCodePage.getStringValue();
-		asciiCodePage = asciiCodePage.trim();
-		try {
-			new String(new byte[]{1}, asciiCodePage);
-		} catch (UnsupportedEncodingException e) {
-			Shell shell = DebugUIPlugin.getShell();
-			if (shell != null)
-			{
-				IStatus status = DebugUIPlugin.newErrorStatus(DebugUIMessages.CodePagesPrefDialog_0, e); 
-				ErrorDialog.openError(shell, DebugUIMessages.CodePagesPrefDialog_6,  DebugUIMessages.CodePagesPrefDialog_7, status);		 // 
-			}
-			return false;
-		}
-		
-		String ebcdicCodePage = fEbcdicCodePage.getStringValue();
-		ebcdicCodePage = ebcdicCodePage.trim();
-		try {
-			new String(new byte[]{1}, ebcdicCodePage);
-		} catch (UnsupportedEncodingException e) {
-			Shell shell = DebugUIPlugin.getShell();
-			if (shell != null)
-			{
-				IStatus status = DebugUIPlugin.newErrorStatus(DebugUIMessages.CodePagesPrefDialog_0, e); 
-				ErrorDialog.openError(shell, DebugUIMessages.CodePagesPrefDialog_8,  DebugUIMessages.CodePagesPrefDialog_9, status);		 // 
-			}
-			return false;
-		}
-		return super.performOk();
-	}
-
-	protected Control createContents(Composite parent) {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, DebugUIPlugin.getUniqueIdentifier() + ".CodePagesPrefDialog_context"); //$NON-NLS-1$
-		return super.createContents(parent);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryView.java
deleted file mode 100644
index aa0ae65..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryView.java
+++ /dev/null
@@ -1,38 +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.debug.internal.ui.views.memory;
-
-
-/**
- * Functions to allow user to control the Memory View or the Memory Rendering View
- * 
- * @since 3.0
- */
-public interface IMemoryView
-{
-	/**
-	 * @return the top view tab from the Memory View
-	 */
-	public IMemoryViewTab getTopMemoryTab( );
-	
-	/**
-	 * @return all view tabs from current tab folder
-	 */
-	public IMemoryViewTab[] getAllViewTabs();
-	
-	/**
-	 * Move specified view tab to the top
-	 * @param viewTab
-	 */
-	public void moveToTop(IMemoryViewTab viewTab);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryViewPane.java
deleted file mode 100644
index e7329f1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryViewPane.java
+++ /dev/null
@@ -1,97 +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.debug.internal.ui.views.memory;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-
-/**
- * Represent a view pane in the memory view.
- * 
- * This is an internal interface for mananging the view panes within the Memory View
- * @since 3.1
- */
-public interface IMemoryViewPane {
-	
-	/**
-	 * Create the view pane with the given parent composite, and pane
-	 * id. 
-	 * @param parent
-	 * @param paneId
-	 * @param label
-	 * @return the control of the view pane
-	 */
-	public Control createViewPane(Composite parent, String paneId, String label);
-	
-	/**
-	 * Restore view pane based on current selection from the debug view.
-	 * Create memory blocks or renderings that currently exist in  the debug
-	 * session.
-	 */
-	public void restoreViewPane();
-	
-	/**
-	 * Dispose the view pane
-	 */
-	public void dispose();
-	
-	/**
-	 * @return unique identifier of the view pane
-	 */
-	public String getId();
-	
-	/**
-	 * @return array of actions to be contributed to the view pane's 
-	 * acition bar.
-	 */
-	public IAction[] getActions();
-	
-	/**
-	 * Add the given selection listener to the view pane.  The selection
-	 * listener gets notified when the selection from the view pane
-	 * has changed.
-	 * @param listener
-	 */
-	public void addSelectionListener(ISelectionChangedListener listener);
-	
-	/**
-	 * Remove the selection listener from the view pane. The listener
-	 * will no longer get notified when selection is changed.
-	 * @param listener
-	 */
-	public void removeSelctionListener(ISelectionChangedListener listener);
-	
-	/**
-	 * @return the selection provider of the view pane
-	 */
-	public ISelectionProvider getSelectionProvider();
-	
-	/**
-	 * @return the control for ths memory view pane
-	 */
-	public Control getControl();
-	
-	/**
-	 * Called when the view pane becomes visible or hidden
-	 * @param visible visibility state of teh view pane
-	 */
-	public void setVisible(boolean visible);
-	
-	/**
-	 * @return if the view pane is currently visible
-	 */
-	public boolean isVisible();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryViewTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryViewTab.java
deleted file mode 100644
index c9dab6a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/IMemoryViewTab.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-
-
-/**
- * Represent a view tab in the Memory View or Memory Rendering View
- * 
- * Refer to AbstractMemoryViewTab.
- * This is an internal interface. This class is not intended to be implemented by clients.
- * 
- * @since 3.0
- */
-public interface IMemoryViewTab
-{	
-	/**
-	 * Remove the view tab.
-	 */
-	public void dispose();
-	
-	/**
-	 * @return if the view tab is disposed
-	 */
-	public boolean isDisposed();
-	
-	/**
-	 * @return enablement state of the view tab.
-	 */
-	public boolean isEnabled();
-	
-	
-	/**
-	 * Sets the enablament state of the view tab.
-	 * @param enabled
-	 */
-	public void setEnabled(boolean enabled);
-	
-	/**
-	 * Set view tab's label
-	 * @param label
-	 */
-	public void setTabLabel(String label);
-	
-	/**
-	 * @return view tab's label, null if the label is not available
-	 */
-	public String getTabLabel();
-	
-	/**
-	 * @return the rendering of this view tab
-	 */
-	public IMemoryRendering getRendering();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/LinkRenderingPanesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/LinkRenderingPanesAction.java
deleted file mode 100644
index 767f3c5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/LinkRenderingPanesAction.java
+++ /dev/null
@@ -1,76 +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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Action to link/unlink rendering view panes
- */
-public class LinkRenderingPanesAction implements IViewActionDelegate{
-
-	IMemoryRenderingSite fRenderingSite;
-	private MemoryViewSynchronizationService fMemSyncService;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {	
-		
-		if (view instanceof IMemoryRenderingSite)
-		{
-			fRenderingSite = (IMemoryRenderingSite)view;
-			
-			IMemoryRenderingSynchronizationService syncService = fRenderingSite.getSynchronizationService();
-			
-			if (syncService instanceof MemoryViewSynchronizationService)
-				fMemSyncService = (MemoryViewSynchronizationService)syncService;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		
-		if (fMemSyncService == null)
-			return;
-		
-		fMemSyncService.setEnabled(!fMemSyncService.isEnabled());
-		updateActionState(action);
-	}
-
-	/**
-	 * @param action
-	 */
-	private void updateActionState(IAction action) {
-		
-		if (fMemSyncService == null)
-			return;
-		
-		if (fMemSyncService.isEnabled())
-			action.setChecked(true);
-		else
-			action.setChecked(false);
-	}
-
-	/* (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) {
-		updateActionState(action);		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
deleted file mode 100644
index 689a32e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
+++ /dev/null
@@ -1,622 +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.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-
-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.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-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.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-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.StructuredViewer;
-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.Menu;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.UIJob;
-
-
-/**
- * Tree viewer for memory blocks
- */
-public class MemoryBlocksTreeViewPane implements ISelectionListener, ISelectionChangedListener,  IMemoryViewPane, IMemoryRenderingContainer{
-	
-	public static final String PANE_ID = DebugUIPlugin.getUniqueIdentifier() + ".MemoryView.MemoryBlocksTreeViewPane"; //$NON-NLS-1$
-	
-	private IViewPart fParent;
-	private MemoryViewTreeViewer fTreeViewer;
-	protected IMemoryBlockRetrieval fRetrieval;
-	private ViewPaneSelectionProvider fSelectionProvider;
-	private AddMemoryBlockAction fAddMemoryBlockAction;
-	private IAction fRemoveMemoryBlockAction;
-	private IAction fRemoveAllMemoryBlocksAction;
-	private String fPaneId;
-	private boolean fVisible = true;
-	private TreeViewPaneContextListener fDebugContextListener;
-	private ViewPaneEventHandler fEvtHandler;
-	private String fLabel;
-	
-	class TreeViewerRemoveMemoryBlocksAction extends Action
-	{
-		TreeViewerRemoveMemoryBlocksAction()
-		{
-			super();
-			setText(DebugUIMessages.RemoveMemoryBlockAction_title); 
-
-			setToolTipText(DebugUIMessages.RemoveMemoryBlockAction_tooltip); 
-			setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_MEMORY));	
-			setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_REMOVE_MEMORY));
-			setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_MEMORY));
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".RemoveMemoryBlockAction_context"); //$NON-NLS-1$
-			setEnabled(true);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			ISelection selected = fTreeViewer.getSelection();
-			
-			if (selected != null && selected instanceof IStructuredSelection)
-			{
-				Object[] selectedMemBlks = ((IStructuredSelection)selected).toArray();
-				ArrayList memoryBlocks = new ArrayList();
-				for (int i=0; i<selectedMemBlks.length; i++)
-				{
-					if (selectedMemBlks[i] instanceof IMemoryBlock)
-						memoryBlocks.add(selectedMemBlks[i]);
-				}
-				
-				DebugPlugin.getDefault().getMemoryBlockManager().removeMemoryBlocks((IMemoryBlock[])memoryBlocks.toArray(new IMemoryBlock[memoryBlocks.size()]));
-			}
-		}
-	}
-	
-	class TreeViewerRemoveAllMemoryBlocksAction extends Action
-	{
-		TreeViewerRemoveAllMemoryBlocksAction()
-		{
-			super();
-			setText(DebugUIMessages.MemoryBlocksTreeViewPane_2); 
-
-			setToolTipText(DebugUIMessages.MemoryBlocksTreeViewPane_2); 
-			setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_ALL));	
-			setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_ALL));
-			setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_ALL));
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".RemoveAllMemoryBlocksAction_context"); //$NON-NLS-1$
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			
-			IWorkbenchWindow window= DebugUIPlugin.getActiveWorkbenchWindow();
-			if (window == null) {
-				return;
-			}
-			boolean proceed = MessageDialog.openQuestion(window.getShell(), DebugUIMessages.MemoryBlocksTreeViewPane_0, DebugUIMessages.MemoryBlocksTreeViewPane_1); // 
-			if (proceed) {
-				IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(fRetrieval);
-				DebugPlugin.getDefault().getMemoryBlockManager().removeMemoryBlocks(memoryBlocks);
-			}
-		}		
-	}
-	
-	class ViewPaneEventHandler implements IMemoryBlockListener, IDebugEventSetListener
-	{
-		private boolean fDisposed = false;
-		
-		public ViewPaneEventHandler()
-		{
-			DebugPlugin.getDefault().getMemoryBlockManager().addListener(this);
-			DebugPlugin.getDefault().addDebugEventListener(this);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			fDisposed = true;
-			DebugPlugin.getDefault().getMemoryBlockManager().removeListener(this);
-			DebugPlugin.getDefault().removeDebugEventListener(this);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.core.memory.IMemoryBlockListener#MemoryBlockAdded(org.eclipse.debug.core.model.IMemoryBlock)
-		 */
-		public void memoryBlocksAdded(final IMemoryBlock[] memory) {
-			// if the content provider is disposed, do not handle event
-			if (fDisposed)
-				return;
-			updateActionsEnablement();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.core.memory.IMemoryBlockListener#MemoryBlockRemoved(org.eclipse.debug.core.model.IMemoryBlock)
-		 */
-		public void memoryBlocksRemoved(final IMemoryBlock[] memory) {
-			if (fDisposed)
-				return;
-			updateActionsEnablement();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.memory.BasicDebugViewContentProvider#doHandleDebugEvent(org.eclipse.debug.core.DebugEvent)
-		 */
-		protected void doHandleDebugEvent(DebugEvent event) {
-			
-			// if the view is disposed, do not handle event
-			if (fDisposed)
-				return;
-			
-			if (event.getKind() == DebugEvent.TERMINATE)
-			{
-				// should only handle the terminate event if the target is terminated
-				if (event.getSource() instanceof IDebugTarget)
-				{
-					IMemoryBlockRetrieval srcRetrieval = getMemoryBlockRetrieval(event.getSource());
-					if (srcRetrieval == fRetrieval)
-					{
-						// #setInput must be done on the UI thread
-						UIJob job = new UIJob("setInput"){ //$NON-NLS-1$
-							public IStatus runInUIThread(IProgressMonitor monitor) {
-								
-								// if viewpane is disposed, do not handle event							
-								if (fTreeViewer.getContentProvider() == null)
-									return  Status.OK_STATUS;
-								
-								fTreeViewer.setInput(null);
-								return Status.OK_STATUS;
-							}};
-							
-						job.setSystem(true);
-						job.schedule();
-					}
-				}
-			}
-		}
-
-		public void handleDebugEvents(DebugEvent[] events) {
-			for (int i=0; i<events.length; i++)
-			{
-				doHandleDebugEvent(events[i]);
-			}
-		}
-	}
-	
-	class TreeViewPaneContextListener implements IDebugContextListener
-	{
-		public void contextActivated(ISelection selection) {
-			
-			if (selection.isEmpty() && fRetrieval != null)
-			{
-				fRetrieval = null;
-				if (fTreeViewer != null && fTreeViewer.getContentProvider() != null)
-					fTreeViewer.setInput(fRetrieval);
-				updateActionsEnablement();
-				return;
-			}
-			
-			if (selection instanceof IStructuredSelection)
-			{		
-				Object obj = ((IStructuredSelection)selection).getFirstElement();
-				if (obj instanceof IAdaptable)
-				{
-					IAdaptable context = (IAdaptable)obj;
-					IMemoryBlockRetrieval retrieval = getMemoryBlockRetrieval(context);
-					if (retrieval != null && retrieval != fRetrieval &&
-						fTreeViewer != null && fTreeViewer.getContentProvider() != null)
-					{
-						// set new setting
-						fRetrieval = retrieval;
-						fTreeViewer.setInput(fRetrieval);
-					}
-					updateActionsEnablement();
-				}
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextListener#contextEvent(org.eclipse.debug.internal.ui.contexts.provisional.DebugContextEvent)
-		 */
-		public void debugContextChanged(DebugContextEvent event) {
-			if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-				contextActivated(event.getContext());
-			}
-		}
-	}
-	
-	public MemoryBlocksTreeViewPane(IViewPart parent)
-	{
-		fParent = parent;
-		fSelectionProvider = new ViewPaneSelectionProvider();
-	}
-	
-	public Control createViewPane(Composite parent, String paneId, String label)
-	{
-		fPaneId = paneId;
-		int style = SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL;
-
-		fLabel = label;
-		
-		IMemoryRenderingSite site = getMemoryRenderingSite();
-		MemoryViewPresentationContext presentationContext = new MemoryViewPresentationContext(site, this, null);
-		fTreeViewer = new MemoryViewTreeViewer(parent, style, presentationContext);
-		
-		IAdaptable context = DebugUITools.getDebugContext();
-		IMemoryBlockRetrieval retrieval = getMemoryBlockRetrieval(context);
-		fTreeViewer.setInput(retrieval);
-		fRetrieval = retrieval;
-		
-		fParent.getViewSite().getSelectionProvider().addSelectionChangedListener(this);
-		fParent.getViewSite().getPage().addSelectionListener(this);
-		
-		fDebugContextListener = new TreeViewPaneContextListener();
-		DebugUITools.getDebugContextManager().getContextService(fParent.getSite().getWorkbenchWindow()).addDebugContextListener(fDebugContextListener);
-		
-		fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection treeSelected = event.getSelection();
-				fSelectionProvider.setSelection(treeSelected);
-			}});
-
-		populateViewPane();
-		fEvtHandler = new ViewPaneEventHandler();
-		
-		// create context menu
-		MenuManager mgr = createContextMenuManager();
-		Menu menu = mgr.createContextMenu(fTreeViewer.getControl());
-		fTreeViewer.getControl().setMenu(menu);
-		
-		GridData data = new GridData();
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		data.horizontalAlignment = SWT.FILL;
-		data.verticalAlignment = SWT.FILL;
-		fTreeViewer.getControl().setLayoutData(data);
-		
-		updateActionsEnablement();
-		
-		return fTreeViewer.getControl();
-	}
-	
-	
-	/**
-	 * 
-	 */
-	private void populateViewPane() {
-		
-		Object context = DebugUITools.getDebugContext();
-		fRetrieval = MemoryViewUtil.getMemoryBlockRetrieval(context);
-		
-		ISelection selection = null;
-		if (fParent.getSite().getSelectionProvider() != null)
-			selection = fParent.getSite().getSelectionProvider().getSelection();
-		
-		IMemoryBlock memoryBlock = null;
-		
-		if (selection == null)
-		{
-			return;
-		}
-		
-		// get memory block from selection if selection is not null
-		memoryBlock = getMemoryBlock(selection);
-		
-		if (memoryBlock == null)
-		{
-			IMemoryBlock [] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(fRetrieval);
-			if (memoryBlocks.length > 0)
-				memoryBlock = memoryBlocks[0];
-		}
-	}
-	
-	private IMemoryBlock getMemoryBlock(ISelection selection)
-	{
-		if (!(selection instanceof IStructuredSelection))
-			return null;
-
-		//only single selection of PICLDebugElements is allowed for this action
-		if (selection.isEmpty() || ((IStructuredSelection)selection).size() > 1)
-		{
-			return null;
-		}
-
-		Object elem = ((IStructuredSelection)selection).getFirstElement();
-		
-		if (elem instanceof IMemoryBlock)
-			return (IMemoryBlock)elem;
-		else if (elem instanceof IMemoryRendering)
-			return ((IMemoryRendering)elem).getMemoryBlock();
-		else
-			return null;
-	}
-
-	protected MenuManager createContextMenuManager() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				manager.add(fAddMemoryBlockAction);
-				manager.add(fRemoveMemoryBlockAction);
-				manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-			}
-		});
-
-		// register a context menu manager, use its pane id as the menu id
-		fParent.getSite().registerContextMenu(getId(), menuMgr, fSelectionProvider);
-		return menuMgr;
-	}
-	
-	public void dispose()
-	{
-		fParent.getViewSite().getSelectionProvider().removeSelectionChangedListener(this);
-		fParent.getViewSite().getPage().removeSelectionListener(this); 
-		fAddMemoryBlockAction.dispose();
-		DebugUITools.getDebugContextManager().getContextService(fParent.getSite().getWorkbenchWindow()).removeDebugContextListener(fDebugContextListener);
-		fEvtHandler.dispose();	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		
-
-
-		if (selection instanceof IStructuredSelection)
-		{
-			Object obj = ((IStructuredSelection)selection).getFirstElement();
-		
-			if (obj instanceof IMemoryBlock)
-			{
-				// if the selection event comes from this view
-				if (part == fParent)
-				{
-					// do not change selection if the selection is already correct
-					ISelection treeSel = fTreeViewer.getSelection();
-					if (treeSel instanceof IStructuredSelection)
-					{
-						if (((IStructuredSelection)treeSel).getFirstElement() == obj)
-							return;
-					}
-					// remove itself as selection listener when handling selection changed event
-					removeSelctionListener(this);
-					fTreeViewer.setSelection(selection);
-					// remove itself as selection listener when handling selection changed event
-					addSelectionListener(this);
-				}
-			}
-		}
-		
-	}
-
-	private IMemoryBlockRetrieval getMemoryBlockRetrieval(Object obj) {
-		IAdaptable adaptable = (IAdaptable)obj;
-		IMemoryBlockRetrieval retrieval = null;
-		if (adaptable != null)
-		{
-			retrieval = (IMemoryBlockRetrieval)adaptable.getAdapter(IMemoryBlockRetrieval.class);
-			if(retrieval == null && obj instanceof IDebugElement)
-			{
-				IDebugTarget debugTarget = ((IDebugElement)obj).getDebugTarget();
-				if (debugTarget != null)
-					retrieval = debugTarget;
-			}
-		}
-		return retrieval;
-	}
-	
-	public String getId()
-	{
-		return fPaneId;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#getActions()
-	 */
-	public IAction[] getActions() {
-		
-		if (fAddMemoryBlockAction == null)
-			fAddMemoryBlockAction = new RetargetAddMemoryBlockAction((IMemoryRenderingSite)fParent);
-		
-		if (fRemoveMemoryBlockAction == null)
-		{
-			fRemoveMemoryBlockAction = new TreeViewerRemoveMemoryBlocksAction();
-		}
-		
-		if (fRemoveAllMemoryBlocksAction == null)
-		{
-			fRemoveAllMemoryBlocksAction = new TreeViewerRemoveAllMemoryBlocksAction();
-		}
-		
-		updateActionsEnablement();
-		
-		return new IAction[]{fAddMemoryBlockAction, fRemoveMemoryBlockAction, fRemoveAllMemoryBlocksAction};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#addSelectionListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionListener(ISelectionChangedListener listener)
-	{
-		if (fSelectionProvider == null)
-			fSelectionProvider = new ViewPaneSelectionProvider();
-		
-		fSelectionProvider.addSelectionChangedListener(listener);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#removeSelctionListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelctionListener(ISelectionChangedListener listener)
-	{
-		if (fSelectionProvider == null)
-			return;
-		
-		fSelectionProvider.removeSelectionChangedListener(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#getSelectionProvider()
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return fSelectionProvider;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#restoreViewPane()
-	 */
-	public void restoreViewPane() {
-		populateViewPane();
-		updateActionsEnablement();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#getControl()
-	 */
-	public Control getControl() {
-		return fTreeViewer.getControl();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		if (fVisible != visible)
-		{
-			fVisible = visible;
-			
-			if(fVisible)
-			{
-				fTreeViewer.refresh();
-				fTreeViewer.getControl().setFocus();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewPane#isVisible()
-	 */
-	public boolean isVisible() {
-		return fVisible;
-	}
-	
-	private void updateActionsEnablement()
-	{
-		if (fRemoveMemoryBlockAction == null)
-			return;
-		
-		if (fRemoveAllMemoryBlocksAction == null)
-			return;
-		
-		if (fRetrieval != null)
-		{
-			IMemoryBlock[] memBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(fRetrieval);
-			if(memBlocks.length > 0)
-			{
-				fRemoveMemoryBlockAction.setEnabled(true);
-				fRemoveAllMemoryBlocksAction.setEnabled(true);
-			}
-			else
-			{
-				fRemoveMemoryBlockAction.setEnabled(false);
-				fRemoveAllMemoryBlocksAction.setEnabled(false);				
-			}
-		}
-		else
-		{
-			fRemoveMemoryBlockAction.setEnabled(false);
-			fRemoveAllMemoryBlocksAction.setEnabled(false);
-		}
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		// only handle selection changed from parent's selection provider
-		if (event.getSource() == fParent.getSite().getSelectionProvider())
-		{
-			MemoryBlocksTreeViewPane.this.selectionChanged(fParent, event.getSelection());
-		}
-	}
-	
-	public StructuredViewer getViewer()
-	{
-		return fTreeViewer;
-	}
-
-	public IMemoryRenderingSite getMemoryRenderingSite() {
-		if (fParent instanceof IMemoryRenderingSite)
-			return (IMemoryRenderingSite)fParent;
-		return null;
-	}
-
-	public void addMemoryRendering(IMemoryRendering rendering) {
-		// do nothing
-	}
-
-	public void removeMemoryRendering(IMemoryRendering rendering) {
-		// do nothing
-	}
-
-	public IMemoryRendering[] getRenderings() {
-		return new IMemoryRendering[0];
-	}
-
-	public IMemoryRendering getActiveRendering() {
-		return null;
-	}
-
-	public String getLabel() {
-		return fLabel;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java
deleted file mode 100644
index 9cd1de2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java
+++ /dev/null
@@ -1,823 +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.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.variables.VariablesViewMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService;
-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.action.ToolBarManager;
-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.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.ToolBar;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * 
- * @since 3.0
- */
-public class MemoryView extends ViewPart implements IMemoryRenderingSite {
-
-	protected MemoryViewSelectionProvider fSelectionProvider;
-	private MemoryViewPartListener fPartListener;
-	
-	private SashForm fSashForm;
-	private Hashtable fViewPanes = new Hashtable();
-	private Hashtable fViewPaneControls = new Hashtable();
-	private ArrayList fVisibleViewPanes = new ArrayList();
-	private boolean fVisible;
-	
-	private ArrayList fWeights = new ArrayList();
-	
-	private static final String VISIBILITY_PREF = IDebugUIConstants.ID_MEMORY_VIEW+".viewPanesVisibility"; //$NON-NLS-1$
-	private static final String ID_MEMORY_VIEW_CONTEXT = "org.eclipse.debug.ui.memoryview"; //$NON-NLS-1$
-	private static final String ID_ADD_MEMORY_BLOCK_COMMAND = "org.eclipse.debug.ui.commands.addMemoryMonitor"; //$NON-NLS-1$
-	private static final String ID_TOGGLE_MEMORY_MONITORS_PANE_COMMAND = "org.eclipse.debug.ui.commands.toggleMemoryMonitorsPane"; //$NON-NLS-1$
-	private static final String ID_NEXT_MEMORY_BLOCK_COMMAND = "org.eclipse.debug.ui.commands.nextMemoryBlock"; //$NON-NLS-1$
-	
-	public static final String VIEW_PANE_ORIENTATION_PREF = IDebugUIConstants.ID_MEMORY_VIEW+".orientation"; //$NON-NLS-1$
-	public static final int HORIZONTAL_VIEW_ORIENTATION = 0;
-	public static final int VERTICAL_VIEW_ORIENTATION =1;
-
-	private String[] defaultVisiblePaneIds ={MemoryBlocksTreeViewPane.PANE_ID, IDebugUIConstants.ID_RENDERING_VIEW_PANE_1};
-		
-	private MemoryBlocksTreeViewPane fMemBlkViewer;
-	
-	private MemoryViewSynchronizationService fSyncService;
-	
-	private boolean fPinMBDisplay = false;	// pin memory block display, on by default
-	private static int fViewCnt = 0;
-
-	private AbstractHandler fAddHandler;
-	private AbstractHandler fToggleMonitorsHandler;
-	private AbstractHandler fNextMemoryBlockHandler;
-	
-	private ViewPaneOrientationAction[] fOrientationActions;
-	private int fViewOrientation = HORIZONTAL_VIEW_ORIENTATION;
-	
-	private String fActivePaneId;
-		
-	class MemoryViewSelectionProvider implements ISelectionProvider, ISelectionChangedListener
-	{
-		ArrayList fListeners = new ArrayList();
-		
-		IStructuredSelection fSelections = new StructuredSelection();
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void addSelectionChangedListener(ISelectionChangedListener listener)
-		{
-			if (!fListeners.contains(listener))
-				fListeners.add(listener);
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-		 */
-		public ISelection getSelection()
-		{
-			return fSelections;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void removeSelectionChangedListener(ISelectionChangedListener listener)
-		{
-			if (fListeners.contains(listener))
-				fListeners.remove(listener);
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-		 */
-		public void setSelection(ISelection selection)
-		{
-			if (selection instanceof IStructuredSelection)
-			{		
-				boolean fireChanged = false;
-				
-				// only fire change event if the selection has really changed
-				if (fSelections.getFirstElement() != ((IStructuredSelection)selection).getFirstElement())
-					fireChanged = true;
-
-				fSelections = (IStructuredSelection)selection;
-				
-				if (fireChanged)
-					fireChanged();
-			}
-		}
-		
-		public void fireChanged()
-		{
-			SelectionChangedEvent evt = new SelectionChangedEvent(this, getSelection());
-			for (int i=0; i<fListeners.size(); i++)
-			{
-				((ISelectionChangedListener)fListeners.get(i)).selectionChanged(evt);
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			ISelection viewPaneSelection = event.getSelection();
-			
-			if (viewPaneSelection instanceof IStructuredSelection)
-			{
-				Object selected = ((IStructuredSelection)viewPaneSelection).getFirstElement();
-			
-				if (selected != null)
-				{
-					StructuredSelection strucSelection = new StructuredSelection(new Object[]{selected});
-					setSelection(strucSelection);
-				}
-				else
-				{
-					setSelection(viewPaneSelection);
-				}
-			}
-		}
-	}
-	
-	class MemoryViewPartListener implements IPartListener2
-	{
-		IMemoryRenderingSite fView = null;
-		
-		public MemoryViewPartListener(IMemoryRenderingSite view)
-		{
-			fView = view;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partActivated(IWorkbenchPartReference ref) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partBroughtToTop(IWorkbenchPartReference ref) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partClosed(IWorkbenchPartReference ref) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partDeactivated(IWorkbenchPartReference ref) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partHidden(IWorkbenchPartReference ref) {
-			
-			IWorkbenchPart part = ref.getPart(false);
-			
-			if (part == fView)
-			{
-				setVisible(false);
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partVisible(IWorkbenchPartReference ref) {
-			IWorkbenchPart part = ref.getPart(false);
-			
-			if (part == fView)
-			{
-				setVisible(true);
-				restoreView();
-			}
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-		 */
-		public void partInputChanged(IWorkbenchPartReference ref) {
-		}
-
-		public void partOpened(IWorkbenchPartReference ref)
-		{	
-		}
-	}
-	
-	public void init(IViewSite site) throws PartInitException {
-		super.init(site);
-		
-		fViewCnt ++;
-		String secondaryId = site.getSecondaryId();
-		if (secondaryId != null)
-			MemoryViewIdRegistry.registerView(secondaryId);
-		
-		// only do this the first time
-		// not sure if there is a bug in the UI... if the view is
-		// not a primary view and if it's hidden, the view is not
-		// init and created until it becomes visible.
-		if (fViewCnt == 1)
-		{
-			// also try to find other views and register
-			if (DebugUIPlugin.getActiveWorkbenchWindow() != null &&
-				DebugUIPlugin.getActiveWorkbenchWindow().getActivePage() != null)
-			{
-				IViewReference references[] = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().getViewReferences();
-				for (int i=0; i<references.length; i++)
-				{
-					if (references[i].getSecondaryId() != null)
-					{
-						MemoryViewIdRegistry.registerView(references[i].getSecondaryId());
-					}
-				}
-			}
-		}
-		
-		fSyncService = new MemoryViewSynchronizationService();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		fSashForm = new SashForm(parent, SWT.HORIZONTAL);
-		
-		fSelectionProvider = new MemoryViewSelectionProvider();
-		
-		// set up selection provider and listeners
-		getSite().setSelectionProvider(fSelectionProvider);
-
-		createMemoryBlocksTreeViewPane(fSashForm);
-		createRenderingViewPane(IDebugUIConstants.ID_RENDERING_VIEW_PANE_1);
-		createRenderingViewPane(IDebugUIConstants.ID_RENDERING_VIEW_PANE_2);
-		
-		setVisible(true);
-		
-		// set up weights in sashform
-		Integer[] weights = (Integer[])fWeights.toArray(new Integer[fWeights.size()]);
-		int[] intWeights = new int[weights.length];
-		for (int i=0; i<weights.length; i++)
-		{
-			intWeights[i] = weights[i].intValue();
-		}
-		fSashForm.setWeights(intWeights);
-		loadViewPanesVisibility();
-		
-		createOrientationActions();
-		loadOrientation();
-		
-		fPartListener = new MemoryViewPartListener(this);
-		getSite().getPage().addPartListener(fPartListener);
-		activateHandlers();
-		// restore view pane after finishing creating all the view panes
-		restoreView();
-	}
-
-	
-    public void activateHandlers() {
-		ICommandService commandSupport = (ICommandService)getSite().getService(ICommandService.class);		
-		IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
-		IContextService contextSupport = (IContextService)getSite().getService(IContextService.class);
-		
-		if (commandSupport != null && handlerService != null && contextSupport != null)
-		{
-			contextSupport.activateContext(ID_MEMORY_VIEW_CONTEXT);
-				
-			fAddHandler = new AbstractHandler() {
-					public Object execute(ExecutionEvent event) throws ExecutionException {
-						IAdaptable context = DebugUITools.getDebugContext();
-						if (context != null && MemoryViewUtil.isValidSelection(new StructuredSelection(context)))
-						{
-							RetargetAddMemoryBlockAction action = new RetargetAddMemoryBlockAction(MemoryView.this);
-							action.run();
-							action.dispose();
-						}
-						return null;
-					}};
-			handlerService.activateHandler(ID_ADD_MEMORY_BLOCK_COMMAND, fAddHandler);
-			
-			fToggleMonitorsHandler = new AbstractHandler() {
-					public Object execute(ExecutionEvent event) throws ExecutionException {
-						ToggleMemoryMonitorsAction action = new ToggleMemoryMonitorsAction();
-						action.init(MemoryView.this);
-						action.run();
-						action.dispose();
-						return null;
-					}
-				};
-			
-			handlerService.activateHandler(ID_TOGGLE_MEMORY_MONITORS_PANE_COMMAND, fToggleMonitorsHandler);
-			
-			fNextMemoryBlockHandler = new AbstractHandler() {
-
-				public Object execute(ExecutionEvent event)
-						throws ExecutionException {
-					SwitchMemoryBlockAction action = new SwitchMemoryBlockAction();
-					action.init(MemoryView.this);
-					action.run();
-					action.dispose();
-					return null;
-				}
-			};
-			handlerService.activateHandler(ID_NEXT_MEMORY_BLOCK_COMMAND, fNextMemoryBlockHandler);
-		}
-    }
-	
-	/**
-	 * 
-	 */
-	private void createMemoryBlocksTreeViewPane(Composite parent) {
-		
-		fMemBlkViewer = new MemoryBlocksTreeViewPane(this);
-		fViewPanes.put(MemoryBlocksTreeViewPane.PANE_ID, fMemBlkViewer);
-		ViewForm viewerViewForm = new ViewForm(parent, SWT.NONE);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewerViewForm, IDebugUIConstants.PLUGIN_ID + ".MemoryView_context"); //$NON-NLS-1$
-		fViewPaneControls.put(MemoryBlocksTreeViewPane.PANE_ID, viewerViewForm);
-		fWeights.add(new Integer(15));
-		
-		fMemBlkViewer.addSelectionListener(fSelectionProvider);
-		
-		Control viewerControl = fMemBlkViewer.createViewPane(viewerViewForm, MemoryBlocksTreeViewPane.PANE_ID, DebugUIMessages.MemoryView_Memory_monitors);
-		viewerViewForm.setContent(viewerControl);
-		
-		ISelection selection = fMemBlkViewer.getSelectionProvider().getSelection();
-		if (selection != null)
-			fSelectionProvider.setSelection(selection);	
-
-		ToolBarManager viewerToolBarMgr = new ToolBarManager(SWT.FLAT);	
-		IAction[] actions = fMemBlkViewer.getActions();
-		for (int i=0; i<actions.length; i++)
-		{
-			viewerToolBarMgr.add(actions[i]);
-		}
-		ToolBar viewerToolbar = viewerToolBarMgr.createControl(viewerViewForm);
-		viewerViewForm.setTopRight(viewerToolbar);
-		
-		Label viewerLabel = new Label(viewerViewForm, SWT.WRAP);
-		viewerLabel.setText(DebugUIMessages.MemoryView_Memory_monitors); 
-		viewerViewForm.setTopLeft(viewerLabel);
-		
-		fMemBlkViewer.getControl().addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				fActivePaneId = fMemBlkViewer.getId();
-			}});
-	}
-
-	/**
-	 * @return an activate listener for the given view pane
-	 * 
-	 */
-	private Listener createDeactivateListener(final IMemoryViewPane viewPane) {
-		Listener deactivateListener = new Listener() {
-			private String id=viewPane.getId();
-			public void handleEvent(Event event) {
-				if (fActivePaneId.equals(id))
-					viewPane.removeSelctionListener(fSelectionProvider);
-			}};
-		return deactivateListener;
-	}
-
-	/**
-	 * @return a deactivate listener for the given view pane
-	 */
-	private Listener createActivateListener(final IMemoryViewPane viewPane) {
-		Listener activateListener = new Listener() {
-			private String id=viewPane.getId(); 
-			public void handleEvent(Event event) {
-				fActivePaneId = id;
-				viewPane.addSelectionListener(fSelectionProvider);
-				fSelectionProvider.setSelection(viewPane.getSelectionProvider().getSelection());
-			}};
-		return activateListener;
-	}
-
-	/**
-	 * 
-	 */
-	public void createRenderingViewPane(final String paneId) {
-		final RenderingViewPane renderingPane = new RenderingViewPane(this); 
-		fViewPanes.put(paneId, renderingPane);
-		ViewForm renderingViewForm = new ViewForm(fSashForm, SWT.NONE);
-		fViewPaneControls.put(paneId, renderingViewForm);
-		fWeights.add(new Integer(40));
-		
-		Control renderingControl = renderingPane.createViewPane(renderingViewForm, paneId, DebugUIMessages.MemoryView_Memory_renderings);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(renderingControl, IDebugUIConstants.PLUGIN_ID + ".MemoryView_context"); //$NON-NLS-1$
-		renderingViewForm.setContent(renderingControl);
-		
-		ToolBarManager renderingViewMgr = new ToolBarManager(SWT.FLAT);
-		IAction[] renderingActions = renderingPane.getActions();
-		for (int i=0; i<renderingActions.length; i++)
-		{
-			renderingViewMgr.add(renderingActions[i]);
-		}
-		
-		ToolBar renderingToolbar = renderingViewMgr.createControl(renderingViewForm);
-		renderingViewForm.setTopRight(renderingToolbar);
-		
-		Label renderingLabel = new Label(renderingViewForm, SWT.NONE);
-		renderingLabel.setText(renderingPane.getLabel());
-		renderingViewForm.setTopLeft(renderingLabel);
-		
-		Listener renderingActivateListener = createActivateListener(renderingPane);
-		renderingControl.addListener(SWT.Activate, renderingActivateListener);
-		
-		Listener renderingDeactivateListener = createDeactivateListener(renderingPane);
-		renderingControl.addListener(SWT.Deactivate, renderingDeactivateListener);
-
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		if (fActivePaneId == null)
-			fActivePaneId = fMemBlkViewer.getId();
-		
-		IMemoryViewPane pane = getViewPane(fActivePaneId);
-		pane.getControl().setFocus();
-	}
-	
-	public void dispose() {
-	    getSite().getPage().removePartListener(fPartListener);
-	    
-		Enumeration enumeration = fViewPanes.elements();
-		while (enumeration.hasMoreElements())
-		{
-			Object element = enumeration.nextElement();
-			if (element instanceof IMemoryViewPane)
-			{
-				((IMemoryViewPane)element).dispose();
-			}
-		}
-		
-		fViewPaneControls.clear();
-		
-		IViewSite viewSite = getViewSite();
-		String secondaryId = viewSite.getSecondaryId();
-		if (secondaryId != null)
-			MemoryViewIdRegistry.deregisterView(secondaryId);
-		
-		fSyncService.shutdown();
-		
-		if (fAddHandler != null)
-			fAddHandler.dispose();
-		
-		if (fToggleMonitorsHandler != null)
-			fToggleMonitorsHandler.dispose();
-		
-		if (fNextMemoryBlockHandler != null)
-			fNextMemoryBlockHandler.dispose();
-		
-		super.dispose();
-	}
-	
-	private void setVisible(boolean visible)
-	{
-		IMemoryViewPane[] viewPanes = getViewPanes();
-		
-		for (int i=0; i<viewPanes.length; i++)
-		{
-			// if currently visible, take view pane's visibility into account
-			// else force view pane to be visible if it is listed in
-			// "visible view panes" array list.
-			if (fVisible)
-				viewPanes[i].setVisible(visible && viewPanes[i].isVisible());
-			else
-			{
-				if (isViewPaneVisible(viewPanes[i].getId()))
-					viewPanes[i].setVisible(visible);
-			}	
-		}
-		
-		fVisible = visible;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMultipaneMemoryView#getViewPane(java.lang.String)
-	 */
-	public IMemoryViewPane getViewPane(String paneId) {
-		return (IMemoryViewPane)fViewPanes.get(paneId);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMultipaneMemoryView#getViewPanes()
-	 */
-	public IMemoryViewPane[] getViewPanes() {
-		IMemoryViewPane[] viewPanes = new IMemoryViewPane[fViewPanes.size()];
-
-		Enumeration enumeration = fViewPanes.elements();
-		int i=0;
-		while (enumeration.hasMoreElements())
-		{
-			viewPanes[i] = (IMemoryViewPane)enumeration.nextElement();
-			i++;
-		}
-		
-		return viewPanes;
-	}
-	
-	/**
-	 * Restore each view pane from the memory view based on current
-	 * debug selection
-	 */
-	private void restoreView() {
-		IMemoryViewPane[] viewPanes = getViewPanes();
-		for (int i=0; i<viewPanes.length; i++)
-		{
-			viewPanes[i].restoreViewPane();
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMultipaneMemoryView#showViewPane(boolean, java.lang.String)
-	 */
-	public void showViewPane(boolean show, String paneId) {
-		
-		Control viewPaneControl = (Control)fViewPaneControls.get(paneId);
-		
-		if (viewPaneControl != null)
-		{
-			Control children[] = fSashForm.getChildren();
-			
-			for (int i=0; i<children.length; i++)
-			{
-				if (children[i] == viewPaneControl)
-				{
-					children[i].setVisible(show);
-					IMemoryViewPane viewPane = (IMemoryViewPane)fViewPanes.get(paneId);
-					if (viewPane != null)
-						viewPane.setVisible(show);
-				}
-			}
-			fSashForm.layout();
-		}
-		
-		storeViewPaneVisibility();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMultipaneMemoryView#isViewPaneVisible(java.lang.String)
-	 */
-	public boolean isViewPaneVisible(String paneId) {
-		return fVisibleViewPanes.contains(paneId);
-	}
-	
-	private void storeViewPaneVisibility()
-	{		
-		fVisibleViewPanes.clear();
-		Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences();
-		StringBuffer visibleViewPanes= new StringBuffer();
-		
-		Enumeration enumeration = fViewPaneControls.keys();
-		
-		while (enumeration.hasMoreElements())
-		{
-			String paneId = (String)enumeration.nextElement();
-			
-			Control control = (Control)fViewPaneControls.get(paneId);
-			if (control.isVisible())
-			{
-				visibleViewPanes.append(paneId);
-				visibleViewPanes.append(","); //$NON-NLS-1$
-				fVisibleViewPanes.add(paneId);
-			}
-		}
-		
-		prefs.setValue(getVisibilityPrefId(), visibleViewPanes.toString());		 
-	}
-	
-	private void loadViewPanesVisibility()
-	{
-		Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences();
-		String visiblePanes = prefs.getString(getVisibilityPrefId());
-		
-		if (visiblePanes != null && visiblePanes.length() > 0)
-		{
-			StringTokenizer tokenizer = new StringTokenizer(visiblePanes, ","); //$NON-NLS-1$
-			while (tokenizer.hasMoreTokens())
-			{
-				String paneId = tokenizer.nextToken();
-				fVisibleViewPanes.add(paneId);
-			}
-		}
-		else
-		{
-			for (int i=0 ;i<defaultVisiblePaneIds.length; i++)
-			{
-				fVisibleViewPanes.add(defaultVisiblePaneIds[i]);
-			}
-		}
-		
-		Enumeration enumeration = fViewPaneControls.keys();
-		while (enumeration.hasMoreElements())
-		{
-			String paneId = (String)enumeration.nextElement();
-			boolean visible = false;
-			if(fVisibleViewPanes.contains(paneId))
-				visible = true;
-			
-			Control control = (Control)fViewPaneControls.get(paneId);
-			control.setVisible(visible);
-			
-			IMemoryViewPane viewPane = (IMemoryViewPane)fViewPanes.get(paneId);
-			viewPane.setVisible(visible);
-		}
-		
-		fSashForm.layout();
-	}
-	
-	private void loadOrientation()
-	{
-		Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences();
-		fViewOrientation = prefs.getInt(getOrientationPrefId());
-		
-		for (int i=0; i<fOrientationActions.length; i++)
-		{
-			if (fOrientationActions[i].getOrientation() == fViewOrientation)
-			{
-				fOrientationActions[i].run();
-			}
-		}
-		updateOrientationActions();
-	}
-	
-	private void saveOrientation()
-	{
-		Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences();
-		prefs.setValue(getOrientationPrefId(), fViewOrientation);
-	}
-	
-	private void updateOrientationActions()
-	{
-		for (int i=0; i<fOrientationActions.length; i++)
-		{
-			if (fOrientationActions[i].getOrientation() == fViewOrientation)
-			{
-				fOrientationActions[i].setChecked(true);
-			}
-			else
-			{
-				fOrientationActions[i].setChecked(false);
-			}
-			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSite#getSynchronizationService()
-	 */
-	public IMemoryRenderingSynchronizationService getSynchronizationService() {
-		return fSyncService;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSite#getMemoryRenderingContainers()
-	 */
-	public IMemoryRenderingContainer[] getMemoryRenderingContainers() {
-		Enumeration enumeration = fViewPanes.elements();
-		ArrayList containers = new ArrayList();
-		while (enumeration.hasMoreElements()){
-			Object obj = enumeration.nextElement();
-			if (obj instanceof IMemoryRenderingContainer)
-				containers.add(obj);
-		}
-		
-		return (IMemoryRenderingContainer[])containers.toArray(new IMemoryRenderingContainer[containers.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSite#getContainer(java.lang.String)
-	 */
-	public IMemoryRenderingContainer getContainer(String id) {
-		Object viewPane =  fViewPanes.get(id);
-		
-		if (viewPane instanceof IMemoryRenderingContainer)
-			return (IMemoryRenderingContainer)viewPane;
-		
-		return null;
-	}
-
-	public boolean isPinMBDisplay() {
-		return fPinMBDisplay;
-	}
-	
-
-	public void setPinMBDisplay(boolean pinMBDisplay) {
-		fPinMBDisplay = pinMBDisplay;
-	}
-	
-	private String getVisibilityPrefId()
-	{
-		IViewSite vs = getViewSite();
-		String viewId = vs.getSecondaryId();
-		
-		if (viewId != null)
-			return VISIBILITY_PREF + "." + viewId; //$NON-NLS-1$
-
-		return VISIBILITY_PREF;
-	}
-	
-	private String getOrientationPrefId()
-	{
-		IViewSite vs = getViewSite();
-		String viewId = vs.getSecondaryId();
-		
-		if (viewId != null)
-			return VIEW_PANE_ORIENTATION_PREF + "." + viewId; //$NON-NLS-1$
-
-		return VIEW_PANE_ORIENTATION_PREF;
-	}
-	
-	private void createOrientationActions()
-	{
-		IActionBars actionBars = getViewSite().getActionBars();
-		IMenuManager viewMenu = actionBars.getMenuManager();
-		
-		fOrientationActions = new ViewPaneOrientationAction[2];
-		fOrientationActions[0] = new ViewPaneOrientationAction(this, HORIZONTAL_VIEW_ORIENTATION);
-		fOrientationActions[1] = new ViewPaneOrientationAction(this, VERTICAL_VIEW_ORIENTATION);
-		
-		viewMenu.add(new Separator());
-		MenuManager layoutSubMenu = new MenuManager(VariablesViewMessages.VariablesView_40);
-		layoutSubMenu.add(fOrientationActions[0]);
-		layoutSubMenu.add(fOrientationActions[1]);
-		viewMenu.add(layoutSubMenu);
-		viewMenu.add(new Separator());
-	}
-	
-	public void setViewPanesOrientation(int orientation)
-	{
-		fViewOrientation = orientation;
-		if (fViewOrientation == VERTICAL_VIEW_ORIENTATION)
-			fSashForm.setOrientation(SWT.VERTICAL);
-		else
-			fSashForm.setOrientation(SWT.HORIZONTAL);
-		
-		saveOrientation();
-		updateOrientationActions();
-	}
-	
-	public int getViewPanesOrientation()
-	{
-		return fViewOrientation;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java
deleted file mode 100644
index f26a490..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java
+++ /dev/null
@@ -1,63 +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.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-
-/**
- * Class for managing the secondary ids for Memory View
- *
- */
-public class MemoryViewIdRegistry{
-	
-	private static ArrayList fgRegistry;
-	
-	public static  void registerView(String secondaryId)
-	{
-		ArrayList registry = getRegistry();
-		
-		if (!registry.contains(secondaryId))
-		{
-			registry.add(secondaryId);
-		}
-	}
-	
-	public static  void deregisterView(String secondaryId)
-	{
-		ArrayList registry = getRegistry();
-		
-		if (registry.contains(secondaryId))
-		{
-			registry.remove(secondaryId);
-		}
-	}
-	
-	public static String getUniqueSecondaryId(String viewId)
-	{
-		int cnt = 0;
-		String id = viewId + "." + cnt; //$NON-NLS-1$
-		ArrayList registry = getRegistry();
-		while (registry.contains(id))
-		{
-			cnt ++;
-			id = viewId + "." + cnt; //$NON-NLS-1$
-		}
-		return id;
-	}
-	
-	private static ArrayList getRegistry()
-	{
-		if (fgRegistry == null)
-			fgRegistry = new ArrayList();
-		
-		return fgRegistry;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewPrefAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewPrefAction.java
deleted file mode 100644
index 9b54d9f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewPrefAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.preference.PreferenceNode;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-public class MemoryViewPrefAction implements IViewActionDelegate {
-
-	public void init(IViewPart view) {
-
-	}
-
-	public void run(IAction action) {
-		
-		PreferenceManager prefManager = new PreferenceManager();
-		
-		ResetMemoryBlockPreferencePage page = new ResetMemoryBlockPreferencePage();
-		IPreferenceNode node = new PreferenceNode("org.eclipse.debug.ui.memory.resetMemoryBlock", page);  //$NON-NLS-1$
-		prefManager.addToRoot(node);
-		
-		SetPaddedStringPreferencePage page2 = new SetPaddedStringPreferencePage();
-		IPreferenceNode node2 = new PreferenceNode("org.eclipse.debug.ui.memory.setPaddedString", page2);  //$NON-NLS-1$
-		prefManager.addToRoot(node2);
-
-		CodePagesPreferencePage page3 = new CodePagesPreferencePage();
-		IPreferenceNode node3 = new PreferenceNode("org.eclipse.debug.ui.memory.codePages", page3);  //$NON-NLS-1$
-		prefManager.addToRoot(node3);
-		
-		final PreferenceDialog dialog = new PreferenceDialog(DebugUIPlugin.getShell(), prefManager);
-
-		BusyIndicator.showWhile(DebugUIPlugin.getStandardDisplay(), new Runnable() {
-			public void run() {
-				dialog.create();
-				dialog.open();
-			}
-		});		
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewSynchronizationService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewSynchronizationService.java
deleted file mode 100644
index 29a9376..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewSynchronizationService.java
+++ /dev/null
@@ -1,429 +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.debug.internal.ui.views.memory;
-
-import java.math.BigInteger;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Synchronization service for the memory view.
- * @since 3.1
- */
-public class MemoryViewSynchronizationService implements
-		IMemoryRenderingSynchronizationService, IMemoryBlockListener, IPropertyChangeListener {
-
-	private static final int ENABLED = 0;
-	private static final int ENABLING = 1;
-	private static final int DISABLED = 2;
-	
-	private Hashtable fSynchronizeInfo;
-	private int fEnableState = ENABLED;
-	private Hashtable fPropertyListeners;
-	
-	private IMemoryRendering fLastChangedRendering;
-	private IMemoryRendering fSyncServiceProvider;
-
-	private static final boolean DEBUG_SYNC_SERVICE = false;
-	
-	public MemoryViewSynchronizationService()
-	{
-		fSynchronizeInfo = new Hashtable();
-		fPropertyListeners = new Hashtable();
-		MemoryViewUtil.getMemoryBlockManager().addListener(this);
-	}
-
-	/**
-	 * Wrapper for ISynchronizedMemoryBlockView
-	 * Holds a list of property filters for the view.
-	 */
-	class PropertyListener 
-	{
-		IPropertyChangeListener fListener;
-		String[] fFilters;
-		
-		public PropertyListener(IPropertyChangeListener listener, String[] properties)
-		{
-			fListener = listener;
-			
-			if(properties != null)
-			{	
-				fFilters = properties;
-			}
-		}
-
-		/**
-		 * If the property matches one of the filters, the property
-		 * is valid and the view should be notified about its change.
-		 * @param property
-		 * @return if the property is specified in the filter
-		 */
-		public boolean isValidProperty(String property){
-			if (fFilters == null)
-				return true;
-			for (int i=0; i<fFilters.length; i++)
-			{
-				if (fFilters[i].equals(property))
-				{
-					return true;
-				}
-			}
-			return false;
-		}
-
-		/**
-		 * Set property filters, indicating what property change events
-		 * the listener is interested in.
-		 * @param filters
-		 */
-		public void setPropertyFilters(String[] filters){	
-			fFilters = filters;
-		}
-
-		/**
-		 * @return Returns the fListener.
-		 */
-		public IPropertyChangeListener getListener() {
-			return fListener;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockViewSynchronizer#getSynchronizedProperty(org.eclipse.debug.ui.ISynchronizedMemoryBlockView, java.lang.String)
-	 */
-	public Object getSynchronizedProperty(IMemoryBlock memoryBlock, String propertyId)
-	{
-		SynchronizeInfo info = (SynchronizeInfo)fSynchronizeInfo.get(memoryBlock);
-		
-		if (info != null)
-		{
-			Object value = info.getProperty(propertyId);
-			return value;
-		}
-		
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockListener#MemoryBlockAdded(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void memoryBlocksAdded(IMemoryBlock[] memoryBlocks) {
-		// do nothing when a memory block is added
-		// create a synchronize info object when there is a fView
-		// tab registered to be synchronized.
-		
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryBlockListener#MemoryBlockRemoved(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void memoryBlocksRemoved(IMemoryBlock[] memoryBlocks) {
-		
-		// Sync info can be null if the service is already shut down
-		if (fSynchronizeInfo == null)
-			return;
-		
-		for (int i=0; i<memoryBlocks.length; i++)
-		{
-			IMemoryBlock memory = memoryBlocks[i];
-			
-			if (fLastChangedRendering != null && fLastChangedRendering.getMemoryBlock() == memory)
-				fLastChangedRendering = null;
-			
-			if (fSyncServiceProvider != null && fSyncServiceProvider.getMemoryBlock() == memory)
-				fSyncServiceProvider = null;
-			
-			// delete the info object and remove it from fSynchronizeInfo
-			// when the memory block is deleted
-			SynchronizeInfo info = (SynchronizeInfo)fSynchronizeInfo.get(memory);
-			
-			if (info != null)
-			{	
-				info.delete();
-				fSynchronizeInfo.remove(memory);
-			}
-		}
-	}
-	
-	/**
-	 * Clean up when the plugin is shutdown
-	 */
-	public void shutdown()
-	{
-		if (fSynchronizeInfo != null)
-		{	
-			Enumeration enumeration = fSynchronizeInfo.elements();
-			
-			// clean up all synchronize info objects
-			while (enumeration.hasMoreElements()){
-				SynchronizeInfo info = (SynchronizeInfo)enumeration.nextElement();
-				info.delete();
-			}
-			
-			fSynchronizeInfo.clear();
-			fSynchronizeInfo = null;
-		}
-		MemoryViewUtil.getMemoryBlockManager().removeListener(this);
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener, java.lang.String[])
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener, String[] properties) {
-		
-		PropertyListener propertylistener = new PropertyListener(listener, properties);
-		
-		if (!fPropertyListeners.contains(propertylistener))
-		{
-			fPropertyListeners.put(listener, propertylistener);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		if (fPropertyListeners.containsKey(listener))
-		{
-			fPropertyListeners.remove(listener);
-		}
-	}
-	
-	/**
-	 * Fire property change events
-	 * @param propertyId
-	 */
-	public void firePropertyChanged(final PropertyChangeEvent evt)
-	{
-		// do not fire property changed event if the synchronization
-		// service is disabled
-		if (fEnableState == DISABLED)
-			return;
-		
-		// Make sure the synchronizer does not swallow any events
-		// Values of the properties are updated in the syncrhonizer immediately.
-		// Change events are queued up on the UI Thread.
-		Display.getDefault().syncExec(new Runnable()
-		{
-			public void run()
-			{
-				if (fSynchronizeInfo == null)
-					return;
-				
-				IMemoryRendering rendering = (IMemoryRendering)evt.getSource();
-				String propertyId = evt.getProperty();
-				
-				SynchronizeInfo info = (SynchronizeInfo)fSynchronizeInfo.get(rendering.getMemoryBlock());
-				if (info != null)
-				{
-					Object value = info.getProperty(propertyId);
-					if (value != null)
-					{				
-						Enumeration enumeration = fPropertyListeners.elements();
-						
-						while(enumeration.hasMoreElements())
-						{
-							PropertyListener listener = (PropertyListener)enumeration.nextElement();
-							
-							IPropertyChangeListener origListener = listener.getListener();
-							
-							// if it's a valid property - valid means that it's listed in the property filters
-							if (listener.isValidProperty(propertyId)){
-								PropertyChangeNotifier notifier = new PropertyChangeNotifier(origListener, evt);
-								SafeRunner.run(notifier);	
-							}
-						}
-					}
-				}
-			}
-		});
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService#getProperty(org.eclipse.debug.core.model.IMemoryBlock, java.lang.String)
-	 */
-	public Object getProperty(IMemoryBlock block, String property) {
-		
-		// When the synchronization service is disabled
-		// return null for all queries to properties
-		// This is to ensure that renderings are not synchronized
-		// to new synchronization properties when the sync service is
-		// disabled.
-		if (!isEnabled())
-			return null;
-		
-		SynchronizeInfo info = (SynchronizeInfo)fSynchronizeInfo.get(block);
-		
-		if (info != null)
-			return info.getProperty(property);
-		
-		return null;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event == null || !(event.getSource() instanceof IMemoryRendering))
-		{
-			return;
-		}
-		
-		// Do not handle any property changed event as the
-		// sync service is being enabled.
-		// Otheriwse, current sync info provider may overwrite
-		// sync info unexpectedly.  We want to sync with the rendering
-		// that is last changed.
-		if (fEnableState == ENABLING)
-			return;
-		
-		IMemoryRendering rendering = ((IMemoryRendering)event.getSource());
-		IMemoryBlock memoryBlock = rendering.getMemoryBlock();
-		String propertyId = event.getProperty();
-		Object value = event.getNewValue();
-		
-		if (DEBUG_SYNC_SERVICE)
-		{
-			System.out.println("SYNC SERVICE RECEIVED CHANGED EVENT:"); //$NON-NLS-1$
-			System.out.println("Source:  " + rendering); //$NON-NLS-1$
-			System.out.println("Property:  " + propertyId); //$NON-NLS-1$
-			System.out.println("Value:  " + value); //$NON-NLS-1$
-			
-			if (value instanceof BigInteger)
-			{
-				System.out.println("Value in hex:  " + ((BigInteger)value).toString(16)); //$NON-NLS-1$
-			}
-		}
-		
-		if (memoryBlock == null)
-			return;
-		
-		if (propertyId == null)
-			return;
-		
-		// find the synchronize info object for the memory block
-		SynchronizeInfo info = (SynchronizeInfo)fSynchronizeInfo.get(memoryBlock);
-		
-		// if info is not available, need to create one to hold the property
-		if (info == null)
-		{
-			info = new SynchronizeInfo(memoryBlock);
-			fSynchronizeInfo.put(memoryBlock, info);
-		}
-		
-		// get the value of the property
-		Object oldValue = info.getProperty(propertyId);
-		
-		if (oldValue == null)
-		{
-			// if the value has never been added to the info object
-			// set the property and fire a change event
-			info.setProperty(propertyId, value);
-			fLastChangedRendering = rendering;
-			firePropertyChanged(event);
-			return;
-		}
-		else if (!oldValue.equals(value))
-		{
-			// if the value has changed
-			// set the property and fire a change event
-			info.setProperty(propertyId, value);
-			fLastChangedRendering = rendering;
-			firePropertyChanged(event);
-		}
-	}
-	
-	public void setEnabled(boolean enabled)
-	{
-		if (enabled && fEnableState == ENABLED)
-			return;
-		
-		if (!enabled && fEnableState == DISABLED)
-			return;
-		
-		try
-		{
-			if (enabled)
-			{	
-				fEnableState = ENABLING;
-				// get sync info from the sync service provider	
-				if (fLastChangedRendering != null)
-				{
-					IMemoryBlock memBlock = fLastChangedRendering.getMemoryBlock();
-					SynchronizeInfo info = (SynchronizeInfo)fSynchronizeInfo.get(memBlock);
-					String[] ids = info.getPropertyIds();
-					
-					// stop handling property changed event while the
-					// synchronization service is being enabled
-					// this is to get around problem when the last changed
-					// rendering is not currently the sync info provider
-					
-					for (int i=0; i<ids.length; i++)
-					{
-						PropertyChangeEvent evt = new PropertyChangeEvent(fLastChangedRendering, ids[i], null, info.getProperty(ids[i]));
-						firePropertyChanged(evt);
-					}
-				}
-			}
-		}
-		finally
-		{
-			if (enabled)
-				fEnableState = ENABLED;
-			else
-				fEnableState = DISABLED;
-		}
-	}
-	
-	public boolean isEnabled()
-	{
-		return fEnableState == ENABLED;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService#setSynchronizationProvider(org.eclipse.debug.ui.memory.IMemoryRendering)
-	 */
-	public void setSynchronizationProvider(IMemoryRendering rendering) {
-		
-		if (DEBUG_SYNC_SERVICE)
-			System.out.println("SYNCHRONIZATION PROVIDER: " + rendering); //$NON-NLS-1$
-		
-		if (fSyncServiceProvider != null)
-			fSyncServiceProvider.removePropertyChangeListener(this);
-		
-		if (rendering != null)
-			rendering.addPropertyChangeListener(this);
-		
-		fSyncServiceProvider = rendering;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService#getSynchronizationProvider()
-	 */
-	public IMemoryRendering getSynchronizationProvider() {
-		return fSyncServiceProvider;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java
deleted file mode 100644
index 850a3ee..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory;
-
-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.debug.internal.ui.views.memory.renderings.ErrorRendering;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-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.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Represents a tab in the Memory View.  This is where memory renderings
- * are hosted in the Memory View.
- * @since 3.1
- */
-public class MemoryViewTab implements IMemoryViewTab, IPropertyChangeListener, Listener {
-
-	private IMemoryRendering fRendering;
-	private TabItem fTabItem;
-	private DisposeListener fDisposeListener;
-	private boolean fEnabled;
-	private boolean fIsDisposed = false;
-	private Control fControl;
-	private RenderingViewPane fContainer;
-	
-	
-	public MemoryViewTab(TabItem tabItem, IMemoryRendering rendering, RenderingViewPane container)
-	{
-		fTabItem = tabItem;
-		fRendering = rendering;
-		fContainer = container;
-		
-		// set the rendering as the synchronization provider
-		// as the new rendering should be in focus and have control 
-		// after it's created
-		
-		if (container.getMemoryRenderingSite().getSynchronizationService() != null)
-			container.getMemoryRenderingSite().getSynchronizationService().setSynchronizationProvider(rendering);
-		Control control = createViewTab();
-		
-		control.addListener(SWT.Activate, this);
-		control.addListener(SWT.Deactivate, this);
-		
-		fTabItem.setControl(control);
-		fTabItem.setData(this);
-		fTabItem.setText(getLabel());
-		fTabItem.setImage(getImage());
-		
-		fTabItem.addDisposeListener(fDisposeListener = new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				fTabItem.removeDisposeListener(fDisposeListener);
-				dispose();
-			}});
-	}
-	
-	private Control createViewTab()
-	{   
-		ISafeRunnable safeRunnable = new ISafeRunnable() {
-
-			public void handleException(Throwable exception) {
-				// create an error rendering to fill the view tab
-				ErrorRendering rendering = new ErrorRendering(fRendering.getRenderingId(), exception);
-				rendering.init(fContainer, fRendering.getMemoryBlock());
-
-				// dispose the rendering
-				fRendering.dispose();
-				
-				fRendering = rendering;
-				fControl = rendering.createControl(fTabItem.getParent());
-			}
-
-			public void run() throws Exception {
-				fControl = fRendering.createControl(fTabItem.getParent());
-				fRendering.addPropertyChangeListener(getInstance());
-			}};
-			
-		SafeRunner.run(safeRunnable);
-		return fControl;
-	}
-	
-	private String getLabel()
-	{
-		return fRendering.getLabel();
-	}
-	
-	private Image getImage()
-	{
-		return fRendering.getImage();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewTab#dispose()
-	 */
-	public void dispose() {
-		
-		if (fIsDisposed)
-			return;
-		
-		fIsDisposed = true;
-		
-		fRendering.removePropertyChangeListener(this);
-		
-		if (!fControl.isDisposed())
-		{
-			fControl.removeListener(SWT.Activate, this);
-			fControl.removeListener(SWT.Deactivate, this);
-		}
-		
-		// always deactivate rendering before disposing it.
-		fRendering.deactivated();
-		
-		fRendering.dispose();
-	}
-	
-	public boolean isDisposed()
-	{
-		return fIsDisposed;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewTab#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return fEnabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewTab#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		fEnabled = enabled;
-		
-		if (fEnabled)
-			fRendering.becomesVisible();
-		else
-			fRendering.becomesHidden();
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewTab#setTabLabel(java.lang.String)
-	 */
-	public void setTabLabel(String label) {
-		fTabItem.setText(label);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewTab#getTabLabel()
-	 */
-	public String getTabLabel() {
-		return fTabItem.getText();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IMemoryViewTab#getRendering()
-	 */
-	public IMemoryRendering getRendering() {
-		return fRendering;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(final PropertyChangeEvent event) {
-		
-		// make sure this runs on the UI thread, otherwise, it
-		// will get to a swt exception
-		
-		WorkbenchJob job = new WorkbenchJob("MemoryViewTab PropertyChanged") { //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				if (isDisposed())
-					return Status.OK_STATUS;
-					
-				if (event.getSource() == fRendering)
-				{
-					if (event.getProperty().equals(IBasicPropertyConstants.P_TEXT))
-					{
-						Object value = event.getNewValue();
-						if (value != null && value instanceof String)
-						{
-							String label = (String)value;
-							setTabLabel(label);
-						}
-						else
-						{
-							setTabLabel(fRendering.getLabel());
-						}
-					}
-					
-					if (event.getProperty().equals(IBasicPropertyConstants.P_IMAGE))
-					{
-						Object value = event.getNewValue();
-						if (value != null && value instanceof Image)
-						{
-							Image image = (Image)value;
-							fTabItem.setImage(image);
-						}
-						else
-						{
-							fTabItem.setImage(fRendering.getImage());
-						}
-					}
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-		job.schedule();
-	}
-	
-	private MemoryViewTab getInstance()
-	{
-		return this;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		if (event.type == SWT.Activate)
-		{
-			fRendering.activated();
-			fContainer.setRenderingSelection(fRendering);
-		}
-		if (event.type == SWT.Deactivate)
-		{
-			fRendering.deactivated();
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTreeModelContentProvider.java
deleted file mode 100644
index 0cd6802..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTreeModelContentProvider.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.viewers.PartPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-
-public class MemoryViewTreeModelContentProvider extends
-		TreeModelContentProvider {
-	
-	protected void updateNodes(IModelDelta[] nodes) {
-		
-		if (getViewer() instanceof TreeModelViewer)
-		{
-	        TreeModelViewer viewer = (TreeModelViewer) getViewer();
-	
-	        for (int i = 0; i < nodes.length; i++) {
-				IModelDelta node = nodes[i];
-				int flags = node.getFlags();
-
-				if ((flags & IModelDelta.ADDED) != 0) {
-					if (node.getElement() instanceof IMemoryBlock) {
-						if ((flags & IModelDelta.SELECT) != 0) {
-							PartPresentationContext context = (PartPresentationContext) viewer
-									.getPresentationContext();
-							if (context.getPart() instanceof MemoryView) {
-								MemoryView view = (MemoryView) context
-										.getPart();
-								if (view.isPinMBDisplay()) {
-									// turn off select if the view is currently
-									// pinned
-									flags |= IModelDelta.SELECT;
-									flags ^= IModelDelta.SELECT;
-								}
-							}
-						}
-
-						// override and select the first memory block
-						if (isFirstMemoryBlock()) {
-							flags |= IModelDelta.SELECT;
-						}
-					}
-				}
-				if ((flags & IModelDelta.ADDED) != 0) {
-					handleAdd(node);
-				}
-				if ((flags & IModelDelta.REMOVED) != 0) {
-					handleRemove(node);
-				}
-				if ((flags & IModelDelta.CONTENT) != 0) {
-					handleContent(node);
-				}
-				if ((flags & IModelDelta.EXPAND) != 0) {
-					handleExpand(node);
-				}
-				if ((flags & IModelDelta.SELECT) != 0) {
-					handleSelect(node);
-				}
-				if ((flags & IModelDelta.STATE) != 0) {
-					handleState(node);
-				}
-				if ((flags & IModelDelta.INSERTED) != 0) {
-					handleInsert(node);
-				}
-				if ((flags & IModelDelta.REPLACED) != 0) {
-					handleReplace(node);
-				}
-				if ((flags & IModelDelta.INSTALL) != 0) {
-					handleInstall(node);
-				}
-				if ((flags & IModelDelta.UNINSTALL) != 0) {
-					handleUninstall(node);
-				}
-				updateNodes(node.getChildDeltas());
-	        }
-		}
-	}
-	
-	private boolean isFirstMemoryBlock()
-	{
-		Object input = getViewer().getInput();
-		if (input instanceof IMemoryBlockRetrieval)
-		{
-			IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks((IMemoryBlockRetrieval)input);
-			if (memoryBlocks.length == 1)
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTreeViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTreeViewer.java
deleted file mode 100644
index cd6b76c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTreeViewer.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Customized tree viewer for the Memory View
- * This Tree Viewer has a specialized update policy for the memory view.
- * When the model fires a ADDED delta, the update policy handles the event as follows:
- * If the ADDED delta is accompanied by SELECT, and the added element is an memory blok, then
- * the udpate policy asks the Memory View if the it is currently pinned to a memory block.  If the view
- * is currently pinned, then the SELECT delta is ignored.
- * 
- * If the ADDED delta and SELECT delta are recieved in separate nodes, then the delta will be handled as-is and would
- * not take the pinning state of the memory view into account. 
- *
- */
-public class MemoryViewTreeViewer extends TreeModelViewer {
-
-	public MemoryViewTreeViewer(Composite parent, int style,
-			IPresentationContext context) {
-		super(parent, style, context);
-	}
-	
-	/* 
-	 * Need to have a customized content provider to define a special update policy for the Memory View
-	 * (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.InternalTreeModelViewer#createContentProvider()
-	 */
-	protected TreeModelContentProvider createContentProvider() {
-		return new MemoryViewTreeModelContentProvider();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewUtil.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewUtil.java
deleted file mode 100644
index 289650c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewUtil.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.debug.internal.ui.views.memory;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IMemoryBlockManager;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Util class for Memory View
- * 
- * @since 3.0
- */
-public class MemoryViewUtil {
-	
-	public static final int[] ignoreKeyEvents =
-	{
-		SWT.ARROW_UP,
-		SWT.ARROW_DOWN,
-		SWT.ARROW_LEFT,
-		SWT.ARROW_RIGHT,
-		SWT.PAGE_UP,
-		SWT.PAGE_DOWN,
-		SWT.HOME,
-		SWT.END,
-		SWT.INSERT,
-		SWT.F1,
-		SWT.F2,
-		SWT.F3,
-		SWT.F4,
-		SWT.F5,
-		SWT.F6,
-		SWT.F7,
-		SWT.F8,
-		SWT.F9,
-		SWT.F10,
-		SWT.F11,
-		SWT.F12,
-		SWT.F13,
-		SWT.F14,
-		SWT.F15,
-		SWT.HELP,
-		SWT.CAPS_LOCK,
-		SWT.NUM_LOCK,
-		SWT.SCROLL_LOCK,
-		SWT.PAUSE,
-		SWT.BREAK,
-		SWT.PRINT_SCREEN,
-		SWT.ESC,
-		SWT.CTRL,
-		SWT.ALT,
-		SWT.SHIFT
-	};	
-	
-	public static ArrayList MEMORY_BLOCKS_HISTORY = new ArrayList();
-	
-	/**
-	 * @param selection
-	 * @return true if the given selection is valid for creating a memory block
-	 */
-	static public boolean isValidSelection(ISelection selection) {
-	
-		if (!(selection instanceof IStructuredSelection))
-			return false;
-	
-		//only single selection is allowed for this action
-		if (selection.isEmpty() || ((IStructuredSelection)selection).size() > 1)
-		{
-			return false;
-		}
-	
-		Object elem = ((IStructuredSelection)selection).getFirstElement();
-	
-		return isValidContext(elem);
-	}
-
-
-	/**
-	 * @param elem
-	 * @return
-	 */
-	public static boolean isValidContext(Object elem) {
-		// if not debug element
-		if (!(elem instanceof IDebugElement))
-			return false;
-	
-		IDebugTarget debugTarget = ((IDebugElement)elem).getDebugTarget();
-		IMemoryBlockRetrieval memRetrieval =(IMemoryBlockRetrieval) ((IDebugElement)elem).getAdapter(IMemoryBlockRetrieval.class);
-		
-		if (memRetrieval == null)
-		{
-			// if debug element returns null from getAdapter, assume its debug target is going to retrieve memory blocks
-			memRetrieval = debugTarget;
-		}
-		
-		if (debugTarget == null)
-			return false;
-		
-		// not valid if the debug target is already terminated
-		if (debugTarget.isTerminated() || debugTarget.isDisconnected())
-			return false;
-		
-		if (memRetrieval.supportsStorageRetrieval()) {
-			return true;
-		}
-		
-		return false;
-	}	
-
-	
-	/**
-	 * Helper function to open an error dialog.
-	 * @param title
-	 * @param message
-	 * @param e
-	 */
-	static public void openError (final String title, final String message, final Exception e)
-	{
-		UIJob uiJob = new UIJob("open error"){ //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-//				 open error for the exception
-				String detail = ""; //$NON-NLS-1$
-				if (e != null)
-					detail = e.getMessage();
-				
-				Shell shell = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
-				
-				MessageDialog.openError(
-					shell,
-					title,
-					message + "\n" + detail); //$NON-NLS-1$
-				return Status.OK_STATUS;
-			}};
-		uiJob.setSystem(true);
-		uiJob.schedule();
-	}
-	
-	static IMemoryBlockManager getMemoryBlockManager()
-	{
-		return DebugPlugin.getDefault().getMemoryBlockManager();
-	}
-	
-	static public boolean isLinuxGTK()
-	{	
-		String ws = Platform.getWS();
-		return ws.equals(Platform.WS_GTK);
-	}
-	
-	/**
-	 * Checks to see if the event is valid for activating
-	 * cell editing in a view tab
-	 * @param event
-	 * @return true if the edit event is valid  for activating the cell editor
-	 */
-	public static boolean isValidEditEvent(int event) {
-		for (int i = 0; i < MemoryViewUtil.ignoreKeyEvents.length; i++) {
-			if (event == MemoryViewUtil.ignoreKeyEvents[i])
-				return false;
-		}
-		return true;
-	}
-	
-	public static BigInteger alignToBoundary(BigInteger integer, int numberOfUnitsPerLine)
-	{
-		BigInteger[] result = integer.divideAndRemainder(BigInteger.valueOf(numberOfUnitsPerLine));
-		integer = integer.subtract(result[1]);
-		return integer;
-	}
-	
-	public static void addHistory(String expression)
-	{		
-		if (!MEMORY_BLOCKS_HISTORY.contains(expression))
-			MEMORY_BLOCKS_HISTORY.add(0, expression);
-		
-		if (MEMORY_BLOCKS_HISTORY.size() > 5)
-			MEMORY_BLOCKS_HISTORY.remove(MEMORY_BLOCKS_HISTORY.size()-1);
-	}
-	
-	public static String[] getHistory() 
-	{
-		return (String[])MEMORY_BLOCKS_HISTORY.toArray(new String[MEMORY_BLOCKS_HISTORY.size()]);
-	}
-	
-	public static IMemoryBlockRetrieval getMemoryBlockRetrieval(Object object)
-	{
-		IMemoryBlockRetrieval retrieval = null;
-
-		if (object instanceof IAdaptable)
-		{
-			IAdaptable adaptable = (IAdaptable)object;
-			retrieval = (IMemoryBlockRetrieval)adaptable.getAdapter(IMemoryBlockRetrieval.class);
-		}
-		
-		if (retrieval == null && object instanceof IDebugElement)
-		{
-			IDebugElement de = (IDebugElement)object;
-			retrieval = de.getDebugTarget();
-		}
-		
-		return retrieval;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MonitorMemoryBlockDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MonitorMemoryBlockDialog.java
deleted file mode 100644
index bb8c32c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MonitorMemoryBlockDialog.java
+++ /dev/null
@@ -1,166 +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.debug.internal.ui.views.memory;
-
-
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Combo;
-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.PlatformUI;
-
-/**
- * @since 3.0
- */
-public class MonitorMemoryBlockDialog extends TrayDialog implements ModifyListener{
-
-	private Combo expressionInput;
-	private Text lengthInput;
-	private String expression;
-	private String length;
-	private boolean needLength = true;
-	private String fPrefillExp = null;
-	private String fPrefillLength = null;
-	
-	/**
-	 * the predefined width of the wrapping label for the expression to enter combo
-	 * @since 3.3
-	 */
-	private static final int LABEL_WIDTH = 210;
-	
-	/**
-	 * @param parentShell
-	 */
-	public MonitorMemoryBlockDialog(Shell parentShell, IMemoryBlockRetrieval memRetrieval, String prefillExp, String prefillLength) {
-		super(parentShell);
-		
-		if (memRetrieval instanceof IMemoryBlockRetrievalExtension)
-			needLength = false;
-		
-		fPrefillExp = prefillExp;
-		fPrefillLength = prefillLength;
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite comp = (Composite) super.createDialogArea(parent);
-		SWTFactory.createWrapLabel(comp, DebugUIMessages.MonitorMemoryBlockDialog_EnterExpressionToMonitor, 1, LABEL_WIDTH);
-		expressionInput = SWTFactory.createCombo(comp, SWT.BORDER, 1, MemoryViewUtil.getHistory());
-		if (fPrefillExp != null) {
-			expressionInput.setText(fPrefillExp);
-		}
-		expressionInput.addModifyListener(this);
-		
-		if (needLength) {
-			SWTFactory.createLabel(comp, DebugUIMessages.MonitorMemoryBlockDialog_NumberOfBytes, 1);
-			lengthInput = SWTFactory.createSingleText(comp, 1);
-			if (fPrefillLength != null) {
-				lengthInput.setText(fPrefillLength);
-			}
-			lengthInput.addModifyListener(this);
-		}
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IDebugUIConstants.PLUGIN_ID + ".MonitorMemoryBlockDialog_context"); //$NON-NLS-1$
-		return comp;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		
-		newShell.setText(DebugUIMessages.MonitorMemoryBlockDialog_MonitorMemory);
-	}
-	
-	/**
-	 * @return the entered expression
-	 */
-	public String getExpression() {
-		return expression;
-	}
-	
-	/**
-	 * @return the entered length
-	 */
-	public String getLength() {
-		return length;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-
-		expression = expressionInput.getText();
-
-		// add to HISTORY list
-		MemoryViewUtil.addHistory(expression);
-
-		if (needLength)
-			length = lengthInput.getText();
-
-		super.okPressed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		updateOKButtonState();
-	}
-
-	private void updateOKButtonState() {
-		if (needLength)
-		{
-			String lengthText = lengthInput.getText();
-			String input = expressionInput.getText();
-			
-			if (input == null || input.equals("") || lengthText == null || lengthText.equals("")) //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				getButton(IDialogConstants.OK_ID).setEnabled(false);	
-			}
-			else
-			{
-				getButton(IDialogConstants.OK_ID).setEnabled(true);
-			}			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createButtonBar(Composite parent) {
-		
-		Control ret =  super.createButtonBar(parent);
-		
-		if (needLength)
-			updateOKButtonState();
-		else
-			// always enable the OK button if we only need the expression
-			getButton(IDialogConstants.OK_ID).setEnabled(true);
-		
-		return ret;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.java
deleted file mode 100644
index 2e62da3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * Action for opening a new memory view.
- */
-public class NewMemoryViewAction implements IViewActionDelegate {
-
-	private MemoryView fView;
-	public void init(IViewPart view) {
-		if (view instanceof MemoryView)
-			fView = (MemoryView)view;                                                                                                                                                                                                                                                                                                                                               
-	}
-
-	public void run(IAction action) {
-		
-		String secondaryId = MemoryViewIdRegistry.getUniqueSecondaryId(IDebugUIConstants.ID_MEMORY_VIEW);
-		try {
-			IWorkbenchPage page = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
-			IViewPart newView = page.showView(IDebugUIConstants.ID_MEMORY_VIEW, secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
-			
-			// set initial selection for new view
-			setInitialSelection(newView);
-			setInitialViewSettings(newView);
-			
-		} catch (PartInitException e) {
-			// if view cannot be opened, open error
-			DebugUIPlugin.log(e);
-		}
-	}
-
-	private void setInitialSelection(IViewPart newView) {
-		ISelection selection = fView.getSite().getSelectionProvider().getSelection();
-		if (selection instanceof IStructuredSelection)
-		{
-			IStructuredSelection strucSel = (IStructuredSelection)selection;
-			
-			// return if current selection is empty
-			if (strucSel.isEmpty())
-				return;
-			
-			Object obj = strucSel.getFirstElement();
-			
-			if (obj == null)
-				return;
-			
-			if (obj instanceof IMemoryRendering)
-			{
-				IMemoryBlock memBlock = ((IMemoryRendering)obj).getMemoryBlock();
-				strucSel = new StructuredSelection(memBlock);
-				newView.getSite().getSelectionProvider().setSelection(strucSel);
-			}
-			else if (obj instanceof IMemoryBlock)
-			{
-				newView.getSite().getSelectionProvider().setSelection(strucSel);
-			}
-		}
-	}
-
-	private void setInitialViewSettings(IViewPart newView) {
-		if (fView != null && newView instanceof MemoryView)
-		{
-			MemoryView newMView = (MemoryView)newView;
-			IMemoryViewPane[] viewPanes = fView.getViewPanes();
-			int orientation = fView.getViewPanesOrientation();
-			for (int i=0; i<viewPanes.length; i++)
-			{
-				// copy view pane visibility
-				newMView.showViewPane(fView.isViewPaneVisible(viewPanes[i].getId()), viewPanes[i].getId());
-			}
-			
-			// do not want to copy renderings as it could be very expensive
-			// create a blank view and let user creates renderings as needed
-			
-			// set orientation of new view
-			newMView.setViewPanesOrientation(orientation);
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.java
deleted file mode 100644
index 93f5fa3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Action for pinning the display of the memory view to
- * the current memory block.  The view would not change
- * selection when a new memory block is added if the diplay is pinned.
- *
- */
-public class PinMemoryBlockAction implements IViewActionDelegate {
-
-	private MemoryView fView;
-	public void init(IViewPart view) {
-		if (view instanceof MemoryView)
-			fView = (MemoryView)view;
-
-	}
-
-	public void run(IAction action) {
-		if (fView == null)
-			return;
-		
-		boolean pin = !fView.isPinMBDisplay();
-		fView.setPinMBDisplay(pin);
-		
-		action.setChecked(pin);
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PropertyChangeNotifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PropertyChangeNotifier.java
deleted file mode 100644
index 4b50660..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PropertyChangeNotifier.java
+++ /dev/null
@@ -1,49 +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.debug.internal.ui.views.memory;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Fire properties changes events in ISafeRunnable to ensure that
- * exceptions are caught and handled.
- * @since 3.1
- */
-public class PropertyChangeNotifier implements ISafeRunnable
-{
-	
-	IPropertyChangeListener fListener;
-	PropertyChangeEvent fEvt;
-	
-	public PropertyChangeNotifier(IPropertyChangeListener listener, PropertyChangeEvent evt)
-	{
-		fListener = listener;
-		fEvt = evt;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-	 */
-	public void handleException(Throwable exception) {
-		DebugUIPlugin.log(exception);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-	 */
-	public void run() throws Exception {
-		fListener.propertyChange(fEvt);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RemoveMemoryRenderingAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RemoveMemoryRenderingAction.java
deleted file mode 100644
index 0b5618c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RemoveMemoryRenderingAction.java
+++ /dev/null
@@ -1,77 +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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.jface.action.Action;
-
-
-/**
- * Remove Memory Rendering action
- * This action serves two purposes:
- *   - remove memory rendering from Memory Rendering Pane
- *   - quck way to remove a memory block from Memory Rendering Pane
- * 
- * When user clicks on the this tool bar action, it simply removes
- * the top view tab from Memory Rendering Pane.
- * @since 3.0
- */
-public class RemoveMemoryRenderingAction extends Action
-{
-	private IMemoryRenderingContainer fViewPane;
-	public RemoveMemoryRenderingAction(IMemoryRenderingContainer viewPane)
-	{
-		// create action as drop down
-		super(DebugUIMessages.RemoveMemoryRenderingAction_Remove_rendering, AS_PUSH_BUTTON); 
-		setText(DebugUIMessages.RemoveMemoryRenderingAction_Remove_rendering); 
-
-		setToolTipText(DebugUIMessages.RemoveMemoryRenderingAction_Remove_rendering); 
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_MEMORY));	
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_REMOVE_MEMORY));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_MEMORY));
-		fViewPane = viewPane;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		
-		// user has click on the RemoveMemoryRendering button
-		IMemoryViewTab topTab = getViewTab();
-		
-		if (topTab != null)
-		{
-			IMemoryRendering rendering = topTab.getRendering();
-			
-			if (rendering != null)
-			{
-				fViewPane.removeMemoryRendering(rendering);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.defaultrenderings.internal.actions.AbstractMemoryAction#getViewTab()
-	 */
-	IMemoryViewTab getViewTab() {
-		if (fViewPane instanceof IMemoryView)
-		{
-			return ((IMemoryView)fViewPane).getTopMemoryTab();
-		}
-		return null;
-	}		
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RemoveRenderingContextAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RemoveRenderingContextAction.java
deleted file mode 100644
index a514ca3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RemoveRenderingContextAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * @since 3.0
- *
- */
-public class RemoveRenderingContextAction implements IViewActionDelegate {
-
-	private IMemoryRenderingSite fMemoryView;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		if (view instanceof IMemoryRenderingSite)
-		{
-			fMemoryView = (IMemoryRenderingSite)view;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (fMemoryView == null)
-			return;
-		
-		IMemoryRenderingContainer[] viewPanes = fMemoryView.getMemoryRenderingContainers();
-		String actionId = action.getId();
-		IMemoryRenderingContainer selectedPane = null;
-		
-		for (int i=0; i<viewPanes.length; i++)
-		{
-			if (actionId.indexOf(viewPanes[i].getId()) != -1)
-			{
-				selectedPane = viewPanes[i];
-				break;
-			}
-		}
-		
-		if (selectedPane == null)
-			return;
-		
-		RemoveMemoryRenderingAction removeAction = new RemoveMemoryRenderingAction(selectedPane);
-		removeAction.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) {
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java
deleted file mode 100644
index 2afe5ca..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java
+++ /dev/null
@@ -1,1274 +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.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Set;
-
-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.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.memory.renderings.CreateRendering;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSynchronizationService;
-import org.eclipse.debug.ui.memory.IResettableMemoryRendering;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.UIJob;
-
-
-
-/**
- * Represents a rendering view pane in the Memory View.
- * This hosts the memory view tabs in the view.
- * @since 3.1
- *
- */
-public class RenderingViewPane extends AbstractMemoryViewPane implements IMemoryRenderingContainer{
-
-	public static final String RENDERING_VIEW_PANE_ID = DebugUIPlugin.getUniqueIdentifier() + ".MemoryView.RenderingViewPane"; //$NON-NLS-1$
-	
-	private Hashtable fTabFolderForMemoryBlock = new Hashtable();
-	private Hashtable fMemoryBlockFromTabFolder = new Hashtable();
-
-	private AddMemoryRenderingAction fAddMemoryRenderingAction;
-
-	private IAction fRemoveMemoryRenderingAction;
-	private ViewPaneRenderingMgr fRenderingMgr;
-	
-	private IMemoryRenderingSite fRenderingSite;
-	private Set fAddedRenderings = new HashSet();
-	private Set fAddedMemoryBlocks = new HashSet();
-
-	private boolean fIsDisposed = false;
-	
-	/**
-	 * @param parent is the view hosting this view pane
-	 * @param paneId is the identifier assigned by the Memory View
-	 * 
-	 * Pane id is assigned with the following format.  
-	 * Rendering view pane created has its id assigned to 
-	 * org.eclipse.debug.ui.MemoryView.RenderingViewPane.#.  
-	 * # is a number indicating the order of which the rendering view
-	 * pane is created.  First rendering view pane created will have its
-	 * id assigned to org.eclipse.debug.ui.MemoryView.RenderingViewPane.1.
-	 * Second rendering view pane created will have its id assigned to
-	 * org.eclipse.debug.ui.MemoryView.RenderingViewPane.2. and so on.
-	 * View pane are created from left to right by the Memory View.
-	 * 
-	 */
-	public RenderingViewPane(IViewPart parent) {
-		super(parent);
-		
-		if (parent instanceof IMemoryRenderingSite)
-			fRenderingSite = (IMemoryRenderingSite)parent;
-		else
-		{
-			DebugUIPlugin.logErrorMessage("Parent for the rendering view pane is invalid."); //$NON-NLS-1$
-		}	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.memory.IMemoryBlockListener#MemoryBlockAdded(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void memoryBlocksAdded(final IMemoryBlock[] memoryBlocks) {
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				
-				if (isDisposed())
-					return;
-						
-				// check condition before doing anything
-				if (memoryBlocks == null || memoryBlocks.length <= 0)
-					return;
-				
-				for (int i=0; i<memoryBlocks.length; i++)
-				{
-					IMemoryBlock memory = memoryBlocks[i];
-				
-					if (!fTabFolderForMemoryBlock.containsKey(memory))
-					{
-						createFolderForMemoryBlock(memory);						
-					}	
-					fAddedMemoryBlocks.add(memory);
-					updateToolBarActionsEnablement();
-				}
-			}});
-	}
-	
-	private IMemoryBlockRetrieval getMemoryBlockRetrieval(IMemoryBlock memoryBlock)
-	{
-		IMemoryBlockRetrieval retrieval = (IMemoryBlockRetrieval)memoryBlock.getAdapter(IMemoryBlockRetrieval.class);
-		
-		if (retrieval == null)
-		{
-			retrieval = memoryBlock.getDebugTarget();
-		}
-		
-		return retrieval;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.memory.IMemoryBlockListener#MemoryBlockRemoved(org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void memoryBlocksRemoved(final IMemoryBlock[] memoryBlocks) {
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				for (int j=0; j<memoryBlocks.length; j++)
-				{
-					IMemoryBlock memory = memoryBlocks[j];
-					if (fTabFolderForMemoryBlock == null)
-					{
-						return;
-					}
-					
-					// get all renderings from this memroy block and remove them from the view
-					IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memory);
-					
-					for (int k=0; k<renderings.length; k++)
-					{
-						removeMemoryRendering(renderings[k]);
-					}
-					
-					// remove a the tab folder if the memory block is removed
-					TabFolder tabFolder =
-						(TabFolder) fTabFolderForMemoryBlock.get(memory);
-					
-					if (tabFolder == null)
-						continue;
-					
-					fTabFolderForMemoryBlock.remove(memory);
-					fMemoryBlockFromTabFolder.remove(tabFolder);
-					fTabFolderForDebugView.remove(getMemoryBlockRetrieval(memory));
-					
-					if (!tabFolder.isDisposed()) {
-						
-						IMemoryBlockRetrieval retrieve = (IMemoryBlockRetrieval)memory.getAdapter(IMemoryBlockRetrieval.class);
-						if (retrieve == null)
-						{	
-							retrieve = memory.getDebugTarget();
-						}
-						
-						if (fTabFolderForDebugView.contains(tabFolder))
-						{					
-							fTabFolderForDebugView.remove(retrieve);
-						}
-						
-						// dispose all view tabs belonging to the tab folder
-						TabItem[] items = tabFolder.getItems();
-						
-						for (int i=0; i<items.length; i++)
-						{	
-							disposeTab(items[i]);
-						}
-						
-						// dispose the tab folder
-						tabFolder.dispose();						
-						
-						// if this is the top control
-						if (tabFolder == fStackLayout.topControl)
-						{	
-							
-							// if memory view is visible and have a selection
-							// follow memory view's selection
-							
-							ISelection selection = DebugUIPlugin.getActiveWorkbenchWindow().getSelectionService().getSelection(IDebugUIConstants.ID_MEMORY_VIEW);
-							IMemoryBlock blk = getMemoryBlock(selection);
-							
-							if (blk != null)
-							{	
-										
-								// memory view may not have got the event and is still displaying
-								// the deleted memory block
-								if (blk != memory)
-									handleMemoryBlockSelection(null, blk);
-								else if ((MemoryViewUtil.getMemoryBlockManager().getMemoryBlocks(memory.getDebugTarget()).length > 0))
-								{
-									blk = MemoryViewUtil.getMemoryBlockManager().getMemoryBlocks(memory.getDebugTarget())[0];
-									handleMemoryBlockSelection(null, blk);										
-								}
-								else
-								{
-									emptyFolder();
-								}
-							}
-							else if (MemoryViewUtil.getMemoryBlockManager().getMemoryBlocks(memory.getDebugTarget()).length > 0)
-							{	// get to the next folder
-								blk = MemoryViewUtil.getMemoryBlockManager().getMemoryBlocks(memory.getDebugTarget())[0];
-								handleMemoryBlockSelection(null, blk);
-							}
-							else
-							{
-								emptyFolder();
-			
-							}
-						}
-						
-						// if not the top control
-						// no need to do anything
-					}
-					
-					fAddedMemoryBlocks.remove(memory);
-					updateToolBarActionsEnablement();
-				}
-			}
-		});
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {
-		if (fIsDisposed)
-			return;
-		
-		// do not schedule job if any of these conditions are true
-		if(part == RenderingViewPane.this)
-			return;
-		
-		if (!(selection instanceof IStructuredSelection))
-			return;
-		
-		if (selection == AbstractMemoryViewPane.EMPTY)
-			return;
-		
-		UIJob job = new UIJob("RenderingViewPane selectionChanged"){ //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				try {
-
-					if (isDisposed())
-						return Status.OK_STATUS;
-					
-					if (selection.isEmpty())
-					{
-						// if the event comes from Memory View
-						// pick empty tab folder as the memory view is no longer displaying anything
-						if (part.getSite().getId().equals(IDebugUIConstants.ID_MEMORY_VIEW))
-						{
-							if (part == getMemoryRenderingSite().getSite().getPart())
-							{
-								IMemoryViewTab lastViewTab = getTopMemoryTab();
-								
-								if (lastViewTab != null)
-									lastViewTab.setEnabled(false);
-								
-								emptyFolder();
-							}
-						}
-						
-						// do not do anything if there is no selection
-						// In the case when a debug adpater fires a debug event incorrectly, Launch View sets
-						// selection to nothing.  If the view tab is disabled, it erases all the "delta" information
-						// in the content.  This may not be desirable as it will cause memory to show up as
-						// unchanged when it's actually changed.  Do not disable the view tab until there is a 
-						// valid selection.
-						
-						return Status.OK_STATUS;
-					}
-					
-					// back up current view tab
-					IMemoryViewTab lastViewTab = getTopMemoryTab();
-					
-					if (!(selection instanceof IStructuredSelection))
-						return Status.OK_STATUS;
-
-					Object elem = ((IStructuredSelection)selection).getFirstElement();
-					
-					if (elem instanceof IMemoryBlock)
-					{	
-						// if the selection event comes from this view
-						if (part == getMemoryRenderingSite())
-						{
-							// find the folder associated with the given IMemoryBlockRetrieval
-							IMemoryBlock memBlock = (IMemoryBlock)elem;
-							
-							// should never get here... added code for safety
-							if (fTabFolderForMemoryBlock == null)
-							{
-								if (lastViewTab != null)
-									lastViewTab.setEnabled(false);
-								
-								emptyFolder();
-								return Status.OK_STATUS;		
-							}
-			
-							handleMemoryBlockSelection(lastViewTab, memBlock);
-						}
-					}
-				}
-				catch(SWTException se)
-				{
-					DebugUIPlugin.log(se);
-				}
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-	
-	public void handleMemoryBlockSelection(final IMemoryViewTab lastViewTab, final IMemoryBlock memBlock) {
-		// don't do anything if the debug target is already terminated
-		if (memBlock.getDebugTarget().isDisconnected()
-				|| memBlock.getDebugTarget().isTerminated()) {
-			emptyFolder();
-			return;
-		}
-
-		// check current memory block
-		TabFolder currentFolder = (TabFolder) fStackLayout.topControl;
-		if (currentFolder != null && !currentFolder.isDisposed()) {
-			IMemoryBlock currentBlk = (IMemoryBlock) fMemoryBlockFromTabFolder.get(currentFolder);
-			if (currentBlk != null) {
-				if (currentBlk == memBlock)
-					return;
-			}
-		}
-
-		if (getTopMemoryTab() != null) {
-			if (getTopMemoryTab().getRendering().getMemoryBlock() == memBlock) {
-				return;
-			}
-		}
-
-		// if we've got a tabfolder to go with the IMemoryBlock, display
-		// it
-		if (fTabFolderForMemoryBlock.containsKey(memBlock)) {
-			if (fStackLayout.topControl != (TabFolder) fTabFolderForMemoryBlock.get(memBlock)) {
-				setTabFolder((TabFolder) fTabFolderForMemoryBlock.get(memBlock));
-				fViewPaneCanvas.layout();
-			}
-		} else { // otherwise, add a new one
-			TabFolder folder = new TabFolder(fViewPaneCanvas, SWT.NULL);
-
-			fTabFolderForMemoryBlock.put(memBlock, folder);
-			fMemoryBlockFromTabFolder.put(folder, memBlock);
-			setTabFolder((TabFolder) fTabFolderForMemoryBlock.get(memBlock));
-			fViewPaneCanvas.layout();
-			fAddedMemoryBlocks.add(memBlock);
-		}
-
-		// restore view tabs
-		IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memBlock);
-		TabFolder toDisplay = (TabFolder) fStackLayout.topControl;
-
-		if (toDisplay.getItemCount() == 0) {
-			restoreViewTabs(renderings);
-		}
-
-		// disable last view tab as it becomes hidden
-		IMemoryViewTab newViewTab = getTopMemoryTab();
-
-		if (lastViewTab != null && lastViewTab != newViewTab) {
-			lastViewTab.setEnabled(false);
-		}
-
-		if (newViewTab != null) {
-			// if new view tab is not already enabled, enable it
-			if (!newViewTab.isEnabled()) {
-				// if the view tab is visible, enable it
-				if (fVisible) {
-					newViewTab.setEnabled(fVisible);
-				}
-			}
-		}
-
-		IMemoryViewTab viewTab = getTopMemoryTab();
-		if (viewTab != null)
-			setRenderingSelection(viewTab.getRendering());
-
-		if (viewTab == null && fRenderingMgr.getRenderings().length == 0) {
-			// do not ever want to put it on the empty folder
-			if (toDisplay != fEmptyTabFolder) {
-				TabItem newItem = new TabItem(toDisplay, SWT.NULL);
-				CreateRendering rendering = new CreateRendering(getInstance());
-				rendering.init(getInstance(), memBlock);
-				MemoryViewTab createTab = new MemoryViewTab(newItem,rendering, getInstance());
-				setRenderingSelection(createTab.getRendering());
-			}
-		}
-
-		//set toolbar actions enabled/disabled
-		updateToolBarActionsEnablement();
-	}
-
-	public void memoryBlockRenderingAdded(final IMemoryRendering rendering) {
-
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				
-				if (isDisposed())
-					return;
-				
-				if (fAddedRenderings.contains(rendering))
-					return;
-
-				IMemoryBlock memoryblk = rendering.getMemoryBlock();
-
-				TabFolder tabFolder = (TabFolder) fTabFolderForMemoryBlock.get(memoryblk);
-				
-				if (tabFolder == null)
-				{
-					tabFolder = createFolderForMemoryBlock(memoryblk);
-				}
-
-				if (tabFolder.getItemCount() >= 1) {
-					TabItem[] items = tabFolder.getItems();
-					for (int i=0; i<items.length; i++)
-					{
-						// remove "Create rendering tab"
-						TabItem item = items[i];
-						if (item.getData() instanceof MemoryViewTab) {
-							MemoryViewTab viewTab = (MemoryViewTab) item.getData();
-							if (viewTab.getRendering() instanceof CreateRendering) {
-								disposeTab(item);
-							}
-						}
-					}
-				}
-				
-				if (tabFolder == fStackLayout.topControl)
-				{
-					// disable current view tab
-					if (getTopMemoryTab() != null) {
-						deactivateRendering(getTopMemoryTab());
-						getTopMemoryTab().setEnabled(false);
-					}						
-				}
-				fAddedRenderings.add(rendering);
-				TabItem tab = new TabItem(tabFolder, SWT.NULL);
-
-				MemoryViewTab viewTab = new MemoryViewTab(tab, rendering,getInstance());
-				tabFolder.setSelection(tabFolder.indexOf(tab));
-				
-				if (tabFolder == fStackLayout.topControl)
-				{
-					setRenderingSelection(viewTab.getRendering());
-
-					// disable top view tab if the view pane is not visible
-					IMemoryViewTab top = getTopMemoryTab();
-					if (top != null)
-						top.setEnabled(fVisible);
-				}
-				else
-				{
-					deactivateRendering(viewTab);
-					viewTab.setEnabled(false);
-				}
-
-				updateToolBarActionsEnablement();
-			}
-		});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.core.memory.IMemoryRenderingListener#MemoryBlockRenderingRemoved(org.eclipse.debug.internal.core.memory.IMemoryRendering)
-	 */
-	public void memoryBlockRenderingRemoved(final IMemoryRendering rendering) {
-		final IMemoryBlock memory = rendering.getMemoryBlock();
-		
-		// need to run the following code on the UI Thread to avoid invalid thread access exception
-		Display.getDefault().asyncExec(new Runnable()
-		{
-			public void run()
-			{
-				if (!fAddedRenderings.contains(rendering))
-					return;
-				
-				fAddedRenderings.remove(rendering);
-				
-				TabFolder tabFolder = (TabFolder) fStackLayout.topControl;
-				
-				if (tabFolder.isDisposed())
-					return;
-				
-				TabItem[] tabs = tabFolder.getItems();
-				boolean foundTab = false;
-				for (int i = 0; i < tabs.length; i++)
-				{
-					IMemoryViewTab viewTab = (IMemoryViewTab) tabs[i].getData();
-					
-					if (tabs[i].isDisposed())
-						continue;
-					
-
-					if (viewTab.getRendering().getMemoryBlock() == memory)
-					{
-						if (viewTab.getRendering() == rendering)
-						{
-							foundTab = true;
-							disposeTab(tabs[i]);
-							break;
-						}
-						
-					}
-				}
-
-				// if a tab is not found in the current top control
-				// this deletion is a result of a debug target termination
-				// find memory from other folder and dispose the view tab
-				if (!foundTab)
-				{
-					Enumeration enumeration = fTabFolderForMemoryBlock.elements();
-					while (enumeration.hasMoreElements())
-					{
-						TabFolder otherTabFolder = (TabFolder) enumeration.nextElement();
-						tabs = otherTabFolder.getItems();
-						IMemoryViewTab viewTab = null;
-						for (int i = 0; i < tabs.length; i++)
-						{
-							viewTab = (IMemoryViewTab) tabs[i].getData();
-							if (viewTab.getRendering().getMemoryBlock() == memory)
-							{
-								if (viewTab.getRendering() == rendering)
-								{
-									foundTab = true;
-									disposeTab(tabs[i]);
-									break;
-								}
-							}
-						}
-					}
-				}
-				IMemoryViewTab top = getTopMemoryTab();
-				
-				// update selection
-				if (top != null)
-					setRenderingSelection(top.getRendering());
-				else
-				{
-					if (tabFolder != fEmptyTabFolder)
-					{
-						IDebugTarget target = memory.getDebugTarget();
-						
-						// do not create if the target is already terminated or if the memory block is removed
-						if (!target.isDisconnected() && !target.isTerminated() && !isMeomryBlockRemoved(memory))
-						{
-							TabItem newItem = new TabItem(tabFolder, SWT.NULL);
-							CreateRendering createRendering = new CreateRendering(getInstance());
-							createRendering.init(getInstance(), memory);
-							
-							MemoryViewTab viewTab = new MemoryViewTab(newItem, createRendering, getInstance());
-							tabFolder.setSelection(0);
-							setRenderingSelection(viewTab.getRendering());
-						}
-					}
-				}
-					
-				updateToolBarActionsEnablement();
-			}
-		});
-		
-	}
-	
-	/**
-	 * @param memoryBlock
-	 * @return if this memory block is removed
-	 */
-	private boolean isMeomryBlockRemoved(IMemoryBlock memoryBlock)
-	{
-		IMemoryBlockRetrieval retrieval = getMemoryBlockRetrieval(memoryBlock);
-		IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
-		boolean removed = true;
-		
-		for (int i=0; i<memoryBlocks.length; i++)
-		{
-			if (memoryBlocks[i] == memoryBlock)
-				removed = false;
-		}
-		
-		return removed;
-	}
-	
-	
-	/**
-	 * @param viewTab
-	 */
-	protected void setRenderingSelection(IMemoryRendering rendering) {
-
-	 	if (rendering != null)
-	 	{	
-	 		fSelectionProvider.setSelection(new StructuredSelection(rendering));
-	 	}
-	}
-	
-	private void restoreViewTabs(IMemoryRendering[] renderings)
-	{
-		for (int i=0; i<renderings.length; i++)
-		{
-			memoryBlockRenderingAdded(renderings[i]);
-		}
-	}
-	
-	private void handleDebugElementSelection(final IMemoryViewTab lastViewTab, final IDebugElement element)
-	{	
-		// get current memory block retrieval and debug target
-		IMemoryBlockRetrieval currentRetrieve = null;
-		
-		// get tab folder
-		TabFolder tabFolder = (TabFolder) fStackLayout.topControl;
-		
-		// get memory block
-		IMemoryBlock currentBlock = (IMemoryBlock)fMemoryBlockFromTabFolder.get(tabFolder);
-		
-		if (currentBlock != null)
-		{	
-			currentRetrieve = (IMemoryBlockRetrieval)currentBlock.getAdapter(IMemoryBlockRetrieval.class);
-			
-			if (currentRetrieve == null)
-			{
-				currentRetrieve = currentBlock.getDebugTarget();
-			}
-			
-			// backup current retrieve and tab folder
-			if (currentRetrieve != null && tabFolder != null)
-			{
-				fTabFolderForDebugView.put(currentRetrieve, tabFolder);
-			}
-		}
-		
-		// find the folder associated with the given IMemoryBlockRetrieval
-		IMemoryBlockRetrieval retrieve = (IMemoryBlockRetrieval)element.getAdapter(IMemoryBlockRetrieval.class);
-		IDebugTarget debugTarget = element.getDebugTarget();
-		
-		// if IMemoryBlockRetrieval is null, use debugtarget
-		if (retrieve == null)
-			retrieve = debugTarget;
-
-		// if debug target has changed
-		// switch to that tab folder
-		if (retrieve != currentRetrieve)
-		{	
-			TabFolder folder = (TabFolder)fTabFolderForDebugView.get(retrieve);
-			
-			if (folder != null)
-			{	
-				setTabFolder(folder);
-				fTabFolderForDebugView.put(retrieve, folder);
-				fViewPaneCanvas.layout();
-			}
-			else
-			{	
-				// find out if there is any memory block for this debug target
-				// and set up tab folder for the memory blocks
-				IMemoryBlock blocks[] = MemoryViewUtil.getMemoryBlockManager().getMemoryBlocks(retrieve);
-				
-				if (blocks.length > 0)
-				{	
-					handleMemoryBlockSelection(null, blocks[0]);
-				}
-				else
-				{	
-					emptyFolder();
-					fTabFolderForDebugView.put(retrieve, fEmptyTabFolder);
-					fViewPaneCanvas.layout();
-				}
-			}
-		}
-		
-		// disable last view tab as it becomes hidden
-		IMemoryViewTab newViewTab = getTopMemoryTab();
-
-		if (lastViewTab != null && lastViewTab != newViewTab)
-		{
-			lastViewTab.setEnabled(false);
-		}
-
-		if (newViewTab != null)
-		{
-			// if new view tab is not already enabled, enable it
-			if (!newViewTab.isEnabled())
-			{
-				// if the view tab is visible, enable it
-				if (fVisible)
-				{
-					newViewTab.setEnabled(fVisible);
-				}					
-			}
-			
-			// should only change selection if the new view tab is different
-			if (lastViewTab != newViewTab)
-				setRenderingSelection(newViewTab.getRendering());
-		}	
-		//set toolbar actions enabled/disabled
-		updateToolBarActionsEnablement();
-	}
-	
-	protected void addListeners() {
-		super.addListeners();
-		
-		// must directly listen for selection events from parent's selection provider
-		// to ensure that we get the selection event from the tree viewer pane even
-		// if the view does not have focuse
-		fParent.getSite().getSelectionProvider().addSelectionChangedListener(this);
-	}
-	protected void removeListeners() {
-		super.removeListeners();
-		fParent.getSite().getSelectionProvider().removeSelectionChangedListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		
-		if (getTopMemoryTab() == null)
-			return;
-		
-		IMemoryRendering rendering = getTopMemoryTab().getRendering();
-		
-		if (rendering != null)
-		{
-			fSelectionProvider.setSelection(new StructuredSelection(rendering));
-		}
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-	}
-	
-	public Object getCurrentSelection() {
-		if (getTopMemoryTab() != null)
-			if (getTopMemoryTab().getRendering() != null)
-				return getTopMemoryTab().getRendering();
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.extended.ui.IMemoryView#getAllViewTabs()
-	 */
-	public IMemoryViewTab[] getAllViewTabs() {
-		
-		// otherwise, find the view tab to display
-		TabFolder folder = (TabFolder) fStackLayout.topControl;
-		TabItem[] items = folder.getItems();
-		
-		IMemoryViewTab[] viewTabs = new IMemoryViewTab[folder.getItemCount()];
-		
-		for(int i=0; i<items.length; i++){
-			viewTabs[i] = (IMemoryViewTab)items[i].getData();
-		}
-		
-		return viewTabs;
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.extended.ui.IMemoryView#moveToTop(com.ibm.debug.extended.ui.IMemoryViewTab)
-	 */
-	public void moveToTop(IMemoryViewTab viewTab) {
-		
-		IMemoryViewTab lastViewTab = getTopMemoryTab();
-		
-		if (viewTab == lastViewTab)
-			return;
-		
-		// otherwise, find the view tab to display
-		TabFolder folder = (TabFolder) fStackLayout.topControl;
-		TabItem[] items = folder.getItems();
-
-		for (int i = 0; i < items.length; i++) {
-			IMemoryViewTab tab =
-				(IMemoryViewTab) items[i].getData();
-			if (viewTab == tab) {
-
-				boolean isEnabled = lastViewTab.isEnabled();
-
-				// switch to that viewTab
-				lastViewTab.setEnabled(false);
-				folder.setSelection(i);
-				
-				setRenderingSelection(tab.getRendering());
-				
-				getTopMemoryTab().setEnabled(isEnabled && fVisible);
-				break;
-			}
-		}
-	}
-
-	public void restoreViewPane() {
-		
-		// get current selection from memory view
-		
-		ISelection selection = null;
-		if (fParent.getSite().getSelectionProvider() != null)
-			selection = fParent.getSite().getSelectionProvider().getSelection();
-		
-		IMemoryBlock memoryBlock = null;
-		if (selection != null)
-		{
-			memoryBlock = getMemoryBlock(selection);
-		}
-		
-		if (memoryBlock == null)
-		{	
-			// get selection from this view
-			selection = fSelectionProvider.getSelection();
-			
-			if (MemoryViewUtil.isValidSelection(selection))
-			{	
-				Object elem = ((IStructuredSelection)selection).getFirstElement();
-
-				if (!(elem instanceof IMemoryBlock))
-					return;
-				
-				memoryBlock = (IMemoryBlock)elem;								
-			}
-		}
-		
-		if (memoryBlock == null)
-		{
-			// get a memory block from current debug context
-			IAdaptable context = DebugUITools.getDebugContext();
-			if (context != null)
-			{
-				IMemoryBlockRetrieval retrieval = (IMemoryBlockRetrieval)context.getAdapter(IMemoryBlockRetrieval.class);
-				if (retrieval == null && context instanceof IDebugElement)
-				{
-					retrieval = ((IDebugElement)context).getDebugTarget();
-				}
-				if (retrieval != null)
-				{
-					IMemoryBlock[] blocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
-					if (blocks.length > 0)
-						memoryBlock = blocks[0];
-				}
-			}
-		}
-		
-		if (memoryBlock != null)
-		{	
-			if (!fTabFolderForMemoryBlock.containsKey(memoryBlock))
-			{
-				// create tab folder if a tab folder does not already exist
-				// for the memory block
-				TabFolder folder = new TabFolder(fViewPaneCanvas, SWT.NULL);
-				
-				fTabFolderForMemoryBlock.put(memoryBlock, folder);
-				fMemoryBlockFromTabFolder.put(folder, memoryBlock);
-				setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memoryBlock));
-				fTabFolderForDebugView.put(getMemoryBlockRetrieval(memoryBlock), fTabFolderForMemoryBlock.get(memoryBlock));
-				fViewPaneCanvas.layout();
-				fAddedMemoryBlocks.add(memoryBlock);
-			}
-			
-			if (fTabFolderForMemoryBlock.containsKey(memoryBlock))
-			{
-				TabFolder toDisplay = (TabFolder)fTabFolderForMemoryBlock.get(memoryBlock);
-				
-				if (toDisplay != null)
-				{
-					setTabFolder(toDisplay);
-					fTabFolderForDebugView.put(getMemoryBlockRetrieval(memoryBlock), toDisplay);
-					fViewPaneCanvas.layout();
-					
-					// restore view tabs
-					IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memoryBlock);
-					
-					if (toDisplay.getItemCount() == 0 || (getTopMemoryTab().getRendering() instanceof CreateRendering))
-					{
-						restoreViewTabs(renderings);
-					}
-				}
-			}
-			
-			// disable current storag block
-		
-			IMemoryViewTab top = getTopMemoryTab();
-		
-			if (top != null)
-			{
-				top.setEnabled(fVisible);
-			}
-			else
-			{
-				TabFolder folder = (TabFolder)fStackLayout.topControl;
-				if (folder != fEmptyTabFolder)
-				{
-					TabItem newItem = new TabItem(folder, SWT.NULL);
-					CreateRendering rendering = new CreateRendering(this);
-					rendering.init(getInstance(), memoryBlock);
-					new MemoryViewTab(newItem, rendering, this);
-					folder.setSelection(0);
-					setRenderingSelection(rendering);
-				}
-			}
-		}
-	}
-	
-	public void dispose() {
-		fIsDisposed = true;
-		super.dispose();
-		fAddMemoryRenderingAction.dispose();
-		
-		fTabFolderForMemoryBlock.clear();
-		fTabFolderForMemoryBlock = null;
-		
-		fMemoryBlockFromTabFolder.clear();
-		fMemoryBlockFromTabFolder = null;
-		
-		fRenderingMgr.dispose();
-		fRenderingMgr = null;
-		
-		fAddedMemoryBlocks.clear();
-		fAddedRenderings.clear();
-	}	
-	
-	public Control createViewPane(Composite parent, String paneId, String label) {
-		Control control =  super.createViewPane(parent, paneId, label);
-		fRenderingMgr = new ViewPaneRenderingMgr(this);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".MemoryRenderingView_context"); //$NON-NLS-1$
-		return control;
-	}
-	
-	public IAction[] getActions() {
-		ArrayList actions = new ArrayList();
-		
-		if (fAddMemoryRenderingAction == null)
-			fAddMemoryRenderingAction = new AddMemoryRenderingAction(this);
-		actions.add(fAddMemoryRenderingAction);
-		
-		if (fRemoveMemoryRenderingAction == null)
-			fRemoveMemoryRenderingAction = new RemoveMemoryRenderingAction(this);
-		
-		fRemoveMemoryRenderingAction.setEnabled(false);
-		actions.add(fRemoveMemoryRenderingAction);
-		
-		return (IAction[])actions.toArray(new IAction[actions.size()]);
-	}
-	
-	// enable/disable toolbar action 
-	protected void updateToolBarActionsEnablement()
-	{
-		IDebugTarget target = getSelectedDebugTarget();
-		if (target != null)
-		{	
-			ISelection selection = fSelectionProvider.getSelection();
-			if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
-			{
-				Object sel = ((IStructuredSelection)selection).getFirstElement();
-				if (sel instanceof CreateRendering)
-					fRemoveMemoryRenderingAction.setEnabled(false);
-				else
-					fRemoveMemoryRenderingAction.setEnabled(true);						
-			}
-			else
-			{
-				fRemoveMemoryRenderingAction.setEnabled(false);
-			}
-		}
-		else
-		{	
-			fRemoveMemoryRenderingAction.setEnabled(false);
-		}
-	}
-	
-	private IDebugTarget getSelectedDebugTarget()
-	{
-		Object context = DebugUITools.getDebugContext();
-		if (context != null && context instanceof IDebugElement)
-		{
-			return ((IDebugElement)context).getDebugTarget();
-		}
-        return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.AbstractMemoryViewPane#emptyFolder()
-	 */
-	protected void emptyFolder() {
-		super.emptyFolder();
-		updateToolBarActionsEnablement();
-		fSelectionProvider.setSelection(AbstractMemoryViewPane.EMPTY);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IRenderingViewPane#addMemoryRendering(org.eclipse.debug.internal.ui.views.memory.IMemoryRendering)
-	 */
-	public void addMemoryRendering(IMemoryRendering rendering) {
-		
-		if (rendering == null)
-			return;
-
-		memoryBlockRenderingAdded(rendering);
-		fRenderingMgr.addMemoryBlockRendering(rendering);
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IRenderingViewPane#removeMemoryRendering(org.eclipse.debug.internal.ui.views.memory.IMemoryRendering)
-	 */
-	public void removeMemoryRendering(IMemoryRendering rendering) {
-		
-		if (rendering == null)
-			return;
-		
-		memoryBlockRenderingRemoved(rendering);
-		
-		if (fRenderingMgr != null)
-			fRenderingMgr.removeMemoryBlockRendering(rendering);
-		
-	}
-	
-	private RenderingViewPane getInstance()
-	{
-		return this;
-	}
-	
-	private IMemoryBlock getMemoryBlock(ISelection selection)
-	{
-		if (!(selection instanceof IStructuredSelection))
-			return null;
-
-		//only single selection of PICLDebugElements is allowed for this action
-		if (selection.isEmpty() || ((IStructuredSelection)selection).size() > 1)
-		{
-			return null;
-		}
-
-		Object elem = ((IStructuredSelection)selection).getFirstElement();
-		
-		if (elem instanceof IMemoryBlock)
-			return (IMemoryBlock)elem;
-		else if (elem instanceof IMemoryRendering)
-			return ((IMemoryRendering)elem).getMemoryBlock();
-		else
-			return null;
-	}
-	
-	private void deactivateRendering(IMemoryViewTab viewTab)
-	{
-		if (viewTab == null)
-			return;
-
-		if (!viewTab.isDisposed())
-		{		
-			viewTab.getRendering().deactivated();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.IRenderingViewPane#getMemoryRenderingSite()
-	 */
-	public IMemoryRenderingSite getMemoryRenderingSite() {
-		return fRenderingSite;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingContainer#getId()
-	 */
-	public String getId() {
-		return getPaneId();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingContainer#getRenderings()
-	 */
-	public IMemoryRendering[] getRenderings() {
-		return fRenderingMgr.getRenderings();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingContainer#getActiveRendering()
-	 */
-	public IMemoryRendering getActiveRendering() {
-		if (getTopMemoryTab() == null)
-			return null;
-		return getTopMemoryTab().getRendering();
-	}
-	
-	/**
-	 * Reset the memory renderings within this view pane.
-	 * @param memoryBlock - reset renderings associated with the given memory block
-	 * @param resetVisible - reset what's currently visible if the parameter is true.
-	 * Otherwise, the view pane will reset all renderings associated with the given 
-	 * memory block.
-	 */
-	public void resetRenderings(IMemoryBlock memoryBlock, boolean resetVisible)
-	{
-		// if we only reset what's visible and the view pane is not visible
-		// do nothing.
-		if (resetVisible && !isVisible())
-			return;
-		
-		if(resetVisible)
-		{
-			IMemoryRendering rendering = getActiveRendering();
-			if (rendering != null)
-			{
-				if (rendering.getMemoryBlock() == memoryBlock)
-				{
-					if (rendering instanceof IResettableMemoryRendering)
-					{
-						IResettableMemoryRendering resettableRendering = (IResettableMemoryRendering)rendering;
-						try {
-							resettableRendering.resetRendering();
-						} catch (DebugException e) {
-							// do not pop up error message
-							// error message is annoying where there are multiple rendering
-							// panes and renderings to reset
-						}
-					}
-				}
-			}
-		}
-		else
-		{
-			// get all renderings associated with the given memory block
-			IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memoryBlock);
-			
-			// back up current synchronization provider
-			IMemoryRendering originalProvider = null;
-			IMemoryRenderingSynchronizationService service = getMemoryRenderingSite().getSynchronizationService();
-			if (service != null)
-				originalProvider = service.getSynchronizationProvider();
-			
-			for (int i=0; i<renderings.length; i++)
-			{
-				if (renderings[i] instanceof IResettableMemoryRendering)
-				{
-					try {
-						
-						// This is done to allow user to select multiple memory monitors and 
-						// reset their renderings.
-						// In this case, a hidden rendering will not be the sync provider to the sync
-						// service.  When the reset happens, the top visible address and selected
-						// address is not updated in the sync service.  When the rendering later
-						// becomes visible, the rendering gets the sync info from the sync service
-						// and will try to sync up with old information, giving user the impression
-						// that the rendering was never reset.  By forcing the rendering that we
-						// are trying to reset as the synchronization provider, we ensure that
-						// the rendering is able to update its sync info even though the rendering
-						// is currently hidden.
-						if (service != null)
-							service.setSynchronizationProvider(renderings[i]);
-						((IResettableMemoryRendering)renderings[i]).resetRendering();
-					} catch (DebugException e) {
-						// do not pop up error message
-						// error message is annoying where there are multiple rendering
-						// panes and renderings to reset
-					}
-				}
-			}
-			
-			// restore synchronization provider
-			if (service != null)
-				service.setSynchronizationProvider(originalProvider);
-		}
-	}
-	
-	private boolean isDisposed()
-	{
-		return fIsDisposed;
-	}
-
-	public void contextActivated(final ISelection selection) {
-		
-		UIJob job = new UIJob("contextActivated"){ //$NON-NLS-1$
-			public IStatus runInUIThread(IProgressMonitor monitor) 
-			{
-				if (isDisposed())
-					return Status.OK_STATUS;
-				
-				IMemoryViewTab lastViewTab = getTopMemoryTab();
-				
-				if (MemoryViewUtil.isValidSelection(selection))
-				{
-					if (!(selection instanceof IStructuredSelection))
-						return Status.OK_STATUS;
-
-					Object elem = ((IStructuredSelection)selection).getFirstElement();
-					
-					if (elem instanceof IDebugElement)
-					{	
-						handleDebugElementSelection(lastViewTab, (IDebugElement)elem);
-					}
-				}
-				else
-				{
-					if (lastViewTab != null)
-						lastViewTab.setEnabled(false);
-					
-					if (fStackLayout.topControl != fEmptyTabFolder)
-						emptyFolder();
-					
-				}
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-
-	/**
-	 * @param memory
-	 */
-	private TabFolder createFolderForMemoryBlock(IMemoryBlock memory) {
-		TabFolder folder =  new TabFolder(fViewPaneCanvas, SWT.NULL);
-		
-		fTabFolderForMemoryBlock.put(memory, folder);
-		fMemoryBlockFromTabFolder.put(folder, memory);
-		fTabFolderForDebugView.put(getMemoryBlockRetrieval(memory), folder);
-		
-		// check renderings, only create if there is no rendering
-		IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memory);
-		if (renderings.length == 0)
-		{
-			TabItem newItem = new TabItem(folder, SWT.NULL);
-			CreateRendering rendering = new CreateRendering(getInstance());
-			rendering.init(getInstance(), memory);
-			new MemoryViewTab(newItem, rendering, getInstance());
-			folder.setSelection(0);
-		}
-		
-		return folder;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextListener#contextEvent(org.eclipse.debug.internal.ui.contexts.provisional.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			contextActivated(event.getContext());
-		}
-		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ResetMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ResetMemoryBlockAction.java
deleted file mode 100644
index ebcb680..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ResetMemoryBlockAction.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * The popup menu action for a memory rendering used to reset the current selection
- * to the default first memory position
- * 
- * @since 3.2.0
- */
-public class ResetMemoryBlockAction  implements IViewActionDelegate{
-
-	private IViewPart fView;
-	private ArrayList fSelectedMB = new ArrayList();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView = view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (fSelectedMB.isEmpty()) {
-			return;
-		}
-		boolean resetVisible = false;
-		String resetPref = DebugUITools.getPreferenceStore().getString(IDebugPreferenceConstants.PREF_RESET_MEMORY_BLOCK);
-		if (resetPref.equals(IDebugPreferenceConstants.RESET_VISIBLE)) {
-			resetVisible = true;
-		}
-		Iterator iter = fSelectedMB.iterator();
-		while(iter.hasNext()) {
-			IMemoryBlock mb = (IMemoryBlock)iter.next();
-			if (fView instanceof MemoryView) {
-				MemoryView memView = (MemoryView)fView;
-				IMemoryRenderingContainer[] containers = memView.getMemoryRenderingContainers();
-				
-				for (int i=0; i<containers.length; i++) {
-					if (containers[i] instanceof RenderingViewPane) {
-						((RenderingViewPane)containers[i]).resetRenderings(mb, resetVisible);
-					}
-				}
-			}
-		}
-	}
-
-	/* (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) {
-		action.setEnabled(!selection.isEmpty());
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection strucSel = (IStructuredSelection) selection;
-			Object[] objs = strucSel.toArray();
-			fSelectedMB.clear();
-			for (int i = 0; i < objs.length; i++) {
-				if (objs[i] instanceof IMemoryBlock)
-					fSelectedMB.add(objs[i]);
-				if (objs[i] instanceof IMemoryRendering)
-					fSelectedMB.add(((IMemoryRendering) objs[i]).getMemoryBlock());
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ResetMemoryBlockPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ResetMemoryBlockPreferencePage.java
deleted file mode 100644
index 1aa8998..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ResetMemoryBlockPreferencePage.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.PlatformUI;
-
-public class ResetMemoryBlockPreferencePage extends FieldEditorPreferencePage{
-	
-	public ResetMemoryBlockPreferencePage()
-	{
-		super(FieldEditorPreferencePage.GRID);
-		setPreferenceStore(DebugUITools.getPreferenceStore());
-		setTitle(DebugUIMessages.ResetMemoryBlockPreferencePage_0);
-	}
-	
-
-	protected void createFieldEditors() {
-		RadioGroupFieldEditor editor = new RadioGroupFieldEditor(IDebugPreferenceConstants.PREF_RESET_MEMORY_BLOCK, DebugUIMessages.ResetMemoryBlockPreferencePage_1, 1, new String[][] {{DebugUIMessages.ResetMemoryBlockPreferencePage_2, IDebugPreferenceConstants.RESET_VISIBLE},{DebugUIMessages.ResetMemoryBlockPreferencePage_3, IDebugPreferenceConstants.RESET_ALL}}, getFieldEditorParent());
-		addField(editor);
-	}
-	
-	protected Control createContents(Composite parent) {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".resetMemoryMonitor_preference_page_context"); //$NON-NLS-1$
-		return super.createContents(parent);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RetargetAddMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RetargetAddMemoryBlockAction.java
deleted file mode 100644
index dfa60c0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RetargetAddMemoryBlockAction.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.actions.IAddMemoryBlocksTarget;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-
-/**
- * This is the retargettable add memory block action in the Memory View.
- * All AddMemoryBlock actions in the view will use this action to make sure
- * that clients can override the "Add Memory Monitor" dialog. 
- *
- */
-public class RetargetAddMemoryBlockAction extends AddMemoryBlockAction {
-
-	public RetargetAddMemoryBlockAction(IMemoryRenderingSite site)
-	{
-		super(site);
-	}
-	
-	public RetargetAddMemoryBlockAction(IMemoryRenderingSite site, boolean addDefaultRenderings)
-	{
-		super(site, addDefaultRenderings);
-	}
-	
-	public RetargetAddMemoryBlockAction(String text, int style, IMemoryRenderingSite site)
-	{
-		super(text, style, site);
-	}
-
-	public void run() {
-		//	get current selection from Debug View
-		Object debugContext = DebugUITools.getDebugContext();
-		IAddMemoryBlocksTarget target = getAddMemoryBlocksTarget(debugContext);
-		
-		if (target != null)
-		{
-			try {
-				if (target.supportsAddMemoryBlocks(getMemoryView()))
-				{
-					target.addMemoryBlocks(getMemoryView(), getMemoryView().getSite().getSelectionProvider().getSelection());
-				}
-				else
-					super.run();
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.RetargetAddMemoryBlockAction_0, ActionMessages.RetargetAddMemoryBlockAction_1, e);
-			}
-		}
-		else	
-		{
-			super.run();
-		}
-	}
-
-	protected void updateAction(Object debugContext) {
-		
-		try {
-			IAddMemoryBlocksTarget target = getAddMemoryBlocksTarget(debugContext);
-			
-			if (target != null)
-			{
-				if (target.supportsAddMemoryBlocks(getMemoryView()))
-				{
-					if (getMemoryView().getSite().getSelectionProvider() != null)
-						setEnabled(target.canAddMemoryBlocks(getMemoryView(), getMemoryView().getSite().getSelectionProvider().getSelection()));
-					else
-						super.updateAction(debugContext);
-				}
-				else
-					super.updateAction(debugContext);
-			}
-			else
-			{
-				super.updateAction(debugContext);
-			}
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}
-	}
-	
-	private IAddMemoryBlocksTarget getAddMemoryBlocksTarget(Object debugContext)
-	{
-		IMemoryBlockRetrieval standardMemRetrieval = MemoryViewUtil.getMemoryBlockRetrieval(debugContext);
-		
-		if (standardMemRetrieval == null)
-			return null;
-		
-		IAddMemoryBlocksTarget target = null;
-		
-		if (standardMemRetrieval instanceof IAddMemoryBlocksTarget)
-		{
-			target = (IAddMemoryBlocksTarget) standardMemRetrieval;
-		}
-		else if (standardMemRetrieval instanceof IAdaptable)
-		{
-			target = (IAddMemoryBlocksTarget)((IAdaptable)standardMemRetrieval).getAdapter(IAddMemoryBlocksTarget.class);
-		}
-		return target;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SetPaddedStringPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SetPaddedStringPreferencePage.java
deleted file mode 100644
index 559c20c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SetPaddedStringPreferencePage.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.StringFieldEditor;
-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.PlatformUI;
-
-public class SetPaddedStringPreferencePage extends FieldEditorPreferencePage {
-	
-	private StringFieldEditor fPaddedString;
-
-	public SetPaddedStringPreferencePage()
-	{
-		super(FieldEditorPreferencePage.GRID);
-		setPreferenceStore(DebugUITools.getPreferenceStore());
-		setTitle(DebugUIMessages.SetPaddedStringDialog_0);
-		
-	}
-
-	protected void createFieldEditors() {
-		fPaddedString = new StringFieldEditor(IDebugUIConstants.PREF_PADDED_STR, DebugUIMessages.SetPaddedStringPreferencePage_0, getFieldEditorParent());
-		fPaddedString.setEmptyStringAllowed(false);
-		fPaddedString.setTextLimit(5);
-		addField(fPaddedString);
-	}
-
-	protected Label createDescriptionLabel(Composite parent) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(DebugUIMessages.SetPaddedStringDialog_1);
-		return label;
-	}
-
-	protected Control createContents(Composite parent) {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".SetPaddedStrDialog_context"); //$NON-NLS-1$
-		return super.createContents(parent);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java
deleted file mode 100644
index 2c3cfe2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java
+++ /dev/null
@@ -1,419 +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.debug.internal.ui.views.memory;
-
-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.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IMemoryBlockListener;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ILabelDecorator;
-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.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * The switch memory block action, used 
- */
-public class SwitchMemoryBlockAction extends Action implements IViewActionDelegate, IActionDelegate2 {
-
-	/**
-	 * A job that updates the enablement of the of the backing action delegate in the UI thread
-	 * 
-	 * @since 3.3.0
-	 */
-	class UpdateActionEnablementJob extends UIJob {
-
-		/**
-		 * Constructor
-		 */
-		public UpdateActionEnablementJob() {
-			super("Update Action Enablement"); //$NON-NLS-1$
-			setSystem(true);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			if (fAction != null) {
-				IAdaptable context = DebugUITools.getDebugContext();
-				if (context != null) {
-					IMemoryBlockRetrieval retrieval = null;
-					if (context.getAdapter(IMemoryBlockRetrieval.class) != null) {
-						retrieval = (IMemoryBlockRetrieval)context.getAdapter(IMemoryBlockRetrieval.class);
-					}
-					if (retrieval == null) {
-						if(context instanceof IMemoryBlockRetrieval) {
-							retrieval = (IMemoryBlockRetrieval)context;
-						}
-						else if(context instanceof IDebugElement) {
-							retrieval = ((IDebugElement)context).getDebugTarget();
-						}
-					}
-					if (retrieval != null) {
-						IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
-						fAction.setEnabled(memoryBlocks.length > 0);
-						return Status.OK_STATUS;
-					}
-					else if (getViewer() != null) {
-						Object input = getViewer().getInput();
-						if (input instanceof IMemoryBlockRetrieval) {
-							retrieval = (IMemoryBlockRetrieval)input;
-							IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
-							fAction.setEnabled(memoryBlocks.length > 0);
-							return Status.OK_STATUS;
-						}
-					}
-				}
-				fAction.setEnabled(false);
-			}
-			return Status.CANCEL_STATUS;
-		}
-	}
-	
-	private IViewPart fView;
-	private MenuCreator fMenuCreator;
-	private IAction fAction;
-	private UpdateActionEnablementJob fUpdateJob = new UpdateActionEnablementJob();
-	
-	/**
-	 * Memoryblock listener to update action delegate enablement
-	 */
-	private IMemoryBlockListener fListener = new IMemoryBlockListener() {
-		public void memoryBlocksAdded(IMemoryBlock[] memory) {
-			if (fAction != null) {
-				fUpdateJob.schedule();
-			}
-		}
-
-		public void memoryBlocksRemoved(IMemoryBlock[] memory) {
-			if (fAction != null) {
-				fUpdateJob.schedule();
-			}
-		}
-	};
-	
-	/**
-	 * Listens for debug context changes and updates action delegate enablement
-	 */
-	private IDebugContextListener fDebugContextListener = new IDebugContextListener() {
-		public void debugContextChanged(DebugContextEvent event) {
-			if (fAction != null) {		
-				fUpdateJob.schedule();
-			}
-		}
-	};
-	
-	/**
-	 * Switch tab folder for fMemoryBlock to the top in Memory Rendering View
-	 */
-	class SwitchToAction extends Action {
-		private IMemoryBlock fMemoryblock;
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			if (fView == null) {
-				return;
-			}
-			// tell the view to switch memory block
-			fView.getSite().getSelectionProvider().setSelection(new StructuredSelection(fMemoryblock));
-		}
-
-		public SwitchToAction(final IMemoryBlock memBlk, boolean buildLabel) {
-			super();
-			if (buildLabel) {
-				setText(DebugUIMessages.SwitchMemoryBlockAction_4);
-				Job job = new Job("SwtichToAction"){ //$NON-NLS-1$
-					protected IStatus run(IProgressMonitor monitor) {
-						getLabels(memBlk);
-						return Status.OK_STATUS;
-					}}; 
-				job.setSystem(true);
-				job.schedule();
-			}
-			fMemoryblock = memBlk;
-		}
-		
-		public SwitchToAction(final IMemoryBlock memBlk, String label) {
-			super(label);
-			fMemoryblock = memBlk;
-		}
-		
-		private void getLabels(final IMemoryBlock memBlk) {
-			StringBuffer text = new StringBuffer(""); //$NON-NLS-1$
-			String label = new String(""); //$NON-NLS-1$
-			if (memBlk instanceof IMemoryBlockExtension) {
-				String expression = ((IMemoryBlockExtension)memBlk).getExpression();
-				if (expression == null) {
-					expression = DebugUIMessages.SwitchMemoryBlockAction_0;
-				}
-				text.append(expression);
-			}
-			else {
-				long address = memBlk.getStartAddress();
-				text.append(Long.toHexString(address));
-			}
-			
-			label = text.toString();
-			label = decorateLabel(memBlk, label);
-
-			final String finalLabel = label;
-			WorkbenchJob job = new WorkbenchJob("SwtichToAction Update Label") { //$NON-NLS-1$
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					SwitchToAction.super.setText(finalLabel);
-					return Status.OK_STATUS;
-				}};
-			job.setSystem(true);
-			job.schedule();
-		}
-	}
-	
-	/**
-	 * Menu creator for the action
-	 */
-	class MenuCreator implements IMenuCreator {
-		Menu dropdown;
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-		 */
-		public void dispose() {
-			if (dropdown != null)
-				dropdown.dispose();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-		 */
-		public Menu getMenu(Control parent) {
-			if (dropdown != null) {	
-				dropdown.dispose();
-				dropdown = null;
-			}
-			if (dropdown == null) {	
-				dropdown =  new Menu(parent);
-
-				// get all memory blocks from tree viewer
-				IMemoryBlock[] allMemoryBlocks = null;
-				
-				// get selection from memory view
-				IMemoryBlock memoryBlock = getCurrentMemoryBlock();
-			
-				Object context = DebugUITools.getDebugContext();
-				IMemoryBlockRetrieval retrieval =  MemoryViewUtil.getMemoryBlockRetrieval(context);
-				if (retrieval != null) {
-					allMemoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
-				}
-				if (allMemoryBlocks != null) {
-					for (int i=0; i<allMemoryBlocks.length; i++) {	
-						SwitchToAction action = new SwitchToAction(allMemoryBlocks[i], true);
-						if (allMemoryBlocks[i] == memoryBlock) {
-							action.setChecked(true);
-						}
-						ActionContributionItem item = new ActionContributionItem(action);
-						item.fill(dropdown, -1);
-						item.getAction().setChecked(true);
-					}
-				}
-			}
-			return dropdown;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-		 */
-		public Menu getMenu(Menu parent) {
-			return null;
-		}
-		
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView = view;
-		DebugUITools.getDebugContextManager().getContextService(fView.getViewSite().getWorkbenchWindow()).addDebugContextListener(fDebugContextListener);
-		DebugPlugin.getDefault().getMemoryBlockManager().addListener(fListener);
-		fUpdateJob.runInUIThread(new NullProgressMonitor());
-	}
-	
-	/**
-	 * Returns the current memory blocks tree viewer, or <code>null</code>
-	 * @return the memory blocks tree viewer or <code>null</code>
-	 */
-	private StructuredViewer getViewer() {
-		if (fView instanceof MemoryView) {
-			MemoryView memView = (MemoryView)fView;
-			IMemoryViewPane pane = memView.getViewPane(MemoryBlocksTreeViewPane.PANE_ID);
-			if (pane instanceof MemoryBlocksTreeViewPane) {
-				 StructuredViewer viewer = ((MemoryBlocksTreeViewPane)pane).getViewer();
-				return viewer;
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		switchToNext();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		switchToNext();
-	}
-
-	private void switchToNext() {		
-		IAdaptable context = DebugUITools.getDebugContext();
-		if (context instanceof IDebugElement) {
-			IDebugElement debugContext = (IDebugElement)context;
-			IMemoryBlockRetrieval retrieval = (IMemoryBlockRetrieval)debugContext.getAdapter(IMemoryBlockRetrieval.class);
-			if (retrieval == null) {
-				retrieval = debugContext.getDebugTarget();
-			}
-			if (retrieval != null) {
-				IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
-				doSwitchToNext(memoryBlocks);
-			}
-		}
-	}
-
-	/**
-	 * @param memoryBlocks
-	 */
-	private void doSwitchToNext(IMemoryBlock[] memoryBlocks) {
-		// only run if there is more than one memory block
-		if (memoryBlocks.length > 1) {
-			IMemoryBlock current = getCurrentMemoryBlock();
-			int next = 0;
-			if (current != null) {
-				for (int i=0; i<memoryBlocks.length; i++) {
-					if (memoryBlocks[i] == current) {
-						next = i+1;
-					}
-				}
-			}
-			if (next > memoryBlocks.length-1) {
-				next = 0;
-			}
-			SwitchToAction switchAction = new SwitchToAction(memoryBlocks[next], false);
-			switchAction.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.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		fAction = action;
-		fUpdateJob.runInUIThread(new NullProgressMonitor());
-		fMenuCreator = new MenuCreator();
-		action.setMenuCreator(fMenuCreator);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		fAction = null;
-		DebugPlugin.getDefault().getMemoryBlockManager().removeListener(fListener);
-		DebugUITools.getDebugContextManager().getContextService(fView.getViewSite().getWorkbenchWindow()).removeDebugContextListener(fDebugContextListener);
-		if (fMenuCreator != null) {
-			fMenuCreator.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		switchToNext();
-	}
-
-	/**
-	 * Returns the current memory block
-	 * @return the current memory block or <code>null</code>
-	 */
-	private IMemoryBlock getCurrentMemoryBlock() {
-		if (fView == null) {
-			return null;
-		}
-		ISelection memBlkSelection = fView.getSite().getSelectionProvider().getSelection();
-		IMemoryBlock memoryBlock = null;
-		
-		if (memBlkSelection != null) {	
-			if (!memBlkSelection.isEmpty() && memBlkSelection instanceof IStructuredSelection) {	
-				Object obj = ((IStructuredSelection)memBlkSelection).getFirstElement();
-				if (obj instanceof IMemoryBlock) {	
-					memoryBlock = (IMemoryBlock)obj;
-				}
-				else if (obj instanceof IMemoryRendering) {
-					memoryBlock = ((IMemoryRendering)obj).getMemoryBlock();
-				}
-			}
-		}
-		return memoryBlock;
-	}
-
-	/**
-	 * Decorate the label for the specified <code>IMemoryBlock</code>
-	 * @param memBlk
-	 * @param label
-	 * @return the decorated label for the specified <code>IMemoryBlock</code>
-	 */
-	private String decorateLabel(final IMemoryBlock memBlk, String label) {
-		ILabelDecorator decorator = (ILabelDecorator)memBlk.getAdapter(ILabelDecorator.class);
-		if (decorator != null) {
-			label = decorator.decorateText(label, memBlk);
-		}
-		return label;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java
deleted file mode 100644
index 974b876..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java
+++ /dev/null
@@ -1,115 +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.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-
-
-/**
- * Stores synchronization information for a memory block
- * Each object of synchronization information contains a memory block,
- * a list of views to be synchronized and a list of properties to be syncrhonized.
- * The views are responsible for defining properties to be synchronized and notifying
- * the synchronizer of properties changes.  This is only for keeping track of
- * values of synchronized properties and firing events when properties are changed.
- * 
- * Memory block serves as a key for synchronization.  Views displaying the same
- * memory block can be synchronized.  Views displaying different memory block
- * cannot be synchronized.
- * 
- * @since 3.0
- */
-public class SynchronizeInfo
-{
-	private IMemoryBlock fBlock;			// memory block blocked by the views
-	private Hashtable fProperties;			// list of properties to be synchronized
-
-	/**
-	 * Create a new synchronization info object for the memory block
-	 * @param block
-	 */
-	public SynchronizeInfo(IMemoryBlock block)
-	{
-		fBlock = block;
-		fProperties = new Hashtable();
-	}
-	
-	
-	/**
-	 * Set a property and its value to the info object
-	 * @param propertyId
-	 * @param value
-	 */
-	public void setProperty(String propertyId, Object value)
-	{
-		if (propertyId == null)
-			return;
-			
-		if (value == null)
-			return;
-			
-		fProperties.put(propertyId, value);
-	}
-	
-	/**
-	 * Returns the value of the property from the info object
-	 * @param propertyId
-	 * @return value of the property
-	 */
-	public Object getProperty(String propertyId)
-	{
-		if (propertyId == null)
-			return null;
-			
-		Object value = fProperties.get(propertyId);
-		
-		return value;	
-	}
-	
-	/**
-	 * @return all the property ids stored in this sync info object
-	 */
-	public String[] getPropertyIds()
-	{
-		if (fProperties == null)
-			return new String[0];
-		
-		Enumeration enumeration = fProperties.keys();
-		ArrayList ids = new ArrayList();
-		
-		while (enumeration.hasMoreElements())
-		{
-			ids.add(enumeration.nextElement());
-		}
-		
-		return (String[])ids.toArray(new String[ids.size()]);
-	}
-	
-	/**
-	 * Clean up the synchronization info object
-	 */
-	public void delete()
-	{
-		
-		if (fProperties != null){
-			fProperties.clear();
-			fProperties = null;
-		}
-		
-		if (fBlock != null){
-			fBlock = null;
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleMemoryMonitorsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleMemoryMonitorsAction.java
deleted file mode 100644
index 8595c83..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleMemoryMonitorsAction.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.debug.internal.ui.views.memory;
-
-
-/**
- * Toggles the visiblity of a view pane.
- * @since 3.1
- *
- */
-public class ToggleMemoryMonitorsAction extends ToggleViewPaneAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.ToggleViewPaneAction#getPaneId()
-	 */
-	public String getPaneId() {
-		return MemoryBlocksTreeViewPane.PANE_ID;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleSplitPaneAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleSplitPaneAction.java
deleted file mode 100644
index 68d1474..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleSplitPaneAction.java
+++ /dev/null
@@ -1,29 +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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Toggles the visibility of the rendering view pane 2.
- * @since 3.1
- *
- */
-public class ToggleSplitPaneAction extends ToggleViewPaneAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.ToggleViewPaneAction#getPaneId()
-	 */
-	public String getPaneId() {
-		return IDebugUIConstants.ID_RENDERING_VIEW_PANE_2;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleViewPaneAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleViewPaneAction.java
deleted file mode 100644
index 645c2d7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ToggleViewPaneAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.ui.DebugUITools;
-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.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * @since 3.1
- */
-abstract public class ToggleViewPaneAction  extends Action implements IViewActionDelegate, IActionDelegate2, IPropertyChangeListener {
-
-	MemoryView fView;
-	IAction fAction;
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		if (view instanceof MemoryView)
-		{
-			fView = (MemoryView)view;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		
-		if (fView == null)
-			return;
-		
-		fView.showViewPane(!fView.isViewPaneVisible(getPaneId()), getPaneId());
-		
-		if (fView.isViewPaneVisible(getPaneId()))
-			action.setChecked(true);
-		else
-			action.setChecked(false);
-		
-	}
-	
-	public void run() {
-		if (fView == null)
-			return;
-		
-		fView.showViewPane(!fView.isViewPaneVisible(getPaneId()), getPaneId());
-	}
-
-	/* (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) {
-		if (fView.isViewPaneVisible(getPaneId()))
-			action.setChecked(true);
-		else
-			action.setChecked(false);
-	}
-
-	public void dispose() {
-		DebugUITools.getPreferenceStore().removePropertyChangeListener(this);
-	}
-
-	public void init(IAction action) {
-		fAction = action;
-		DebugUITools.getPreferenceStore().addPropertyChangeListener(this);
-	}
-
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		if (fView != null && fAction != null)
-		{
-			if (fView.isViewPaneVisible(getPaneId()))
-				fAction.setChecked(true);
-			else
-				fAction.setChecked(false);
-		}
-	}
-	
-	abstract public String getPaneId();	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneOrientationAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneOrientationAction.java
deleted file mode 100644
index ae822df..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneOrientationAction.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.debug.internal.ui.views.memory;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-class ViewPaneOrientationAction extends Action 
-{
-		private MemoryView fView;
-		private int fOrientation;
-
-		ViewPaneOrientationAction(MemoryView view, int orientation)
-		{
-			super("", AS_RADIO_BUTTON); //$NON-NLS-1$
-			fView = view;
-			fOrientation = orientation;
-			
-			if (orientation == MemoryView.HORIZONTAL_VIEW_ORIENTATION) {
-				setText(DebugUIMessages.ViewPaneOrientationAction_0);  
-				setToolTipText(DebugUIMessages.ViewPaneOrientationAction_1);    
-				setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_RIGHT));
-				setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_RIGHT));
-				setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DETAIL_PANE_RIGHT));
-			} else if (orientation == MemoryView.VERTICAL_VIEW_ORIENTATION) {
-				setText(DebugUIMessages.ViewPaneOrientationAction_2);  
-				setToolTipText(DebugUIMessages.ViewPaneOrientationAction_3);    
-				setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DETAIL_PANE_UNDER));
-				setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DETAIL_PANE_UNDER));
-				setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DETAIL_PANE_UNDER));
-			} 
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.MEMORY_VIEW_PANE_ORIENTATION_ACTION);
-		}
-
-		public void run() {
-			fView.setViewPanesOrientation(fOrientation);
-		}
-		
-		public int getOrientation()
-		{
-			return fOrientation;
-		}
-	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java
deleted file mode 100644
index 3b2b5a0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.internal.core.LaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A View Pane Rendering Manager manages all the rendering from a view pane.
- * It is responsible for handling debug events and removing renderings
- * from the view pane as a debug session is terminated.
- * In addition, the rendering manager is responsible for persisting memory renderings.
- * Renderings need to be persisted when the memory view is disposed.  If the view is
- * opened again, the same set of renderings will be created in the view pane if 
- * the renderings are still valid.
- * @since 3.1
- */
-public class ViewPaneRenderingMgr implements IDebugEventSetListener{
-
-	private ArrayList fRenderings = new ArrayList();
-	private IMemoryRenderingContainer fViewPane;
-	
-	private static final String RENDERINGS_TAG = "persistedMemoryRenderings"; //$NON-NLS-1$
-	private static final String MEMORY_RENDERING_TAG = "memoryRendering"; //$NON-NLS-1$
-	private static final String MEMORY_BLOCK = "memoryBlock"; //$NON-NLS-1$
-	private static final String RENDERING_ID = "renderingId"; //$NON-NLS-1$
-	
-	public ViewPaneRenderingMgr(IMemoryRenderingContainer viewPane)
-	{
-		fViewPane = viewPane;
-		loadPersistedRenderings(getPrefId());
-	}
-
-	public void removeMemoryBlockRendering(IMemoryBlock mem, String renderingId)
-	{
-		if(fRenderings == null)
-			return;
-		
-		IMemoryRendering[] toRemove = getRenderings(mem, renderingId);
-		
-		for (int i=0; i<toRemove.length; i++)
-		{
-			fRenderings.remove(toRemove[i]);
-			
-			// remove listener after the last memory block has been removed
-			if (fRenderings.size() == 0)
-			{
-				DebugPlugin.getDefault().removeDebugEventListener(this);
-			}
-		}
-		
-		storeRenderings();
-	}
-	
-
-	public void addMemoryBlockRendering(IMemoryRendering rendering) {
-		
-		// do not allow duplicated objects
-		if (fRenderings.contains(rendering))
-			return;
-		
-		fRenderings.add(rendering);
-		
-		// add listener for the first memory block added
-		if (fRenderings.size() == 1)
-		{
-			DebugPlugin.getDefault().addDebugEventListener(this);
-		}
-		
-		storeRenderings();
-	}
-
-
-	public void removeMemoryBlockRendering(IMemoryRendering rendering) {
-		if(rendering == null)
-			return;
-		
-		if(!fRenderings.contains(rendering))
-			return;
-		
-		fRenderings.remove(rendering);
-		
-		// remove listener after the last memory block has been removed
-		if (fRenderings.size() == 0)
-		{
-			DebugPlugin.getDefault().removeDebugEventListener(this);
-		}
-		
-		storeRenderings();
-	}
-
-	public IMemoryRendering[] getRenderings(IMemoryBlock mem, String renderingId)
-	{
-		if (renderingId == null)
-		{
-			return getRenderingsFromMemoryBlock(mem);
-		}
-		
-		ArrayList ret = new ArrayList();
-		for (int i=0; i<fRenderings.size(); i++)
-		{
-			if (fRenderings.get(i) instanceof IMemoryRendering)
-			{
-				IMemoryRendering rendering = (IMemoryRendering)fRenderings.get(i);
-				if (rendering.getMemoryBlock() == mem && renderingId.equals(rendering.getRenderingId()))
-				{
-					ret.add(rendering);
-				}
-			}
-		}
-		
-		return (IMemoryRendering[])ret.toArray(new IMemoryRendering[ret.size()]);
-	}
-	
-	public IMemoryRendering[] getRenderings()
-	{
-		return (IMemoryRendering[])fRenderings.toArray(new IMemoryRendering[fRenderings.size()]);
-	}
-
-	public IMemoryRendering[] getRenderingsFromDebugTarget(IDebugTarget target)
-	{
-		ArrayList ret = new ArrayList();
-		for (int i=0; i<fRenderings.size(); i++)
-		{
-			if (fRenderings.get(i) instanceof IMemoryRendering)
-			{
-				IMemoryRendering rendering = (IMemoryRendering)fRenderings.get(i);
-				if (rendering.getMemoryBlock().getDebugTarget() == target)
-				{
-					ret.add(rendering);
-				}
-			}
-		}
-		
-		return (IMemoryRendering[])ret.toArray(new IMemoryRendering[ret.size()]);
-	}
-	
-
-	public IMemoryRendering[] getRenderingsFromMemoryBlock(IMemoryBlock block)
-	{
-		ArrayList ret = new ArrayList();
-		for (int i=0; i<fRenderings.size(); i++)
-		{
-			if (fRenderings.get(i) instanceof IMemoryRendering)
-			{
-				IMemoryRendering rendering = (IMemoryRendering)fRenderings.get(i);
-				if (rendering.getMemoryBlock() == block)
-				{
-					ret.add(rendering);
-				}
-			}
-		}
-		
-		return (IMemoryRendering[])ret.toArray(new IMemoryRendering[ret.size()]);		
-	}	
-	
-	
-
-	public void handleDebugEvents(DebugEvent[] events) {
-		
-		for (int i=0; i < events.length; i++)
-			handleDebugEvent(events[i]);
-		
-	}
-	
-	public void handleDebugEvent(DebugEvent event) {
-		Object obj = event.getSource();
-		IDebugTarget dt = null;
-		
-		if (event.getKind() == DebugEvent.TERMINATE)
-		{
-			// a terminate event could happen from an IThread or IDebugTarget
-			// Only handle terminate event from debug target
-			if (obj instanceof IDebugTarget)
-			{
-				dt = ((IDebugTarget)obj);
-				
-				// returns empty array if dt == null
-				IMemoryRendering[] deletedrendering = getRenderingsFromDebugTarget(dt);
-				
-				for (int i=0; i<deletedrendering.length; i++)
-				{
-					removeMemoryBlockRendering(deletedrendering[i].getMemoryBlock(), deletedrendering[i].getRenderingId());
-					fViewPane.removeMemoryRendering(deletedrendering[i]);
-				}
-			}
-		}
-	}
-
-	public void dispose()
-	{
-		// remove all renderings
-		fRenderings.clear();
-		
-		String secondaryId = getViewSiteSecondaryId();
-		if (secondaryId != null)
-		{
-			// do not save renderings if this is not the primary rendering view
-			String prefid = getPrefId();
-			Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences();
-			prefs.setToDefault(prefid);
-		}
-			
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-	}
-	
-	/**
-	 * Store renderings as preferences.  If renderings are stored, renderings
-	 * can be persisted even after the memory view is closed.
-	 */
-	private void storeRenderings()
-	{
-		Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences();
-		String renderingsStr= ""; //$NON-NLS-1$
-		try {
-			renderingsStr= getRenderingsAsXML();
-		} catch (IOException e) {
-			DebugUIPlugin.log(e);
-		} catch (ParserConfigurationException e) {
-			DebugUIPlugin.log(e);
-		} catch (TransformerException e) {
-			DebugUIPlugin.log(e);
-		}
-		
-		String prefid = getPrefId();
-		
-		if (renderingsStr != null)
-			prefs.setValue(prefid, renderingsStr);
-		else
-			prefs.setToDefault(prefid);
-	}
-
-	private String getPrefId() {
-		// constructs id based on memory view's secondary id + the rendering view pane id
-		// format:  secondaryId:viewPaneId
-		StringBuffer id = new StringBuffer();
-		IMemoryRenderingSite renderingSite = fViewPane.getMemoryRenderingSite();
-		IWorkbenchPartSite ps = renderingSite.getSite();
-		if (ps instanceof IViewSite)
-		{
-			IViewSite vs = (IViewSite)ps;
-			String secondaryId = vs.getSecondaryId();
-			if (secondaryId != null)
-			{
-				id.append(secondaryId);
-				id.append(":"); //$NON-NLS-1$
-			}
-			
-		}
-		id.append(fViewPane.getId());
-		String prefId = id.toString();
-		return prefId;
-	}
-	
-	/**
-	 * Convert renderings to xml text
-	 * @return
-	 * @throws IOException
-	 * @throws ParserConfigurationException
-	 * @throws TransformerException
-	 */
-	private String getRenderingsAsXML() throws IOException, ParserConfigurationException, TransformerException {
-		IMemoryRendering[] renderings= (IMemoryRendering[])fRenderings.toArray(new IMemoryRendering[fRenderings.size()]);
-		
-		if (renderings.length == 0)
-			return null;
-		
-		Document document= LaunchManager.getDocument();
-		Element rootElement= document.createElement(RENDERINGS_TAG);
-		document.appendChild(rootElement);
-		for (int i = 0; i < renderings.length; i++) {
-			IMemoryRendering rendering= renderings[i];
-			Element element= document.createElement(MEMORY_RENDERING_TAG); 
-			element.setAttribute(MEMORY_BLOCK, Integer.toString(rendering.getMemoryBlock().hashCode()));
-			element.setAttribute(RENDERING_ID, rendering.getRenderingId());
-			rootElement.appendChild(element);
-		}
-		return LaunchManager.serializeDocument(document);
-	}
-
-	/**
-	 * Load renderings currently stored.
-	 */
-	private void loadPersistedRenderings(String prefId) {
-		String renderingsStr= DebugUIPlugin.getDefault().getPluginPreferences().getString(prefId);
-		if (renderingsStr.length() == 0) {
-			return;
-		}
-		Element root;
-		try {
-			root = DebugPlugin.parseDocument(renderingsStr);
-		} catch (CoreException e) {
-			DebugUIPlugin.logErrorMessage("An exception occurred while loading memory renderings."); //$NON-NLS-1$
-			return;
-		}
-		if (!root.getNodeName().equals(RENDERINGS_TAG)) {
-			DebugUIPlugin.logErrorMessage("Invalid format encountered while loading memory renderings."); //$NON-NLS-1$
-			return;
-		}
-		NodeList list= root.getChildNodes();
-		boolean renderingsAdded= false;
-		for (int i= 0, numItems= list.getLength(); i < numItems; i++) {
-			Node node= list.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element element= (Element) node;
-				if (!element.getNodeName().equals(MEMORY_RENDERING_TAG)) {
-					DebugUIPlugin.logErrorMessage("Invalid XML element encountered while loading memory rendering."); //$NON-NLS-1$
-					continue;
-				}
-				String memoryBlockHashCode= element.getAttribute(MEMORY_BLOCK);
-				String renderingId = element.getAttribute(RENDERING_ID);
-				
-				IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks();
-				IMemoryBlock memoryBlock = null;
-				for (int j=0; j<memoryBlocks.length; j++)
-				{
-					if (Integer.toString(memoryBlocks[j].hashCode()).equals(memoryBlockHashCode))
-						memoryBlock = memoryBlocks[j];
-				}
-				
-				if (memoryBlock != null)
-				{
-					IMemoryRenderingType[] types  = DebugUITools.getMemoryRenderingManager().getRenderingTypes(memoryBlock);
-					IMemoryRenderingType type = null;
-					for (int k=0; k<types.length; k++)
-					{
-						if (types[k].getId().equals(renderingId))
-							type = types[k];
-					}
-				
-					// if memory block is not found, the rendering is no longer valid
-					// simply ignore the rendering
-					if (type != null)
-					{
-						try {
-		
-							IMemoryRendering rendering = type.createRendering();
-							if (rendering != null)
-							{
-								rendering.init(fViewPane, memoryBlock);
-								if (!fRenderings.contains(rendering))
-								{
-								    fRenderings.add(rendering);
-								    renderingsAdded= true;
-								}
-							}
-						} catch (CoreException e1) {
-							DebugUIPlugin.log(e1);
-						}
-					}
-				}
-			}
-		}
-		if (renderingsAdded) {
-			DebugPlugin.getDefault().addDebugEventListener(this);
-		}
-	}	
-	
-	/**
-	 * @return secondary id, or null if not available
-	 */
-	private String getViewSiteSecondaryId()
-	{
-		IMemoryRenderingSite renderingSite = fViewPane.getMemoryRenderingSite();
-		IWorkbenchPartSite ps = renderingSite.getSite();
-		if (ps instanceof IViewSite)
-		{
-			IViewSite vs = (IViewSite)ps;
-			String secondaryId = vs.getSecondaryId();
-			return secondaryId;
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneSelectionProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneSelectionProvider.java
deleted file mode 100644
index c375da7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneSelectionProvider.java
+++ /dev/null
@@ -1,77 +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.debug.internal.ui.views.memory;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-
-/**
- * Handles selection changes in a rendering view pane.
- * @since 3.1
- *
- */
-public class ViewPaneSelectionProvider implements ISelectionProvider
-{
-	ArrayList fListeners = new ArrayList();
-	ISelection fSelection;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener)
-	{
-		if (!fListeners.contains(listener))
-			fListeners.add(listener);
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection()
-	{
-		return fSelection;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(ISelectionChangedListener listener)
-	{
-		if (fListeners.contains(listener))
-			fListeners.remove(listener);
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection)
-	{		
-		fSelection = selection;
-		fireChanged();
-	}
-	
-	public void fireChanged()
-	{
-		SelectionChangedEvent evt = new SelectionChangedEvent(this, getSelection());
-		for (int i=0; i<fListeners.size(); i++)
-		{
-			((ISelectionChangedListener)fListeners.get(i)).selectionChanged(evt);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewTabEnablementManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewTabEnablementManager.java
deleted file mode 100644
index e501363..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewTabEnablementManager.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory;
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * Controls view tab enablement based on tab folder selection
- * 
- * @since 3.0
- */
-public class ViewTabEnablementManager implements SelectionListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		if (e.getSource() instanceof TabFolder)
-		{
-			handleTabFolderSelection(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		 
-		
-	}
-	
-	private void handleTabFolderSelection(SelectionEvent event)
-	{
-		TabFolder folder = (TabFolder)event.getSource();
-		
-		TabItem[] selectedItems = folder.getSelection();
-		TabItem selectedItem;
-		IMemoryViewTab selectedViewTab;
-		
-		// get selected view tab
-		if (selectedItems.length > 0)
-		{
-			selectedItem = selectedItems[0];
-			
-			Object obj = selectedItem.getData();
-			
-			if (obj instanceof IMemoryViewTab)
-			{
-				selectedViewTab = (IMemoryViewTab)obj;
-			}
-			else
-			{
-				return;
-			}
-		}
-		else
-		{
-			return;
-		}
-		
-		// get all tabs
-		TabItem[] allTabs = folder.getItems();
-		
-		// check all tabs to make sure they are enabled/disabled properly
-		for (int i=0; i<allTabs.length; i++)
-		{	
-			IMemoryViewTab viewTab;
-			Object obj = allTabs[i].getData();
-			
-			if (obj instanceof IMemoryViewTab)
-			{	
-				viewTab = (IMemoryViewTab)obj;
-				
-				// if view tab matches the selected item
-				if (viewTab == selectedViewTab && !viewTab.isEnabled() )
-				{
-					// if the item has been selected and this tab is not enabled
-					// enable it.
-					viewTab.setEnabled(true);
-					viewTab.getRendering().activated();
-					
-				}
-				else if (viewTab != selectedViewTab && viewTab.isEnabled())
-				{
-					// if the tab is not selected, disable it
-					viewTab.setEnabled(false);
-					viewTab.getRendering().deactivated();
-				}	
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ASCIIRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ASCIIRendering.java
deleted file mode 100644
index 4d2b01e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ASCIIRendering.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTextRendering;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-
-
-
-/**
- * Convert bytes into ASCII string and vice versa
- * @since 3.1
- */
-public class ASCIIRendering extends AbstractAsyncTextRendering{
-	
-	private final int numCharsPerByte = 1;
-	
-
-	public ASCIIRendering(String renderingId)
-	{
-		super(renderingId);
-		String codepage = DebugUITools.getPreferenceStore().getString(IDebugUIConstants.PREF_DEFAULT_ASCII_CODE_PAGE);
-		setCodePage(codepage);
-	}
-	
-	public void dispose() {
-		super.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.AbstractMemoryRendering#getNumCharsPerByte()
-	 */
-	public int getNumCharsPerByte() {
-		return numCharsPerByte;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.AbstractTableRendering#getBytes(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public byte[] getBytes(
-		String renderingId,
-		BigInteger address,
-		MemoryByte[] currentValues,
-		String data) {
-		
-		byte[] bytes =  super.getBytes(renderingId, address, currentValues, data);
-		
-		// undo the replacement of 1's to 0's.
-		for (int i=0; i<bytes.length && i < currentValues.length; i++)
-		{
-			if (bytes[i] == 1 && currentValues[i].getValue() == 0)
-			{
-				bytes[i] = 0;
-			}
-		}
-		
-		return bytes;
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.AbstractTableRendering#getString(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[])
-	 */
-	public String getString(
-		String renderingId,
-		BigInteger address,
-		MemoryByte[] data) {
-		
-		MemoryByte[] copy = new MemoryByte[data.length];
-
-		// If a byte equals zero, it represents null in a string
-		// and often causes subsequent string not displayed or printed properly
-		// Replace all null with 1's
-		for (int i=0; i<data.length; i++){
-			copy[i] = new MemoryByte();
-			if (data[i].getValue() == 0)
-			{
-				copy[i].setValue((byte)1);
-			}
-			else
-			{
-				copy[i].setValue(data[i].getValue());
-			}
-			copy[i].setFlags(data[i].getFlags());
-		}
-		
-		return super.getString(renderingId, address, copy);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		
-		// handle code page changed event
-		if (event.getProperty().equals(IDebugUIConstants.PREF_DEFAULT_ASCII_CODE_PAGE))
-		{
-			String codePage = (String)event.getNewValue();
-			setCodePage(codePage);
-			
-			if (isVisible())
-				// just update labels, don't need to reget memory
-				updateLabels();
-		}
-		
-		super.propertyChange(event);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ASCIIRenderingTypeDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ASCIIRenderingTypeDelegate.java
deleted file mode 100644
index 73c01e0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ASCIIRenderingTypeDelegate.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate;
-
-/**
- * The delegate for creating an ASCII rendering.
- * @since 3.1
- */
-public class ASCIIRenderingTypeDelegate implements IMemoryRenderingTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate#createRendering(java.lang.String)
-	 */
-	public IMemoryRendering createRendering(String id) throws CoreException {
-		return new ASCIIRendering(id);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractBaseTableRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractBaseTableRendering.java
deleted file mode 100644
index 7eb33d1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractBaseTableRendering.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.ui.memory.AbstractMemoryRendering;
-import org.eclipse.debug.ui.memory.IRepositionableMemoryRendering;
-
-/**
- * Internal base class to allow AbstractTableRendering and AbstractAsyncTableRendering
- * to share actions and dialogs.  This abstract class is not to be published.
- *
- * @since 3.2
- */
-public abstract class AbstractBaseTableRendering extends AbstractMemoryRendering implements IRepositionableMemoryRendering{
-
-	public AbstractBaseTableRendering(String renderingId) {
-		super(renderingId);
-	}
-
-	/**
-	 * Format view tab based on the bytes per line and column.
-	 * 
-	 * @param bytesPerLine - number of bytes per line, possible values: (1 / 2 / 4 / 8 / 16) * addressableSize
-	 * @param columnSize - number of bytes per column, possible values: (1 / 2 / 4 / 8 / 16) * addressableSize
-	 * @return true if format is successful, false, otherwise
-	 */
-	abstract public boolean format(int bytesPerLine, int columnSize);
-
-	/**
-	 * Returns the addressible size of this rendering's memory block in bytes.
-	 * 
-	 * @return the addressible size of this rendering's memory block in bytes
-	 */
-	abstract public int getAddressableSize();
-
-	/**
-	 * Resize column to the preferred size.
-	 */
-	abstract public void resizeColumnsToPreferredSize();
-
-	/**
-	 * Returns the number of addressable units per row.
-	 *  
-	 * @return number of addressable units per row
-	 */
-	abstract public int getAddressableUnitPerLine();
-
-	/**
-	 * Returns the number of addressable units per column.
-	 * 
-	 * @return number of addressable units per column
-	 */
-	abstract public int getAddressableUnitPerColumn();
-
-	/**
-	 * Returns the number of bytes displayed in a single column cell.
-	 * 
-	 * @return the number of bytes displayed in a single column cell
-	 */
-	abstract public int getBytesPerColumn();
-
-	/**
-	 * Returns the number of bytes displayed in a row.
-	 * 
-	 * @return the number of bytes displayed in a row
-	 */
-	abstract public int getBytesPerLine();
-
-	/**
-	 * Updates labels of this rendering.
-	 */
-	abstract public void updateLabels();
-
-	/**
-	 * @return the label of this rendering
-	 */
-	abstract public String getLabel();
-
-	/**
-	 * Refresh the table viewer with the current top visible address.
-	 * Update labels in the memory rendering.
-	 */
-	abstract public void refresh();
-
-	/**
-	 * Moves the cursor to the specified address.
-	 * Will load more memory if the address is not currently visible.
-	 * 
-	 * @param address address to position cursor at
-	 * @throws DebugException if an exception occurrs
-	 */
-	abstract public void goToAddress(BigInteger address) throws DebugException;
-
-	/**
-	 * Returns the currently selected address in this rendering.
-	 * 
-	 * @return the currently selected address in this rendering
-	 */
-	abstract public BigInteger getSelectedAddress();
-
-	/**
-	 * Returns the currently selected content in this rendering as a String.
-	 * 
-	 * @return the currently selected content in this rendering
-	 */
-	abstract public String getSelectedAsString();
-
-	/**
-	 * Returns the currently selected content in this rendering as MemoryByte.
-	 * 
-	 * @return the currently selected content in array of MemoryByte.  
-	 * Returns an empty array if the selected address is out of buffered range.
-	 */
-	abstract public MemoryByte[] getSelectedAsBytes();
-
-	/**
-	 * Returns the number of characters a byte will convert to
-	 * or -1 if unknown.
-	 * 
-	 * @return the number of characters a byte will convert to
-	 *  or -1 if unknown
-	 */
-	abstract public int getNumCharsPerByte();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IResettableMemoryRendering#resetRendering()
-	 */
-	abstract public void resetRendering() throws DebugException;
-
-	/**
-	 * Returns text for the given memory bytes at the specified address for the specified
-	 * rendering type. This is called by the label provider for.
-	 * Subclasses must override.
-	 * 
-	 * @param renderingTypeId rendering type identifier
-	 * @param address address where the bytes belong to
-	 * @param data the bytes
-	 * @return a string to represent the memory. Cannot not return <code>null</code>.
-	 * 	Returns a string to pad the cell if the memory cannot be converted
-	 *  successfully.
-	 */
-	abstract public String getString(String renderingTypeId, BigInteger address,
-			MemoryByte[] data);
-
-	/**
-	 * Returns bytes for the given text corresponding to bytes at the given
-	 * address for the specified rendering type. This is called by the cell modifier
-	 * when modifying bytes in a memory block.
-	 * Subclasses must convert the string value to an array of bytes.  The bytes will
-	 * be passed to the debug adapter for memory block modification.
-	 * Returns <code>null</code> if the bytes cannot be formatted properly.
-	 * 
-	 * @param renderingTypeId rendering type identifier
-	 * @param address address the bytes begin at
-	 * @param currentValues current values of the data in bytes format
-	 * @param newValue the string to be converted to bytes
-	 * @return the bytes converted from a string
-	 */
-	abstract public byte[] getBytes(String renderingTypeId, BigInteger address,
-			MemoryByte[] currentValues, String newValue);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractIntegerRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractIntegerRendering.java
deleted file mode 100644
index 9f11c97..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractIntegerRendering.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-
-/**
- * Abstract implementation to an integer rendering.
- * @since 3.1
- *
- */
-public abstract class AbstractIntegerRendering extends AbstractAsyncTableRendering {
-	
-	private int fDisplayEndianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-	
-	public AbstractIntegerRendering(String renderingId){
-		super(renderingId);
-	}
-	
-	public void init(IMemoryRenderingContainer container, IMemoryBlock block) {
-		super.init(container, block);
-		
-		// default to big endian for simple memory block
-		if (!(block instanceof IMemoryBlockExtension))
-			fDisplayEndianess = RenderingsUtil.BIG_ENDIAN;
-	}
-	
-	/**
-	 * @return Returns the currentEndianess.
-	 */
-	public int getDisplayEndianess() {
-		return fDisplayEndianess;
-	}
-
-	/**
-	 * @param currentEndianess The currentEndianess to set.
-	 */
-	public void setDisplayEndianess(int currentEndianess) {
-		fDisplayEndianess = currentEndianess;
-	}
-
-	protected int getBytesEndianess(MemoryByte[] data) {
-		int endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-		
-		if (!data[0].isEndianessKnown())
-			return endianess;
-		
-		if (data[0].isBigEndian())
-			endianess = RenderingsUtil.BIG_ENDIAN;
-		else
-			endianess = RenderingsUtil.LITTLE_ENDIAN;
-		for (int i=1; i<data.length; i++)
-		{
-			// if endianess is not known for a byte, return unknown
-			if (!data[i].isEndianessKnown())
-				return RenderingsUtil.ENDIANESS_UNKNOWN;
-			
-			int byteEndianess = data[i].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;
-			if (byteEndianess != endianess)
-			{
-				endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-				break;
-			}
-		}
-		return endianess;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractTableRenderingLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractTableRenderingLabelProvider.java
deleted file mode 100644
index 8fcbf33..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractTableRenderingLabelProvider.java
+++ /dev/null
@@ -1,107 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Abstract label provider for an ITableMemoryViewTab
- * 
- * @since 3.0
- */
-abstract public class AbstractTableRenderingLabelProvider extends LabelProvider implements ITableLabelProvider{
-
-	protected AbstractTableRendering fRendering;
-	
-	/**
-	 * 
-	 * Constructor for MemoryViewLabelProvider
-	 */
-	public AbstractTableRenderingLabelProvider() {
-		super();
-	}
-	
-	public AbstractTableRenderingLabelProvider(AbstractTableRendering rendering){
-		fRendering = rendering;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		fRendering = null;
-		super.dispose();
-	}
-
-	/**
-	 * @see ITableLabelProvider#getColumnImage(Object, int)
-	 */
-	public Image getColumnImage(Object element, int columnIndex) {
-		
-		if (columnIndex == 0)
-		{
-			return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
-		}
-		else if (columnIndex > (fRendering.getBytesPerLine()/fRendering.getBytesPerColumn()))
-		{
-			return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
-		}
-		else
-		{	
-			// if memory in the range has changed, return delta icon
-			int startOffset = (columnIndex-1)*fRendering.getBytesPerColumn();
-			int endOffset = startOffset + fRendering.getBytesPerColumn() - 1;
-			if (((TableRenderingLine)element).isRangeChange(startOffset, endOffset)) {
-				return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY_CHANGED);
-			}
-			return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJECT_MEMORY);	
-		}
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object element, int columnIndex) {
-		String columnLabel = null;
-
-		if (columnIndex == 0)
-		{
-			columnLabel = ((TableRenderingLine)element).getAddress();
-			
-			// consult model presentation for address presentation
-		}
-		else if (columnIndex > (fRendering.getBytesPerLine()/fRendering.getBytesPerColumn()))
-		{
-			columnLabel = " "; //$NON-NLS-1$
-		}
-		else
-		{	
-			int start = (columnIndex-1)*fRendering.getBytesPerColumn();
-			int end = start + fRendering.getBytesPerColumn();
-
-			MemoryByte[] bytes = ((TableRenderingLine)element).getBytes(start, end);
-			BigInteger address = new BigInteger(((TableRenderingLine)element).getAddress(), 16);
-			address = address.add(BigInteger.valueOf(start)); 
-			
-			columnLabel = fRendering.getString(fRendering.getRenderingId(), address, bytes);
-		}
-		return columnLabel;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractVirtualContentTableModel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractVirtualContentTableModel.java
deleted file mode 100644
index c366b2d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AbstractVirtualContentTableModel.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.debug.internal.ui.views.memory.renderings;
-
-import java.util.ArrayList;
-
-import org.eclipse.debug.internal.ui.viewers.AsynchronousTableModel;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousViewer;
-import org.eclipse.debug.internal.ui.viewers.ModelNode;
-
-abstract public class AbstractVirtualContentTableModel extends AsynchronousTableModel{
-
-	public AbstractVirtualContentTableModel(AsynchronousViewer viewer) {
-		super(viewer);
-	}
-
-	public Object[] getElements()
-	{
-		ModelNode[] nodes = getNodes(getRootNode().getElement());
-		ArrayList result = new ArrayList();
-		if (nodes != null)
-		{
-			for (int i=0; i<nodes.length; i++)
-			{
-				ModelNode[] children = nodes[i].getChildrenNodes();
-				if (children != null)
-				{
-					for (int j=0; j<children.length; j++)
-					{
-						result.add(children[j].getElement());
-					}
-				}
-			}
-			
-			return result.toArray();
-		}
-		return new Object[0];
-	}
-	
-	public Object getElement(int idx)
-	{
-		Object[] elements = getElements();
-		if (idx >=0 && idx < elements.length)
-			return elements[idx];
-
-		return null;
-	}
-
-	
-	public int indexOfElement(Object element)
-	{
-		Object[] elements = getElements();
-		
-		for (int i=0; i<elements.length; i++)
-		{
-			if (elements[i] == element)
-				return i;
-		}
-		return -1;
-	}
-	
-	abstract public int indexOfKey(Object key);
-	
-	abstract public int columnOf(Object element, Object key);
-	
-	abstract public Object getKey(int idx);
-	
-	abstract public Object getKey(Object element);
-	
-	abstract public Object getKey(int idx, int col);
-	
-	public void handleViewerChanged() 
-	{
-		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncCopyTableRenderingAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncCopyTableRenderingAction.java
deleted file mode 100644
index 9caa554..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncCopyTableRenderingAction.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.debug.internal.ui.views.memory.renderings;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Copy action for <code>AbstractAsyncTableRendering</code>.  Only copy what is visible in the view.
- *
- */
-public class AsyncCopyTableRenderingAction extends
-		CopyTableRenderingToClipboardAction {
-
-	public AsyncCopyTableRenderingAction(AbstractBaseTableRendering rendering, StructuredViewer viewer) {
-		super(rendering, viewer);
-	}
-
-	protected String concatenateTableAsString(TableItem[] itemList) {
-		
-		Table table = null;
-		if (itemList.length > 0)
-			table = itemList[0].getParent();
-		
-		int topIndex = table.getTopIndex();
-		int itemCount = table.getItemCount();
-	    int numVisibleLines = Math.min((table.getBounds().height / table.getItemHeight()) + 2, itemCount - topIndex);
-		
-		ArrayList items = new ArrayList();
-		
-		// start at top index until there is no more data in the table
-		for (int i=topIndex; i< topIndex + numVisibleLines; i++)
-		{
-			if (itemList[i].getData() != null)
-			{
-				items.add(itemList[i]);
-			}
-			else
-				break;
-		}
-		
-		return super.concatenateTableAsString((TableItem[]) items.toArray(new TableItem[items.size()]));
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncPrintTableRenderingAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncPrintTableRenderingAction.java
deleted file mode 100644
index 1148641..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncPrintTableRenderingAction.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.debug.internal.ui.views.memory.renderings;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.printing.Printer;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Print action for <code>AbstractAsyncTableRendering</code>.  Only print what is visible in the view.
- *
- */
-public class AsyncPrintTableRenderingAction extends PrintTableRenderingAction {
-
-	public AsyncPrintTableRenderingAction(AbstractBaseTableRendering rendering, StructuredViewer viewer) {
-		super(rendering, viewer);
-	}
-
-	protected void printTable(TableItem[] itemList, GC printGC, Printer printer) {
-		Table table = null;
-		if (itemList.length > 0)
-			table = itemList[0].getParent();
-		
-		int topIndex = table.getTopIndex();
-		int itemCount = table.getItemCount();
-	    int numVisibleLines = Math.min((table.getBounds().height / table.getItemHeight()) + 2, itemCount - topIndex);
-		
-		ArrayList items = new ArrayList();
-		
-		// start at top index until there is no more data in the table
-		for (int i=topIndex; i< topIndex + numVisibleLines; i++)
-		{
-			if (itemList[i].getData() != null)
-			{
-				items.add(itemList[i]);
-			}
-			else
-				break;
-		}
-		
-		super.printTable((TableItem[])items.toArray(new TableItem[items.size()]), printGC, printer);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingCellModifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingCellModifier.java
deleted file mode 100644
index 28a2f9e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingCellModifier.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-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.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.memory.MemoryRenderingElement;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * @since 3.1
- *
- */
-// TODO:  if we want "true" flexible hierarchy, also need to allow clients
-// to plug cell modifier in case the element is not MemorySegment
-public class AsyncTableRenderingCellModifier implements ICellModifier {
-
-    private AbstractAsyncTableRendering fRendering;
-    private boolean fMBSupportsValueModification = false;
-    
-    private ICellModifier fCustomModifier;
-
-    public AsyncTableRenderingCellModifier(AbstractAsyncTableRendering rendering, ICellModifier customModifier) {
-        fRendering = rendering;
-        fCustomModifier = customModifier;
-        
-        Job job = new Job("AsyncTableRenderingCellModifier"){ //$NON-NLS-1$
-
-			protected IStatus run(IProgressMonitor monitor) {
-				fMBSupportsValueModification = fRendering.getMemoryBlock().supportsValueModification();
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object,
-     *      java.lang.String)
-     */
-    public boolean canModify(Object element, String property) {
-        boolean canModify = true;
-        try {
-            if (!(element instanceof MemorySegment))
-                return false;
-
-            if (!isValueModificationSupported()) {
-                return false;
-            }
-
-            MemorySegment line = (MemorySegment) element;
-            if (TableRenderingLine.P_ADDRESS.equals(property)) {
-                return false;
-            }
-            
-            // property is stored as number of addressable unit away from the
-            // line address
-            // to calculate offset to the memory line array, offset =
-            // numberofAddressableUnit * addressableSize
-            int addressableSize = getAddressableSize();
-
-            int offset = Integer.valueOf(property, 16).intValue() * addressableSize;
-
-            MemoryByte[] bytes = line.getBytes(offset, fRendering.getBytesPerColumn());
-
-            if (fCustomModifier != null)
-            {
-            	BigInteger address = line.getAddress().add(BigInteger.valueOf(offset));
-            	MemoryRenderingElement mElement = new MemoryRenderingElement(fRendering, address, bytes);
-            	return fCustomModifier.canModify(mElement, null);       
-            }
-
-            for (int i = 0; i < bytes.length; i++) {
-                if (!bytes[i].isWritable()) {
-                    canModify = false;
-                }
-            }
-            return canModify;
-        } catch (NumberFormatException e) {
-            canModify = false;
-            return canModify;
-        }
-    }
-
-    /**
-     * @return
-     */
-    private int getAddressableSize() {
-        int addressableSize = fRendering.getAddressableSize();
-        if (addressableSize < 1)
-            addressableSize = 1;
-        return addressableSize;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object,
-     *      java.lang.String)
-     */
-    public Object getValue(Object element, String property) {
-    	
-        // give back the value of the column
-
-        if (!(element instanceof MemorySegment))
-            return null;
-
-        MemorySegment line = (MemorySegment) element;
-        try {
-            if (TableRenderingLine.P_ADDRESS.equals(property))
-                return line.getAddress();
-
-            int offsetToLineBuffer = Integer.valueOf(property, 16).intValue() * getAddressableSize();            
-            MemoryByte[] memory = line.getBytes(offsetToLineBuffer, fRendering.getBytesPerColumn());
-
-            int offsetFromLineAddress = Integer.valueOf(property, 16).intValue();
-            BigInteger address = line.getAddress().add(BigInteger.valueOf(offsetFromLineAddress));
-            
-            if (fCustomModifier != null)
-            {
-            	MemoryRenderingElement mElement = new MemoryRenderingElement(fRendering, address, memory);
-            	return fCustomModifier.getValue(mElement, null);       
-            }
-
-            // ask the rendering for a string representation of the bytes
-            return fRendering.getString(fRendering.getRenderingId(), address, memory);
-
-        } catch (NumberFormatException e) {
-            return "00"; //$NON-NLS-1$
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object,
-     *      java.lang.String, java.lang.Object)
-     */
-    public void modify(Object element, final String property, final Object value) {
-    	
-        MemorySegment segment = null;
-        if (element instanceof TableItem) {
-        	Object data = ((TableItem)element).getData();
-        	if (data != null && data instanceof MemorySegment)
-        		segment = (MemorySegment)data;
-        	
-        } else if (element instanceof MemorySegment){
-        	segment = (MemorySegment) element;
-        }
-        
-        if (segment == null)
-        	return;
-        
-        final MemorySegment line = segment;
-        
-        Job job = new Job("Set Values"){ //$NON-NLS-1$
-
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-		            // calculate offset to update
-					final IMemoryBlock memoryBlk = fRendering.getMemoryBlock();
-
-					// number of addressable units from the line's start address
-					int offsetFromLineAddress = Integer.valueOf(property, 16).intValue();
-
-					// this offset is number of addressable unit from memory block's base address
-					final BigInteger offsetFromMBBase = getOffset(memoryBlk, line.getAddress(), offsetFromLineAddress);
-
-					// property is number of addressable unit from line address
-					// to calculate proper offset in the memoryViewLine's array
-					// offset = numberOfAddressableUnit * addressableSize
-					int offsetToLineBuffer = Integer.valueOf(property, 16).intValue() * getAddressableSize();
-
-					MemoryByte[] oldArray = line.getBytes(offsetToLineBuffer, fRendering.getBytesPerColumn());
-
-					// address is line address + addressable unit into the line
-					BigInteger address = line.getAddress();
-					address = address.add(BigInteger.valueOf(offsetFromLineAddress));
-
-					if (fCustomModifier != null) {
- 						MemoryRenderingElement mElement = new MemoryRenderingElement(fRendering, address, oldArray);
-						fCustomModifier.modify(mElement, null, value);
-						return Status.OK_STATUS;
-					}
-					
-					if (!(value instanceof String))
-					{
-						DebugUIPlugin.logErrorMessage("Cell modifier cannot handle non-string values."); //$NON-NLS-1$
-						return Status.OK_STATUS;
-					}
-					
-	              byte[] bytes = null;	                
-			      String oldValue = (String) getValue(line, property);		                
-		          if (!oldValue.equals(value)) {
-		                bytes = fRendering.getBytes(fRendering.getRenderingId(), address, oldArray, (String) value);
-
-		                if (bytes == null)
-		                    return Status.OK_STATUS;
-
-		                if (bytes.length == 0)
-		                	 return Status.OK_STATUS;
-
-		                if (bytes.length <= oldArray.length) {
-		                    boolean changed = false;
-		                    // check that the bytes returned has actually changed
-		                    for (int i = 0; i < bytes.length; i++) {
-		                        if (bytes[i] != oldArray[i].getValue()) {
-		                            changed = true;
-		                            break;
-		                        }
-		                    }
-		                    if (!changed)
-		                    	 return Status.OK_STATUS;
-		                }
-		            } else {
-		                // return if value has not changed
-		            	 return Status.OK_STATUS;
-		            }
-		            
-		            final byte[] newByteValues = bytes;
-		            
-		            if (memoryBlk instanceof IMemoryBlockExtension)
-		                ((IMemoryBlockExtension) memoryBlk).setValue(offsetFromMBBase, newByteValues);
-		            else
-		                memoryBlk.setValue(offsetFromMBBase.longValue(), newByteValues);				
-		        } catch (DebugException e) {
-		            MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, DebugUIMessages.MemoryViewCellModifier_failed, e);
-		        } catch (NumberFormatException e) {
-		            MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, DebugUIMessages.MemoryViewCellModifier_failed + "\n" + DebugUIMessages.MemoryViewCellModifier_data_is_invalid, null); //$NON-NLS-1$
-		        }
-		        return Status.OK_STATUS;
-			}};
-
-       job.setSystem(true);
-       job.schedule();
-    }
-
-    private BigInteger getOffset(IMemoryBlock memory, BigInteger lineAddress, int lineOffset) throws DebugException {
-
-        BigInteger memoryAddr;
-
-        if (memory instanceof IMemoryBlockExtension) {
-            memoryAddr = ((IMemoryBlockExtension) memory).getBigBaseAddress();
-        } else {
-            memoryAddr = BigInteger.valueOf(memory.getStartAddress());
-        }
-
-        if (memoryAddr == null)
-            memoryAddr = new BigInteger("0"); //$NON-NLS-1$
-
-        return lineAddress.subtract(memoryAddr).add(BigInteger.valueOf(lineOffset));
-    }
-    
-    private boolean isValueModificationSupported()
-    {
-    	return fMBSupportsValueModification;
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingUpdatePolicy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingUpdatePolicy.java
deleted file mode 100644
index 8d5056a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingUpdatePolicy.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.TableUpdatePolicy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * This update policy updates immediately after a model changed event.  The update policy will
- * only update if the rendering is visible.  Cache from the content manager is cleared
- * when the memory block has changed when the rendering is not visible
- *
- */
-public class AsyncTableRenderingUpdatePolicy extends TableUpdatePolicy
-{
-	public void modelChanged(IModelDelta node, IModelProxy proxy) {
-		
-		// clear current cache as it becomes invalid when the memory block is changed
-		AbstractVirtualContentTableModel model = getTableViewer().getVirtualContentModel();
-		
-		if (model != null)
-		{
-			IContentChangeComputer computer = null;
-			if (model instanceof IContentChangeComputer)
-				computer = (IContentChangeComputer)model;
-			
-			clearCache(computer);
-			
-			if (!containsEvent(node))
-			{
-				return;
-			}
-			
-			if (node.getElement() instanceof IMemoryBlock && (node.getFlags() & IModelDelta.CONTENT) != 0)
-			{
-				if (computer != null && getTableViewer() != null)
-				{
-					// only cache if the rendering is not currently displaying error
-					if (!getTableViewer().getRendering().isDisplayingError())
-					{
-						// cache visible elelements
-						computer.cache(model.getElements());
-					}
-				}
-
-				// update policy figured out what's changed in the memory block
-				// and will tell rendering to update accordinly.
-				// Updating the rendering indirectly update the table viewer
-				notifyRendering(node, proxy);
-				handleMemoryBlockChanged((IMemoryBlock)node.getElement(), node);
-				return;
-				
-			}
-			else if (node.getElement() instanceof IMemoryBlock && (node.getFlags() & IModelDelta.STATE) != 0)
-			{
-				// override handling of state change event
-				// let the super class deals with the rest of the changes
-				handleMemoryBlockChanged((IMemoryBlock)node.getElement(), node);
-				return;				
-			}				
-		}
-		
-		super.modelChanged(node, proxy);
-	}
-
-	/**
-	 * @param computer
-	 */
-	protected void clearCache(IContentChangeComputer computer) {
-		if (computer != null)
-			computer.clearCache();
-	}
-
-	private void notifyRendering(IModelDelta node, IModelProxy proxy) {
-		if (getTableViewer() != null)
-		{
-			IModelChangedListener listener = (IModelChangedListener)getTableViewer().getRendering().getAdapter(IModelChangedListener.class);
-			if (listener != null)
-				listener.modelChanged(node, proxy);
-		}
-	}
-	
-	protected void handleMemoryBlockChanged(IMemoryBlock mb, IModelDelta delta)
-	{
-		try {
-			if (getViewer().getPresentationContext() instanceof MemoryViewPresentationContext)
-			{
-				MemoryViewPresentationContext context = (MemoryViewPresentationContext)getViewer().getPresentationContext();
-				final AbstractAsyncTableRendering rendering = getTableRendering(context);
-				if (rendering != null)
-				{
-					if ((delta.getFlags() & IModelDelta.CONTENT) != 0)
-					{
-						TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)rendering.getAdapter(TableRenderingContentDescriptor.class);
-						
-						if (descriptor != null)
-						{
-							final BigInteger address = getMemoryBlockBaseAddress(mb);
-							if (!descriptor.isMemoryBlockBaseAddressInitialized() || !address.equals(descriptor.getContentBaseAddress()))
-							{
-								descriptor.updateContentBaseAddress();
-								UIJob job = new UIJob("go to address"){ //$NON-NLS-1$
-			
-									public IStatus runInUIThread(IProgressMonitor monitor) {
-										try {
-											rendering.goToAddress(address);
-										} catch (DebugException e) {
-											if (getTableViewer() != null)
-												getTableViewer().handlePresentationFailure(null, e.getStatus());
-										}
-										return Status.OK_STATUS;
-									}};
-								job.setSystem(true);
-								job.schedule();
-							}
-							else
-							{
-								rendering.refresh();
-							}
-						}
-					}
-					else
-					{
-						rendering.updateLabels();
-					}
-				}
-			}
-		} catch (DebugException e) {
-			if (getTableViewer() != null)
-				getTableViewer().handlePresentationFailure(null, e.getStatus());
-		}
-	}
-	
-	private BigInteger getMemoryBlockBaseAddress(IMemoryBlock mb) throws DebugException
-	{
-		if (mb instanceof IMemoryBlockExtension)
-			return ((IMemoryBlockExtension)mb).getBigBaseAddress();
-		else
-			return BigInteger.valueOf(mb.getStartAddress());
-	}
-	
-	private AsyncTableRenderingViewer getTableViewer()
-	{
-		if (getViewer() instanceof AsyncTableRenderingViewer)
-			return (AsyncTableRenderingViewer)getViewer();
-		return null;
-	}
-	
-	private boolean containsEvent(IModelDelta delta)
-	{
-		if (getViewer().getPresentationContext() instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext context = (MemoryViewPresentationContext) getViewer().getPresentationContext();
-			if (context.getRendering() instanceof AbstractAsyncTableRendering)
-			{
-				AbstractAsyncTableRendering rendering = (AbstractAsyncTableRendering)context.getRendering();
-				if (!rendering.isVisible())
-					return false;
-			}
-		}
-		return true;
-	}
-	
-	protected AbstractAsyncTableRendering getTableRendering(MemoryViewPresentationContext context)
-	{
-		IMemoryRendering memRendering = context.getRendering();
-		if (memRendering != null && memRendering instanceof AbstractAsyncTableRendering)
-		{
-			return (AbstractAsyncTableRendering)memRendering;
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingViewer.java
deleted file mode 100644
index 4fa9407..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncTableRenderingViewer.java
+++ /dev/null
@@ -1,1037 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.viewers.AbstractUpdatePolicy;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousModel;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableCursor;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-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.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.progress.UIJob;
-
-public class AsyncTableRenderingViewer extends AsyncVirtualContentTableViewer {
-
-	private AbstractAsyncTableRendering fRendering;
-	
-	// selection keys
-	private Object fPendingSelection;
-	private Object fSelectionKey;
-	
-	// cursor and associated listeners
-	private TableCursor fTableCursor;
-	private KeyAdapter fCursorKeyAdapter;
-	private TraverseListener fCursorTraverseListener;
-	private MouseAdapter fCursorMouseListener;
-	private SelectionAdapter fCursorSelectionListener;
-
-	// cursor editor and associated listeners
-	private TableEditor fCursorEditor;
-	private KeyAdapter fEditorKeyListener;
-	private CellEditorListener fCellEditorListener;
-	
-	private class CellEditorListener implements ICellEditorListener {
-
-		private CellEditor fEditor;
-		private int fRow;
-		private int fCol;
-		
-		public CellEditorListener(int row, int col, CellEditor editor) {
-			fEditor = editor;
-			fRow = row;
-			fCol = col;
-		}
-		
-		public void applyEditorValue() {
-			fEditor.removeListener(this);
-			modifyValue(fRow, fCol, fEditor.getValue());			
-		}
-
-		public void cancelEditor() {
-			fEditor.removeListener(this);
-		}
-		
-		public void editorValueChanged(boolean oldValidState,
-				boolean newValidState) {
-		}
-		
-		public int getRow()
-		{
-			return fRow;
-		}
-		
-		public int getCol()
-		{
-			return fCol;
-		}
-	}
-
-	private boolean fPendingFormatViewer;
-
-	
-	public AsyncTableRenderingViewer(AbstractAsyncTableRendering rendering, Composite parent, int style) {
-		super(parent, style);
-		fRendering = rendering;
-		
-		getTable().addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				handleTableMouseEvent(e);
-			}});
-		
-		createCursor(getTable());
-	}
-
-	public AbstractUpdatePolicy createUpdatePolicy() {
-		return new AsyncTableRenderingUpdatePolicy();
-	}
-	
-	public AbstractAsyncTableRendering getRendering()
-	{
-		return fRendering;
-	}
-	
-	private void createCursor(Table table)
-	{
-		fTableCursor = new TableCursor(table, SWT.NONE);
-		
-		Display display = fTableCursor.getDisplay();
-		
-		// set up cursor color
-		fTableCursor.setBackground(display.getSystemColor(SWT.COLOR_LIST_SELECTION));
-		fTableCursor.setForeground(display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT));
-		
-		fTableCursor.setFont(JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME));
-		
-		fCursorKeyAdapter = new KeyAdapter() {
-			public void keyPressed(KeyEvent e)
-			 {
-			 	handleCursorKeyPressed(e);
-			 }	
-		};
-		
-		fTableCursor.addKeyListener(fCursorKeyAdapter);
-		
-		fCursorTraverseListener = new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				handleCursorTraverseEvt(e);
-			}};
-					
-		fTableCursor.addTraverseListener(fCursorTraverseListener);
-		
-		fCursorMouseListener = new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				handleCursorMouseEvent(e);
-			}};
-		fTableCursor.addMouseListener(fCursorMouseListener);
-		
-		// cursor may be disposed before disposed is called
-		// remove listeners whenever the cursor is disposed
-		fTableCursor.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (fTableCursor == null)
-					return;
-				fTableCursor.removeTraverseListener(fCursorTraverseListener);
-				fTableCursor.removeKeyListener(fCursorKeyAdapter);
-				fTableCursor.removeMouseListener(fCursorMouseListener);
-				fTableCursor.removeSelectionListener(fCursorSelectionListener);
-			}});
-		
-		fCursorSelectionListener = new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						handleCursorMoved();
-					}
-				};
-		fTableCursor.addSelectionListener(fCursorSelectionListener);
-		fCursorEditor = new TableEditor (getTable());	
-	}
-	
-	private void handleCursorKeyPressed(KeyEvent event)
-	{
-		if (event.character == '\r' && event.getSource() instanceof TableCursor)
-		{
-			activateCellEditor(null);
-			return;
-		}		
-		
-		if (MemoryViewUtil.isValidEditEvent(event.keyCode))
-		{	
-			// activate edit as soon as user types something at the cursor
-			if (event.getSource() instanceof TableCursor)
-			{
-				int col = fTableCursor.getColumn();
-				if (getCellEditors()[col] instanceof TextCellEditor)
-				{
-					String initialValue = String.valueOf(event.character);
-					activateCellEditor(initialValue);
-				}
-			}
-		}
-	}
-	
-	private void handleCursorMouseEvent(MouseEvent e){
-		if (e.button == 1)
-		{
-			int col = fTableCursor.getColumn();
-			if (col > 0 && col <= (getNumCol()))
-				activateCellEditor(null);
-		}			
-	}
-	
-	private void handleCursorTraverseEvt(TraverseEvent e){
-		if (fTableCursor.getRow() == null)
-			return;
-		
-		Table table = (Table)fTableCursor.getParent();
-		int row = table.indexOf(fTableCursor.getRow());
-		int col = fTableCursor.getColumn();
-		if (col == getNumCol() && e.keyCode == SWT.ARROW_RIGHT)
-		{
-			if (row + 1>= table.getItemCount())
-			{
-				return;
-			}
-			
-			row = row +1;
-			col = 0;
-			fTableCursor.setSelection(row, col);
-		}
-		if (col <= 1 && e.keyCode == SWT.ARROW_LEFT)
-		{
-			if (row-1 < 0)
-			{
-				return;
-			}
-			
-			row = row - 1;
-			col = getNumCol()+1;
-			fTableCursor.setSelection(row, col);
-		}			
-		
-		handleCursorMoved();
-	}
-	
-	/**
-	 * Update selected address.
-	 * Load more memory if required.
-	 */
-	private void handleCursorMoved()
-	{	
-		fSelectionKey = getSelectionKeyFromCursor();
-		fPendingSelection = null;
-		
-		if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-			System.out.println(Thread.currentThread().getName() + " cursor moved selection is: " + ((BigInteger)fSelectionKey).toString(16)); //$NON-NLS-1$
-		
-		// now check to see if the cursor is approaching buffer limit
-		handleScrollBarSelection();
-		fireSelectionChanged(fSelectionKey);
-	}
-	
-	private int getNumCol() {
-		
-		int bytesPerLine = fRendering.getBytesPerLine();
-		int columnSize = fRendering.getBytesPerColumn();
-		
-		return bytesPerLine/columnSize;
-	}
-	
-	/**
-	 * Sets the cursor at the specified address
-	 * @param key selection key
-	 */
-	public void setSelection(Object key)
-	{
-		fPendingSelection = key;
-		attemptSetKeySelection();
-	}
-	
-	public Object getSelectionKey()
-	{
-		return fSelectionKey;
-	}
-	
-	private synchronized void attemptSetKeySelection()
-	{
-		if (fPendingSelection != null) {
-            doAttemptSetKeySelection(fPendingSelection);
-		}
-		
-	}
-	
-	synchronized private Object doAttemptSetKeySelection(final Object key)
-	{	
-		if (getBufferTopKey() == null || getBufferEndKey() == null)
-			return key;
-		
-		// calculate selected row address
-		int[] location = getCoordinatesFromKey(key);
-		if(location.length == 0)
-		{
-			return key;
-		}
-		
-		UIJob uiJob = new UIJob("Set Cursor Selection"){ //$NON-NLS-1$
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				try {
-					if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-						System.out.println(getRendering() + " set cursor selection " + ((BigInteger)key).toString(16)); //$NON-NLS-1$
-					
-					if (fPendingSelection != null && fPendingSelection != key)
-						return Status.OK_STATUS;
-					
-					if (fTableCursor.isDisposed())
-						return Status.OK_STATUS;
-					
-					// by the time this is called, the location may not be valid anymore
-					int[] newLocation = getCoordinatesFromKey(key);
-					if (newLocation.length == 0)
-					{
-						Object selectionKey = getSelectionKey();
-						fPendingSelection = selectionKey;
-						return Status.OK_STATUS;
-					}
-					
-					fSelectionKey = key;
-					fPendingSelection = null;
-					
-					if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-					{
-						System.out.println(getRendering() + " set cursor selection, row is " + getTable().getItem(newLocation[0]).getData()); //$NON-NLS-1$
-						System.out.println(getRendering() + " set cursor selection, model is " + getVirtualContentModel().getElement(newLocation[0])); //$NON-NLS-1$
-					}
-					
-					fTableCursor.setSelection(newLocation[0], newLocation[1]);
-					showTableCursor(true);
-					
-					int topIndex = getTable().getTopIndex();
-					Object topKey = getVirtualContentModel().getKey(topIndex);
-					setTopIndexKey(topKey);
-					
-					
-				} catch (RuntimeException e) {
-					
-					// by the time this is called, the selection may no longer
-					// get the latest selection and try to set selection again
-					Object selectionKey = getSelectionKey();
-					fPendingSelection = selectionKey;
-					doAttemptSetKeySelection(selectionKey);
-				}
-				return Status.OK_STATUS;
-			}};
-			
-		uiJob.setSystem(true);
-		uiJob.schedule();
-		
-		return null;
-	}
-	
-	/**
-	 * 
-	 * @param key
-	 * @return the coordinates of the key
-	 * Element[0] is the row index
-	 * Element[1] is the column index
-	 */
-	private int[] getCoordinatesFromKey(Object key)
-	{
-		final int row = indexOf(key);
-		
-		if (row == -1)
-		{
-			return new int[0];
-		}
-		
-		Object element = getVirtualContentModel().getElement(row);
-		final int col = columnOf(element, key);
-		
-		if (col == -1)
-		{
-			return new int[0];
-		}
-		return new int[]{row, col};
-	}
-	
-	private Object getSelectionKeyFromCursor()
-	{	
-		int idx = getTable().indexOf(fTableCursor.getRow());		
-		int col = fTableCursor.getColumn();
-		
-		return getVirtualContentModel().getKey(idx, col);
-	}
-	
-	private Object getBufferTopKey()
-	{
-		return getKey(0);
-	}
-	
-	private Object getBufferEndKey()
-	{
-		AbstractVirtualContentTableModel model = getVirtualContentModel();
-		
-		if (model != null)
-			return getKey(model.getElements().length-1);
-		return null;
-	}
-	
-	public int indexOf(Object key)
-	{
-		int idx = -1;
-		AbstractVirtualContentTableModel model = getVirtualContentModel();
-		if (model != null)
-			idx = model.indexOfKey(key);
-		return idx;
-	}
-	
-	private int columnOf(Object element, Object key)
-	{
-		int idx = -1;
-		AbstractVirtualContentTableModel model = getVirtualContentModel();
-		if (model != null)
-		{
-			idx = model.columnOf(element, key);
-		}
-		return idx;
-	}
-	
-	public Object getKey(int index)
-	{
-		AbstractVirtualContentTableModel model = getVirtualContentModel();
-		if (model != null)
-		{
-			Object key = model.getKey(index);
-			return key;
-		}
-		return null;
-	}
-	
-	public Object getKey(int row, int col)
-	{		
-		AbstractVirtualContentTableModel model = getVirtualContentModel();
-		if (model != null)
-			return model.getKey(row, col);
-		return null;
-	}
-	
-	
-	protected synchronized void preservingSelection(Runnable updateCode) {
-		Object oldTopIndexKey = null;
-		
-		if (getPendingSetTopIndexKey() == null) {
-			// preserve selection
-			oldTopIndexKey = getTopIndexKey();
-		}
-		else
-		{
-			oldTopIndexKey = getPendingSetTopIndexKey();
-		}
-		Object oldSelectionKey = null;
-		try {
-			if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-			{
-				if (oldTopIndexKey != null)
-					System.out.println(getRendering() + " preserve top index: " + ((BigInteger)oldTopIndexKey).toString(16)); //$NON-NLS-1$
-				else
-					System.out.println("top index key is null, nothing to preserve"); //$NON-NLS-1$
-			}
-
-			if (fPendingSelection != null)
-				oldSelectionKey = fPendingSelection;
-			else
-				oldSelectionKey = getSelectionKey();
-			
-			if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-			{
-				if (oldTopIndexKey != null)
-					System.out.println(getRendering() + " preserve selection: " + ((BigInteger)oldSelectionKey).toString(16)); //$NON-NLS-1$
-				else
-					System.out.println("selection key is null, nothing to preserve"); //$NON-NLS-1$
-			}
-			
-			// perform the update
-			updateCode.run();
-			
-		} finally {
-			
-			if (oldSelectionKey != null)
-			{
-				if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-					System.out.println(getRendering() + " preserved selection " + ((BigInteger)oldSelectionKey).toString(16)); //$NON-NLS-1$
-				setSelection(oldSelectionKey);
-			}
-			
-			if (getPendingSetTopIndexKey() != null)
-			{
-				if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-					System.out.println(getRendering() + " finished top index: " + ((BigInteger)oldTopIndexKey).toString(16)); //$NON-NLS-1$
-				setTopIndex(getPendingSetTopIndexKey());
-			}
-			else if (oldTopIndexKey != null)
-			{
-				setTopIndex(oldTopIndexKey);
-				
-				if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-					System.out.println(getRendering() + " finished top index: " + ((BigInteger)oldTopIndexKey).toString(16)); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	public void dispose()
-	{
-		super.dispose();
-		
-		if (fTableCursor != null && !fTableCursor.isDisposed())
-		{
-			fCursorEditor.dispose();
-			fCursorEditor = null;
-			
-			fTableCursor.removeTraverseListener(fCursorTraverseListener);
-			fTableCursor.removeKeyListener(fCursorKeyAdapter);
-			fTableCursor.removeMouseListener(fCursorMouseListener);
-			fTableCursor.removeSelectionListener(fCursorSelectionListener);
-			
-			fTableCursor.dispose();
-			fTableCursor = null;
-		}
-	}
-	
-	public void showTableCursor(final boolean show)
-	{
-		
-		Display display = DebugUIPlugin.getDefault().getWorkbench().getDisplay();
-		if (Thread.currentThread() == display.getThread())
-		{
-			if (!fTableCursor.isDisposed())
-			{
-				if (fTableCursor.isVisible() != show)
-					fTableCursor.setVisible(show);
-			}
-		}
-		else
-		{
-			UIJob job = new UIJob("show table cursor"){ //$NON-NLS-1$
-	
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					if (!fTableCursor.isDisposed())
-					{
-						if (fTableCursor.isVisible() != show)
-							fTableCursor.setVisible(show);
-					}
-					return Status.OK_STATUS;
-				}};
-				
-			job.setSystem(true);
-			job.schedule();
-		}
-	}
-
-	private void handleTableMouseEvent(MouseEvent e) {
-		// figure out new cursor position based on here the mouse is pointing
-		TableItem[] tableItems = getTable().getItems();
-		TableItem selectedRow = null;
-		int colNum = -1;
-		int numCol = getColumnProperties().length;
-		
-		for (int j=0; j<tableItems.length; j++)
-		{
-			TableItem item = tableItems[j];
-			if (item.getData() != null)
-			{
-				for (int i=0; i<numCol; i++)
-				{
-					Rectangle bound = item.getBounds(i);
-					if (bound.contains(e.x, e.y))
-					{
-						colNum = i;
-						selectedRow = item;
-						break;
-					}
-				}
-			}
-			if (colNum >= 0)
-				break;
-		}
-		
-		// if column position cannot be determined, return
-		if (colNum < 1)
-			return;
-		
-		// handle user mouse click onto table
-		// move cursor to new position
-		if (selectedRow != null)
-		{
-			int row = getTable().indexOf(selectedRow);
-			showTableCursor(true);
-			fTableCursor.setSelection(row, colNum);
-			
-			// manually call this since we don't get an event when
-			// the table cursor changes selection.
-			handleCursorMoved();
-			
-			fTableCursor.setFocus();
-		}			
-	}
-
-	/**
-	 * Activate cell editor and prefill it with initial value.
-	 * If initialValue is null, use cell content as initial value
-	 * @param initialValue
-	 */
-	private void activateCellEditor(String initialValue) {
-
-		final int col = fTableCursor.getColumn();
-		final int row = indexOf(fSelectionKey);
-
-		if (row < 0)
-			return;
-
-		// do not allow user to edit address column
-		if (col == 0 || col > getNumCol()) {
-			return;
-		}
-
-		ICellModifier cellModifier = null;
-
-		cellModifier = getCellModifier();
-
-		TableItem tableItem = getTable().getItem(row);
-
-		Object element = tableItem.getData();
-
-		if (element != null) {
-			Object property = getColumnProperties()[col];
-			Object value = cellModifier.getValue(element, (String) property);
-			boolean canEdit = cellModifier
-					.canModify(element, (String) property);
-
-			if (!canEdit)
-				return;
-
-			CellEditor editor = getCellEditors()[col];
-			if (editor != null) {
-				// The control that will be the editor must be a child of the
-				// Table
-				Control control = editor.getControl();
-
-				Object cellValue = null;
-
-				if (initialValue != null) {
-					cellValue = initialValue;
-				} else {
-					cellValue = value;
-				}
-
-				editor.setValue(cellValue);
-
-				fCursorEditor.horizontalAlignment = SWT.LEFT;
-				fCursorEditor.grabHorizontal = true;
-
-				// Open the editor editor in selected column of the selected
-				// row.
-				fCursorEditor.setEditor(control, tableItem, col);
-
-				// Assign focus to the editor control
-				editor.setFocus();
-
-				if (initialValue != null && control instanceof Text) {
-					((Text) control).clearSelection();
-				}
-
-				control.setFont(JFaceResources
-						.getFont(IInternalDebugUIConstants.FONT_NAME));
-
-				// add listeners for the editor control
-				addListeners(control);
-				
-				fCellEditorListener = new CellEditorListener(row, col, editor);
-				editor.addListener(fCellEditorListener);
-
-				// move cursor below editor control
-				fTableCursor.moveBelow(control);
-			}
-		}
-	}
-	
-	private void deactivateEditor(CellEditor editor)
-	{
-		removeListeners(editor.getControl());
-		fTableCursor.moveAbove(editor.getControl());
-		fTableCursor.setFocus();
-	}
-	
-	/*
-	 * @param editor
-	 */
-	private void addListeners(Control control) {
-		
-		fEditorKeyListener = new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				handleKeyEventInEditor(e);
-			}
-		};
-
-		control.addKeyListener(fEditorKeyListener);
-	}
-	
-	/**
-	 * @param event
-	 */
-	private void handleKeyEventInEditor(KeyEvent event) {
-		
-		final KeyEvent e = event;
-		Display.getDefault().asyncExec(new Runnable()
-		{
-			public void run()
-			{
-				Object obj = e.getSource();
-				if (obj instanceof Control)
-				{
-					Control control = (Control)obj;
-					int row = fCellEditorListener.getRow();
-					int col = fCellEditorListener.getCol();
-					
-					try
-					{
-						switch (e.keyCode)
-						{
-							case 0:
-								doHandleKeyEvent(row, col);
-								break;	
-							case SWT.ESC:
-								cancelEditing(row, col);
-								break;	
-							default :
-								doHandleKeyEvent(row, col);
-							break;
-						}
-					}
-					catch (NumberFormatException e1)
-					{
-						MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, 
-							DebugUIMessages.MemoryViewCellModifier_data_is_invalid, null);
-						
-						fTableCursor.setSelection(row, col);
-						handleCursorMoved();
-				
-						removeListeners(control);
-					}
-				}
-			}
-		});
-	}
-	
-	private void doHandleKeyEvent(int row, int col)
-	{
-		int numCharsPerByte = fRendering.getNumCharsPerByte();
-		if (numCharsPerByte > 0)
-		{						
-			Object value = getCellEditors()[col].getValue();
-			if (getCellEditors()[col] instanceof TextCellEditor && value instanceof String)
-			{
-				String str = (String)value;
-				
-				if (str.length() > fRendering.getBytesPerColumn()*numCharsPerByte)
-				{											
-					String newValue = str;
-					
-					CellEditor editor = getCellEditors()[col];
-					editor.setValue(newValue.substring(0,fRendering.getBytesPerColumn()* numCharsPerByte));
-					
-					// We want to call modify value here to avoid race condition.
-					// Relying on the editor event to modify the cell may introduce a race condition since
-					// we try to activate another cell editor in this method.  If we happen to use same cell
-					// editor in the next activation, the value of the editor may be incorrect when the listener gets the event.
-					// We may write the wrong value in that case.  Calling modify here allows us to capture the value
-					// now and send that to the model.
-					fCellEditorListener.cancelEditor();
-					deactivateEditor(editor);			
-					modifyValue(fCellEditorListener.getRow(), fCellEditorListener.getCol(), editor.getValue());
-					
-					// if cursor is at the end of a line, move to next line
-					if (col >= getNumCol())
-					{
-						col = 1;
-						row++;
-					}
-					else
-					{
-						col++;
-					}
-					
-					fTableCursor.setSelection(row, col);									
-					handleCursorMoved();
-														
-					activateCellEditor(newValue.substring(fRendering.getBytesPerColumn()*numCharsPerByte));
-				}
-			}
-		}
-	}
-	
-	private void cancelEditing(int row, int col)
-	{
-		// if user has pressed escape, do not commit the changes
-		// remove listener to avoid getting notified on the modify value
-		fCellEditorListener.cancelEditor();
-		deactivateEditor(getCellEditors()[col]);
-		
-		fTableCursor.setSelection(row, col);
-		handleCursorMoved();
-		
-		// cursor needs to have focus to remove focus from cell editor
-		fTableCursor.setFocus();		
-	}
-	
-	/**
-	 * @param control
-	 */
-	private void removeListeners(Control control) {
-		
-		control.removeKeyListener(fEditorKeyListener);
-	}
-	
-	/**
-	 * Modify value and send new value to debug adapter
-	 * @param row
-	 * @param col
-	 * @param newValue
-	 * @throws NumberFormatException
-	 */
-	private void modifyValue(int row, int col, Object newValue) throws NumberFormatException
-	{	
-		if (newValue instanceof String && ((String)newValue).length() == 0)
-		{	
-			// do not do anything if user has not entered anything
-			return;
-		}
-		
-		if (row >= 0 && row < getTable().getItemCount())
-		{
-			TableItem tableItem = getTable().getItem(row);
-	
-			Object property = getColumnProperties()[col];
-			getCellModifier().modify(tableItem, (String)property, newValue);
-		}
-	}
-	
-	public TableCursor getCursor()
-	{
-		return fTableCursor;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ContentViewer#getLabelProvider()
-	 * Implemented minimum to work with PrintTableRendering action.
-	 * This is not a real table labe provider, only goes to the table
-	 * to get the text at the specified row and column.
-	 */
-	public IBaseLabelProvider getLabelProvider() {
-		return new ITableLabelProvider() {
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				int idx = getVirtualContentModel().indexOfElement(element);
-				if (idx >= 0 )
-				{	
-					TableItem item = getTable().getItem(idx);
-					return item.getText(columnIndex);
-				}
-				return ""; //$NON-NLS-1$
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			}
-
-			public void dispose() {
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			}};
-	}
-	
-	public void formatViewer()
-	{
-		if (getModel() == null || !hasPendingUpdates())
-			doFormatViewer();
-		else 
-			// do not format in the middle of an update
-			// set pending update and will format when update is completed
-			fPendingFormatViewer = true;
-	}
-
-	/**
-	 * 
-	 */
-	private void doFormatViewer() {
-		fPendingFormatViewer = false;
-		preservingSelection(new Runnable() {
-
-			public void run() {
-				// causes the content of the table viewer to be replaced
-				// without asking content adapter for content
-				AbstractVirtualContentTableModel model = getVirtualContentModel();
-				if (model != null)
-				{
-					model.handleViewerChanged();
-				}
-			}});
-	}
-	
-	private void fireSelectionChanged(Object selectionKey)
-	{
-		if (selectionKey != null)
-		{
-			SelectionChangedEvent evt = new SelectionChangedEvent(this, new StructuredSelection(selectionKey));
-			fireSelectionChanged(evt);
-		}
-	}
-
-	public void handlePresentationFailure(IStatusMonitor monitor, IStatus status) {
-		super.handlePresentationFailure(monitor, status);
-	}
-	
-	public void refresh(boolean getContent)
-	{
-		if (getContent)
-			refresh();
-		else
-		{
-			preservingSelection(new Runnable() {
-
-				public void run() {
-					AbstractVirtualContentTableModel model = getVirtualContentModel();
-					if (model != null)
-					{
-						Object[] elements = model.getElements();
-						model.remove(elements);
-						model.add(elements);
-					}
-				}});
-		}
-	}
-	
-	protected void tableTopIndexSetComplete() {
-		
-		if (!fTableCursor.isDisposed())
-		{
-			// TODO:  work around swt bug, must force a table cursor redraw after top index is changed
-			// BUG 130130
-			int[] coordinates = getCoordinatesFromKey(getSelectionKey());
-			if (coordinates.length > 0)
-				fTableCursor.setVisible(true);
-			else
-				fTableCursor.setVisible(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.AsynchronousViewer#getModel()
-	 */
-	public AsynchronousModel getModel() {
-		return super.getModel();
-	}
-	
-	// TODO:  need pluggable model to be truly flexible
-	protected AbstractVirtualContentTableModel createVirtualContentTableModel() {
-		return new TableRenderingModel(this);
-	}
-
-	protected void updateComplete(IStatusMonitor monitor) {
-		super.updateComplete(monitor);
-		
-		if (!hasPendingUpdates() && !fTableCursor.isDisposed())
-		{
-			attemptSetKeySelection();
-			fTableCursor.redraw();
-			
-			// if the viewer has pending top index, then more updates will come in
-			// and the cursor should not be redrawn yet.
-			if (!hasPendingSetTopIndex())
-			{
-				preservingSelection(new Runnable() {
-
-					public void run() {
-
-						int[] coordinates = getCoordinatesFromKey(getSelectionKey());
-						if (coordinates.length > 0)
-							fTableCursor.setVisible(true);
-						else
-							fTableCursor.setVisible(false);
-					}});
-			}
-		}
-		
-		if (!hasPendingUpdates() && fPendingFormatViewer)
-		{
-			formatViewer();
-			resizeColumnsToPreferredSize();
-		}
-	}
-
-	protected void clear(Widget item) {
-		super.clear(item);
-		
-		// this table viewer assumes that #getData will return null
-		// set data to null when clearing an item.
-		// only visible item will get SET DATA event again and at that time
-		// the viewer would set the data back.
-		if (item instanceof TableItem)
-		{
-			item.setData(null);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncVirtualContentTableViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncVirtualContentTableViewer.java
deleted file mode 100644
index cb000c9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/AsyncVirtualContentTableViewer.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-
-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.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousModel;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousTableViewer;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-import org.eclipse.debug.internal.ui.viewers.provisional.ILabelRequestMonitor;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.jface.viewers.CellEditor;
-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.ScrollBar;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.progress.UIJob;
-
-abstract public class AsyncVirtualContentTableViewer extends AsynchronousTableViewer {
-
-	private Object fPendingTopIndexKey;
-	private ArrayList fTopIndexQueue = new ArrayList();
-	
-	private boolean fPendingResizeColumns;
-	private ListenerList fVirtualContentListeners;
-	private SelectionListener fScrollSelectionListener;
-	private ListenerList fPresentationErrorListeners;
-	private Object fTopIndexKey;
-
-	public static boolean DEBUG_DYNAMIC_LOADING = false;
-	
-	public AsyncVirtualContentTableViewer(Composite parent, int style) {
-		super(parent, style);
-		fVirtualContentListeners = new ListenerList();
-		fPresentationErrorListeners = new ListenerList();
-		initScrollBarListener();
-	}
-	
-	private void initScrollBarListener()
-	{
-		ScrollBar scroll = getTable().getVerticalBar();
-		fScrollSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handleScrollBarSelection();
-			}};
-		scroll.addSelectionListener(fScrollSelectionListener);
-	}
-
-	public void setTopIndex(Object key)
-	{
-		fPendingTopIndexKey = key;
-		attemptSetTopIndex();
-	}
-	
-	protected Object getPendingSetTopIndexKey()
-	{
-		return fPendingTopIndexKey;
-	}
-	
-	protected void handlePresentationFailure(IStatusMonitor monitor, IStatus status) {
-		notifyPresentationError(monitor, status);
-	}
-	
-	public void disposeColumns()
-	{
-		// clean up old columns
-		TableColumn[] oldColumns = getTable().getColumns();
-		
-		for (int i=0; i<oldColumns.length; i++)
-		{
-			oldColumns[i].dispose();
-		}
-	}
-	
-	public void disposeCellEditors()
-	{
-		// clean up old cell editors
-		CellEditor[] oldCellEditors = getCellEditors();
-		
-		if (oldCellEditors != null)
-		{
-			for (int i=0; i<oldCellEditors.length; i++)
-			{
-				oldCellEditors[i].dispose();
-			}
-		}
-	}
-    
-	/**
-	 * Resize column to the preferred size.
-	 */
-	public void resizeColumnsToPreferredSize() {
-		fPendingResizeColumns = true;
-		fPendingResizeColumns = attemptResizeColumnsToPreferredSize();
-	}
-	
-	private boolean attemptResizeColumnsToPreferredSize()
-	{
-		if (fPendingResizeColumns)
-		{
-			if(!hasPendingUpdates()) {
-				UIJob job = new UIJob("packcolumns"){ //$NON-NLS-1$
-
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						Table table = getTable();
-						
-						if (!table.isDisposed())
-						{
-							// if table size is zero, the rendering has not been made visible
-							// cannot pack until the rendering is visible
-							if (table.getSize().x > 0)
-							{
-								TableColumn[] columns = table.getColumns();
-								for (int i=0 ;i<columns.length-1; i++)
-								{	
-									columns[i].pack();
-								}	
-							}
-							else
-							{
-								fPendingResizeColumns = true;
-							}
-						}
-						return Status.OK_STATUS;
-					}};
-				job.setSystem(true);
-				job.schedule();	
-				return false;
-			}
-		}
-		return fPendingResizeColumns;
-	}
-	
-	/**
-	 * Attempts to update any pending setTopIndex
-	 * 
-	 * @param reveal whether to reveal the selection
-	 */
-	protected synchronized void attemptSetTopIndex() {
-		if (fPendingTopIndexKey != null) {
-            Object remaining = doAttemptSetTopIndex(fPendingTopIndexKey);
-            if (remaining == null)
-            {
-            	fPendingTopIndexKey = remaining;
-            }
-		}
-	}
-	
-	private synchronized Object doAttemptSetTopIndex(final Object topIndexKey)
-	{
-		final int i = getVirtualContentModel().indexOfKey(topIndexKey);
-		if (i >= 0)
-		{
-			UIJob job = new UIJob("set top index"){ //$NON-NLS-1$
-
-				public IStatus runInUIThread(IProgressMonitor monitor)  {
-						if (getTable().isDisposed())
-						{
-							fTopIndexQueue.clear();
-							return Status.OK_STATUS;
-						}
-						
-						int idx = getVirtualContentModel().indexOfKey(topIndexKey);
-						if (idx >= 0)
-						{
-							if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-								System.out.println("actual set top index: " + ((BigInteger)topIndexKey).toString(16)); //$NON-NLS-1$
-							fPendingTopIndexKey = null;
-							setTopIndexKey(topIndexKey);
-							getTable().setTopIndex(idx);							
-							tableTopIndexSetComplete();		
-							
-							if (getTable().getTopIndex() != idx  )
-							{
-								if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-									System.out.println(">>> FAILED set top index : " + ((BigInteger)topIndexKey).toString(16)); //$NON-NLS-1$
-
-								// only retry if we have pending updates
-								if (hasPendingUpdates())
-								{
-									if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-										System.out.println(">>> Retry top index: " + ((BigInteger)topIndexKey).toString(16)); //$NON-NLS-1$
-
-									fPendingTopIndexKey = topIndexKey;
-								}
-							}														
-						}
-						else
-						{
-							if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-								System.out.println("cannot find key, put it back to the queue: " + topIndexKey); //$NON-NLS-1$
-							fPendingTopIndexKey = topIndexKey;
-						}
-						
-						// remove the top index key from queue when it is processed
-						removeKeyFromQueue(topIndexKey);
-						
-					return Status.OK_STATUS;
-				}};
-				
-			// set top index does not happen immediately, keep track of
-			// all pending set top index
-			addKeyToQueue(topIndexKey);
-			
-			job.setSystem(true);
-			job.schedule();
-			return topIndexKey;
-		}
-		return topIndexKey;
-	}
-	
-	protected void tableTopIndexSetComplete()
-	{
-		
-	}
-	 
-	 public void addVirtualContentListener(IVirtualContentListener listener)
-	 {
-		 fVirtualContentListeners.add(listener);
-	 }
-	 
-	 public void removeVirtualContentListener(IVirtualContentListener listener)
-	 {
-		 fVirtualContentListeners.remove(listener);
-	 }
-	 
-	 protected void notifyListenersAtBufferStart()
-	 {
-		 int topIdx = getTable().getTopIndex();
-		 Object[] listeners = fVirtualContentListeners.getListeners();
-	 
-		for (int i = 0; i < listeners.length; i++) {
-			final IVirtualContentListener listener = (IVirtualContentListener) listeners[i];
-			if (topIdx < listener.getThreshold(IVirtualContentListener.BUFFER_START))
-			{
-				SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {	
-						listener.handledAtBufferStart();
-					}
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-				});
-			}
-		}
-	 }
-	 
-	 protected void notifyListenersAtBufferEnd()
-	 {
-		Object[] listeners = fVirtualContentListeners.getListeners();
-		int topIdx = getTable().getTopIndex();
-		int bottomIdx = topIdx + getNumberOfVisibleLines();
-		int elementsCnt = getVirtualContentModel().getElements().length;
-		int numLinesLeft = elementsCnt - bottomIdx;
-	 
-		for (int i = 0; i < listeners.length; i++) {
-			final IVirtualContentListener listener = (IVirtualContentListener) listeners[i];
-			if (numLinesLeft <= listener.getThreshold(IVirtualContentListener.BUFFER_END))
-			{
-				SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {
-						listener.handleAtBufferEnd();
-					}
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-				});
-			}
-		}
-	 }
-	 
-	protected void  handleScrollBarSelection()
-	{
-//		 ignore event if there is pending set top index in the queue
-		if (!fTopIndexQueue.isEmpty())
-			return;
-		topIndexChanged();
-	}
-	
-	public void topIndexChanged()
-	{
-		if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-		{
-			MemorySegment a = (MemorySegment)getTable().getItem(getTable().getTopIndex()).getData();
-			System.out.println(Thread.currentThread().getName() + " " + this + " handle scroll bar moved:  top index: " + a.getAddress().toString(16)); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		setTopIndexKey(getVirtualContentModel().getKey(getTable().getTopIndex()));
-
-		notifyListenersAtBufferStart();
-		notifyListenersAtBufferEnd();
-	}
-	
-	protected void setTopIndexKey(Object key)
-	{
-		fTopIndexKey = key;
-	}
-	
-	protected Object getTopIndexKey()
-	{
-		return fTopIndexKey;
-	}
-
-	protected synchronized void preservingSelection(Runnable updateCode) {
-		Object oldTopIndexKey = null;
-		if (fPendingTopIndexKey == null) {
-			// preserve selection
-			oldTopIndexKey = getTopIndexKey();
-		}
-		else
-		{
-			oldTopIndexKey = fPendingTopIndexKey;
-		}
-		
-		try {
-
-			// perform the update
-			updateCode.run();
-		} finally {			
-			if (oldTopIndexKey != null)
-			{
-				setTopIndex(oldTopIndexKey);
-			}
-		}
-
-	}
-	
-	public void addPresentationErrorListener(IPresentationErrorListener errorListener)
-	{
-		fPresentationErrorListeners.add(errorListener);
-	}
-	
-	public void removePresentationErrorListener(IPresentationErrorListener errorListener)
-	{
-		fPresentationErrorListeners.remove(errorListener);
-	}
-	
-	private void notifyPresentationError(final IStatusMonitor monitor, final IStatus status)
-	{
-		Object[] listeners = fPresentationErrorListeners.getListeners();
-	 
-		for (int i = 0; i < listeners.length; i++) {
-			
-			if (listeners[i] instanceof IPresentationErrorListener)
-			{
-				final IPresentationErrorListener listener = (IPresentationErrorListener)listeners[i];
-				SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {
-						listener.handlePresentationFailure(monitor, status);
-					}
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-				});
-			}
-		}
-	}
-
-	protected AsynchronousModel createModel() {
-		return createVirtualContentTableModel();
-	}
-	
-	abstract protected AbstractVirtualContentTableModel createVirtualContentTableModel();
-	
-	private void addKeyToQueue(Object topIndexKey)
-	{
-		synchronized(fTopIndexQueue){
-			if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-				System.out.println(" >>> add to top index queue: " + ((BigInteger)topIndexKey).toString(16)); //$NON-NLS-1$
-			fTopIndexQueue.add(topIndexKey);
-		}
-	}
-	
-	private void removeKeyFromQueue(Object topIndexKey)
-	{
-		synchronized(fTopIndexQueue){
-			if (AsyncVirtualContentTableViewer.DEBUG_DYNAMIC_LOADING)
-				System.out.println(" >>> remove frome top index queue: " + ((BigInteger)topIndexKey).toString(16)); //$NON-NLS-1$
-			fTopIndexQueue.remove(topIndexKey);
-		}
-	}
-	
-	public AbstractVirtualContentTableModel getVirtualContentModel()
-	{
-		if (getModel() instanceof AbstractVirtualContentTableModel)
-			return (AbstractVirtualContentTableModel) getModel();
-		return null;
-	}
-	
-	private int getNumberOfVisibleLines()
-	{	
-		Table table = getTable();
-		int height = table.getSize().y;
-		
-		// when table is not yet created, height is zero
-		if (height == 0)
-		{
-			// make use of the table viewer to estimate table size
-			height = table.getParent().getSize().y;
-		}
-		
-		// height of border
-		int border = table.getHeaderHeight();
-		
-		// height of scroll bar
-		int scroll = table.getHorizontalBar().getSize().y;
-
-		// height of table is table's area minus border and scroll bar height		
-		height = height-border-scroll;
-
-		// calculate number of visible lines
-		int lineHeight = getMinTableItemHeight(table);
-		
-		int numberOfLines = height/lineHeight;
-		
-		if (numberOfLines <= 0)
-			return 20;
-	
-		return numberOfLines;		
-	}
-	
-	private int getMinTableItemHeight(Table table){
-		
-		// Hack to get around Linux GTK problem.
-		// On Linux GTK, table items have variable item height as
-		// carriage returns are actually shown in a cell.  Some rows will be
-		// taller than others.  When calculating number of visible lines, we
-		// need to find the smallest table item height.  Otherwise, the rendering
-		// underestimates the number of visible lines.  As a result the rendering
-		// will not be able to get more memory as needed.
-		if (MemoryViewUtil.isLinuxGTK())
-		{
-			// check each of the items and find the minimum
-			TableItem[] items = table.getItems();
-			int minHeight = table.getItemHeight();
-			for (int i=0; i<items.length; i++)
-			{
-				if (items[i].getData() != null)
-					minHeight = Math.min(items[i].getBounds(0).height, minHeight);
-			}
-			
-			return minHeight;
-				
-		}
-		return table.getItemHeight();
-	}
-
-	protected void updateComplete(IStatusMonitor monitor) {
-		super.updateComplete(monitor);
-		attemptSetTopIndex();
-		if (monitor instanceof ILabelRequestMonitor)
-		{
-			fPendingResizeColumns = attemptResizeColumnsToPreferredSize();
-		}
-	}
-	
-	protected boolean hasPendingSetTopIndex()
-	{
-		return !fTopIndexQueue.isEmpty();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/BasicDebugViewContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/BasicDebugViewContentProvider.java
deleted file mode 100644
index e1b72a8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/BasicDebugViewContentProvider.java
+++ /dev/null
@@ -1,123 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @since 3.0
- * 
- */
-public abstract class BasicDebugViewContentProvider implements IStructuredContentProvider, IDebugEventSetListener {
-
-	protected StructuredViewer fViewer;
-	protected boolean fDisposed= false;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		fDisposed= true;
-	}
-	
-	/**
-	 * Returns whether this content provider has already
-	 * been disposed.
-	 */
-	protected boolean isDisposed() {
-		return fDisposed;
-	}
-	
-	/* (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) {
-		fViewer= (StructuredViewer) viewer;
-	}
-
-	protected void asyncExec(Runnable r) {
-		if (fViewer != null) {
-			Control ctrl= fViewer.getControl();
-			if (ctrl != null && !ctrl.isDisposed()) {
-				ctrl.getDisplay().asyncExec(r);
-			}
-		}
-	}
-	
-	protected void syncExec(Runnable r) {
-		if (fViewer != null) {
-			Control ctrl= fViewer.getControl();
-			if (ctrl != null && !ctrl.isDisposed()) {
-				ctrl.getDisplay().syncExec(r);
-			}
-		}
-	}
-	
-	/**
-	 * Refreshes the viewer - must be called in UI thread.
-	 */
-	protected void refresh() {
-		if (fViewer != null) {
-			fViewer.refresh();
-		}
-	}
-			
-	/**
-	 * Refresh the given element in the viewer - must be called in UI thread.
-	 */
-	protected void refresh(Object element) {
-		if (fViewer != null) {
-			 fViewer.refresh(element);
-		}
-	}
-	
-	/**
-	 * Handle debug events on the main thread.
-	 * @param event
-	 */
-	public void handleDebugEvent(final DebugEvent event) {
-		if (fViewer == null) {
-			return;
-		}
-		Object element= event.getSource();
-		if (element == null) {
-			return;
-		}
-		Runnable r= new Runnable() {
-			public void run() {
-				if (!isDisposed()) {
-					doHandleDebugEvent(event);
-				}
-			}
-		};
-		
-		asyncExec(r);
-	}
-
-	/* (non-Javadoc)
-	 * @see IDebugEventSetListener#handleDebugEvents(DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i=0; i < events.length; i++)
-			handleDebugEvent(events[i]);
-	}
-	
-	/**
-	 * Performs an update based on the event
-	 */
-	protected abstract void doHandleDebugEvent(DebugEvent event);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/BigEndianAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/BigEndianAction.java
deleted file mode 100644
index 94d7d15..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/BigEndianAction.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.model.MemoryByte;
-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;
-
-/**
- * Show integers in Big Endian
- */
-public class BigEndianAction implements IObjectActionDelegate {
-
-	AbstractIntegerRendering fRendering;
-	
-	/* (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) {
-
-		if (fRendering == null)
-			return;
-		
-		if (fRendering.getDisplayEndianess() != RenderingsUtil.BIG_ENDIAN){
-			fRendering.setDisplayEndianess(RenderingsUtil.BIG_ENDIAN);
-			fRendering.refresh();
-		}
-	}
-
-	/* (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) {
-		
-		if (selection == null)
-			return;
-		
-		if (selection instanceof IStructuredSelection)
-		{
-			Object obj = ((IStructuredSelection)selection).getFirstElement();
-			if (obj == null)
-				return;
-			
-			if (obj instanceof AbstractIntegerRendering)
-			{
-				fRendering = (AbstractIntegerRendering)obj;
-			}
-			
-			int endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-			if (fRendering.getDisplayEndianess() == RenderingsUtil.ENDIANESS_UNKNOWN)
-			{
-				MemoryByte[] selectedBytes = fRendering.getSelectedAsBytes();
-				for (int i=0; i<selectedBytes.length; i++)
-				{
-					if (!selectedBytes[i].isEndianessKnown())
-					{
-						endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-						break;
-					}
-					if (i==0)
-					{
-						endianess = selectedBytes[i].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;
-					}
-					else
-					{
-						int byteEndianess = selectedBytes[i].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;
-						if (endianess != byteEndianess)
-						{
-							endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-							break;
-						}
-					}
-				}
-			}
-			else
-				endianess = fRendering.getDisplayEndianess();
-			
-			if (endianess == RenderingsUtil.BIG_ENDIAN)
-				action.setChecked(true);
-			else
-				action.setChecked(false);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CopyTableRenderingToClipboardAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CopyTableRenderingToClipboardAction.java
deleted file mode 100644
index 3324098..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CopyTableRenderingToClipboardAction.java
+++ /dev/null
@@ -1,188 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Toobar Copy View Tab to Clipboard action
- * 
- * @since 3.0
- */
-public class CopyTableRenderingToClipboardAction extends Action
-{
-	private final String COLUMN_SEPERATOR = "  "; //$NON-NLS-1$
-	
-	protected AbstractBaseTableRendering fRendering;
-	protected StructuredViewer fViewer;
-	
-	public CopyTableRenderingToClipboardAction(AbstractBaseTableRendering rendering, StructuredViewer viewer)
-	{
-		super();
-		fRendering = rendering;
-		fViewer = viewer;
-		setText(DebugUIMessages.CopyViewToClipboardAction_title);
-		setToolTipText(DebugUIMessages.CopyViewToClipboardAction_tooltip);
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_COPY_VIEW_TO_CLIPBOARD));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_COPY_VIEW_TO_CLIPBOARD));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_COPY_VIEW_TO_CLIPBOARD));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".PrintViewTabContextAction_context"); //$NON-NLS-1$
-	}
-
-	protected String concatenateTableAsString(TableItem[] itemList) {
-		if (itemList.length == 0) return null;
-
-		StringBuffer tableContents = new StringBuffer();
-		
-		Table table = (Table)fViewer.getControl();
-		int numColumns = table.getColumnCount();
-		ITableLabelProvider labelProvider = (ITableLabelProvider)fViewer.getLabelProvider();		
-		TableColumn columns[] = table.getColumns();
-		
-		// get title of view tab
-		String label = fRendering.getLabel();
-		tableContents.append(label);
-		tableContents.append(System.getProperty("line.separator")); //$NON-NLS-1$
-		tableContents.append(COLUMN_SEPERATOR);
-		
-		int charsPerByte = fRendering.getNumCharsPerByte();
-		if (charsPerByte < 0)
-			charsPerByte = 4;
-		
-		//get the column headers and line them up properly
-		for (int k=0; k < numColumns; k++) {
-			
-			StringBuffer columnLabel = new StringBuffer(columns[k].getText());
-			int numBytes = 0;
-			int numChars = 0;
-			
-			if (k > 0)
-			{	
-				numBytes = fRendering.getBytesPerColumn();
-				numChars = numBytes * charsPerByte;
-			}
-			else
-			{
-				// special for address column
-				IMemoryBlock memBlock = fRendering.getMemoryBlock();
-				if (memBlock instanceof IMemoryBlockExtension)
-				{
-					TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)fRendering.getAdapter(TableRenderingContentDescriptor.class);
-					if (descriptor == null)
-						{
-						try {
-							numBytes = ((IMemoryBlockExtension)memBlock).getAddressSize();
-						} catch (DebugException e) {
-							numBytes = 0;
-						}
-					}
-					else
-						numBytes = descriptor.getAddressSize();
-					
-					// check address size
-					if (numBytes <= 0)
-						numBytes = 4;
-				}
-				else
-				{
-					numBytes = 4;
-				}
-				numChars = numBytes*2;
-				
-			}
-			
-			 while (columnLabel.length() < numChars)
-			 {
-				 columnLabel.append(" "); //$NON-NLS-1$
-			 }
-				
-			tableContents.append(columnLabel);	
-			tableContents.append(COLUMN_SEPERATOR);
-		}
-		
-		tableContents.append(System.getProperty("line.separator")); //$NON-NLS-1$
-		StringBuffer temp;
-			
-		//get the column contents from all the rows
-		for (int i=0; i < itemList.length; i++) {
-			for (int j=0; j < numColumns; j++) {
-				tableContents.append(COLUMN_SEPERATOR);
-				
-				temp = new StringBuffer(labelProvider.getColumnText(itemList[i].getData(), j));
-				
-				if (j>0)
-				{	
-					int numBytes = fRendering.getBytesPerColumn();
-					int numChars = numBytes * charsPerByte;
-					while (temp.length() < numChars)
-					{
-						temp.append(" "); //$NON-NLS-1$
-					}
-				}
-				
-				tableContents.append(temp);
-			}
-			tableContents.append(System.getProperty("line.separator")); //$NON-NLS-1$
-		}
-		return tableContents.toString();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		
-		if (fRendering == null)
-			return;
-		
-		if (! (fViewer.getControl() instanceof Table))
-			return;
-		
-		Table table = (Table)fViewer.getControl();
-		
-		if (table == null)
-			return;
-		Clipboard clip= null;
-		try {
-			clip = new Clipboard(table.getDisplay());
-			TableItem[] tableItems = table.getItems();
-			String tableAsString = new String();
-			tableAsString = concatenateTableAsString(tableItems);
-			if (!tableAsString.equals("")) { //$NON-NLS-1$
-				TextTransfer plainTextTransfer = TextTransfer.getInstance();
-				clip.setContents(new Object[] {tableAsString}, new Transfer[] {plainTextTransfer});
-			}
-		} finally {
-			if (clip != null) {
-				clip.dispose();
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
deleted file mode 100644
index b21f8ad..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-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.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.memory.AbstractMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener;
-import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-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.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * The rendering to allow users to create a rendering.
- * @since 3.1
- */
-public class CreateRendering extends AbstractMemoryRendering implements IMemoryRenderingBindingsListener {
-
-	private ListViewer fViewer;
-	private Label fMemoryBlockLabel;
-	private IMemoryRenderingContainer fContainer; 
-	private Composite fCanvas;
-	private String fLabel;
-	
-	public CreateRendering(IMemoryRenderingContainer container)
-	{
-		super("org.eclipse.debug.internal.ui.views.createrendering"); //$NON-NLS-1$
-		fContainer = container;
-	}
-
-	class MemoryRenderingLabelProvider implements ILabelProvider
-	{
-		
-		/* (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) {
-			if (element instanceof IMemoryRenderingType)
-			{	
-				String label = ((IMemoryRenderingType)element).getLabel();
-				return label;
-			}
-            return element.toString();
-		}
-
-		/* (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) {
-		}
-
-	}
-	
-	class MemoryRenderingContentProvider implements IStructuredContentProvider
-	{
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			IMemoryRenderingType[] renderings = DebugUITools.getMemoryRenderingManager().getRenderingTypes((IMemoryBlock)inputElement);
-			return renderings;
-		}
-
-		/* (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.debug.ui.memory.IMemoryRendering#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		fCanvas = new Composite(parent, SWT.NONE);
-		GridLayout compositeLayout = new GridLayout();
-		compositeLayout.numColumns = 2;
-		compositeLayout.makeColumnsEqualWidth = false;
-		fCanvas.setLayout(compositeLayout);
-		
-		GridData comositeSpec= new GridData();
-		comositeSpec.grabExcessVerticalSpace= true;
-		comositeSpec.grabExcessHorizontalSpace= true;
-		comositeSpec.horizontalAlignment= GridData.FILL;
-		comositeSpec.verticalAlignment= GridData.CENTER;
-		fCanvas.setLayoutData(comositeSpec);
-		
-		fMemoryBlockLabel = new Label(fCanvas, SWT.BORDER);
-		
-		String memoryBlockLabel = " "; //$NON-NLS-1$
-		memoryBlockLabel = getLabel();
-		
-		fMemoryBlockLabel.setText("  " + DebugUIMessages.CreateRenderingTab_Memory_monitor + memoryBlockLabel + "  "); //$NON-NLS-1$ //$NON-NLS-2$ 
-		GridData textLayout = new GridData();
-		textLayout.verticalAlignment=GridData.CENTER;
-		textLayout.horizontalAlignment=GridData.BEGINNING;
-		fMemoryBlockLabel.setLayoutData(textLayout);
-
-		Label renderingLabel = new Label(fCanvas, SWT.NONE);
-		renderingLabel.setText(DebugUIMessages.CreateRenderingTab_Select_renderings_to_create); 
-		GridData renderingLayout = new GridData();
-		renderingLayout.horizontalAlignment = GridData.BEGINNING;
-		renderingLayout.verticalAlignment = GridData.CENTER;
-		renderingLayout.horizontalSpan = 2;
-		renderingLabel.setLayoutData(renderingLayout);
-		
-		fViewer = new ListViewer(fCanvas);
-		fViewer.setContentProvider(new MemoryRenderingContentProvider());
-		fViewer.setLabelProvider(new MemoryRenderingLabelProvider());
-		fViewer.setInput(getMemoryBlock());
-		
-		if (fViewer.getElementAt(0) != null)
-		{
-			fViewer.getList().select(0);
-		}
-		
-		GridData listLayout = new GridData(GridData.FILL_BOTH);
-		listLayout.horizontalSpan = 1;
-		fViewer.getControl().setLayoutData(listLayout);
-		
-		fViewer.addDoubleClickListener(new IDoubleClickListener (){
-
-			public void doubleClick(DoubleClickEvent event) {
-				addRenderings();
-			}});
-		
-		Button addButton = new Button(fCanvas, SWT.NONE);
-		addButton.setText(DebugUIMessages.CreateRenderingTab_Add_renderings); 
-		GridData buttonLayout = new GridData();
-		buttonLayout.horizontalAlignment = GridData.BEGINNING;
-		buttonLayout.verticalAlignment = GridData.BEGINNING;
-		addButton.setLayoutData(buttonLayout);
-		
-		addButton.addSelectionListener(new SelectionListener() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addRenderings();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				addRenderings();
-			}});
-		
-		DebugUITools.getMemoryRenderingManager().addListener(this);
-		
-		return fCanvas;		
-	}
-	
-	private void addRenderings()
-	{									
-		ISelection selection = fViewer.getSelection();
-		Object[] renderings = null;
-		
-		if (selection instanceof IStructuredSelection)
-		{
-			IStructuredSelection strucSelection = (IStructuredSelection)selection;
-			
-			renderings = strucSelection.toArray();
-		}
-		
-		if (renderings == null)
-		{
-			Status stat = new Status(
-					IStatus.ERROR,DebugUIPlugin.getUniqueIdentifier(),
-					DebugException.INTERNAL_ERROR, DebugUIMessages.CreateRenderingTab_0, null); 
-			DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), DebugUIMessages.CreateRenderingTab_1, DebugUIMessages.CreateRenderingTab_2, stat); // 
-			return;
-		}
-										
-		// ask for debug target and memory block retrieval
-		IDebugTarget debugTarget = ((IDebugElement)getMemoryBlock()).getDebugTarget();
-		IMemoryBlockRetrieval standardMemRetrieval = (IMemoryBlockRetrieval)((IDebugElement)getMemoryBlock()).getAdapter(IMemoryBlockRetrieval.class);
-		
-		if (standardMemRetrieval == null)
-		{	
-			standardMemRetrieval = debugTarget;
-		}
-		
-		if (standardMemRetrieval == null)
-			return;
-		
-		
-		// make a copy of the container, may be diposed when a rendering is added
-		IMemoryRenderingContainer container = fContainer;
-		// add memory renderings to Memory Rendering Manager
-		for (int i=0; i<renderings.length; i++)
-		{	
-			if (renderings[i] instanceof IMemoryRenderingType)
-			{
-				try {
-					IMemoryRendering rendering = ((IMemoryRenderingType)renderings[i]).createRendering();
-					if (rendering != null)
-					{
-						rendering.init(container, getMemoryBlock());
-						container.addMemoryRendering(rendering);
-					}
-				} catch (CoreException e) {
-					
-					MemoryViewUtil.openError(DebugUIMessages.CreateRendering_0, DebugUIMessages.CreateRendering_1, e);  // 
-				}
-			}					
-		}		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#dispose()
-	 */
-	public void dispose() {
-		fViewer = null;
-		fCanvas = null;
-		fContainer = null;
-		fMemoryBlockLabel = null;
-		DebugUITools.getMemoryRenderingManager().removeListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.memory.AbstractMemoryRendering#getControl()
-	 */
-	public Control getControl() {
-		return fCanvas;
-	}
-	public void memoryRenderingBindingsChanged() {
-		if (fViewer != null)
-			fViewer.refresh();
-	}
-
-	public String getLabel() {
-		if (fLabel == null)
-		{
-			fLabel = DebugUIMessages.CreateRendering_2;
-			updateRenderingLabel();
-		}
-		
-		return fLabel;
-	}
-	
-	protected void updateRenderingLabel()
-	{
-		Job job = new Job("Update Rendering Label"){ //$NON-NLS-1$
-
-			protected IStatus run(IProgressMonitor monitor) {
-				fLabel = CreateRendering.super.getLabel();
-				firePropertyChangedEvent(new PropertyChangeEvent(CreateRendering.this, IBasicPropertyConstants.P_TEXT, null, fLabel));
-				
-				WorkbenchJob wbJob = new WorkbenchJob("Create Rendering Update Label"){ //$NON-NLS-1$
-
-					public IStatus runInUIThread(IProgressMonitor wbMonitor) {
-						if (fMemoryBlockLabel != null)
-						{
-							fMemoryBlockLabel.setText("  " + DebugUIMessages.CreateRenderingTab_Memory_monitor + fLabel + "  ");  //$NON-NLS-1$//$NON-NLS-2$
-							fMemoryBlockLabel.getParent().layout();
-						}
-						return Status.OK_STATUS;
-					}};
-				wbJob.setSystem(true);
-				wbJob.schedule();
-				return Status.OK_STATUS;
-			}};
-		job.setSystem(true);
-		job.schedule();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/DefaultEndianessAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/DefaultEndianessAction.java
deleted file mode 100644
index 1c37061..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/DefaultEndianessAction.java
+++ /dev/null
@@ -1,70 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-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;
-
-/**
- * Restore default endianess.
- * For IMemoryBlockExtension, default is governed by the attributes set
- * in its memory bytes.
- * For IMemoryBlock, default is big endian.
- *
- */
-public class DefaultEndianessAction implements IObjectActionDelegate {
-
-	AbstractIntegerRendering fRendering;
-	public DefaultEndianessAction() {
-		super();
-	}
-
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-
-	public void run(IAction action) {
-		if (fRendering != null)
-		{
-			if (fRendering.getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				fRendering.setDisplayEndianess(RenderingsUtil.ENDIANESS_UNKNOWN);
-			}
-			else
-			{
-				fRendering.setDisplayEndianess(RenderingsUtil.BIG_ENDIAN);
-			}
-			fRendering.refresh();
-		}
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (selection == null)
-			return;
-		
-		if (selection instanceof IStructuredSelection)
-		{
-			Object obj = ((IStructuredSelection)selection).getFirstElement();
-			if (obj == null)
-				return;
-			
-			if (obj instanceof AbstractIntegerRendering)
-			{
-				fRendering = (AbstractIntegerRendering)obj;
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ErrorRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ErrorRendering.java
deleted file mode 100644
index 36743b9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ErrorRendering.java
+++ /dev/null
@@ -1,90 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.memory.AbstractMemoryRendering;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A dummy rendering for displaying an error message in a view tab.
- * @since 3.1
- */
-/**
- * @author chanskw
- *
- */
-public class ErrorRendering extends AbstractMemoryRendering {
-
-	private TextViewer fTextViewer;
-	private String fRenderingId;
-	private Throwable fException;
-	
-	/**
-	 * @param renderingId - id of rendering that the memory view has failed
-	 * to create.
-	 */
-	public ErrorRendering(String renderingId, Throwable exception)
-	{
-		super("org.eclipse.debug.internal.ui.views.memory.errorrendering"); //$NON-NLS-1$
-		fRenderingId = renderingId;
-		fException = exception;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		fTextViewer = new TextViewer(parent, SWT.READ_ONLY);		
-		fTextViewer.setDocument(new Document());
-		StyledText styleText = fTextViewer.getTextWidget();
-		
-		styleText.setText("\r\n\r\n" + DebugUIMessages.EmptyViewTab_Unable_to_create + "\n" + getRenderingName() + "\n\n" + DebugUIMessages.ErrorRendering_0 + fException.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$  
-		
-		
-		return fTextViewer.getControl();
-	}
-	
-
-	/**
-	 * 
-	 */
-	private String getRenderingName() {
-		
-		if (DebugUITools.getMemoryRenderingManager().getRenderingType(fRenderingId)!= null)
-		{
-			String name =
-				DebugUITools.getMemoryRenderingManager()
-				.getRenderingType(fRenderingId)
-				.getLabel();
-			
-			return name;
-		}
-		return "Unknown"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.memory.AbstractMemoryRendering#getControl()
-	 */
-	public Control getControl() {
-		return fTextViewer.getControl();
-	}
-
-	public void refresh() {
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/FormatTableRenderingAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/FormatTableRenderingAction.java
deleted file mode 100644
index c3ae82d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/FormatTableRenderingAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-public class FormatTableRenderingAction extends Action {
-
-	private AbstractBaseTableRendering fRendering;
-	
-	int fColumnSize = -1;
-	int fRowSize = -1;
-	
-	public FormatTableRenderingAction(AbstractBaseTableRendering rendering)
-	{
-		fRendering = rendering;
-		setText(DebugUIMessages.FormatTableRenderingAction_16);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".FormatTableRenderingAction_context"); //$NON-NLS-1$
-	}
-
-	public void run() {
-		FormatTableRenderingDialog dialog = new FormatTableRenderingDialog(fRendering, DebugUIPlugin.getShell());
-		dialog.open();
-		fColumnSize = dialog.getColumnSize();
-		fRowSize = dialog.getRowSize();
-		if (fColumnSize > 0 && fRowSize > 0)
-		{
-			int addressableSize = fRendering.getAddressableSize();
-			int columnSizeInBytes = addressableSize * fColumnSize;
-			int rowSizeInBytes = addressableSize * fRowSize;
-			fRendering.format(rowSizeInBytes, columnSizeInBytes);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/FormatTableRenderingDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/FormatTableRenderingDialog.java
deleted file mode 100644
index 5384f88..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/FormatTableRenderingDialog.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.memory.IPersistableDebugElement;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-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.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.PageBook;
-
-public class FormatTableRenderingDialog extends TrayDialog
-	{
-
-		private int[] fColumnSizes = new int[] {1, 2, 4, 8, 16};
-		private int[] fRowSizes = new int[] {1, 2, 4, 8, 16};
-		private Combo fColumnControl;
-		private Combo fRowControl;
-		
-		private int fCurrentColIdx = -1;
-		private int fCurrentRowIdx = -1;
-		private Control fPreivewPage;
-		private PageBook fPreviewPageBook;
-		private Button fDefaultButton;
-		private Text fDefaultColValue;
-		private Text fDefaultRowValue;
-		private AbstractBaseTableRendering fRendering;
-		private int fColumnSize;
-		private int fRowSize;
-		private Label fMsgLabel;
-		private boolean fDisableCancel = false;
-		private String fMsg;
-		
-
-		public FormatTableRenderingDialog(AbstractBaseTableRendering rendering, Shell parentShell) {
-			super(parentShell);
-			setShellStyle(getShellStyle() | SWT.RESIZE);
-			fRendering = rendering;
-			fMsg = DebugUIMessages.FormatTableRenderingAction_1;
-		}
-		
-		protected Control createDialogArea(Composite parent) {
-			getShell().setText(DebugUIMessages.FormatTableRenderingAction_0);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".FormatTableRenderingDialog_context"); //$NON-NLS-1$
-			
-			Composite composite = new Composite(parent, SWT.NONE);
-			GridLayout layout = new GridLayout();
-			layout.numColumns = 3;
-			layout.makeColumnsEqualWidth = false;
-			composite.setLayout(layout);
-			GridData data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.grabExcessVerticalSpace = true;
-			data.horizontalAlignment = SWT.FILL;
-			data.verticalAlignment = SWT.FILL;
-			composite.setLayoutData(data);
-			
-			fMsgLabel = new Label(composite, SWT.NONE);
-			fMsgLabel.setText(fMsg);
-			
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.horizontalAlignment = SWT.BEGINNING;
-			data.horizontalSpan = 3;
-			fMsgLabel.setLayoutData(data);
-			
-			Label rowLabel = new Label(composite, SWT.NONE);
-			rowLabel.setText(DebugUIMessages.FormatTableRenderingAction_2);
-			fRowControl = new Combo(composite, SWT.READ_ONLY);
-			for (int i=0; i<fRowSizes.length; i++)
-			{
-				fRowControl.add(String.valueOf(fRowSizes[i]));
-			}
-			
-			fRowControl.addSelectionListener(new SelectionListener() {
-
-				public void widgetSelected(SelectionEvent e) {
-					if (fCurrentRowIdx != fRowControl.getSelectionIndex())
-					{
-						fCurrentRowIdx = fRowControl.getSelectionIndex();
-						refreshPreviewPage();
-						updateButtons();
-					}
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}});
-			
-			data = new GridData();
-			data.grabExcessHorizontalSpace = false;
-			data.horizontalAlignment = SWT.BEGINNING;
-			fRowControl.setLayoutData(data);
-			
-			Label unit = new Label(composite, SWT.NONE);
-			unit.setText(DebugUIMessages.FormatTableRenderingAction_3);		
-			
-			Label columnLabel = new Label(composite, SWT.NONE);
-			columnLabel.setText(DebugUIMessages.FormatTableRenderingAction_4);
-			fColumnControl = new Combo(composite, SWT.READ_ONLY);
-			for (int i=0; i<fColumnSizes.length; i++)
-			{
-				fColumnControl.add(String.valueOf(fColumnSizes[i]));
-			}
-			
-			fColumnControl.addSelectionListener(new SelectionListener() {
-
-				public void widgetSelected(SelectionEvent e) {
-					if (fCurrentColIdx != fColumnControl.getSelectionIndex())
-					{
-						fCurrentColIdx = fColumnControl.getSelectionIndex();
-						refreshPreviewPage();
-						updateButtons();
-					}
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}});
-			
-			data = new GridData();
-			data.grabExcessHorizontalSpace = false;
-			data.horizontalAlignment = SWT.BEGINNING;
-			fColumnControl.setLayoutData(data);
-			
-			unit = new Label(composite, SWT.NONE);
-			unit.setText(DebugUIMessages.FormatTableRenderingAction_5);
-			
-			populateDialog();
-			
-			fDefaultButton = new Button(composite, SWT.NONE);
-			fDefaultButton.setText(DebugUIMessages.FormatTableRenderingAction_8);
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.grabExcessVerticalSpace = true;
-			data.horizontalAlignment = SWT.END;
-			data.horizontalSpan = 3;
-			fDefaultButton.setLayoutData(data);
-			
-			fDefaultButton.addSelectionListener(new SelectionListener() {
-
-				public void widgetSelected(SelectionEvent e) {
-					saveDefaults();
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					
-				}});
-			
-			Group group = new Group(composite, SWT.NONE);
-			group.setText(DebugUIMessages.FormatTableRenderingAction_7);
-			group.setLayout(new GridLayout());
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.grabExcessVerticalSpace = true;
-			data.horizontalAlignment = SWT.FILL;
-			data.verticalAlignment = SWT.FILL;
-			data.horizontalSpan = 3;
-			group.setLayoutData(data);
-			
-			fPreviewPageBook = new PageBook(group, SWT.NONE);
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.grabExcessVerticalSpace = true;
-			data.horizontalAlignment = SWT.FILL;
-			data.verticalAlignment = SWT.FILL;
-			fPreviewPageBook.setLayoutData(data);
-			
-			int rowSize = fRowSizes[fRowControl.getSelectionIndex()];
-			int colSize = fColumnSizes[fColumnControl.getSelectionIndex()];
-
-			fPreivewPage = createPreviewPage(fPreviewPageBook, rowSize, colSize);
-			fPreviewPageBook.showPage(fPreivewPage);
-			
-			Label defaultRow = new Label(composite, SWT.NONE);
-			defaultRow.setText(DebugUIMessages.FormatTableRenderingDialog_0);
-			fDefaultRowValue = new Text(composite, SWT.READ_ONLY);
-			
-			int defRow = getDefaultRowSize();
-						
-			fDefaultRowValue.setText(String.valueOf(defRow));
-			Label def = new Label(composite, SWT.NONE);
-			def.setText(DebugUIMessages.FormatTableRenderingDialog_1);
-			
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.grabExcessVerticalSpace = true;
-			data.horizontalAlignment = SWT.BEGINNING;
-			def.setLayoutData(data);
-			
-			
-			Label defaultCol = new Label(composite, SWT.NONE);
-			defaultCol.setText(DebugUIMessages.FormatTableRenderingDialog_2);
-			fDefaultColValue = new Text(composite, SWT.READ_ONLY);
-			
-			int defCol = getDefaultColumnSize();
-			
-			fDefaultColValue.setText(String.valueOf(defCol));
-			def = new Label(composite, SWT.NONE);
-			def.setText(DebugUIMessages.FormatTableRenderingDialog_3);
-			
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.grabExcessVerticalSpace = true;
-			data.horizontalAlignment = SWT.BEGINNING;
-			def.setLayoutData(data);
-			
-			Button restoreButton = new Button(composite, SWT.NONE);
-			restoreButton.setText(DebugUIMessages.FormatTableRenderingAction_6);
-			restoreButton.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent e) {
-					restoreDefaults();
-				}
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}});
-			data = new GridData();
-			data.grabExcessHorizontalSpace = true;
-			data.horizontalAlignment = SWT.END;
-			data.horizontalSpan = 3;
-			data.verticalAlignment = SWT.CENTER;
-			restoreButton.setLayoutData(data);
-			
-			return composite;
-		}
-
-		protected void okPressed() {
-			int idx = fColumnControl.getSelectionIndex();
-			fColumnSize = fColumnSizes[idx];
-			fRowSize = fRowSizes[fRowControl.getSelectionIndex()];
-			super.okPressed();
-		}
-		
-		private void populateDialog()
-		{
-			int currentColSize = fRendering.getAddressableUnitPerColumn();
-			int currentRowSize = fRendering.getAddressableUnitPerLine();
-			setCurrentRowColSizes(currentRowSize, currentColSize);
-		}
-
-		private int populateControl(int currentSize, int[] searchArray, Combo control) {
-			int idx = 0;
-			for (int i=0 ;i<searchArray.length; i++)
-			{
-				if (searchArray[i] == currentSize)
-				{
-					idx = i;
-					break;
-				}
-			}
-			control.select(idx);
-			return idx;
-		}
-		
-		private Control createPreviewPage(Composite parent, int rowSize, int colSize)
-		{			
-			if (!isValid(rowSize, colSize))
-			{	
-				Label label = new Label(parent, SWT.NONE);
-				StringBuffer errorMsg = new StringBuffer();
-				errorMsg.append(DebugUIMessages.FormatTableRenderingAction_9);
-				errorMsg.append("\n"); //$NON-NLS-1$
-				errorMsg.append(DebugUIMessages.FormatTableRenderingAction_11);
-				
-				if (colSize > rowSize)
-				{
-					errorMsg.append("\n"); //$NON-NLS-1$
-					errorMsg.append(DebugUIMessages.FormatTableRenderingAction_13);
-				}
-				
-				label.setText(errorMsg.toString());
-				
-				return label;
-			}
-			
-			Table table = new Table(parent, SWT.BORDER);
-			table.setHeaderVisible(true);
-			
-			int numCol = rowSize/colSize;
-			
-			TableColumn addressCol = new TableColumn(table, SWT.NONE);
-			
-			TableColumn[] columns = new TableColumn[numCol];
-			for (int i=0; i<columns.length; i++)
-			{
-				columns[i] = new TableColumn(table, SWT.NONE);
-			}
-			
-			StringBuffer buf = new StringBuffer();
-			for (int j=0; j<colSize; j++)
-			{
-				buf.append("X"); //$NON-NLS-1$
-			}
-			
-			for (int i = 0; i < 4; i++) {
-				TableItem tableItem = new TableItem(table, SWT.NONE);
-				
-				String[] text = new String[numCol + 1];
-				text[0] = DebugUIMessages.FormatTableRenderingAction_15;
-				for (int j=1; j<text.length; j++)
-				{
-					text[j] = buf.toString(); 
-				}
-				
-				tableItem.setText(text);
-			}
-			
-			addressCol.pack();
-			for (int i=0; i<columns.length; i++)
-			{
-				columns[i].pack();
-			}
-			
-			
-			return table;
-		}
-		
-		private boolean isValid(int rowSize, int colSize)
-		{
-			if (rowSize % colSize != 0)
-				return false;
-			
-			if (colSize > rowSize)
-				return false;
-			
-			return true;
-		}
-
-		private void refreshPreviewPage() {
-			fPreivewPage.dispose();
-			
-			int rowSize = fRowSizes[fRowControl.getSelectionIndex()];
-			int colSize = fColumnSizes[fColumnControl.getSelectionIndex()];
-			fPreivewPage = createPreviewPage(fPreviewPageBook, rowSize, colSize);
-			fPreviewPageBook.showPage(fPreivewPage);
-		}
-
-		private void updateButtons() {
-			int rowSize = fRowSizes[fRowControl.getSelectionIndex()];
-			int colSize = fColumnSizes[fColumnControl.getSelectionIndex()];
-			Button button = getButton(IDialogConstants.OK_ID);
-			if (!isValid(rowSize, colSize))
-			{
-				button.setEnabled(false);
-				fDefaultButton.setEnabled(false);
-				
-				
-			}
-			else
-			{
-				button.setEnabled(true);
-				fDefaultButton.setEnabled(true);
-			}
-		}
-
-		private String getRowPrefId(String modelId) {
-			String rowPrefId = IDebugPreferenceConstants.PREF_ROW_SIZE + ":" + modelId; //$NON-NLS-1$
-			return rowPrefId;
-		}
-
-		private String getColumnPrefId(String modelId) {
-			String colPrefId = IDebugPreferenceConstants.PREF_COLUMN_SIZE + ":" + modelId; //$NON-NLS-1$
-			return colPrefId;
-		}
-		
-		private int getDefaultRowSize()
-		{
-			int size = -1;
-			IPersistableDebugElement elmt = (IPersistableDebugElement)fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			if (elmt != null)
-			{
-				if (elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL))
-					return getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL);
-			}
-			
-			size = getDefaultRowSize(fRendering.getMemoryBlock().getModelIdentifier());
-			
-			return size;
-		}
-		
-		private int getDefaultColumnSize()
-		{
-			int size = -1;
-			IPersistableDebugElement elmt = (IPersistableDebugElement)fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			if (elmt != null)
-			{
-				if (elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL))
-					return getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL);
-			}
-
-			size = getDefaultColumnSize(fRendering.getMemoryBlock().getModelIdentifier());
-			return size;
-		}
-		
-		private int getDefaultRowSize(String modelId)
-		{
-			int row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-			if (row == 0)
-			{
-				DebugUITools.getPreferenceStore().setValue(getRowPrefId(modelId), IDebugPreferenceConstants.PREF_ROW_SIZE_DEFAULT);
-				row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-			}
-			
-			return row;
-			
-		}
-		
-		private int getDefaultColumnSize(String modelId)
-		{
-			int col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-			if (col == 0)
-			{
-				// if not yet defined, initialize with default
-				DebugUITools.getPreferenceStore().setValue(getColumnPrefId(modelId), IDebugPreferenceConstants.PREF_COLUMN_SIZE_DEFAULT);
-				col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-			}
-			return col;
-		}
-
-		private void saveDefaults() {
-			int columnSize = fColumnSizes[fColumnControl.getSelectionIndex()];
-			int rowSize = fRowSizes[fRowControl.getSelectionIndex()];
-			
-			IPersistableDebugElement elmt = (IPersistableDebugElement)fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			
-			if (elmt != null && elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL)
-				&& elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL))
-			{
-				try {
-					elmt.setProperty(fRendering, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL, new Integer(rowSize));
-					elmt.setProperty(fRendering, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL, new Integer(columnSize));
-				} catch (CoreException e) {
-					DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), DebugUIMessages.FormatTableRenderingDialog_4, DebugUIMessages.FormatTableRenderingDialog_5, e);
-				}
-			}
-			else
-			{
-				// save preference
-				// find model id
-				String modelId = fRendering.getMemoryBlock().getModelIdentifier();
-				
-				// constrcut preference id
-				String rowPrefId = getRowPrefId(modelId);
-				String colPrefId = getColumnPrefId(modelId);
-				
-				// save setting
-				IPreferenceStore prefStore = DebugUITools.getPreferenceStore();
-				prefStore.setValue(rowPrefId, rowSize);
-				prefStore.setValue(colPrefId, columnSize);
-			}
-			
-			fDefaultColValue.setText(String.valueOf(getDefaultColumnSize()));
-			fDefaultRowValue.setText(String.valueOf(getDefaultRowSize()));
-			
-			fDefaultRowValue.getParent().layout();
-		}
-
-		private void restoreDefaults() {
-			String modelId = fRendering.getMemoryBlock().getModelIdentifier();
-			int defaultRowSize = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-			int defaultColSize = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-			
-			if (defaultRowSize == 0 || defaultColSize == 0)
-			{
-				defaultRowSize = DebugUITools.getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_ROW_SIZE);
-				defaultColSize = DebugUITools.getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_COLUMN_SIZE);
-				
-				DebugUITools.getPreferenceStore().setValue(getRowPrefId(modelId), defaultRowSize);
-				DebugUITools.getPreferenceStore().setValue(getColumnPrefId(modelId), defaultColSize);
-			}
-			
-			populateControl(defaultRowSize, fRowSizes, fRowControl);
-			populateControl(defaultColSize, fColumnSizes, fColumnControl);
-			
-			fCurrentRowIdx = fRowControl.getSelectionIndex();
-			fCurrentColIdx = fColumnControl.getSelectionIndex();
-			
-			refreshPreviewPage();
-			updateButtons();
-		}
-
-		public int getColumnSize() {
-			return fColumnSize;
-		}
-
-		public int getRowSize() {
-			return fRowSize;
-		}
-		
-		public void setCurrentRowColSizes(int row, int col)
-		{
-			fCurrentColIdx = populateControl(col, fColumnSizes, fColumnControl);
-			fCurrentRowIdx = populateControl(row, fRowSizes, fRowControl);
-		}
-
-		protected Control createButtonBar(Composite parent) {
-			Control ret =  super.createButtonBar(parent);
-			if (fDisableCancel)
-				getButton(IDialogConstants.CANCEL_ID).setEnabled(false);
-			updateButtons();
-			return ret;
-		}
-		
-		public void openError(String msg)
-		{
-			fDisableCancel = true;
-			fMsg = msg;
-			open();
-		}
-		
-		private int getDefaultFromPersistableElement(String propertyId) {
-			int defaultValue = -1;
-			IPersistableDebugElement elmt = (IPersistableDebugElement)fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			if (elmt != null)
-			{
-				try {
-					Object valueMB = elmt.getProperty(this, propertyId);
-					if (valueMB != null && !(valueMB instanceof Integer))
-					{
-						IStatus status = DebugUIPlugin.newErrorStatus("Model returned invalid type on " + propertyId, null); //$NON-NLS-1$
-						DebugUIPlugin.log(status);
-					}
-					
-					if (valueMB != null)
-					{
-						Integer value = (Integer)valueMB;
-						defaultValue = value.intValue();
-					}
-				} catch (CoreException e) {
-					DebugUIPlugin.log(e);
-				}
-			}
-			return defaultValue;
-		}
-	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java
deleted file mode 100644
index 530d985..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java
+++ /dev/null
@@ -1,214 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.debug.ui.memory.IRepositionableMemoryRendering;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Go To Address Action for table rendering
- * 
- * @since 3.0
- */
-public class GoToAddressAction extends Action
-{
-	private IRepositionableMemoryRendering fRendering;
-	
-	public GoToAddressAction(IRepositionableMemoryRendering rendering)
-	{		
-		super(DebugUIMessages.GoToAddressAction_title);
-		setToolTipText(DebugUIMessages.GoToAddressAction_title);
-		
-		fRendering = rendering;
-		
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".GoToAddressAction_context"); //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run()
-	{
-		try
-		{	
-			Shell shell= DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
-		
-			// create dialog to ask for expression/address to block
-			GoToAddressDialog dialog = new GoToAddressDialog(shell);
-			dialog.open();
-		
-			int returnCode = dialog.getReturnCode();
-		
-			if (returnCode == Window.CANCEL)
-			{
-				return;
-			}
-		
-			// get expression from dialog
-			String expression = dialog.getExpression();
-			
-			expression = parseExpression(expression);
-			
-			doGoToAddress(expression);
-		}
-		// open error in case of any error
-		catch (DebugException e)
-		{
-			MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed, 
-				DebugUIMessages.GoToAddressAction_Go_to_address_failed, e);
-		}
-		catch (NumberFormatException e1)
-		{
-			MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed, 
-				DebugUIMessages.GoToAddressAction_Address_is_invalid, null);
-		}
-	}
-	/**
-	 * @param expression
-	 * @return
-	 */
-	public String parseExpression(String expression) {
-		expression = expression.toUpperCase();
-		expression = expression.trim();
-		
-		if (expression.startsWith("0X")) //$NON-NLS-1$
-		{
-			expression = expression.substring(2);
-		}
-		return expression;
-	}
-	/**
-	 * @param expression
-	 * @throws DebugException
-	 */
-	public void doGoToAddress(String expression) throws DebugException, NumberFormatException {
-		// convert expression to address
-		BigInteger address = new BigInteger(expression, 16);
-		
-		// look at this address and figure out if a new memory block should
-		// be opened.
-		IMemoryBlock mb = fRendering.getMemoryBlock();
-		if (mb instanceof IMemoryBlockExtension)
-		{
-			IMemoryBlockExtension mbExt = (IMemoryBlockExtension)mb;
-			BigInteger mbStart = mbExt.getMemoryBlockStartAddress();
-			BigInteger mbEnd = mbExt.getMemoryBlockEndAddress();
-			
-			if (mbStart != null)
-			{
-				// if trying to go beyond the start address
-				// of the memory block
-				if (address.compareTo(mbStart) < 0)
-				{
-					IMemoryBlockRetrievalExtension retrieval = (IMemoryBlockRetrievalExtension)mbExt.getAdapter(IMemoryBlockRetrievalExtension.class);
-					IDebugTarget dt = mbExt.getDebugTarget();
-					
-					if (retrieval == null && dt instanceof IMemoryBlockRetrievalExtension)
-						retrieval = (IMemoryBlockRetrievalExtension)dt;
-					
-					// add a new memory block and then the same rendering as fRendering
-					// in the same container.
-					if (retrieval != null)
-					{
-						addNewMemoryBlock(expression, retrieval);
-							return;
-					}
-				}
-			}
-			if (mbEnd != null)
-			{
-				// if trying to go beyond the end address
-				// of the memory block
-				if (address.compareTo(mbEnd) > 0)
-				{
-					IMemoryBlockRetrievalExtension retrieval = (IMemoryBlockRetrievalExtension)mbExt.getAdapter(IMemoryBlockRetrievalExtension.class);
-					IDebugTarget dt = mbExt.getDebugTarget();
-					
-					if (retrieval == null && dt instanceof IMemoryBlockRetrievalExtension)
-						retrieval = (IMemoryBlockRetrievalExtension)dt;
-					
-					// add a new memory block and then the same rendering as fRendering
-					// in the same container.
-					if (retrieval != null)
-					{
-						addNewMemoryBlock(expression, retrieval);
-							return;
-					}
-				}
-			}
-		}
-		
-		// go to specified address
-		fRendering.goToAddress(address);
-	}
-	
-	private void addNewMemoryBlock(String expression, IMemoryBlockRetrievalExtension retrieval)
-	{
-		Object elem = DebugUITools.getDebugContext();
-		
-		if (!(elem instanceof IDebugElement))
-			return;
-		 
-		try {
-			if (retrieval != null)
-			{	
-				IMemoryBlockExtension mbext = retrieval.getExtendedMemoryBlock(expression, elem);
-				if (mbext != null)
-				{
-					IMemoryBlock[] memArray = new IMemoryBlock[]{mbext};
-					DebugPlugin.getDefault().getMemoryBlockManager().addMemoryBlocks(memArray);
-				}
-				
-				IMemoryRenderingType renderingType = DebugUITools.getMemoryRenderingManager().getRenderingType(fRendering.getRenderingId());
-				
-				if (renderingType != null)
-				{
-					IMemoryRendering rendering = renderingType.createRendering();
-					
-					if (rendering != null && fRendering instanceof AbstractMemoryRendering)
-					{
-						rendering.init(((AbstractMemoryRendering)fRendering).getMemoryRenderingContainer(), mbext);
-						((AbstractMemoryRendering)fRendering).getMemoryRenderingContainer().addMemoryRendering(rendering);
-					}
-				}
-			}
-		} catch (DebugException e) {
-			MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed, 
-			DebugUIMessages.GoToAddressAction_Go_to_address_failed, e);
-		} catch (CoreException e)
-		{
-			MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed, 
-			DebugUIMessages.GoToAddressAction_Go_to_address_failed, e);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressComposite.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressComposite.java
deleted file mode 100644
index 2fd4ef7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressComposite.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.Text;
-import org.eclipse.ui.PlatformUI;
-
-public class GoToAddressComposite {
-	
-	private Text fExpression;
-	private Button fOKButton;
-	private Button fCancelButton;
-	private Composite fComposite;
-	private Combo fGoToCombo;
-	private Button fHexButton;
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	public Control createControl(Composite parent)
-	{
-		fComposite = new Composite(parent, SWT.NONE);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(fComposite, DebugUIPlugin.getUniqueIdentifier() + ".GoToAddressComposite_context"); //$NON-NLS-1$
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 6;
-		layout.makeColumnsEqualWidth = false;
-		layout.marginHeight = 0;
-		layout.marginLeft = 0;
-		fComposite.setLayout(layout);
-		
-		fGoToCombo = new Combo(fComposite, SWT.READ_ONLY);
-		fGoToCombo.add(DebugUIMessages.GoToAddressComposite_0);
-		fGoToCombo.add(DebugUIMessages.GoToAddressComposite_4);
-		fGoToCombo.add(DebugUIMessages.GoToAddressComposite_5);
-		fGoToCombo.select(0);
-
-		fExpression = new Text(fComposite, SWT.SINGLE | SWT.BORDER);
-		fExpression.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		fHexButton = new Button(fComposite, SWT.CHECK);
-		fHexButton.setText(DebugUIMessages.GoToAddressComposite_6);
-		fHexButton.setSelection(true);
-		
-		fOKButton = new Button(fComposite, SWT.NONE);
-		fOKButton.setText(DebugUIMessages.GoToAddressComposite_1);
-		
-		fCancelButton = new Button(fComposite, SWT.NONE);
-		fCancelButton.setText(DebugUIMessages.GoToAddressComposite_2);
-		
-		return fComposite;
-	}
-	
-	public int getHeight()
-	{
-		int height = fComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		return height;
-	}
-	
-	public Button getButton(int id)
-	{
-		if (id == IDialogConstants.OK_ID)
-			return fOKButton;
-		else if (id == IDialogConstants.CANCEL_ID)
-			return fCancelButton;
-		return null;
-	}
-	
-	public String getExpressionText()
-	{
-		return fExpression.getText();
-	}
-	
-	public Text getExpressionWidget()
-	{
-		return fExpression;
-	}
-	
-	public boolean isGoToAddress()
-	{
-		return fGoToCombo.getSelectionIndex() == 0;
-	}
-	
-	public boolean isOffset()
-	{
-		return fGoToCombo.getSelectionIndex() == 1;
-	}
-	
-	public boolean isJump()
-	{
-		return fGoToCombo.getSelectionIndex() == 2;
-	}
-	
-	public boolean isHex()
-	{
-		return fHexButton.getSelection();
-	}
-	
-	public BigInteger getGoToAddress(BigInteger baseAddress, BigInteger selectedAddress) throws NumberFormatException
-	{
-		boolean add = true;
-		String expression = getExpressionText();
-		boolean hex = isHex();
-		int radix = hex?16:10;
-		
-		expression = expression.trim();
-		
-		if (isGoToAddress())
-		{
-			expression = expression.toUpperCase();
-			if (expression.startsWith("0X")) //$NON-NLS-1$
-			{
-				expression = expression.substring(2);
-				radix = 16;
-			}
-			
-			return new BigInteger(expression, radix);
-		}
-
-		if (expression.startsWith("+")) //$NON-NLS-1$
-		{
-			expression = expression.substring(1);
-		}
-		else if (expression.startsWith("-")) //$NON-NLS-1$
-		{
-			expression = expression.substring(1);
-			add = false;
-		}
-		
-		expression = expression.toUpperCase();
-		if (expression.startsWith("0X")) //$NON-NLS-1$
-		{
-			expression = expression.substring(2);
-			radix = 16;
-		}
-		
-		BigInteger gotoAddress = new BigInteger(expression, radix); 
-
-		BigInteger address = baseAddress;
-		if (isJump())
-			address = selectedAddress;
-
-		if (address == null)
-			throw new NumberFormatException(DebugUIMessages.GoToAddressComposite_7);
-		
-		if (add)
-			gotoAddress = address.add(gotoAddress);
-		else
-			gotoAddress = address.subtract(gotoAddress);
-		
-		return gotoAddress;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressDialog.java
deleted file mode 100644
index 3455589..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressDialog.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.util.Vector;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TrayDialog;
-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.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.ui.PlatformUI;
-
-/**
- * @since 3.0
- */
-
-public class GoToAddressDialog extends TrayDialog implements ModifyListener{
-
-	private static Vector history = new Vector();
-	private Combo expressionInput;
-	private String expression;
-
-	/**
-	 * @param parentShell
-	 */
-	public GoToAddressDialog(Shell parentShell) {
-		super(parentShell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-	
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".GoToAddressDialog_context"); //$NON-NLS-1$
-		parent.setLayout(new GridLayout());
-		GridData spec2= new GridData();
-		spec2.grabExcessVerticalSpace= true;
-		spec2.grabExcessHorizontalSpace= true;
-		spec2.horizontalAlignment= GridData.FILL;
-		spec2.verticalAlignment= GridData.CENTER;
-		parent.setLayoutData(spec2);
-
-		Label textLabel = new Label(parent, SWT.NONE);
-		textLabel.setText(DebugUIMessages.GoToAddressDialog_Address);
-		GridData textLayout = new GridData();
-		textLayout.widthHint = 280;
-		textLabel.setLayoutData(textLayout);
-		
-		expressionInput = new Combo(parent, SWT.BORDER);
-		GridData spec= new GridData();
-		spec.grabExcessVerticalSpace= false;
-		spec.grabExcessHorizontalSpace= true;
-		spec.horizontalAlignment= GridData.FILL;
-		spec.verticalAlignment= GridData.BEGINNING;
-		spec.heightHint = 50;
-		expressionInput.setLayoutData(spec);
-		
-		// add history
-		String[] historyExpression = (String[])history.toArray(new String[history.size()]);
-		for (int i=0; i<historyExpression.length; i++)
-		{
-			expressionInput.add(historyExpression[i]);
-		}
-		
-		expressionInput.addModifyListener(this);
-		
-		return parent;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		
-		newShell.setText(DebugUIMessages.GoToAddressDialog_GoToAddress);
-	}
-	
-	public String getExpression()
-	{
-		return expression;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-
-		expression = expressionInput.getText();
-
-		// add to history list
-		if (!history.contains(expression))
-			history.insertElementAt(expression, 0);
-
-		super.okPressed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-
-		String input = expressionInput.getText();
-	
-		if (input == null || input.equals("")) //$NON-NLS-1$
-		{
-			getButton(IDialogConstants.OK_ID).setEnabled(false);	
-		}
-		else
-		{
-			getButton(IDialogConstants.OK_ID).setEnabled(true);
-		}			
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createButtonBar(Composite parent) {
-		
-		Control ret =  super.createButtonBar(parent);
-		getButton(IDialogConstants.OK_ID).setEnabled(false);
-		
-		return ret;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRendering.java
deleted file mode 100644
index 0724220..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRendering.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
- *     David Pickens - [Memory View] Endian in hex view and ASCII view doesn't work
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.3
- */
-public class HexIntegerRendering extends AbstractIntegerRendering {
-	
-	public HexIntegerRendering(String renderingId)
-	{
-		super(renderingId);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.AbstractTableRendering#getString(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public String getString(String dataType, BigInteger address,
-			MemoryByte[] data) {
-		StringBuffer strBuffer = new StringBuffer();
-		int endianess = getEndianness(data);
-
-		String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-		
-        if (endianess == RenderingsUtil.LITTLE_ENDIAN) {
-            MemoryByte[] swapped = new MemoryByte[data.length];
-            for (int i = 0; i < data.length; i++){
-                swapped[data.length-i-1] = data[i];
-            }
-            data = swapped;
-        }
-        
-		for (int i=0; i<data.length; i++)
-		{
-			if (data[i].isReadable())
-			{
-				strBuffer.append(new String(RenderingsUtil.convertByteToCharArray(data[i].getValue())));
-			}
-			else
-			{
-				// pad with padded string
-				strBuffer.append(paddedStr);
-			}
-		}
-		
-		return strBuffer.toString().toUpperCase();
-	}
-
-    /**
-     * @todo davidp needs to add a method comment.
-     * @param data
-     * @return
-     */
-    private int getEndianness (MemoryByte[] data) {
-        // if the user has not set an endianess to the rendering
-        // take default
-        int endianess = getDisplayEndianess();
-        if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-            endianess = getBytesEndianess(data);
-        return endianess;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.AbstractTableRendering#getBytes(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public byte[] getBytes(String dataType, BigInteger address,
-			MemoryByte[] currentValues, String data) {
-
-		int endianess = getEndianness(currentValues);
-		byte[] bytes = RenderingsUtil.convertHexStringToByteArray(data, currentValues.length, getNumCharsPerByte());
-		
-		
-        if (endianess == RenderingsUtil.LITTLE_ENDIAN) {
-            byte[] swapped = new byte[bytes.length];
-            for (int i = 0; i < bytes.length; i++){
-                swapped[bytes.length-i-1] = bytes[i];
-            }
-           bytes = swapped;
-        }
-        
-		return bytes;
-	}
-	
-	public int getNumCharsPerByte()
-	{
-		return 2;
-	}
-
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRenderingDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRenderingDelegate.java
deleted file mode 100644
index 8ccbde8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRenderingDelegate.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate;
-
-public class HexIntegerRenderingDelegate implements IMemoryRenderingTypeDelegate {
-
-	public HexIntegerRenderingDelegate() {
-	}
-
-	public IMemoryRendering createRendering(String id) throws CoreException {
-		return new HexIntegerRendering(id);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java
deleted file mode 100644
index cfc2efc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java
+++ /dev/null
@@ -1,71 +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
- *     Ken Dyck - Bug 90154: [Memory View] Short Input Rejected by Hex Rendering
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * @since 3.1
- */
-public class HexRendering extends AbstractAsyncTableRendering {
-	
-	public HexRendering(String renderingId)
-	{
-		super(renderingId);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.AbstractTableRendering#getString(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public String getString(String dataType, BigInteger address,
-			MemoryByte[] data) {
-		StringBuffer strBuffer = new StringBuffer();
-
-		String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-		
-		for (int i=0; i<data.length; i++)
-		{
-			if (data[i].isReadable())
-			{
-				strBuffer.append(new String(RenderingsUtil.convertByteToCharArray(data[i].getValue())));
-			}
-			else
-			{
-				// pad with padded string
-				strBuffer.append(paddedStr);
-			}
-		}
-		
-		return strBuffer.toString().toUpperCase();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.memory.AbstractTableRendering#getBytes(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public byte[] getBytes(String dataType, BigInteger address,
-			MemoryByte[] currentValues, String data) {
-		byte[] bytes = RenderingsUtil.convertHexStringToByteArray(data, currentValues.length, getNumCharsPerByte());
-		
-		return bytes;
-	}
-	
-	public int getNumCharsPerByte()
-	{
-		return 2;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRenderingTypeDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRenderingTypeDelegate.java
deleted file mode 100644
index 22ddebb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRenderingTypeDelegate.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate;
-
-/**
- * Delegate for creating a hex rendering.
- * @since 3.1
- */
-public class HexRenderingTypeDelegate implements IMemoryRenderingTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate#createRendering(java.lang.String)
-	 */
-	public IMemoryRendering createRendering(String id) throws CoreException {
-		HexRendering rendering = new HexRendering(id);
-		return rendering;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IContentChangeComputer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IContentChangeComputer.java
deleted file mode 100644
index 87d4b8f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IContentChangeComputer.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.debug.internal.ui.views.memory.renderings;
-
-public interface IContentChangeComputer {
-	
-	public void clearCache();
-	
-	public void cache(Object[] elements);
-	
-	public Object[] compare(Object[] newElements); 
-	
-	public boolean isEmpty();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IPresentationErrorListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IPresentationErrorListener.java
deleted file mode 100644
index 667e224..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IPresentationErrorListener.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IStatusMonitor;
-
-public interface IPresentationErrorListener {
-	
-	public void handlePresentationFailure(IStatusMonitor monitor, IStatus status);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IVirtualContentListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IVirtualContentListener.java
deleted file mode 100644
index ee18fc8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/IVirtualContentListener.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.debug.internal.ui.views.memory.renderings;
-
-public interface IVirtualContentListener {
-	
-	public int BUFFER_START = 0;
-	public int BUFFER_END = 1;
-	
-	/**
-	 * Called when the viewer is at the beginning of its bufferred content
-	 */
-	public void handledAtBufferStart();
-	
-	/**
-	 * Called when viewer is at the end of its bufferred content
-	 */
-	public void handleAtBufferEnd();
-	
-	/**
-	 * @return
-	 */
-	public int getThreshold(int bufferEndOrStart);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/LittleEndianAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/LittleEndianAction.java
deleted file mode 100644
index 9bf917e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/LittleEndianAction.java
+++ /dev/null
@@ -1,104 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.model.MemoryByte;
-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;
-
-
-/**
- * Show integers in little endian.
- * @since 3.0
- */
-public class LittleEndianAction implements IObjectActionDelegate {
-
-	AbstractIntegerRendering fRendering;
-	
-	/* (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) {
-
-		if (fRendering == null)
-			return;
-		
-		if (fRendering.getDisplayEndianess() != RenderingsUtil.LITTLE_ENDIAN){
-			fRendering.setDisplayEndianess(RenderingsUtil.LITTLE_ENDIAN);
-			fRendering.refresh();
-		}
-	}
-
-	/* (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) {
-		if (selection == null)
-			return;
-		
-		if (selection instanceof IStructuredSelection)
-		{
-			Object obj = ((IStructuredSelection)selection).getFirstElement();
-			if (obj == null)
-				return;
-			
-			if (obj instanceof AbstractIntegerRendering)
-			{
-				fRendering = (AbstractIntegerRendering)obj;
-			}
-			
-			int endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-			if (fRendering.getDisplayEndianess() == RenderingsUtil.ENDIANESS_UNKNOWN)
-			{
-				MemoryByte[] selectedBytes = fRendering.getSelectedAsBytes();
-					
-				for (int i=0; i<selectedBytes.length; i++)
-				{
-					if (!selectedBytes[i].isEndianessKnown())
-					{
-						endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-						break;
-					}
-					if (i==0)
-					{
-						endianess = selectedBytes[i].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;
-					}
-					else
-					{
-						int byteEndianess = selectedBytes[i].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;
-						if (endianess != byteEndianess)
-						{
-							endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-							break;
-						}
-					}
-				}
-			}
-			else
-				endianess = fRendering.getDisplayEndianess();
-			
-			if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-				action.setChecked(true);
-			else
-				action.setChecked(false);
-		}		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/MemorySegment.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/MemorySegment.java
deleted file mode 100644
index ddb69da..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/MemorySegment.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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.model.MemoryByte;
-
-public class MemorySegment extends PlatformObject {
-	
-	private BigInteger fAddress;
-	private BigInteger fEndAddress;
-	private MemoryByte[] fBytes;
-	private int fNumAddressableUnits;
-	
-	public MemorySegment(BigInteger address, MemoryByte[] bytes, int numAddressableUnits)
-	{
-		fAddress = address;
-		fBytes = bytes;
-		fNumAddressableUnits = numAddressableUnits;
-	}
-	
-	public BigInteger getAddress() {
-		return fAddress;
-	}
-	
-	public MemoryByte[] getBytes() {
-		return fBytes;
-	}
-	
-	public int getNumAddressableUnits() {
-		return fNumAddressableUnits;
-	}
-	
-	public boolean containsAddress(BigInteger address)
-	{
-		if (getAddress().compareTo(address) <= 0 && getEndAddress().compareTo(address) >= 0)
-			return true;
-		return false;
-	}
-	
-	public BigInteger getEndAddress()
-	{
-		if (fEndAddress == null)
-		{
-			fEndAddress = fAddress.add(BigInteger.valueOf(fNumAddressableUnits).subtract(BigInteger.ONE));
-		}
-		return fEndAddress;
-	}
-	
-	/**
-	 * @param start - zero-based start offset
-	 * @param length - number of bytes to get
-	 * @return the bytes from start offset to the end.
-	 */
-	public MemoryByte[] getBytes(int start, int length)
-	{
-		if (start < 0)
-			return new MemoryByte[0];
-		
-		if (start + length > fBytes.length)
-			return new MemoryByte[0];
-		
-		ArrayList ret = new ArrayList();
-		
-		for (int i=start; i< start+length; i++)
-		{
-			ret.add(fBytes[i]);
-		}
-		return (MemoryByte[]) ret.toArray(new MemoryByte[ret.size()]);
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/PendingPropertyChanges.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/PendingPropertyChanges.java
deleted file mode 100644
index ce3b064..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/PendingPropertyChanges.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-/**
- * Stores changes in properties when the rendering is hidden.
- * These data will be used to sync up the rendering when it becomes visible again.
- *
- */
-public class PendingPropertyChanges
-{
-	BigInteger fTopVisibleAddress;
-	BigInteger fSelectedAddress;
-	BigInteger fPageStartAddress;
-	int fColumnSize = -1;
-	int fRowSize = -1;
-	int fPageSize = -1;
-
-	public int getColumnSize() {
-		return fColumnSize;
-	}
-
-	public void setColumnSize(int columnSize) {
-		fColumnSize = columnSize;
-	}
-
-	public BigInteger getPageStartAddress() {
-		return fPageStartAddress;
-	}
-
-	public void setPageStartAddress(BigInteger pageStartAddress) {
-		fPageStartAddress = pageStartAddress;
-	}
-
-	public int getRowSize() {
-		return fRowSize;
-	}
-
-	public void setRowSize(int rowSize) {
-		fRowSize = rowSize;
-	}
-
-	public BigInteger getSelectedAddress() {
-		return fSelectedAddress;
-	}
-
-	public void setSelectedAddress(BigInteger selectedAddress) {
-		fSelectedAddress = selectedAddress;
-	}
-
-	public BigInteger getTopVisibleAddress() {
-		return fTopVisibleAddress;
-	}
-
-	public void setTopVisibleAddress(BigInteger topVisibleAddress) {
-		fTopVisibleAddress = topVisibleAddress;
-	}
-	
-	public void setPageSize(int pageSize)
-	{
-		fPageSize = pageSize;
-	}
-	
-	public int getPageSize()
-	{
-		return fPageSize;
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/PrintTableRenderingAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/PrintTableRenderingAction.java
deleted file mode 100644
index 1cb64e4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/PrintTableRenderingAction.java
+++ /dev/null
@@ -1,196 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.printing.PrintDialog;
-import org.eclipse.swt.printing.Printer;
-import org.eclipse.swt.printing.PrinterData;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Print view tab toolbar action
- * 
- * @since 3.0
- */
-public class PrintTableRenderingAction extends Action
-{
-	private AbstractBaseTableRendering fRendering;
-	private StructuredViewer fViewer;
-	
-	private static final String COLUMN_SEPERATOR = "  "; //$NON-NLS-1$
-	
-	public PrintTableRenderingAction(AbstractBaseTableRendering rendering, StructuredViewer viewer)
-	{
-		super(DebugUIMessages.PrintViewTabAction_title);
-		fRendering = rendering;
-		fViewer = viewer;
-		setToolTipText(DebugUIMessages.PrintViewTabAction_tooltip);
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_PRINT_TOP_VIEW_TAB));
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_PRINT_TOP_VIEW_TAB));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_PRINT_TOP_VIEW_TAB));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".PrintViewTabContextAction_context"); //$NON-NLS-1$
-	}
-
-	/*
-	 * draws a Table to a GC which has been initialized with a Printer.
-	 * startJob() and startPage() must be called before printTable(...),
-	 * and endPage() and endJob() must be called after printTable(...).
-	 */
-	protected void printTable(TableItem[] itemList, GC printGC, Printer printer) {
-		
-		
-		int numColumns = ((Table)fViewer.getControl()).getColumnCount();
-		ITableLabelProvider labelProvider = (ITableLabelProvider)fViewer.getLabelProvider();		
-		int lineNum = 1;
-
-		int charsPerByte = fRendering.getNumCharsPerByte();
-		if (charsPerByte < 0)
-			charsPerByte = 4;
-		
-		// return line number after column labels are printed
-		lineNum = printColumnLabels(printGC, lineNum);
-
-		//for all items in the table
-		for (int i=0; i < itemList.length; i++) {
-			StringBuffer tableContents = new StringBuffer();
-			//print all columns for this row
-			for (int j=0; j < numColumns; j++) {
-				String columnText = labelProvider.getColumnText(itemList[i].getData(), j);
-				
-				while (columnText.length() < fRendering.getBytesPerColumn() * charsPerByte)
-				{
-					 columnText += " "; //$NON-NLS-1$
-				}
-				tableContents.append(COLUMN_SEPERATOR);
-				tableContents.append(columnText);							 
-			}
-			printGC.drawString(tableContents.toString(), 10, 10+(lineNum*printGC.getFontMetrics().getHeight()));
-			lineNum++;
-
-			// if we've run over the end of a page, start a new one
-			if (20+lineNum*printGC.getFontMetrics().getHeight() > printer.getClientArea().height) {
-				lineNum=1;
-				printer.endPage();
-				printer.startPage();
-				lineNum = printColumnLabels(printGC, lineNum);
-			}
-		}
-	}
-	
-	private int printColumnLabels(GC printGC, int lineNum)
-	{	
-		StringBuffer tableContents = new StringBuffer();
-		int numColumns = ((Table)fViewer.getControl()).getColumnCount();		
-		TableColumn columns[] = ((Table)fViewer.getControl()).getColumns();
-		
-		int charsPerByte = fRendering.getNumCharsPerByte();
-		if (charsPerByte < 0)
-			charsPerByte = 4;
-		
-		int addressSizeInBytes = 0;
-		TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)fRendering.getAdapter(TableRenderingContentDescriptor.class);
-		if (descriptor == null)
-		{
-			// special for address column
-			IMemoryBlock memBlock = fRendering.getMemoryBlock();
-			if (memBlock instanceof IMemoryBlockExtension)
-			{
-				try {
-					addressSizeInBytes = ((IMemoryBlockExtension)memBlock).getAddressSize();
-				} catch (DebugException e) {
-					addressSizeInBytes = 0;
-				}
-				
-				if (addressSizeInBytes <= 0)
-					addressSizeInBytes = 4;
-			}
-			else
-			{
-				addressSizeInBytes = 4;
-			}
-		}
-		else
-		{
-			addressSizeInBytes = descriptor.getAddressSize();
-		}
-	
-		//get the column headers
-		for (int k=0; k < numColumns; k++) {
-	
-			StringBuffer columnLabel = new StringBuffer(columns[k].getText());
-			int numBytes = 0;
-	
-			if (k > 0)
-			{
-				numBytes = fRendering.getBytesPerColumn();
-			}
-			else
-			{
-				numBytes = addressSizeInBytes;
-			}
-	
-			 while (columnLabel.length() < numBytes * charsPerByte)
-			 {
-				 columnLabel.append(" "); //$NON-NLS-1$
-			 }
-	 
-			tableContents.append(COLUMN_SEPERATOR);
-			tableContents.append(columnLabel);
-		}
-		printGC.drawString(tableContents.toString(), 10, 10+(lineNum*printGC.getFontMetrics().getHeight()));
-		lineNum++;		
-		
-		return lineNum;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		
-		if (!(fViewer.getControl() instanceof Table))
-			return;
-		
-		PrintDialog printDialog = new PrintDialog(DebugUIPlugin.getShell());
-		PrinterData printerData = printDialog.open();	// pop up a system print dialog
-		if (printerData == null) {setChecked(false); return;}
-		Printer printer = new Printer(printerData);
-		GC gc = new GC(printer);
-		TableItem[] tableItems = ((Table)fViewer.getControl()).getItems();
-		
-		// start the print job and assign it a title
-		printer.startJob(DebugUIMessages.PrintViewTabAction_jobtitle + fRendering.getLabel());
-		printer.startPage();					// start the first page
-		printTable(tableItems, gc, printer);	// print all rows of the table
-		printer.endPage();						// end the last page
-		printer.endJob();						// end the print job
-		gc.dispose();
-		printer.dispose();
-		setChecked(false);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ReformatAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ReformatAction.java
deleted file mode 100644
index 0324df3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ReformatAction.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Resize all columns
- * 
- * @since 3.0
- */
-public class ReformatAction extends Action {
-	
-	private AbstractBaseTableRendering fRendering;
-	
-	public ReformatAction(AbstractBaseTableRendering rendering)
-	{
-		super(DebugUIMessages.ReformatAction_title);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".ReformatAction_context"); //$NON-NLS-1$
-		fRendering = rendering;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		fRendering.resizeColumnsToPreferredSize();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java
deleted file mode 100644
index 4d25e38..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java
+++ /dev/null
@@ -1,580 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-
-/**
- * Util functions for data conversions
- */
-public class RenderingsUtil {
-	
-	public static final int LITTLE_ENDIAN = 0;
-	public static final int BIG_ENDIAN = 1;
-	public static final int ENDIANESS_UNKNOWN = 2;
-
-	/**
-	 * Pad byte array with zero's with the byte array's length
-	 * is shorter that what's expected the conversion functions.
-	 * @param array
-	 * @param size
-	 * @param endianess
-	 * @return an array of bytes
-	 */
-	protected static byte[] fillArray(byte[] array, int size, int endianess)
-	{
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			byte[] temp = new byte[size];
-			
-			for (int i=0; i<array.length; i++)
-			{
-				temp[i] = array[i];
-			}
-			
-			// fill up the rest of the array
-			for (int i=array.length; i<size; i++)
-			{
-				temp[i] = 0;
-			}
-			
-			array = temp;
-			return array;
-		}
-        byte[] temp = new byte[size];
-        
-        for (int i=0; i<size - array.length; i++)
-        {
-        	temp[i] = 0;
-        }
-        
-        int j=0;
-        // fill up the rest of the array
-        for (int i=size - array.length; i<size; i++)
-        {
-        	temp[i] = array[j];
-        	j++;
-        }
-        
-        array = temp;
-        return array;
-	}
-	
-	static public BigInteger convertByteArrayToUnsignedLong(byte[] array, int endianess)
-	{
-		if (array.length < 8)
-		{
-			array = fillArray(array, 8, endianess);
-		}
-		
-		BigInteger value = new BigInteger("0"); //$NON-NLS-1$
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int i=0; i< 8; i++)
-			{
-				byte[] temp = new byte[1];
-				temp[0] = array[i];
-				BigInteger b = new BigInteger(temp);
-				b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
-				b = b.shiftLeft(i*8);
-				value = value.or(b);
-			}			
-		}
-		else
-		{	
-			for (int i=0; i< 8; i++)
-			{
-				byte[] temp = new byte[1];
-				temp[0] = array[i];
-				BigInteger b = new BigInteger(temp);
-				b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
-				b = b.shiftLeft((7-i)*8);
-				value = value.or(b);
-			}
-		}
-		return value;
-	}
-	
-	/**
-	 * Convert byte array to long.
-	 * @param array
-	 * @param endianess
-	 * @return result of the conversion in long
-	 */
-	static public long convertByteArrayToLong(byte[] array, int endianess)
-	{	
-		if (array.length < 8)
-		{
-			array = fillArray(array, 8, endianess);
-		}
-		
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{	
-			long value = 0;
-			for (int i = 0; i < 8; i++) {
-				long b = array[i];
-				b &= 0xff;
-				value |= (b << (i * 8));
-			}
-			return value;
-		}
-        long value = 0;
-        for (int i=0; i< 8; i++)
-        {
-        	long b = array[i];
-        	b &= 0xff;
-        	value |= (b<<((7-i)*8));
-        }
-        
-        return value;
-	}
-	
-	static public BigInteger convertByteArrayToSignedBigInt(byte[] array, int endianess)
-	{	
-		if (array.length < 16)
-		{
-			array = fillArray(array, 16, endianess);
-		}
-		
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{	
-			// reverse bytes
-			byte[] holder = new byte[16];
-			int j=15;
-			for (int i=0; i<16; i++, j--)
-			{	
-				holder[i] = array[j];
-			}
-			
-			// create BigInteger
-			BigInteger value = new BigInteger(holder);
-			return value;
-		}
-        BigInteger value = new BigInteger(array);
-        return value;
-	}
-	
-	static public BigInteger convertByteArrayToSignedBigInt(byte[] array, int endianess, int arraySize)
-	{	
-		if (array.length < arraySize)
-		{
-			array = fillArray(array, arraySize, endianess);
-		}
-		
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{	
-			// reverse bytes
-			byte[] holder = new byte[arraySize];
-			int j=arraySize-1;
-			for (int i=0; i<arraySize; i++, j--)
-			{	
-				holder[i] = array[j];
-			}
-			
-			// create BigInteger
-			BigInteger value = new BigInteger(holder);
-			return value;
-		}
-        BigInteger value = new BigInteger(array);
-        return value;
-	}
-	
-	static public BigInteger convertByteArrayToUnsignedBigInt(byte[] array, int endianess)
-	{
-		if (array.length < 16)
-		{
-			array = fillArray(array, 16, endianess);
-		}
-		
-		BigInteger value = new BigInteger("0"); //$NON-NLS-1$
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int i=0; i< 16; i++)
-			{
-				byte[] temp = new byte[1];
-				temp[0] = array[i];
-				BigInteger b = new BigInteger(temp);
-				b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
-				b = b.shiftLeft(i*8);
-				value = value.or(b);
-			}			
-		}
-		else
-		{	
-			for (int i=0; i< 16; i++)
-			{
-				byte[] temp = new byte[1];
-				temp[0] = array[i];
-				BigInteger b = new BigInteger(temp);
-				b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
-				b = b.shiftLeft((15-i)*8);
-				value = value.or(b);
-			}
-		}
-		return value;	
-	}
-	
-	static public BigInteger convertByteArrayToUnsignedBigInt(byte[] array, int endianess, int arraySize)
-	{
-		if (array.length < arraySize)
-		{
-			array = fillArray(array, arraySize, endianess);
-		}
-		
-		BigInteger value = new BigInteger("0"); //$NON-NLS-1$
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int i=0; i< arraySize; i++)
-			{
-				byte[] temp = new byte[1];
-				temp[0] = array[i];
-				BigInteger b = new BigInteger(temp);
-				b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
-				b = b.shiftLeft(i*8);
-				value = value.or(b);
-			}			
-		}
-		else
-		{	
-			for (int i=0; i< arraySize; i++)
-			{
-				byte[] temp = new byte[1];
-				temp[0] = array[i];
-				BigInteger b = new BigInteger(temp);
-				b = b.and(new BigInteger("ff", 16)); //$NON-NLS-1$
-				b = b.shiftLeft((arraySize-1-i)*8);
-				value = value.or(b);
-			}
-		}
-		return value;			
-	}
-	
-	/**
-	 * Convert byte array to integer.
-	 * @param array
-	 * @param endianess
-	 * @return result of the conversion in int
-	 */
-	static public int convertByteArrayToInt(byte[] array, int endianess)
-	{	
-		if (array.length < 4)
-		{
-			array = fillArray(array, 4, endianess);
-		}
-		
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			int value = 0;
-			for (int i = 0; i < 4; i++) {
-				int b = array[i];
-				b &= 0xff;
-				value |= (b << (i * 8));
-			}
-			return value;
-		}
-        int value = 0;
-        for (int i=0; i< 4; i++)
-        {
-        	int b = array[i];
-        	b &= 0xff;
-        	value |= (b<<((3-i)*8));
-        }
-        
-        return value;
-	}
-	
-	/**
-	 * Convert byte array to short.
-	 * @param array
-	 * @param endianess
-	 * @return result of teh conversion in short
-	 */
-	static public short convertByteArrayToShort(byte[] array, int endianess)
-	{	
-		if (array.length < 2)
-		{
-			array = fillArray(array, 2, endianess);
-		}
-		
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			short value = 0;
-			for (int i = 0; i < 2; i++) {
-				short b = array[i];
-				b &= 0xff;
-				value |= (b << (i * 8));
-			}
-			return value;
-		}
-        short value = 0;
-        for (int i=0; i< 2; i++)
-        {
-        	short b = array[i];
-        	b &= 0xff;
-        	value |= (b<<((1-i)*8));
-        }
-        return value;
-	}
-	
-	/**
-	 * Convert big integer to byte array.
-	 * @param i
-	 * @param endianess
-	 * @return result of the conversion in raw byte array
-	 */
-	static public byte[] convertBigIntegerToByteArray(BigInteger i, int endianess)
-	{
-		byte buf[]=new byte[16];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int j=0; j<16; j++)
-			{
-				BigInteger x = i.shiftRight(j*8);
-				buf[j] = x.byteValue();
-			}
-			return buf;
-		}
-        for (int j=15; j>=0; j--)
-        {
-        	BigInteger x = i.shiftRight((15-j)*8);
-        	buf[j] = x.byteValue();
-        }
-        return buf;		
-	}
-	
-	static public byte[] convertSignedBigIntToByteArray(BigInteger i, int endianess, int arraySize)
-	{
-		byte buf[]=new byte[arraySize];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int j=0; j<arraySize; j++)
-			{
-				BigInteger x = i.shiftRight(j*8);
-				buf[j] = x.byteValue();
-			}
-			return buf;
-		}
-        for (int j=arraySize-1; j>=0; j--)
-        {
-        	BigInteger x = i.shiftRight((arraySize-1-j)*8);
-        	buf[j] = x.byteValue();
-        }
-        return buf;				
-	}
-	
-	/**
-	 * Convert big integer to byte array.
-	 * @param i
-	 * @param endianess
-	 * @return result of the conversion in raw byte array
-	 */
-	static public byte[] convertUnsignedBigIntegerToByteArray(BigInteger i, int endianess)
-	{
-		byte buf[]=new byte[32];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int j=0; j<32; j++)
-			{
-				BigInteger x = i.shiftRight(j*8);
-				buf[j] = x.byteValue();
-			}
-			return buf;
-		}
-        for (int j=31; j>=0; j--)
-        {
-        	BigInteger x = i.shiftRight((31-j)*8);
-        	buf[j] = x.byteValue();
-        }
-        return buf;		
-	}
-	
-	static public byte[] convertUnsignedBigIntToByteArray(BigInteger i, int endianess, int arraySize)
-	{
-		byte buf[]=new byte[arraySize*2];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int j=0; j<arraySize*2; j++)
-			{
-				BigInteger x = i.shiftRight(j*8);
-				buf[j] = x.byteValue();
-			}
-			return buf;
-		}
-        for (int j=(arraySize*2)-1; j>=0; j--)
-        {
-        	BigInteger x = i.shiftRight(((arraySize*2)-1-j)*8);
-        	buf[j] = x.byteValue();
-        }
-        return buf;				
-	}
-	
-	/**
-	 * Convert long to byte array.
-	 * @param i
-	 * @param endianess
-	 * @return result of the conversion in raw byte array
-	 */
-	static public byte[] convertLongToByteArray(long i, int endianess)
-	{
-		byte buf[]=new byte[8];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int j=0; j<8; j++)
-			{
-				buf[j] = new Long(i>>j*8).byteValue();
-			}
-			return buf;
-		}
-        for (int j=7; j>=0; j--)
-        {
-        	buf[j] = new Long(i>>(7-j)*8).byteValue();
-        }
-        return buf;
-	}
-	
-	/**
-	 * Convert integer to byte array.
-	 * @param i
-	 * @param endianess
-	 * @return result of the conversion in raw byte array
-	 */
-	static public byte[] convertIntToByteArray(int i, int endianess)
-	{
-		byte buf[]=new byte[4];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (int j=0; j<4; j++)
-			{
-				buf[j] = new Integer(i>>j*8).byteValue();
-			}
-			return buf;
-		}
-        for (int j=3; j>=0; j--)
-        {
-        	buf[j] = new Integer(i>>(3-j)*8).byteValue();
-        }
-        return buf;
-	}
-	
-	/**
-	 * Convert short to byte array.
-	 * @param i
-	 * @param endianess
-	 * @return result of the conversion in raw byte array
-	 */
-	static public byte[] convertShortToByteArray(short i, int endianess)
-	{
-		byte buf[]=new byte[2];
-
-		if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-		{
-			for (short j=0; j<2; j++)
-			{
-				buf[j] = new Integer(i>>j*8).byteValue();
-			}
-			return buf;
-		}
-        for (short j=1; j>=0; j--)
-        {
-        	buf[j] = new Integer(i>>(1-j)*8).byteValue();
-        }
-        return buf;
-	}
-
-	/**
-	 * byte array to Hex string helper
-	 * replaces the Integer.toHexString() which can't convert byte values properly
-	 * (always pads with FFFFFF)
-	 */
-	static public String convertByteArrayToHexString(byte[] byteArray)
-	{
-		StringBuffer strBuffer = new StringBuffer();
-		char charArray[];
-		
-		for (int i=0; i<byteArray.length;i ++)
-		{
-			charArray = RenderingsUtil.convertByteToCharArray(byteArray[i]);
-			strBuffer.append(charArray);			
-		}
-		
-		return strBuffer.toString();
-	}
-
-	static public char[] convertByteToCharArray(byte aByte)
-	{
-		char charArray[] = new char[2];
-		int val = aByte;
-		if (val<0) val += 256;
-		charArray[0] = Character.forDigit(val/16, 16);
-		charArray[1] = Character.forDigit(val%16, 16);
-		
-		return charArray;
-	}
-
-	/**
-	 * Convert raw memory data to byte array
-	 * @param str
-	 * @param numBytes
-	 * @param numCharsPerByte - number of characters per byte of data
-	 * @return an array of byte, converted from a hex string
-	 * @throws NumberFormatException
-	 */
-	public static byte[] convertHexStringToByteArray(String str, int numBytes, int numCharsPerByte) throws NumberFormatException
-	{
-	    if (str.length() == 0) 
-	        return null;
-		
-		StringBuffer buf = new StringBuffer(str);
-	    
-	    // pad string with zeros
-	    int requiredPadding =  numBytes * numCharsPerByte - str.length();
-	    while (requiredPadding > 0) {
-	        buf.insert(0, "0"); //$NON-NLS-1$
-	        requiredPadding--;
-	    }
-		
-		byte[] bytes = new byte[numBytes];
-		str = buf.toString();
-	
-		// set data in memory
-		for (int i=0; i<bytes.length; i++)
-		{
-			// convert string to byte
-			String oneByte = str.substring(i*2, i*2+2);
-			
-			Integer number = Integer.valueOf(oneByte, 16);
-			if (number.compareTo(Integer.valueOf(Byte.toString(Byte.MAX_VALUE))) > 0)
-			{
-				int temp = number.intValue();
-				temp = temp - 256;
-	
-				String tempStr = Integer.toString(temp);
-		
-				Byte myByte = Byte.valueOf(tempStr);
-				bytes[i] = myByte.byteValue();
-			}
-			else
-			{
-				Byte myByte = Byte.valueOf(oneByte, 16);
-				bytes[i] = myByte.byteValue();
-			}
-		}
-		
-		return bytes;
-	} 	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ResetToBaseAddressAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ResetToBaseAddressAction.java
deleted file mode 100644
index 23373eb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/ResetToBaseAddressAction.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.debug.internal.ui.views.memory.renderings;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Reest MemoryViewTab to the base address of a memory block
- * 
- * @since 3.0
- */
-public class ResetToBaseAddressAction extends Action {
-
-    private AbstractBaseTableRendering fRendering;
-
-    public ResetToBaseAddressAction(AbstractBaseTableRendering rendering) {
-        fRendering = rendering;
-        setText(DebugUIMessages.ResetMemoryBlockAction_title);
-        setToolTipText(DebugUIMessages.ResetMemoryBlockAction_tootip);
-
-        setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_RESET_MEMORY));
-        setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_RESET_MEMORY));
-        setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_RESET_MEMORY));
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".ResetBaseAddressContextAction_context"); //$NON-NLS-1$
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-    	
-    	// check if client has overrode the #reset method
-    	// if client has overrode #reset method, call old method
-    	// otherwise, call new #resetRendering method
-    	// This is done to ensure that client's code will continue to be executed until
-    	// they have migrated to the new #resetRendering API
-    	Class renderingClass = fRendering.getClass();
-    	try {
-			Method method = renderingClass.getMethod("reset", new Class[]{}); //$NON-NLS-1$
-			if (method.getDeclaringClass().equals(AbstractTableRendering.class))
-			{
-				// client has not overrode, call new method
-				try {
-					fRendering.resetRendering();
-				} catch (DebugException e) {
-					MemoryViewUtil.openError(DebugUIMessages.AbstractTableRendering_12, DebugUIMessages.AbstractTableRendering_13, e); //
-				}
-				return;
-			}
-		} catch (SecurityException e) {
-		} catch (NoSuchMethodException e) {
-			try {
-				// if no such method, then it must be AbstractAsycTableRendering
-				fRendering.resetRendering();
-			} catch (DebugException e1) {
-				MemoryViewUtil.openError(DebugUIMessages.AbstractTableRendering_12, DebugUIMessages.AbstractTableRendering_13, e); //
-			}
-		}
-		
-		if(fRendering instanceof AbstractTableRendering)
-		{
-			// call old method
-			((AbstractTableRendering)fRendering).reset();
-		}
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/SignedIntegerRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/SignedIntegerRendering.java
deleted file mode 100644
index 9e79fba..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/SignedIntegerRendering.java
+++ /dev/null
@@ -1,213 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * 
- * Represent a signed integer rendering.
- */
-public class SignedIntegerRendering extends AbstractIntegerRendering {
-
-	private int fColSize;
-	private BigInteger fMax;
-	private BigInteger fMin;
-	
-	/**
-	 * @param memBlock
-	 * @param renderingId
-	 */
-	public SignedIntegerRendering(String renderingId) {
-		super(renderingId);
-	}
-
-	private String convertToString(byte[] byteArray, int columnSize, int endianess)
-	{
-		String ret;
-		long result = 0;
-		
-		if (columnSize == 1)
-		{
-			result = byteArray[0];
-		}
-		else if (columnSize == 2)
-		{	
-			result = RenderingsUtil.convertByteArrayToShort(byteArray, endianess);
-		}
-		else if (columnSize == 4)
-		{
-			result = RenderingsUtil.convertByteArrayToInt(byteArray, endianess);
-		}
-		else if (columnSize == 8)
-		{
-			result = RenderingsUtil.convertByteArrayToLong(byteArray, endianess);				
-		}
-		else if (columnSize == 16)
-		{
-			BigInteger bigRet = RenderingsUtil.convertByteArrayToSignedBigInt(byteArray, endianess);
-			return bigRet.toString();
-		}
-		else
-		{
-			BigInteger bigRet = RenderingsUtil.convertByteArrayToSignedBigInt(byteArray, endianess, columnSize);
-			return bigRet.toString();			
-		}
-
-		ret = new Long(result).toString();
-		
-		return ret;
-	}	
-	
-	private byte[] convertToBytes(int colSize, String newValue, int endianess)
-	{
-		try {
-			byte[] bytes;
-			if (colSize == 1)
-			{
-				byte x = Byte.parseByte(newValue);
-				bytes = new byte[1];
-				bytes[0] = x;
-			}
-			else if (colSize == 2)
-			{	
-				short i = Short.parseShort(newValue);
-				bytes = RenderingsUtil.convertShortToByteArray(i, endianess);
-			}
-			else if (colSize == 4)
-			{	
-				int i = Integer.parseInt(newValue);
-				bytes = RenderingsUtil.convertIntToByteArray(i, endianess);
-			}
-			else if (colSize == 8)
-			{	
-				long i = Long.parseLong(newValue);
-				bytes = RenderingsUtil.convertLongToByteArray(i, endianess);
-			}
-			else if (colSize == 16)
-			{
-				// special case for colSize == 16
-				// need to represent number in Big Integer
-				BigInteger i = new BigInteger(newValue);
-				bytes = RenderingsUtil.convertBigIntegerToByteArray(i, endianess);
-			
-				return bytes;
-			}		
-			else
-			{
-				BigInteger i = new BigInteger(newValue);
-				
-				// avoid calculating max and min over and over again
-				// for the same column size
-				if (fColSize != colSize)
-				{
-					fColSize = colSize;
-					fMax = BigInteger.valueOf(2);
-					fMax = fMax.pow(colSize*8-1);
-					fMin = fMax.multiply(BigInteger.valueOf(-1));
-					fMax = fMax.subtract(BigInteger.valueOf(1));
-				}
-				
-				if (i.compareTo(fMax) > 0 || i.compareTo(fMin) < 0)
-					throw new NumberFormatException();
-				
-				bytes = RenderingsUtil.convertSignedBigIntToByteArray(i, endianess, colSize);
-				return bytes;				
-			}
-			
-			return bytes;
-		} catch (NumberFormatException e) {
-			throw e;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.extended.ui.AbstractMemoryRenderer#getString(java.lang.String, java.math.BigInteger, byte[])
-	 */
-	public String getString(String dataType, BigInteger address, MemoryByte[] data) {
-		
-		boolean invalid = false;
-		String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-		for (int i=0; i<data.length; i++)
-		{
-			if (!data[i].isReadable())
-			{
-				invalid = true;
-				break;
-			}
-		}
-		
-		if (invalid)
-		{
-			StringBuffer strBuf = new StringBuffer();
-			for (int i=0; i<data.length; i++)
-			{
-				strBuf.append(paddedStr);
-			}
-			return strBuf.toString();
-		}
-		
-		int columnSize = getBytesPerColumn();
-		
-		// if the user has not set an endianess to the rendering
-		// take default endianess from bytes
-		int endianess = getDisplayEndianess();
-		if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-			endianess = getBytesEndianess(data);
-		
-		byte[] byteArray = new byte[data.length];
-		for (int i=0; i<byteArray.length;i ++)
-		{
-			byteArray[i] = data[i].getValue();
-		}
-		
-		// if endianess is unknown, do not render, just return padded string		
-		if (RenderingsUtil.ENDIANESS_UNKNOWN == endianess)
-		{
-			StringBuffer strBuf = new StringBuffer();
-			for (int i=0; i<byteArray.length; i++)
-			{
-				strBuf.append(paddedStr);
-			}
-			return strBuf.toString();
-		}
-		return convertToString(byteArray, columnSize, endianess);
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.extended.ui.AbstractMemoryRenderer#getBytes(java.lang.String, java.math.BigInteger, java.lang.String)
-	 */
-	public byte[] getBytes(String dataType, BigInteger address, MemoryByte[] currentValues, String data) {
-		
-		int columnSize = getBytesPerColumn();
-		
-		// if the user has not set an endianess to the rendering
-		// take default
-		int endianess = getDisplayEndianess();
-		if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-			endianess = getBytesEndianess(currentValues);
-		
-		// if endianess is unknown, do not try to render new data to bytes
-		if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-		{
-			byte[] retBytes = new byte[currentValues.length];
-			for (int i=0 ;i<currentValues.length; i++)
-				retBytes[i] = currentValues[i].getValue();
-			return retBytes;
-		}
-		
-		return convertToBytes(columnSize, data, endianess);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/SignedIntegerRenderingTypeDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/SignedIntegerRenderingTypeDelegate.java
deleted file mode 100644
index 9651f7e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/SignedIntegerRenderingTypeDelegate.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate;
-
-/**
- * Delegate for creating a signed integer rendering.
- * @since 3.1
- */
-public class SignedIntegerRenderingTypeDelegate implements
-		IMemoryRenderingTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate#createRendering(java.lang.String)
-	 */
-	public IMemoryRendering createRendering(String id) throws CoreException {
-		return new SignedIntegerRendering(id);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingCellModifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingCellModifier.java
deleted file mode 100644
index 0cdaa4b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingCellModifier.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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * @since 3.1
- */
-public class TableRenderingCellModifier implements ICellModifier {
-
-    private boolean editActionInvoked = false;
-
-    private AbstractTableRendering fRendering;
-
-    public TableRenderingCellModifier(AbstractTableRendering rendering) {
-        fRendering = rendering;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object,
-     *      java.lang.String)
-     */
-    public boolean canModify(Object element, String property) {
-        boolean canModify = true;
-        try {
-            if (!(element instanceof TableRenderingLine))
-                return false;
-
-            if (!editActionInvoked)
-                return false;
-
-            if (fRendering == null)
-                return false;
-
-            if (fRendering.getMemoryBlock().supportsValueModification() == false) {
-                return false;
-            }
-
-            TableRenderingLine line = (TableRenderingLine) element;
-            if (TableRenderingLine.P_ADDRESS.equals(property)) {
-                return false;
-            }
-
-            // property is stored as number of addressable unit away from the
-            // line address
-            // to calculate offset to the memory line array, offset =
-            // numberofAddressableUnit * addressableSize
-            int addressableSize = getAddressableSize();
-
-            int offset = Integer.valueOf(property, 16).intValue() * addressableSize;
-            int end = offset + fRendering.getBytesPerColumn();
-
-            for (int i = offset; i < end; i++) {
-                MemoryByte oneByte = line.getByte(i);
-
-                if (!oneByte.isWritable()) {
-                    canModify = false;
-                }
-            }
-            return canModify;
-        } catch (NumberFormatException e) {
-            canModify = false;
-            return canModify;
-        }
-    }
-
-    /**
-     * @return
-     */
-    private int getAddressableSize() {
-        int addressableSize = fRendering.getAddressableSize();
-        if (addressableSize < 1)
-            addressableSize = 1;
-        return addressableSize;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object,
-     *      java.lang.String)
-     */
-    public Object getValue(Object element, String property) {
-        // give back the value of the column
-
-        if (!(element instanceof TableRenderingLine))
-            return null;
-
-        TableRenderingLine line = (TableRenderingLine) element;
-        try {
-            if (TableRenderingLine.P_ADDRESS.equals(property))
-                return line.getAddress();
-
-            int offset = Integer.valueOf(property, 16).intValue() * getAddressableSize();
-            int end = offset + fRendering.getBytesPerColumn();
-
-            // Ask for label provider
-            MemoryByte[] memory = line.getBytes(offset, end);
-
-            if (line.isAvailable(offset, end)) {
-                // ask the renderer for a string representation of the bytes
-                offset = Integer.valueOf(property, 16).intValue();
-
-                BigInteger address = new BigInteger(((TableRenderingLine) element).getAddress(), 16);
-                address = address.add(BigInteger.valueOf(offset));
-
-                return fRendering.getString(fRendering.getRenderingId(), address, memory);
-            }
-            // if the range is not available, just return padded string
-            return getPaddedString(offset, end);
-        } catch (NumberFormatException e) {
-            return "00"; //$NON-NLS-1$
-        }
-    }
-
-    /*
-     * (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) {
-        TableRenderingLine line = null;
-        if (!(element instanceof TableRenderingLine)) {
-            line = (TableRenderingLine) ((TableItem) element).getData();
-        } else {
-            line = (TableRenderingLine) element;
-        }
-
-        // validate data
-        if (!(value instanceof String))
-            return;
-
-        try {
-            // calculate offset to update
-            IMemoryBlock memoryBlk = fRendering.getMemoryBlock();
-
-            int lineOffset = Integer.valueOf(property, 16).intValue();
-
-            // this offset is number of addressable unit from the line address
-            BigInteger offset = getOffset(memoryBlk, line.getAddress(), lineOffset);
-
-            byte[] bytes = null;
-
-            String oldValue = (String) getValue(line, property);
-
-            if (!oldValue.equals(value)) {
-
-                // property is number of addressable unit from line address
-                // to calculate proper offset in the memoryViewLine's array
-                // offset = numberOfAddressableUnit * addressableSize
-                int offsetToLine = Integer.valueOf(property, 16).intValue() * getAddressableSize();
-                int end = offsetToLine + fRendering.getBytesPerColumn();
-
-                MemoryByte[] oldArray = line.getBytes(offsetToLine, end);
-
-                BigInteger address = new BigInteger(line.getAddress(), 16);
-                address = address.add(BigInteger.valueOf(offsetToLine));
-
-                bytes = fRendering.getBytes(fRendering.getRenderingId(), address, oldArray, (String) value);
-
-                if (bytes == null)
-                    return;
-
-                if (bytes.length == 0)
-                    return;
-
-                if (bytes.length <= oldArray.length) {
-                    boolean changed = false;
-                    // check that the bytes returned has actually changed
-                    for (int i = 0; i < bytes.length; i++) {
-                        if (bytes[i] != oldArray[i].getValue()) {
-                            changed = true;
-                            break;
-                        }
-                    }
-                    if (!changed)
-                        return;
-                }
-            } else {
-                // return if value has not changed
-                return;
-            }
-
-            if (memoryBlk instanceof IMemoryBlockExtension)
-                ((IMemoryBlockExtension) memoryBlk).setValue(offset, bytes);
-            else
-                memoryBlk.setValue(offset.longValue(), bytes);
-        } catch (DebugException e) {
-            MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, DebugUIMessages.MemoryViewCellModifier_failed, e);
-        } catch (NumberFormatException e) {
-            MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, DebugUIMessages.MemoryViewCellModifier_failed + "\n" + DebugUIMessages.MemoryViewCellModifier_data_is_invalid, null); //$NON-NLS-1$
-        }
-
-    }
-
-    private BigInteger getOffset(IMemoryBlock memory, String lineAddress, int lineOffset) throws DebugException {
-
-        BigInteger lineAddr = new BigInteger(lineAddress, 16);
-        BigInteger memoryAddr;
-
-        if (memory instanceof IMemoryBlockExtension) {
-            memoryAddr = ((IMemoryBlockExtension) memory).getBigBaseAddress();
-        } else {
-            memoryAddr = BigInteger.valueOf(memory.getStartAddress());
-        }
-
-        if (memoryAddr == null)
-            memoryAddr = new BigInteger("0"); //$NON-NLS-1$
-
-        return lineAddr.subtract(memoryAddr).add(BigInteger.valueOf(lineOffset));
-    }
-
-    /**
-     * @param editActionInvoked
-     *            The editActionInvoked to set.
-     */
-    public void setEditActionInvoked(boolean editActionInvoked) {
-        this.editActionInvoked = editActionInvoked;
-    }
-
-    /**
-     * @param start
-     * @param end
-     * @return padded string
-     */
-    public String getPaddedString(int start, int end) {
-        StringBuffer buf = new StringBuffer();
-        String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-        for (int i = start; i < end; i++) {
-            buf.append(paddedStr);
-        }
-        return buf.toString();
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentDescriptor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentDescriptor.java
deleted file mode 100644
index 4ab4a13..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentDescriptor.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-
-public class TableRenderingContentDescriptor{
-	private AbstractBaseTableRendering fRendering;
-	private int fPreBuffer;					// number of lines before the top visible line
-	private int fPostBuffer;				// number of lines after thes last visible line
-	private BigInteger fLoadAddress;		// Top address to load at the table
-	private int fNumLines;					// number of visible lines
-	private BigInteger fMemoryBlockBaseAddress;		// base address of the memory block when this input is set
-	private BigInteger fStartAddress;
-	private BigInteger fEndAddress;
-	
-	private int fAddressSize = -1;
-	private int fAddressableSize = -1;
-	
-	private boolean fAlignAddress = true;
-	
-	private boolean fIsDynamicLoad;
-	
-	public TableRenderingContentDescriptor(AbstractBaseTableRendering rendering)
-	{
-		fRendering = rendering;
-	}
-
-	public int getPostBuffer() {
-		return fPostBuffer;
-	}
-	public int getPreBuffer() {
-		return fPreBuffer;
-	}
-	public BigInteger getLoadAddress() {
-		return fLoadAddress;
-	}
-	
-	public IMemoryBlock getMemoryBlock()
-	{
-		return fRendering.getMemoryBlock();
-	}
-	public void setPostBuffer(int postBuffer) {
-		fPostBuffer = postBuffer;
-	}
-	public void setPreBuffer(int preBuffer) {
-		fPreBuffer = preBuffer;
-	}
-
-	public void setLoadAddress(BigInteger address)
-	{
-		fLoadAddress = address;
-	}
-	public BigInteger getContentBaseAddress() {
-		
-		if (fMemoryBlockBaseAddress == null)
-		{
-			try {
-				updateContentBaseAddress();
-			} catch (DebugException e) {
-				fMemoryBlockBaseAddress = new BigInteger("0"); //$NON-NLS-1$
-			}
-		}
-		
-		return fMemoryBlockBaseAddress;
-	}
-	
-	public void updateContentBaseAddress() throws DebugException {
-		IMemoryBlock memoryBlock = fRendering.getMemoryBlock();
-		if (memoryBlock instanceof IMemoryBlockExtension)
-			fMemoryBlockBaseAddress = ((IMemoryBlockExtension)memoryBlock).getBigBaseAddress();
-		else
-			fMemoryBlockBaseAddress = BigInteger.valueOf(memoryBlock.getStartAddress());
-	}
-	
-	/**
-	 * @return start address of the memory block
-	 */
-	public BigInteger getStartAddress()
-	{
-		if (fStartAddress == null)
-		{
-			try {
-				IMemoryBlock memoryBlock = fRendering.getMemoryBlock();
-				if(memoryBlock instanceof IMemoryBlockExtension)
-				{
-					BigInteger startAddress = ((IMemoryBlockExtension)memoryBlock).getMemoryBlockStartAddress();
-					if (startAddress != null)
-						fStartAddress =  startAddress;
-				}
-			} catch (DebugException e) {
-				// default to 0 if we have trouble getting the start address
-				fStartAddress =  BigInteger.valueOf(0);			
-			}
-			
-			if (fStartAddress == null)
-				fStartAddress =  BigInteger.valueOf(0);
-		}
-		return fStartAddress; 
-	}
-	
-	/**
-	 * @return end address of the memory block
-	 */
-	public BigInteger getEndAddress()
-	{
-		if (fEndAddress == null)
-		{
-			IMemoryBlock memoryBlock = fRendering.getMemoryBlock();
-			if(memoryBlock instanceof IMemoryBlockExtension)
-			{
-				BigInteger endAddress;
-				try {
-					endAddress = ((IMemoryBlockExtension)memoryBlock).getMemoryBlockEndAddress();
-					if (endAddress != null)
-						fEndAddress = endAddress;
-				} catch (DebugException e) {
-					fEndAddress = null;
-				}
-				
-				if (fEndAddress == null)
-				{
-					int addressSize;
-					try {
-						addressSize = ((IMemoryBlockExtension)memoryBlock).getAddressSize();
-					} catch (DebugException e) {
-						addressSize = 4;
-					}
-					
-					endAddress = BigInteger.valueOf(2);
-					endAddress = endAddress.pow(addressSize*8);
-					endAddress = endAddress.subtract(BigInteger.valueOf(1));
-					fEndAddress =  endAddress;
-				}
-			}
-			
-			if (fEndAddress == null)
-				fEndAddress = BigInteger.valueOf(Integer.MAX_VALUE);
-		}
-		return fEndAddress;
-	}
-	
-	public int getNumLines()
-	{
-		return fNumLines;
-	}
-	
-	public void setNumLines(int numLines)
-	{
-		fNumLines = numLines;
-	}
-	
-	public AbstractBaseTableRendering getRendering()
-	{
-		return fRendering;
-	}
-
-	public int getAddressableSize() {
-		return fAddressableSize;
-	}
-
-	public void setAddressableSize(int addressableSize) {
-		fAddressableSize = addressableSize;
-	}
-
-	public int getAddressSize() {
-		return fAddressSize;
-	}
-
-	public void setAddressSize(int addressSize) {
-		fAddressSize = addressSize;
-	}
-	
-	public void setDynamicLoad(boolean dynamic)
-	{
-		fIsDynamicLoad = dynamic;
-	}
-	
-	public boolean isDynamicLoad()
-	{
-		return fIsDynamicLoad;
-	}
-	
-	public boolean isMemoryBlockBaseAddressInitialized()
-	{
-		return (fMemoryBlockBaseAddress != null);
-	}
-	
-	public boolean isAlignAddressToBoundary()
-	{
-		return fAlignAddress;
-	}
-	
-	public void setAlignAddressToBoundary(boolean align)
-	{
-		fAlignAddress = align;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentInput.java
deleted file mode 100644
index ae9c5bf..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentInput.java
+++ /dev/null
@@ -1,205 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-
-/**
- * This is an internal class for storing information about the content
- * in the table viewer.
- */
-public class TableRenderingContentInput extends PlatformObject {
-
-	private IMemoryRendering fRendering;
-	private int fPreBuffer;					// number of lines before the top visible line
-	private int fPostBuffer;				// number of lines after thes last visible line
-	private BigInteger fLoadAddress;		// Top address to load at the table
-	private int fNumLines;					// number of visible lines
-	private boolean fUpdateDelta;			// should the content provider calculate delta info
-	private BigInteger fMemoryBlockBaseAddress;		// base address of the memory block when this input is set
-	private BigInteger fStartAddress;
-	private BigInteger fEndAddress;
-	
-	public TableRenderingContentInput(IMemoryRendering rendering, int preBuffer, int postBuffer, BigInteger loadAddress, int numOfLines, boolean updateDelta, BigInteger contentBaseAddress)
-	{
-		fRendering = rendering;
-		fPreBuffer = preBuffer;
-		fPostBuffer = postBuffer;
-		fLoadAddress = loadAddress;
-		fNumLines = numOfLines;
-		fUpdateDelta = updateDelta;
-
-		if (contentBaseAddress == null)
-		{
-			try {
-				updateContentBaseAddress();
-			} catch (DebugException e) {
-			}
-		}
-		else
-		{
-			fMemoryBlockBaseAddress = contentBaseAddress;
-		}
-	}
-
-	public int getPostBuffer() {
-		return fPostBuffer;
-	}
-	public int getPreBuffer() {
-		return fPreBuffer;
-	}
-	public BigInteger getLoadAddress() {
-		return fLoadAddress;
-	}
-	
-	public IMemoryBlock getMemoryBlock()
-	{
-		return fRendering.getMemoryBlock();
-	}
-	public void setPostBuffer(int postBuffer) {
-		fPostBuffer = postBuffer;
-	}
-	public void setPreBuffer(int preBuffer) {
-		fPreBuffer = preBuffer;
-	}
-	public boolean isUpdateDelta() {
-		return fUpdateDelta;
-	}
-	public void setUpdateDelta(boolean updateDelta) {
-		fUpdateDelta = updateDelta;
-	}
-
-	public void setLoadAddress(BigInteger address)
-	{
-		fLoadAddress = address;
-	}
-	public BigInteger getContentBaseAddress() {
-		
-		if (fMemoryBlockBaseAddress == null)
-		{
-			try {
-				updateContentBaseAddress();
-			} catch (DebugException e) {
-				fMemoryBlockBaseAddress = new BigInteger("0"); //$NON-NLS-1$
-			}
-		}
-		
-		return fMemoryBlockBaseAddress;
-	}
-	
-	public void updateContentBaseAddress() throws DebugException {
-		IMemoryBlock memoryBlock = fRendering.getMemoryBlock();
-		if (memoryBlock instanceof IMemoryBlockExtension)
-			fMemoryBlockBaseAddress = ((IMemoryBlockExtension)memoryBlock).getBigBaseAddress();
-		else
-			fMemoryBlockBaseAddress = BigInteger.valueOf(memoryBlock.getStartAddress());
-	}
-	
-	/**
-	 * @return start address of the memory block
-	 */
-	public BigInteger getStartAddress()
-	{
-		if (fStartAddress == null)
-		{
-			try {
-				IMemoryBlock memoryBlock = fRendering.getMemoryBlock();
-				if(memoryBlock instanceof IMemoryBlockExtension)
-				{
-					BigInteger startAddress = ((IMemoryBlockExtension)memoryBlock).getMemoryBlockStartAddress();
-					if (startAddress != null)
-						fStartAddress =  startAddress;
-				}
-			} catch (DebugException e) {
-				// default to 0 if we have trouble getting the start address
-				fStartAddress =  BigInteger.valueOf(0);			
-			}
-			
-			if (fStartAddress == null)
-				fStartAddress =  BigInteger.valueOf(0);
-		}
-		return fStartAddress; 
-	}
-	
-	/**
-	 * @return end address of the memory block
-	 */
-	public BigInteger getEndAddress()
-	{
-		if (fEndAddress == null)
-		{
-			IMemoryBlock memoryBlock = fRendering.getMemoryBlock();
-			if(memoryBlock instanceof IMemoryBlockExtension)
-			{
-				BigInteger endAddress;
-				try {
-					endAddress = ((IMemoryBlockExtension)memoryBlock).getMemoryBlockEndAddress();
-					if (endAddress != null)
-						fEndAddress = endAddress;
-				} catch (DebugException e) {
-					fEndAddress = null;
-				}
-				
-				if (fEndAddress == null)
-				{
-					int addressSize;
-					try {
-						addressSize = ((IMemoryBlockExtension)memoryBlock).getAddressSize();
-					} catch (DebugException e) {
-						addressSize = 4;
-					}
-					
-					endAddress = BigInteger.valueOf(2);
-					endAddress = endAddress.pow(addressSize*8);
-					endAddress = endAddress.subtract(BigInteger.valueOf(1));
-					fEndAddress =  endAddress;
-				}
-			}
-			
-			if (fEndAddress == null)
-				fEndAddress = BigInteger.valueOf(Integer.MAX_VALUE);
-		}
-		return fEndAddress;
-	}
-	
-	public int getNumLines()
-	{
-		return fNumLines;
-	}
-	
-	public void setNumLines(int numLines)
-	{
-		fNumLines = numLines;
-	}
-	
-	public Object getAdapter(Class adapter) {
-		if (adapter == AbstractTableRendering.class)
-		{
-			if (fRendering instanceof AbstractTableRendering)
-				return fRendering;
-		}
-		if (adapter == AbstractAsyncTableRendering.class)
-		{
-			if (fRendering instanceof AbstractAsyncTableRendering)
-				return fRendering;
-		}
-		
-		return super.getAdapter(adapter);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentProvider.java
deleted file mode 100644
index 8aff1e4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingContentProvider.java
+++ /dev/null
@@ -1,974 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.memory.IMemoryRenderingUpdater;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Content provider for MemoryViewTab
- * 
- * @since 3.0
- */
-public class TableRenderingContentProvider extends BasicDebugViewContentProvider {
-	
-	// lines currently being displayed by the table rendering
-	protected Vector lineCache;
-	
-	// Cache to allow the content provider to comppute change information
-	// Cache is taken by copying the lineCache after a suspend event
-	// or change event from the the memory block.
-	protected Hashtable contentCache;
-	
-	// cache in the form of MemoryByte
-	// needed for reorganizing cache when the row size changes
-	private MemoryByte[] fContentCacheInBytes;	
-	private String fContentCacheStartAddress;
-
-	private BigInteger fBufferTopAddress;
-	
-	private TableRenderingContentInput fInput;
-	private BigInteger fBufferEndAddress;
-	
-	private boolean fDynamicLoad;
-
-	/**
-	 * @param memoryBlock
-	 * @param newTab
-	 */
-	public TableRenderingContentProvider()
-	{
-		lineCache = new Vector();
-		contentCache = new Hashtable();
-		initializeDynamicLoad();
-			
-		DebugPlugin.getDefault().addDebugEventListener(this);
-	}
-	
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(StructuredViewer viewer)
-	{
-		fViewer = viewer;
-	}
-	
-	/* (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) {
-		try {
-			if (newInput instanceof TableRenderingContentInput)
-			{
-				fInput = (TableRenderingContentInput)newInput;
-				if (fInput.getMemoryBlock() instanceof IMemoryBlockExtension)
-					loadContentForExtendedMemoryBlock();
-				else
-					loadContentForSimpleMemoryBlock();
-				
-				// tell rendering to display table if the loading is successful
-				getTableRendering(fInput).displayTable();
-			}
-		} catch (DebugException e) {
-			getTableRendering(fInput).displayError(e);
-		}
-	}
-
-	public void dispose() {
-		DebugPlugin.getDefault().removeDebugEventListener(this);		
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object parent) {
-
-		// if cache is empty, get memory
-		if (lineCache.isEmpty()) { 
-		
-			try {
-				getMemoryFromMemoryBlock();
-			} catch (DebugException e) {
-				DebugUIPlugin.log(e.getStatus());
-				getTableRendering(fInput).displayError(e);
-				return lineCache.toArray();
-			}
-		}
-		
-		if (lineCache.isEmpty())
-			return lineCache.toArray();
-		
-		// check to see if the row size has changed
-		TableRenderingLine line = (TableRenderingLine)lineCache.get(0);
-		int currentRowSize = line.getByteArray().length;
-		int renderingRowSize = getTableRendering(fInput).getBytesPerLine();
-		
-		if (renderingRowSize != currentRowSize)
-		{
-			try {
-				reorganizeContentCache(renderingRowSize);			
-				reorganizeLines(lineCache, renderingRowSize);
-			} catch (DebugException e) {
-				DebugUIPlugin.log(e.getStatus());
-				getTableRendering(fInput).displayError(e);
-				return lineCache.toArray();
-			}
-		}
-		return lineCache.toArray();
-	}
-	
-	private void getMemoryFromMemoryBlock() throws DebugException {
-		IMemoryBlock memoryBlock = fInput.getMemoryBlock();
-		if (memoryBlock instanceof IMemoryBlockExtension)
-		{
-			loadContentForExtendedMemoryBlock();
-			getTableRendering(fInput).displayTable();
-		}
-		else
-		{
-			loadContentForSimpleMemoryBlock();
-			getTableRendering(fInput).displayTable();
-		}
-	}
-
-	/**
-	 * @throws DebugException
-	 */
-	public void loadContentForSimpleMemoryBlock() throws DebugException {
-		// get as much memory as the memory block can handle
-		fInput.setPreBuffer(0);
-		fInput.setPostBuffer(0);
-		long startAddress = fInput.getMemoryBlock().getStartAddress();
-		BigInteger address = BigInteger.valueOf(startAddress);
-		long length = fInput.getMemoryBlock().getLength();
-		long numLines = length / getTableRendering(fInput).getBytesPerLine();
-		getMemoryToFitTable(address, numLines, fInput.isUpdateDelta());
-	}
-
-	/**
-	 * @throws DebugException
-	 */
-	public void loadContentForExtendedMemoryBlock() throws DebugException {
-		
-		// do not load if number of lines needed is < 0
-		if (fInput.getNumLines() <= 0)
-			return;
-		
-		// calculate top buffered address
-		BigInteger loadAddress = fInput.getLoadAddress();
-		if (loadAddress == null)
-		{
-			loadAddress = new BigInteger("0"); //$NON-NLS-1$
-		}
-		
-		BigInteger mbStart = fInput.getStartAddress();
-		BigInteger mbEnd = fInput.getEndAddress();
-		
-		// check that the load address is within range
-		if (loadAddress.compareTo(mbStart) < 0 || loadAddress.compareTo(mbEnd) > 0)
-		{
-			// default load address to memory block base address
-			loadAddress = ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress();
-			fInput.setLoadAddress(loadAddress);
-		}
-		
-		// if address is still out of range, throw an exception
-		if (loadAddress.compareTo(mbStart) < 0 || loadAddress.compareTo(mbEnd) > 0)
-		{
-			throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_0 + loadAddress.toString(16), null));
-		}
-		
-		int addressableUnitsPerLine = getTableRendering(fInput).getAddressableUnitPerLine();
-		BigInteger bufferStart = loadAddress.subtract(BigInteger.valueOf(fInput.getPreBuffer()*addressableUnitsPerLine));
-		BigInteger bufferEnd = loadAddress.add(BigInteger.valueOf(fInput.getPostBuffer()*addressableUnitsPerLine));
-		bufferEnd = bufferEnd.add(BigInteger.valueOf(fInput.getNumLines()*addressableUnitsPerLine));
-		
-		if (isDynamicLoad())
-		{
-			if (bufferStart.compareTo(mbStart) < 0)
-				bufferStart = mbStart;
-			
-			if (bufferEnd.compareTo(mbEnd) > 0)
-			{
-				bufferEnd = mbEnd;
-				
-				int numLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue();
-				if (numLines < fInput.getNumLines())
-				{
-					// re-calculate buffer start since we may not have enough lines to popoulate the view
-					bufferStart = bufferEnd.subtract(BigInteger.valueOf(fInput.getNumLines()*addressableUnitsPerLine));
-					bufferStart = bufferStart.subtract(BigInteger.valueOf(fInput.getPreBuffer()*addressableUnitsPerLine));
-				}
-			}
-			
-			// buffer end must be greater than buffer start
-			if (bufferEnd.compareTo(bufferStart) <= 0)
-				throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_1, null));
-			
-			int numLines = bufferEnd.subtract(bufferStart).divide(BigInteger.valueOf(addressableUnitsPerLine)).intValue()+1;		
-			// get stoarage to fit the memory view tab size
-			getMemoryToFitTable(bufferStart, numLines, fInput.isUpdateDelta());
-		}
-		else
-		{
-			if (bufferStart.compareTo(mbStart) < 0)
-				bufferStart = mbStart;
-			
-			if (bufferEnd.compareTo(mbEnd) > 0)
-			{
-				bufferStart = mbEnd.subtract(BigInteger.valueOf((fInput.getNumLines()-1)*addressableUnitsPerLine));
-			}
-			
-			// buffer end must be greater than buffer start
-			if (bufferEnd.compareTo(bufferStart) <= 0)
-				throw new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.TableRenderingContentProvider_2, null));
-			
-			int numLines = fInput.getNumLines();	
-			// get stoarage to fit the memory view tab size
-			getMemoryToFitTable(bufferStart, numLines, fInput.isUpdateDelta());
-		}
-	}
-	
-	/**
-	 * @return the memroy block
-	 */
-	public IMemoryBlock getMemoryBlock() {
-		return fInput.getMemoryBlock();
-	}
-	
-	/**
-	 * Get memory to fit table
-	 * @param startingAddress
-	 * @param numberOfLines
-	 * @param updateDelta
-	 * @throws DebugException
-	 */
-	public void getMemoryToFitTable(BigInteger startingAddress, long numberOfLines, boolean updateDelta) throws DebugException
-	{
-		// do not ask for memory from memory block if the debug target
-		// is already terminated
-		IDebugTarget target = fInput.getMemoryBlock().getDebugTarget();
-		
-		if (target.isDisconnected() || target.isTerminated())
-			return;
-		
-		boolean error = false;
-		DebugException dbgEvt = null;
-		
-		// calculate address size
-		String adjustedAddress = startingAddress.toString(16);
-		
-		int addressSize;
-		try {
-			addressSize = getAddressSize(startingAddress);
-		} catch (DebugException e1) {
-			dbgEvt = e1;
-			error = true;
-			addressSize = 4;
-		}
-		
-		int addressLength = addressSize * IInternalDebugUIConstants.CHAR_PER_BYTE;
-
-		// align to the closest boundary based on addressable size per line
-		if ( getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			startingAddress = MemoryViewUtil.alignToBoundary(startingAddress, getTableRendering(fInput).getAddressableUnitPerLine());
-		}
-
-		IMemoryBlockExtension extMemoryBlock = null;
-		MemoryByte[] memoryBuffer = null;
-		
-		String paddedString = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-		
-		long reqNumBytes = 0;
-		try
-		{
-			if (fInput.getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				reqNumBytes = getTableRendering(fInput).getBytesPerLine() * numberOfLines;
-				// get memory from memory block
-				extMemoryBlock = (IMemoryBlockExtension) fInput.getMemoryBlock();
-				
-				long reqNumberOfUnits = getTableRendering(fInput).getAddressableUnitPerLine() * numberOfLines;
-						
-				memoryBuffer =	extMemoryBlock.getBytesFromAddress(startingAddress,	reqNumberOfUnits);
-		
-				if(memoryBuffer == null)
-				{
-					DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));
-					throw e;
-				}
-			}
-			else
-			{
-				// get memory from memory block
-				byte[] memory = fInput.getMemoryBlock().getBytes();
-				
-				if (memory == null)
-				{
-					DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.MemoryViewContentProvider_Unable_to_retrieve_content, null));	
-					throw e;					
-				}
-				
-				int prefillNumBytes = 0;
-				
-				// number of bytes need to prefill
-				if (!startingAddress.toString(16).endsWith("0")) //$NON-NLS-1$
-				{
-					adjustedAddress = startingAddress.toString(16).substring(0, adjustedAddress.length() - 1);
-					adjustedAddress += "0"; //$NON-NLS-1$
-					BigInteger adjustedStart = new BigInteger(adjustedAddress, 16);
-					prefillNumBytes = startingAddress.subtract(adjustedStart).intValue();
-					startingAddress = adjustedStart;
-				}
-				reqNumBytes = fInput.getMemoryBlock().getLength() + prefillNumBytes;
-				
-				// figure out number of dummy bytes to append
-				while (reqNumBytes % getTableRendering(fInput).getBytesPerLine() != 0)
-				{
-					reqNumBytes ++;
-				}
-				
-				numberOfLines = reqNumBytes / getTableRendering(fInput).getBytesPerLine();
-				
-				// create memory byte for IMemoryBlock
-				memoryBuffer = new MemoryByte[(int)reqNumBytes];
-				
-				// prefill buffer to ensure double-word alignment
-				for (int i=0; i<prefillNumBytes; i++)
-				{
-					MemoryByte tmp = new MemoryByte();
-					tmp.setValue((byte)0);
-					tmp.setWritable(false);
-					tmp.setReadable(false);
-					tmp.setEndianessKnown(false);
-					memoryBuffer[i] = tmp;
-				}
-				
-				// fill buffer with memory returned by debug adapter
-				int j = prefillNumBytes; 							// counter for memoryBuffer
-				for (int i=0; i<memory.length; i++)
-				{
-					MemoryByte tmp = new MemoryByte();
-					tmp.setValue(memory[i]);
-					tmp.setReadable(true);
-					tmp.setWritable(true);
-					tmp.setEndianessKnown(false);
-					memoryBuffer[j] = tmp;
-					j++;
-				}
-				
-				// append to buffer to fill up the entire line
-				for (int i=j; i<memoryBuffer.length; i++)
-				{
-					MemoryByte tmp = new MemoryByte();
-					tmp.setValue((byte)0);
-					tmp.setWritable(false);
-					tmp.setReadable(false);
-					tmp.setEndianessKnown(false);
-					memoryBuffer[i] = tmp;
-				}
-			}
-		}
-		catch (DebugException e)
-		{
-			memoryBuffer = makeDummyContent(numberOfLines);
-			
-			// finish creating the content provider before throwing an event
-			error = true; 
-			dbgEvt = e;
-		}
-		catch (Throwable e)
-		{
-			// catch all errors from this process just to be safe
-			memoryBuffer = makeDummyContent(numberOfLines);
-			
-			// finish creating the content provider before throwing an event
-			error = true; 
-			dbgEvt = new DebugException(DebugUIPlugin.newErrorStatus(e.getMessage(), e));
-		}
-		
-		// if debug adapter did not return enough memory, create dummy memory
-		if (memoryBuffer.length < reqNumBytes)
-		{
-			ArrayList newBuffer = new ArrayList();
-			
-			for (int i=0; i<memoryBuffer.length; i++)
-			{
-				newBuffer.add(memoryBuffer[i]);
-			}
-			
-			for (int i=memoryBuffer.length; i<reqNumBytes; i++)
-			{
-				MemoryByte mb = new MemoryByte();
-				mb.setReadable(false);
-				mb.setWritable(false);
-				mb.setEndianessKnown(false);
-				newBuffer.add(mb);
-			}
-			
-			memoryBuffer = (MemoryByte[])newBuffer.toArray(new MemoryByte[newBuffer.size()]);
-			
-		}
-		
-		// clear line cache
-		if (!lineCache.isEmpty())
-		{
-			lineCache.clear();
-		}
-		String address = startingAddress.toString(16);
-		// save address of the top of buffer
-		fBufferTopAddress = startingAddress;
-		
-		boolean manageDelta = true;
-		
-		// If change information is not managed by the memory block
-		// The view tab will manage it and calculate delta information
-		// for its content cache.
-		if (fInput.getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			manageDelta = !((IMemoryBlockExtension)fInput.getMemoryBlock()).supportsChangeManagement();
-		}
-			
-		// put memory information into MemoryViewLine
-		organizeLines(numberOfLines, updateDelta, addressLength, memoryBuffer, paddedString, address, manageDelta);
-		
-		if (error){
-			throw dbgEvt;
-		}
-	}
-
-	private void organizeLines(long numberOfLines, boolean updateDelta, int addressLength, MemoryByte[] memoryBuffer, String paddedString, String address, boolean manageDelta) 
-	{
-		for (int i = 0; i < numberOfLines; i++)
-		{   //chop the raw memory up 
-			String tmpAddress = address.toUpperCase();
-			if (tmpAddress.length() < addressLength)
-			{
-				for (int j = 0; tmpAddress.length() < addressLength; j++)
-				{
-					tmpAddress = "0" + tmpAddress; //$NON-NLS-1$
-				}
-			}
-			int bytesPerLine = getTableRendering(fInput).getBytesPerLine();
-			MemoryByte[] memory = new MemoryByte[bytesPerLine];
-			boolean isMonitored = true;
-			
-			// counter for memory, starts from 0 to number of bytes per line
-			int k = 0;
-			// j is the counter for memArray, memory returned by debug adapter
-			for (int j = i * bytesPerLine;
-				j < i * bytesPerLine + bytesPerLine;
-				j++)
-			{
-				
-				byte changeFlag = memoryBuffer[j].getFlags();
-				if (manageDelta)
-				{
-					// turn off both change and known bits to make sure that
-					// the change bits returned by debug adapters do not take
-					// any effect
-					
-					changeFlag |= MemoryByte.HISTORY_KNOWN;
-					changeFlag ^= MemoryByte.HISTORY_KNOWN;
-					
-					changeFlag |= MemoryByte.CHANGED;
-					changeFlag ^= MemoryByte.CHANGED;
-				}
-				
-				MemoryByte newByteObj = new MemoryByte(memoryBuffer[j].getValue(), changeFlag);
-				memory[k] =  newByteObj;
-				k++;
-				
-				
-				if (!manageDelta)
-				{
-					// If the byte is marked as unknown, the line is not monitored
-					if (!memoryBuffer[j].isHistoryKnown())
-					{
-						isMonitored = false;
-					}
-				}
-			}
-			
-			TableRenderingLine newLine = new TableRenderingLine(tmpAddress, memory, lineCache.size(), paddedString);
-			
-			TableRenderingLine oldLine = (TableRenderingLine)contentCache.get(newLine.getAddress());
-			
-			if (manageDelta)
-			{
-				if (oldLine != null)
-					newLine.isMonitored = true;
-				else
-					newLine.isMonitored = false;
-			}
-			else
-			{
-				// check the byte for information
-				newLine.isMonitored = isMonitored;
-			}
-			
-			// calculate delta info for the memory view line
-			if (manageDelta && !getTableRendering(fInput).isDisplayingError())
-			{
-				if (updateDelta)
-				{
-					if (oldLine != null)
-					{
-						newLine.markDeltas(oldLine);
-					}
-				}
-				else
-				{
-					if (oldLine != null)
-					{
-						// deltas can only be reused if the line has not been changed
-						// otherwise, force a refresh
-						if (newLine.isLineChanged(oldLine))
-						{
-							newLine.markDeltas(oldLine);
-						}
-						else
-						{
-							newLine.copyDeltas(oldLine);
-						}
-					}
-				}
-			}
-			else if (manageDelta && getTableRendering(fInput).isDisplayingError())
-			{
-				// show as unmonitored if the view tab is previoulsy displaying error
-				newLine.isMonitored = false;
-			}
-			lineCache.add(newLine);
-			
-			
-			// increment row address
-			BigInteger bigInt = new BigInteger(address, 16);
-			fBufferEndAddress = bigInt;
-			int addressableUnit = getTableRendering(fInput).getBytesPerLine()/getTableRendering(fInput).getAddressableSize();
-			address = bigInt.add(BigInteger.valueOf(addressableUnit)).toString(16);
-		}
-	}
-	
-	/**
-	 * @param numberOfLines
-	 * @return an array of dummy MemoryByte
-	 */
-	private MemoryByte[] makeDummyContent(long numberOfLines) {
-		MemoryByte[] memoryBuffer;
-		// make up dummy memory, needed for recovery in case the debug adapter
-		// is capable of retrieving memory again
-
-		int numBytes = (int)(getTableRendering(fInput).getBytesPerLine() * numberOfLines);
-		memoryBuffer = new MemoryByte[numBytes];
-		
-		for (int i=0; i<memoryBuffer.length; i++){
-			memoryBuffer[i] = new MemoryByte();
-			memoryBuffer[i].setValue((byte)0);
-			memoryBuffer[i].setWritable(false);
-			memoryBuffer[i].setReadable(false);
-			memoryBuffer[i].setEndianessKnown(false);
-		}
-		return memoryBuffer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.internal.views.BasicDebugViewContentProvider#doHandleDebugEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void doHandleDebugEvent(DebugEvent event) {
-		
-		if (getTableRendering(fInput).isVisible())
-		{
-			// only do this if it's visible
-			// still need to clear content cache if the rendering
-			// is not visible
-			if (isUpdateManagedByMB())
-				return;
-		}
-		
-		// do nothing if the debug event did not come from a debug element comes from non-debug element
-		if (!(event.getSource() instanceof IDebugElement))
-			return;
-		
-		// do not try to recover if the content input has not been created
-		if (fInput == null)
-			return;
-		
-		IDebugElement src = (IDebugElement)event.getSource();
-		
-		// if a debug event happens from the memory block
-		// invoke contentChanged to get content of the memory block updated
-		if (event.getKind() == DebugEvent.CHANGE && event.getSource() == fInput.getMemoryBlock())
-		{
-			if (event.getDetail() == DebugEvent.STATE){
-				getTableRendering(fInput).updateLabels();
-			}
-			else
-			{	
-				updateContent();
-			}
-		}
-		
-		// if the suspend evnet happens from the debug target that the 
-		// memory block belongs to
-		if (event.getKind() == DebugEvent.SUSPEND && src.getDebugTarget() == fInput.getMemoryBlock().getDebugTarget())
-		{	
-			updateContent();
-		}
-
-	}
-	
-	/**
-	 * Update content of the view tab if the content of the memory block has changed
-	 * or if its base address has changed
-	 * Update will not be performed if the memory block has not been changed or
-	 * if the rendering is not visible
-	 */
-	public void updateContent()
-	{
-		IDebugTarget dt = fInput.getMemoryBlock().getDebugTarget();
-		
-		// no need to update if debug target is disconnected or terminated
-		if (dt.isDisconnected() || dt.isTerminated())
-		{
-			return;
-		}
-		
-		takeContentSnapshot();
-		
-		//do not handle event if the rendering is not visible
-		if (!getTableRendering(fInput).isVisible())
-			 return;
-		
-		getTableRendering(fInput).refresh();
-		
-	}
-	
-	/**
-	 *  Take a snapshot on the content, marking the lines as monitored
-	 */
-	public void takeContentSnapshot()
-	{	
-		// cache content before getting new ones
-		TableRenderingLine[] lines =(TableRenderingLine[]) lineCache.toArray(new TableRenderingLine[lineCache.size()]);
-		fContentCacheInBytes = convertLinesToBytes(lines);
-		fContentCacheStartAddress = lines[0].getAddress();
-		
-		if (contentCache != null)
-		{
-			contentCache.clear();
-		}
-		
-		//do not handle event if the rendering is not visible
-		if (!getTableRendering(fInput).isVisible())
-			 return;
-		
-		// use existing lines as cache is the rendering is not currently displaying
-		// error.  Otherwise, leave contentCache empty as we do not have updated
-		// content.
-		if (!getTableRendering(fInput).isDisplayingError())
-		{
-			for (int i=0; i<lines.length; i++)
-			{
-				contentCache.put(lines[i].getAddress(), lines[i]);
-				lines[i].isMonitored = true;
-			}
-		}
-
-		// reset all the deltas currently stored in contentCache
-		// This will ensure that changes will be recomputed when user scrolls
-		// up or down the memory view.		
-		resetDeltas();
-	}
-
-	/**
-	 * @return buffer's top address
-	 */
-	public BigInteger getBufferTopAddress()
-	{
-		return fBufferTopAddress;
-	}
-	
-	public BigInteger getBufferEndAddress()
-	{
-		return fBufferEndAddress;
-	}
-	
-	/**
-	 * Calculate address size of the given address
-	 * @param address
-	 * @return size of address from the debuggee
-	 */
-	public int getAddressSize(BigInteger address) throws DebugException
-	{
-		// calculate address size
-		 String adjustedAddress = address.toString(16);
-		
-		 int addressSize = 0;
-		 if (fInput.getMemoryBlock() instanceof IMemoryBlockExtension)
-		 {
-			 addressSize = ((IMemoryBlockExtension)fInput.getMemoryBlock()).getAddressSize();
-		 }
-		
-		 // handle IMemoryBlock and invalid address size returned by IMemoryBlockExtension
-		 if (addressSize <= 0)
-		 {
-			 if (adjustedAddress.length() > 8)
-			 {
-				 addressSize = 8;
-			 }
-			 else
-			 {
-				 addressSize = 4;
-			 }			
-		 }		
-		 
-		 return addressSize;
-	}
-	
-	/**
-	 * @return base address of memory block
-	 */
-	public BigInteger getContentBaseAddress()
-	{
-		return fInput.getContentBaseAddress(); 
-	}
-	
-	/**
-	 * Clear all delta information in the lines
-	 */
-	public void resetDeltas()
-	{
-		Enumeration enumeration = contentCache.elements();
-		
-		while (enumeration.hasMoreElements())
-		{
-			TableRenderingLine line = (TableRenderingLine)enumeration.nextElement();
-			line.unmarkDeltas();
-		}
-	}
-	
-	/**
-	 * Check if address is out of buffered range
-	 * @param address
-	 * @return true if address is out of bufferred range, false otherwise
-	 */
-	public boolean isAddressOutOfRange(BigInteger address)
-	{
-		if (lineCache != null && !lineCache.isEmpty())
-		{
-			TableRenderingLine first = (TableRenderingLine)lineCache.firstElement();
-			TableRenderingLine last = (TableRenderingLine) lineCache.lastElement();
-			
-			if (first == null ||last == null)
-				return true;
-			
-			BigInteger startAddress = new BigInteger(first.getAddress(), 16);
-			BigInteger lastAddress = new BigInteger(last.getAddress(), 16);
-			int addressableUnit = getTableRendering(fInput).getAddressableUnitPerLine();
-			lastAddress = lastAddress.add(BigInteger.valueOf(addressableUnit)).subtract(BigInteger.valueOf(1));
-			
-			if (startAddress.compareTo(address) <= 0 &&
-				lastAddress.compareTo(address) >= 0)
-			{
-				return false;
-			}
-			return true;
-		}
-		return true;
-	}
-	
-	public void clearContentCache()
-	{
-		fContentCacheInBytes = new MemoryByte[0];
-		fContentCacheStartAddress = null;
-		contentCache.clear();
-	}
-	
-	/**
-	 * @return if the memory block would manage its own update.
-	 */
-	private boolean isUpdateManagedByMB()
-	{
-		IMemoryBlock memoryBlock = getMemoryBlock();
-		
-		IMemoryRenderingUpdater managedMB = null;
-		if (memoryBlock instanceof IMemoryRenderingUpdater)
-		{
-			managedMB = (IMemoryRenderingUpdater)memoryBlock;
-		}
-		
-		if (managedMB == null)
-			managedMB = (IMemoryRenderingUpdater)memoryBlock.getAdapter(IMemoryRenderingUpdater.class);
-		
-		// do not handle event if if the memory block wants to do its
-		// own update
-		if (managedMB != null && managedMB.supportsManagedUpdate(getTableRendering(fInput)))
-			return true;
-		
-		return false;
-	}
-	
-	public boolean isDynamicLoad()
-	{
-		return fDynamicLoad;
-	}
-	
-	private void initializeDynamicLoad()
-	{
-		fDynamicLoad = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-	}
-	
-	public void setDynamicLoad(boolean dynamicLoad)
-	{
-		fDynamicLoad = dynamicLoad;
-	}
-	
-	private void reorganizeLines(Vector lines, int numBytesPerLine) throws DebugException
-	{
-		if (lines == null || lines.isEmpty())
-			return;
-		
-		Object[] objs = lines.toArray();
-		
-		if (objs.length > 0)
-		{
-			TableRenderingLine[] renderingLines = (TableRenderingLine[])lines.toArray(new TableRenderingLine[lines.size()]);
-			MemoryByte[] buffer = convertLinesToBytes(renderingLines);
-			BigInteger lineAddress = new BigInteger(renderingLines[0].getAddress(), 16);
-			int numberOfLines = buffer.length / numBytesPerLine;
-			boolean updateDelta = false;
-			int addressLength = getAddressSize(lineAddress) * IInternalDebugUIConstants.CHAR_PER_BYTE;
-			MemoryByte[] memoryBuffer = buffer;
-			String address =renderingLines[0].getAddress();
-			String paddedString = DebugUITools.getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-			
-			// set to false to preserve information delta information 
-			boolean manageDelta = true;
-			
-			// If change information is not managed by the memory block
-			// The view tab will manage it and calculate delta information
-			// for its content cache.
-			if (fInput.getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				manageDelta = !((IMemoryBlockExtension)fInput.getMemoryBlock()).supportsChangeManagement();
-			}
-			lineCache.clear();
-			
-			organizeLines(numberOfLines, updateDelta, addressLength, memoryBuffer, paddedString, address, manageDelta);
-		}
-	}
-	
-	private void reorganizeContentCache(int bytesPerLine)
-	{
-		// if content cache is empty, do nothing
-		if (contentCache == null || contentCache.isEmpty()
-			|| fContentCacheInBytes.length == 0 || fContentCacheStartAddress == null)
-			return;
-		
-		MemoryByte[] bytes = fContentCacheInBytes;
-		TableRenderingLine[] convertedLines = convertBytesToLines(bytes, bytesPerLine, new BigInteger(fContentCacheStartAddress, 16));
-		
-		contentCache.clear();
-		for (int i=0; i<convertedLines.length; i++)
-		{
-			contentCache.put(convertedLines[i].getAddress(), convertedLines[i]);
-		}
-	}
-	
-	private MemoryByte[] convertLinesToBytes(TableRenderingLine[] lines)
-	{
-		// convert the lines back to a buffer of MemoryByte
-		TableRenderingLine temp = lines[0];
-		int lineLength = temp.getLength();
-
-		MemoryByte[] buffer = new MemoryByte[lines.length * lineLength];
-		for (int i=0; i<lines.length; i++)
-		{
-			TableRenderingLine line = lines[i];
-			MemoryByte[] bytes = line.getBytes();
-			System.arraycopy(bytes, 0, buffer, i*lineLength, lineLength);
-		}
-		return buffer;
-	}
-	
-	private TableRenderingLine[] convertBytesToLines(MemoryByte[] bytes, int bytesPerLine, BigInteger startAddress)
-	{
-		int numOfLines = bytes.length / bytesPerLine;
-		String address = startAddress.toString(16);
-		int addressLength;
-		try {
-			addressLength = getAddressSize(startAddress) * IInternalDebugUIConstants.CHAR_PER_BYTE;
-		} catch (DebugException e) {
-			DebugUIPlugin.log(e);
-			addressLength = 4 * IInternalDebugUIConstants.CHAR_PER_BYTE;
-		}
-		ArrayList lines = new ArrayList();
-		String paddedString = DebugUITools.getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-		
-		for (int i=0; i<numOfLines; i++)
-		{
-			MemoryByte[] temp = new MemoryByte[bytesPerLine];
-			System.arraycopy(bytes, i*bytesPerLine, temp, 0, bytesPerLine);
-			
-			String tmpAddress = address.toUpperCase();
-			if (tmpAddress.length() < addressLength)
-			{
-				for (int j = 0; tmpAddress.length() < addressLength; j++)
-				{
-					tmpAddress = "0" + tmpAddress; //$NON-NLS-1$
-				}
-			}
-			
-			TableRenderingLine newLine = new TableRenderingLine(tmpAddress, temp, lines.size(), paddedString);
-			lines.add(newLine);
-			
-			// increment row address
-			BigInteger bigInt = new BigInteger(address, 16);
-			fBufferEndAddress = bigInt;
-			int addressableUnit = getTableRendering(fInput).getBytesPerLine()/getTableRendering(fInput).getAddressableSize();
-			address = bigInt.add(BigInteger.valueOf(addressableUnit)).toString(16);
-		}
-		
-		return (TableRenderingLine[])lines.toArray(new TableRenderingLine[lines.size()]);
-	}
-	
-	private AbstractTableRendering getTableRendering(TableRenderingContentInput input)
-	{
-		return (AbstractTableRendering)input.getAdapter(AbstractTableRendering.class);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLabelProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLabelProvider.java
deleted file mode 100644
index 009de77..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLabelProvider.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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.debug.ui.memory.IMemoryBlockTablePresentation;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @since 3.0
- */
-public class TableRenderingLabelProvider extends AbstractTableRenderingLabelProvider implements IColorProvider {
-	
-	private IMemoryBlockTablePresentation fTablePresentation;
-
-	/**
-	 * Constructor for MemoryViewLabelProvider
-	 */
-	public TableRenderingLabelProvider() {
-		super();
-	}
-	
-	public TableRenderingLabelProvider(AbstractTableRendering rendering){
-		super(rendering);
-		fTablePresentation = (IMemoryBlockTablePresentation)rendering.getAdapter(IMemoryBlockTablePresentation.class);
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (fTablePresentation != null) {
-			fTablePresentation.dispose();
-			fTablePresentation = null;
-		}
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		if (element instanceof TableRenderingLine)
-		{
-			TableRenderingLine line = (TableRenderingLine)element;
-			
-			if (line.isMonitored) {
-				return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR);
-			}
-			return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR);
-		}
-		return DebugUIPlugin.getPreferenceColor(IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object element, int columnIndex) {
-		
-		String label = super.getColumnText(element, columnIndex);
-		
-		// consult model presentation for address presentation
-		if (columnIndex == 0)
-		{	
-			if (fTablePresentation != null)
-			{	
-				String address = ((TableRenderingLine)element).getAddress();
-				
-				// get address presentation
-				String tempLabel = fTablePresentation.getRowLabel(fRendering.getMemoryBlock(), new BigInteger(address, 16));
-				
-				if (tempLabel != null)
-					return tempLabel;
-			}
-			return label;
-		}
-		return label;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLabelProviderEx.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLabelProviderEx.java
deleted file mode 100644
index 5fe5fbd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLabelProviderEx.java
+++ /dev/null
@@ -1,158 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.ui.memory.AbstractTableRendering;
-import org.eclipse.debug.ui.memory.MemoryRenderingElement;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This label provider is used by AbstractTableRendering if clients decide to
- * provide customized decorations in the rendering. Otherwise the table
- * rendering uses TableRenderingLabelProvider.
- * 
- */
-public class TableRenderingLabelProviderEx extends TableRenderingLabelProvider implements ITableColorProvider, ITableFontProvider {
-
-	private IFontProvider fFontProvider;
-	private ILabelProvider fLabelProvider;
-	private IColorProvider fColorProvider;
-
-	public TableRenderingLabelProviderEx(AbstractTableRendering rendering) {
-		super(rendering);
-		fLabelProvider = (ILabelProvider) rendering.getAdapter(ILabelProvider.class);
-		fColorProvider = (IColorProvider) rendering.getAdapter(IColorProvider.class);
-		fFontProvider = (IFontProvider) rendering.getAdapter(IFontProvider.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (fFontProvider != null) {
-			fFontProvider = null;
-		}
-		if (fColorProvider != null) {
-			fColorProvider = null;
-		}
-		if (fLabelProvider != null) {
-			fLabelProvider.dispose();
-			fLabelProvider = null;
-		}
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int)
-	 */
-	public Color getBackground(Object element, int columnIndex) {
-		if (fColorProvider != null && columnIndex > 0) {
-			MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex);
-			if (renderingElement != null) {
-				Color color = fColorProvider.getBackground(renderingElement);
-				if (color != null)
-					return color;
-			}
-		}
-		return super.getBackground(element);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang.Object, int)
-	 */
-	public Color getForeground(Object element, int columnIndex) {
-		if (fColorProvider != null && columnIndex > 0) {
-			MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex);
-			if (renderingElement != null) {
-				Color color = fColorProvider.getForeground(renderingElement);
-				if (color != null)
-					return color;
-			}			
-		}
-		return super.getForeground(element);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Image getColumnImage(Object element, int columnIndex) {
-		if (fLabelProvider != null && columnIndex > 0) {
-			MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex);
-			if (renderingElement != null) {
-				Image image = fLabelProvider.getImage(renderingElement);
-				if (image != null)
-					return image;
-			}
-		}
-		return super.getColumnImage(element, columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int)
-	 */
-	public Font getFont(Object element, int columnIndex) {
-		if (fFontProvider != null && columnIndex > 0) {
-			MemoryRenderingElement renderingElement = getMemoryRenderingElement(element, columnIndex);
-			if (renderingElement != null) {
-				Font font = fFontProvider.getFont(renderingElement);
-				if (font != null)
-					return font;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns a memory rendering element corresponding to the given element
-	 * or <code>null</code> if none.
-	 *  
-	 * @param element element to be rendered
-	 * @param columnIndex column index at which to render
-	 * @return memory rendering element or <code>null</code>
-	 */
-	private MemoryRenderingElement getMemoryRenderingElement(Object element, int columnIndex) {
-		if (element instanceof TableRenderingLine) {
-			TableRenderingLine line = (TableRenderingLine) element;
-			BigInteger lineAddress = new BigInteger(line.getAddress(), 16);
-			int offset = (columnIndex - 1) * fRendering.getBytesPerColumn();
-			if (offset < fRendering.getBytesPerLine() && (offset + fRendering.getBytesPerColumn()) <= fRendering.getBytesPerLine()) {
-				return getMemoryRenderingElement(line, lineAddress, offset);
-			}
-		}
-		return null;
-	}
-	
-	private MemoryRenderingElement getMemoryRenderingElement(TableRenderingLine line, BigInteger lineAddress, int offset) {
-		BigInteger cellAddress = lineAddress.add(BigInteger.valueOf(offset));
-		MemoryByte[] bytes = line.getBytes(offset, offset
-				+ fRendering.getBytesPerColumn());
-		// make a copy to ensure that the memory bytes are not overwritten
-		// by clients
-		MemoryByte[] copy = new MemoryByte[bytes.length];
-		System.arraycopy(bytes, 0, copy, 0, bytes.length);
-		MemoryRenderingElement renderingElement = new MemoryRenderingElement(
-				fRendering, cellAddress, copy);
-		return renderingElement;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java
deleted file mode 100644
index 0652248..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java
+++ /dev/null
@@ -1,305 +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.debug.internal.ui.views.memory.renderings;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.model.MemoryByte;
-
-/**
- * @since 3.0
- */
-
-public class TableRenderingLine extends PlatformObject {
-	private String fAddress;
-	private String fStrRep;
-	private MemoryByte[] fBytes;
-	private byte[] fByteArray; 
-	private int fTableIndex = -1;
-	private String fPaddedString;
-	public boolean isMonitored;
-
-	public static final String P_ADDRESS = "address"; //$NON-NLS-1$
-
-	// for raw hex data, it's 2 characters per byte
-	private static final int numCharPerByteForHex = 2;
-
-	public TableRenderingLine(String address, MemoryByte[] bytes, int tableIndex, String paddedString) {
-		fAddress = address;
-		fBytes = bytes;
-		fTableIndex = tableIndex;
-		fPaddedString = paddedString;
-	}
-
-	public String getAddress() {
-		return fAddress;
-	}
-
-	public void setAddress(String address) {
-		fAddress = address;
-	}
-	
-	public MemoryByte[] getBytes()
-	{
-		return fBytes;
-	}
-	
-	public MemoryByte getByte(int offset)
-	{
-		if (fBytes == null)
-			return null;
-		
-		if (offset < fBytes.length) {
-			return fBytes[offset];
-		}
-		
-		return null;		
-	}
-	
-	public MemoryByte[] getBytes(int start, int end)
-	{
-		ArrayList ret = new ArrayList();
-		
-		for (int i=start; i<end; i++)
-		{
-			ret.add(fBytes[i]);
-		}
-		return (MemoryByte[]) ret.toArray(new MemoryByte[ret.size()]);
-	}
-	
-	public String getRawMemoryString()
-	{
-		if (fStrRep == null)
-		{
-			StringBuffer buffer = new StringBuffer();
-			fStrRep = RenderingsUtil.convertByteArrayToHexString(getByteArray());
-			fStrRep = fStrRep.toUpperCase();
-			
-			buffer = buffer.append(fStrRep);
-			
-			// pad unavailable bytes with padded string from memory block
-			String paddedString = null;
-			int bufferCounter = 0;
-			for (int i=0; i<fBytes.length; i++)
-			{ 
-				// if byte is invalid
-				if (!fBytes[i].isReadable())
-				{
-					if (paddedString == null)
-					{
-						paddedString = fPaddedString;
-						
-						if (paddedString.length() > TableRenderingLine.numCharPerByteForHex)
-							paddedString = paddedString.substring(0, TableRenderingLine.numCharPerByteForHex);
-					}
-					buffer.replace(bufferCounter, bufferCounter+TableRenderingLine.numCharPerByteForHex, paddedString);		
-				}
-				bufferCounter += TableRenderingLine.numCharPerByteForHex;
-			}
-			
-			fStrRep = buffer.toString();
-		}
-		
-		return fStrRep;
-	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @return is the bytes between start and end are all valid
-	 */
-	public boolean isAvailable(int start, int end) {
-		boolean available = true;
-		for (int i=start; i<end; i++)
-		{	
-			if (!fBytes[i].isReadable())
-			{	
-				available = false;
-				break;
-			}
-		}
-		return available;
-	}
-
-
-	public byte[] getByteArray()
-	{
-		if (fByteArray == null)
-		{
-			fByteArray = new byte[fBytes.length];
-			for (int i=0; i<fBytes.length; i++)
-			{
-				fByteArray[i] = fBytes[i].getValue();
-			}			
-		}
-		
-		return fByteArray;
-	}
-	
-	public byte[] getByteArray(int start, int end)
-	{
-		byte[] ret = new byte[end-start];
-		int j=0;
-		
-		for (int i=start; i<end; i++)
-		{
-			ret[j] = fBytes[i].getValue();
-			j++;
-		}
-		return ret;
-	}
-	
-	public void markDeltas(TableRenderingLine oldData)
-	{
-		if (oldData == null)
-			return;
-		
-		// if address is not the same, no need to compare
-		if (!oldData.getAddress().equals(this.getAddress()))
-			return;
-		
-		// if the string representation is the same, no need to compare
-		if (oldData.getRawMemoryString().equals(getRawMemoryString()))
-		{
-			for (int i=0; i<fBytes.length; i++)
-			{
-				// set history as known if we have old data for this line
-				fBytes[i].setHistoryKnown(true);
-			}
-			return;
-		}
-		
-		MemoryByte[] oldMemory = oldData.getBytes();
-		
-		if (oldMemory.length != fBytes.length)
-			return;
-			
-		for (int i=0; i<fBytes.length; i++)
-		{
-			// turn on known bit
-			fBytes[i].setHistoryKnown(true);
-			
-			if ((fBytes[i].getFlags() & MemoryByte.READABLE) != (oldMemory[i].getFlags() & MemoryByte.READABLE))
-			{
-				fBytes[i].setChanged(true);
-				continue;
-			}
-				
-			if (fBytes[i].isReadable() && oldMemory[i].isReadable())
-			{
-				if (fBytes[i].getValue() != oldMemory[i].getValue())
-				{
-					fBytes[i].setChanged(true);
-				}
-			}
-		}
-	}
-	
-	public void copyDeltas(TableRenderingLine oldData)
-	{
-		if (oldData == null)
-			return;
-		
-		// if address is not the same, do not copy
-		if (!oldData.getAddress().equals(this.getAddress()))
-			return;
-		
-		// reuse delta information from old data
-		MemoryByte[] oldMemory = oldData.getBytes();
-		
-		if (oldMemory.length != fBytes.length)
-			return;
-			
-		for (int i=0; i<fBytes.length; i++)
-		{
-			fBytes[i].setFlags(oldMemory[i].getFlags());
-		}		
-	}
-	
-	public boolean isLineChanged(TableRenderingLine oldData)
-	{
-		if (oldData == null)
-			return false;
-		
-		// if address is not the same, no need to compare
-		if (!oldData.getAddress().equals(this.getAddress()))
-			return false;
-		
-		// if the string representation is not the same, this line has changed
-		if (oldData.getRawMemoryString().equals(getRawMemoryString())) {
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * @param offset
-	 * @param endOffset
-	 * @return true if the specified range of memory has changed, false otherwise
-	 * */
-	
-	public boolean isRangeChange(int offset, int endOffset)
-	{	
-		boolean allBytesKnown = true;
-		boolean allBytesUnchanged = true;
-		
-		for (int i=offset; i<=endOffset; i++)
-		{
-			if (!fBytes[i].isHistoryKnown())
-				allBytesKnown = false;
-			if (fBytes[i].isChanged())
-				allBytesUnchanged = false;
-		}
-		
-		if (allBytesKnown && !allBytesUnchanged) {
-			return true;
-		}
-		return false;
-	}
-	
-	public void unmarkDeltas()
-	{
-		for (int i=0; i<fBytes.length; i++)
-		{
-			// unset the change bit
-			if (fBytes[i].isChanged())
-				fBytes[i].setChanged(false);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString()
-	{
-		StringBuffer buf = new StringBuffer();
-		buf.append(getAddress());
-		
-		buf.append(": "); //$NON-NLS-1$
-		
-		buf.append(getRawMemoryString());
-		
-		return buf.toString();
-	}
-	
-	public int getTableIndex()
-	{
-		return fTableIndex;
-	}
-	
-	public int getLength()
-	{
-		return fBytes.length;
-	}
-
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingModel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingModel.java
deleted file mode 100644
index d7c5a40..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingModel.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.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.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.memory.provisional.AbstractAsyncTableRendering;
-import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.AsynchronousTableViewer;
-import org.eclipse.debug.internal.ui.viewers.ModelNode;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-
-
-public class TableRenderingModel extends AbstractVirtualContentTableModel
-		implements IContentChangeComputer {
-
-
-	private Hashtable fCache;
-	private Vector fOrderedCache;			// needed to re-organize cache
-	
-	private boolean fMBSupportsChangeManagement;
-	private IMemoryBlock fMemoryBlock;
-
-	class SupportsChangeMgmtJob extends Job {
-		
-		SupportsChangeMgmtJob()
-		{
-			super("Support Change Management"); //$NON-NLS-1$
-			setSystem(true);
-		}
-
-		protected IStatus run(IProgressMonitor monitor) {
-			IMemoryBlock mb = getMemoryBlock();
-			if (mb instanceof IMemoryBlockExtension)
-			{
-				IMemoryBlockExtension mbExt = (IMemoryBlockExtension)mb;
-				fMBSupportsChangeManagement = mbExt.supportsChangeManagement();
-			}
-			return Status.OK_STATUS;
-		}
-		
-	}
-	
-	
-	public TableRenderingModel(AsynchronousTableViewer viewer) {
-		super(viewer);
-		fCache = new Hashtable();
-		fOrderedCache = new Vector();
-	}
-	
-	public int indexOfKey(Object key)
-	{
-		if (key instanceof BigInteger)
-		{
-			BigInteger address = (BigInteger)key;
-			Object items[] = getElements();
-			
-			for (int i=0; i<items.length; i++){
-				if (items[i] != null && items[i] instanceof MemorySegment)
-				{	
-					MemorySegment line = (MemorySegment)items[i];
-					if (line.containsAddress(address))
-						return i;
-				}
-			}
-		}
-		
-		return -1;
-	}
-	
-	public int columnOf(Object element, Object key)
-	{
-		if (element instanceof MemorySegment && key instanceof BigInteger)
-		{
-			BigInteger address = (BigInteger)key;
-			MemorySegment line = (MemorySegment)element;
-			if (line.containsAddress(address))
-			{
-				if (getAddressableUnitsPerColumn() > 0)
-				{
-					BigInteger offset = address.subtract(line.getAddress());
-					
-					// locate column
-					int colAddressableUnit = getAddressableUnitsPerColumn();
-					int col = ((offset.intValue()/colAddressableUnit)+1);
-					
-					if (col == 0)
-						col = 1;
-					
-					return col;
-				}
-			}
-		}
-		
-		return -1;
-	}
-	
-	public Object getKey(int idx)
-	{
-		Object elmt = getElement(idx);
-		if (elmt instanceof MemorySegment)
-		{
-			return ((MemorySegment)elmt).getAddress();
-		}
-	
-		return null;
-	}
-
-	public Object getKey(Object element) {
-		int idx = indexOfElement(element);
-		if (idx >= 0)
-		{
-			return getKey(idx);
-		}
-		return null;
-	}
-	
-	public Object getKey(int idx, int col) {
-		Object element = getElement(idx);
-		if (element != null && element instanceof MemorySegment)
-		{
-			MemorySegment segment = (MemorySegment)element;
-			BigInteger rowAddress = segment.getAddress();
-			
-			int offset;
-			if (col > 0)
-			{	
-				// 	get address offset
-				int addressableUnit = getAddressableUnitsPerColumn();
-				offset = (col-1) * addressableUnit;
-			}
-			else
-			{
-				offset = 0;
-			}
-			return rowAddress.add(BigInteger.valueOf(offset));
-		}
-		return null;
-	}
-	
-	private int getAddressableUnitsPerColumn()
-	{
-		AsynchronousTableViewer viewer = getTableViewer();
-		if (viewer.getPresentationContext() instanceof MemoryViewPresentationContext)
-		{
-			MemoryViewPresentationContext context = (MemoryViewPresentationContext)viewer.getPresentationContext();
-			if (getTableRendering(context)!= null)
-			{
-				return getTableRendering(context).getAddressableUnitPerColumn();
-			}
-		}
-		return -1;
-	}
-
-	public void cache(Object[] elements) {
-		for (int i=0; i<elements.length; i++)
-		{
-			Object obj = elements[i];
-			if (obj instanceof MemorySegment)
-			{
-				cache(((MemorySegment)obj).getAddress(), obj);
-			}
-		}
-		
-	}
-	
-	private void cache(Object key, Object element)
-	{
-		fCache.put(key, element);
-		fOrderedCache.add(element);
-	}
-
-	public Object[] compare(Object[] newElements) {
-		
-		if (fCache.isEmpty())
-			return newElements;
-		
-		for (int j=0; j<newElements.length; j++)
-		{
-			Object obj = newElements[j];
-			if (obj instanceof MemorySegment)
-			{
-				MemorySegment newSegment = (MemorySegment)obj;
-				MemorySegment oldSegment = (MemorySegment)fCache.get(newSegment.getAddress());
-
-				if (oldSegment != null)
-				{
-					if (oldSegment.getNumAddressableUnits() == newSegment.getNumAddressableUnits())
-					{
-						MemoryByte[] newBytes = newSegment.getBytes();
-						MemoryByte[] oldBytes = oldSegment.getBytes();
-						
-						for (int i=0; i<newBytes.length; i++)
-						{
-							newBytes[i].setHistoryKnown(true);
-							
-							if (newBytes[i].isReadable() != oldBytes[i].isReadable())
-							{
-								newBytes[i].setChanged(true);
-								continue;
-							}			
-
-							if (newBytes[i].isReadable() && oldBytes[i].isReadable() && 
-								(newBytes[i].getValue() != oldBytes[i].getValue()))
-								newBytes[i].setChanged(true);
-						}
-					}
-				}
-			}
-		}		
-		return newElements;
-	}
-	
-	public void clearCache()
-	{
-		fCache.clear();
-		fOrderedCache.clear();
-	}
-
-	public boolean isEmpty() {
-		return fCache.isEmpty();
-	}
-
-	public void handleViewerChanged() {
-		// viewer has changed, content manager needs to re-organize the cache
-		rebuildCache();
-		rebuildContent();
-	}
-	
-	private void rebuildCache()
-	{
-		if (isEmpty())
-			return;
-		
-		MemoryViewPresentationContext context = (MemoryViewPresentationContext)getTableViewer().getPresentationContext();
-		AbstractAsyncTableRendering rendering = getTableRendering(context);
-		
-		if (rendering == null)
-			return;
-		
-		ArrayList segments = new ArrayList(); 
-		Enumeration enumeration = fOrderedCache.elements();
-		
-		BigInteger address = ((MemorySegment)fOrderedCache.get(0)).getAddress();
-		while (enumeration.hasMoreElements())
-		{
-			Object element = enumeration.nextElement();
-			if (element instanceof MemorySegment)
-			{
-				
-				segments.add(element);
-			}
-		}
-		
-		MemoryByte[] bytes = convertSegmentsToBytes((MemorySegment[])segments.toArray(new MemorySegment[0]));
-		
-		int bytesPerLine = rendering.getBytesPerLine();
-		int numAddressableUnitPerLine = rendering.getAddressableUnitPerLine();
-		
-		int addressableSize = rendering.getAddressableSize();
-		
-		clearCache();
-		
-		TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)rendering.getAdapter(TableRenderingContentDescriptor.class);
-		boolean alignAddress = true;
-		if (descriptor != null && !descriptor.isAlignAddressToBoundary())
-		{
-			alignAddress = descriptor.isAlignAddressToBoundary();
-		}
-		
-		MemorySegment[] newSegments = convertMemoryBytesToSegments(address, bytes, bytesPerLine, numAddressableUnitPerLine, addressableSize, alignAddress);
-		for (int i=0; i<newSegments.length; i++)
-		{
-			cache(newSegments[i].getAddress(), newSegments[i]);
-		}
-	}
-	
-	private void rebuildContent()
-	{
-		MemoryViewPresentationContext context = (MemoryViewPresentationContext)getTableViewer().getPresentationContext();
-		AbstractAsyncTableRendering rendering = getTableRendering(context);
-		
-		if (rendering == null)
-			return;
-		
-		ArrayList segments = new ArrayList();
-		Object[] elements = getElements();
-		for (int i=0; i<elements.length; i++)
-		{
-			Object element = elements[i];
-			if (element instanceof MemorySegment)
-			{
-				segments.add(element);
-			}
-		}
-		
-		MemoryByte[] bytes = convertSegmentsToBytes((MemorySegment[])segments.toArray(new MemorySegment[segments.size()]));
-		
-		int bytesPerLine = rendering.getBytesPerLine();
-		int numAddressableUnitPerLine = rendering.getAddressableUnitPerLine();
-		BigInteger address = (BigInteger)getKey(0);
-
-		int addressableSize = rendering.getAddressableSize();
-		
-		TableRenderingContentDescriptor descriptor = (TableRenderingContentDescriptor)rendering.getAdapter(TableRenderingContentDescriptor.class);
-		boolean alignAddress = true;
-		if (descriptor != null && !descriptor.isAlignAddressToBoundary())
-		{
-			alignAddress = descriptor.isAlignAddressToBoundary();
-		}
-		
-		MemorySegment[] newSegments = convertMemoryBytesToSegments(address, bytes, bytesPerLine, numAddressableUnitPerLine, addressableSize, alignAddress);
-		remove(getElements());
-		add(newSegments);
-	}
-
-	
-	private MemoryByte[] convertSegmentsToBytes(MemorySegment[] segments)
-	{
-		ArrayList toReturn = new ArrayList();
-		for (int i=0; i<segments.length; i++)
-		{
-			MemoryByte[] temp = segments[i].getBytes();
-			for (int j=0; j<temp.length; j++)
-			{
-				toReturn.add(temp[j]);
-			}
-		}
-		return (MemoryByte[])toReturn.toArray(new MemoryByte[0]);
-	}
-	
-	private MemorySegment[] convertMemoryBytesToSegments(BigInteger address, MemoryByte[] bytes, int bytesPerLine, int numAddressableUnitPerLine, int addressableSize, boolean alignAddress) {
-		
-		Assert.isTrue(bytesPerLine > 0);
-		Assert.isTrue(numAddressableUnitPerLine > 0);
-		
-		ArrayList segments = new ArrayList();
-		MemoryByte[] temp = bytes;
-		
-		if (alignAddress)
-		{
-			BigInteger alignedAddress = MemoryViewUtil.alignToBoundary(address, numAddressableUnitPerLine);
-			
-			// also check that the address is properly aligned and prepend bytes if need to
-			if (!address.subtract(alignedAddress).equals(BigInteger.ZERO))
-			{
-				BigInteger unitsToSetBack = address.subtract(alignedAddress);
-				BigInteger tempAddress = address.subtract(unitsToSetBack);
-				// only do this if the resulted address >= 0
-				// do not want to have negative addresses
-				if (tempAddress.compareTo(BigInteger.ZERO) >= 0)
-				{
-					address = alignedAddress;
-					int numBytesNeeded = unitsToSetBack.intValue() * addressableSize;
-					temp = new MemoryByte[bytes.length + numBytesNeeded];
-					
-					for (int i=0; i<numBytesNeeded; i++)
-					{
-						temp[i] = new MemoryByte();
-						temp[i].setReadable(false);
-						temp[i].setWritable(false);
-						temp[i].setEndianessKnown(false);	
-					}	
-					
-					System.arraycopy(bytes, 0, temp, numBytesNeeded, bytes.length);
-					bytes = temp;
-				}
-			}
-		}
-		
-		if (bytes.length % bytesPerLine != 0)
-		{
-			int numBytesNeeded = bytesPerLine - (bytes.length % bytesPerLine);
-			temp = new MemoryByte[bytes.length + numBytesNeeded];
-			System.arraycopy(bytes, 0, temp, 0, bytes.length);
-			
-			for (int i=bytes.length; i<temp.length; i++)
-			{
-				temp[i] = new MemoryByte();
-				temp[i].setReadable(false);
-				temp[i].setWritable(false);
-				temp[i].setEndianessKnown(false);	
-			}	
-			bytes = temp;
-		}
-		
-		int idx = 0;
-		while (idx < bytes.length && (idx + bytesPerLine)<= bytes.length)
-		{
-			MemoryByte[] newBytes = new MemoryByte[bytesPerLine];
-			System.arraycopy(bytes, idx, newBytes, 0, bytesPerLine);
-			
-			MemorySegment segment = new MemorySegment(address, newBytes, numAddressableUnitPerLine);
-			segments.add(segment);
-			
-			address = address.add(BigInteger.valueOf(numAddressableUnitPerLine));
-			idx += bytesPerLine;
-		}
-		
-		return (MemorySegment[])segments.toArray(new MemorySegment[segments.size()]);
-	}
-	
-	private AsynchronousTableViewer getTableViewer()
-	{
-		return (AsynchronousTableViewer)getViewer();
-	}
-
-	protected void setChildren(ModelNode parentNode, List kids) {
-		
-		if (computeChanges())
-		{
-			Object[] newContent = compare(kids.toArray());
-			ArrayList newList = new ArrayList();
-			for (int i=0; i<newContent.length; i++)
-			{
-				newList.add(newContent[i]);
-			}
-			super.setChildren(parentNode, newList);
-		}
-		else
-			super.setChildren(parentNode, kids);
-	}
-	
-	private boolean computeChanges()
-	{ 
-		if (isEmpty())
-			return false;
-		
-		if (fMBSupportsChangeManagement)
-		{
-			return false;
-		}
-		
-		return true;
-	}
-	
-	private IMemoryBlock getMemoryBlock()
-	{
-		return fMemoryBlock;
-	}
-	
-
-	public void init(Object root) {
-		if (root instanceof IMemoryBlock)
-		{
-			fMemoryBlock = (IMemoryBlock)root;
-			new SupportsChangeMgmtJob().schedule();
-		}
-		super.init(root);
-	}
-	
-	private AbstractAsyncTableRendering getTableRendering(MemoryViewPresentationContext context)
-	{
-		IMemoryRendering memRendering = context.getRendering();
-		if (memRendering != null && memRendering instanceof AbstractAsyncTableRendering)
-		{
-			return (AbstractAsyncTableRendering)memRendering;
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPrefAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPrefAction.java
deleted file mode 100644
index 43a2840..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPrefAction.java
+++ /dev/null
@@ -1,60 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.action.IAction;
-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.jface.preference.PreferenceNode;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.actions.ActionDelegate;
-
-public class TableRenderingPrefAction extends ActionDelegate implements IViewActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IPreferencePage page = new TableRenderingPreferencePage(DebugUIMessages.TableRenderingPrefAction_0);
-		showPreferencePage("org.eclipse.debug.ui.tableRenderingPreferencepage", page);	 //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-	}
-	
-	protected void showPreferencePage(String id, IPreferencePage page) {
-		final IPreferenceNode targetNode = new PreferenceNode(id, page);
-		
-		PreferenceManager manager = new PreferenceManager();
-		manager.addToRoot(targetNode);
-		final PreferenceDialog dialog = new PreferenceDialog(DebugUIPlugin.getShell(), manager);
-		final boolean [] result = new boolean[] { false };
-		BusyIndicator.showWhile(DebugUIPlugin.getStandardDisplay(), new Runnable() {
-			public void run() {
-				dialog.create();
-				dialog.setMessage(targetNode.getLabelText());
-				result[0]= (dialog.open() == Window.OK);
-			}
-		});		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPreferencePage.java
deleted file mode 100644
index e32593f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPreferencePage.java
+++ /dev/null
@@ -1,219 +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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-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.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.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.ui.PlatformUI;
-
-public class TableRenderingPreferencePage extends PreferencePage implements
-	IPropertyChangeListener, SelectionListener{
-
-	private Button fAuto;
-	private Button fManual;
-	private IntegerFieldEditor fPreBufferSize;
-	private IntegerFieldEditor fPostBufferSize;
-	private IntegerFieldEditor fPageSize;
-	private Group fGroup;
-	private Composite fComposite;
-	
-	
-	public TableRenderingPreferencePage(String title) {
-		super(title);
-	}
-
-	protected Control createContents(Composite parent) {
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".table_renderings_preference_page_context"); //$NON-NLS-1$
-		
-		fComposite = new Composite(parent, SWT.NONE);
-		fComposite.setLayout(new GridLayout());
-		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
-		fComposite.setLayoutData(data); 
-
-		GridData hspanData = new GridData(SWT.FILL, SWT.FILL, true, false);
-		hspanData.horizontalSpan = 2;
-		
-		SWTFactory.createWrapLabel(fComposite, DebugUIMessages.TableRenderingPreferencePage_10, 2, 300);
-		
-		fAuto = new Button(fComposite, SWT.RADIO);
-		fAuto.setText(DebugUIMessages.TableRenderingPreferencePage_0);
-		fAuto.setLayoutData(hspanData);
-		
-		fGroup = new Group(fComposite, SWT.NONE);
-		fGroup.setText(DebugUIMessages.TableRenderingPreferencePage_5);
-		GridData groupData = new GridData(SWT.FILL, SWT.FILL, true, false);
-		groupData.horizontalSpan = 2;
-		fGroup.setLayoutData(groupData);
-		fPreBufferSize = new IntegerFieldEditor(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE, DebugUIMessages.TableRenderingPreferencePage_6, fGroup);
-		fPreBufferSize.setPreferenceStore(getPreferenceStore());
-		fPreBufferSize.load();
-		fPostBufferSize = new IntegerFieldEditor(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE, DebugUIMessages.TableRenderingPreferencePage_7, fGroup);
-		fPostBufferSize.setPreferenceStore(getPreferenceStore());
-		fPostBufferSize.load();
-		
-		fManual = new Button(fComposite, SWT.RADIO);
-		fManual.setText(DebugUIMessages.TableRenderingPreferencePage_8);
-		fManual.setLayoutData(hspanData);
-		
-		fPageSize = new IntegerFieldEditor(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE, DebugUIMessages.TableRenderingPreferencePage_2, fComposite);
-		fPageSize.setPreferenceStore(getPreferenceStore());
-		fPageSize.load();
-		
-		fPreBufferSize.setPropertyChangeListener(this);
-		fPostBufferSize.setPropertyChangeListener(this);
-		fPageSize.setPropertyChangeListener(this);
-		
-		fAuto.addSelectionListener(this);
-		fManual.addSelectionListener(this);
-		
-		loadLoadingModeFromPreference();
-		updateTextEditorsEnablement();
-		
-		return fComposite;
-	}
-
-	/**
-	 * 
-	 */
-	private void loadLoadingModeFromPreference() {
-		boolean isAuto = getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-		fAuto.setSelection(isAuto);
-		fManual.setSelection(!isAuto);
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().equals(FieldEditor.VALUE))
-		{
-			if (event.getSource().equals(fPageSize) ||
-				event.getSource().equals(fPostBufferSize) ||
-				event.getSource().equals(fPreBufferSize))
-			{
-				validatePageSize();
-			}
-		}
-		
-	}
-	
-	private void validatePageSize() {
-		boolean autoLoad = fAuto.getSelection();
-		try {
-			int bufferSize = fPageSize.getIntValue();
-			int preBuffer = fPreBufferSize.getIntValue();
-			int postBuffer = fPostBufferSize.getIntValue();
-			if (!autoLoad && bufferSize < 1)
-			{
-				setValid(false);
-				setErrorMessage(DebugUIMessages.TableRenderingPreferencePage_3);
-			}
-			else if (autoLoad)
-			{
-				// For auto load mode, we must have have > 1 buffer size
-				// otherwise, the rendering cannot be loaded dynamically
-				
-				if (preBuffer < 1 || postBuffer < 1)
-				{
-					setValid(false);
-					setErrorMessage(DebugUIMessages.TableRenderingPreferencePage_9);
-				}
-				else
-				{
-					setValid(true);
-					setErrorMessage(null);
-				}
-			}
-			else
-			{
-				setValid(true);
-				setErrorMessage(null);
-				
-			}
-		} catch (NumberFormatException e) {
-				setValid(false);
-				setErrorMessage(DebugUIMessages.TableRenderingPreferencePage_4);
-		}
-	}
-	
-	protected IPreferenceStore doGetPreferenceStore() {
-		return DebugUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	public void dispose() {
-		fAuto.removeSelectionListener(this);
-		fManual.removeSelectionListener(this);
-		fPageSize.setPropertyChangeListener(null);
-		fPreBufferSize.setPropertyChangeListener(null);
-		fPostBufferSize.setPropertyChangeListener(null);
-		super.dispose();
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-		// do nothing
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		updateTextEditorsEnablement();
-	}
-	
-	public boolean performOk() {
-		boolean auto = fAuto.getSelection();
-		boolean currentValue = getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-		if (auto != currentValue)
-			getPreferenceStore().setValue(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM, auto);
-		
-		fPageSize.store();
-		fPreBufferSize.store();
-		fPostBufferSize.store();
-		return super.performOk();
-	}
-	
-	protected void performDefaults() {
-		
-		boolean auto = getPreferenceStore().getDefaultBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-		fAuto.setSelection(auto);
-		fManual.setSelection(!auto);
-		updateTextEditorsEnablement();
-		
-		fPageSize.loadDefault();
-		fPreBufferSize.loadDefault();
-		fPostBufferSize.loadDefault();
-		super.performDefaults();
-	}
-
-	/**
-	 * 
-	 */
-	private void updateTextEditorsEnablement() {
-		boolean auto = fAuto.getSelection();
-		fPreBufferSize.setEnabled(auto, fGroup);
-		fPostBufferSize.setEnabled(auto, fGroup);
-		fPageSize.setEnabled(!auto, fComposite);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPropertiesPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPropertiesPage.java
deleted file mode 100644
index 0f17551..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingPropertiesPage.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-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.ui.IWorkbenchPropertyPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-public class TableRenderingPropertiesPage extends PropertyPage implements
-		IWorkbenchPropertyPage {
-
-	public TableRenderingPropertiesPage() {
-		super();
-	}
-
-	protected Control createContents(Composite parent) {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".TableRenderingPropertiesPage_context"); //$NON-NLS-1$
-		noDefaultAndApplyButton();
-		Composite composite = new Composite(parent, SWT.NONE);
-		if (getElement() instanceof AbstractBaseTableRendering)
-		{
-			AbstractBaseTableRendering rendering = (AbstractBaseTableRendering)getElement();
-			GridLayout compositeLayout = new GridLayout();
-			compositeLayout.numColumns = 2;
-			compositeLayout.makeColumnsEqualWidth = false;
-			composite.setLayout(compositeLayout);
-			
-			GridData comositeSpec= new GridData();
-			comositeSpec.grabExcessVerticalSpace= true;
-			comositeSpec.grabExcessHorizontalSpace= true;
-			comositeSpec.horizontalAlignment= GridData.FILL;
-			comositeSpec.verticalAlignment= GridData.CENTER;
-			composite.setLayoutData(comositeSpec);
-			
-			String label = rendering.getLabel();
-			if (label.startsWith("&&")) //$NON-NLS-1$
-				label = label.replaceFirst("&&", "&");  //$NON-NLS-1$//$NON-NLS-2$
-			addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_1, label);
-						
-			MemoryByte[] bytes = rendering.getSelectedAsBytes();
-			if (bytes.length > 0) {
-				
-				if (rendering.getSelectedAddress() != null)
-				{
-					String selectedAddress = "0x" + rendering.getSelectedAddress().toString(16).toUpperCase(); //$NON-NLS-1$
-					StringBuffer content = new StringBuffer(selectedAddress);
-					addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_2, content.toString());
-				}
-				
-				String length = String.valueOf(rendering.getAddressableUnitPerColumn()) + " " + DebugUIMessages.TableRenderingPropertiesPage_3; //$NON-NLS-1$
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_4, length);
-				
-				String selectedContent = rendering.getSelectedAsString();
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_5, selectedContent);
-				
-				int addressableSize = rendering.getAddressableSize() * 8;
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_6, String.valueOf(addressableSize) + " " + DebugUIMessages.TableRenderingPropertiesPage_8); //$NON-NLS-1$
-				
-				boolean endianessKnown = bytes[0].isEndianessKnown();
-				int endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-				if (endianessKnown)
-					endianess = bytes[0].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;		
-				
-				boolean allBytesKnown = bytes[0].isHistoryKnown();
-				boolean allBytesUnchanged = bytes[0].isChanged()?false:true;
-				
-				boolean allBytesReadable = bytes[0].isReadable();
-				boolean allBytesWritable = bytes[0].isWritable();
-				
-				if (bytes.length > 1)
-				{
-					for (int i=1; i<bytes.length; i++)
-					{
-						if (endianessKnown)
-						{
-							int byteEndianess = bytes[i].isBigEndian()?RenderingsUtil.BIG_ENDIAN:RenderingsUtil.LITTLE_ENDIAN;
-							if (endianess != RenderingsUtil.ENDIANESS_UNKNOWN && endianess != byteEndianess)
-								endianess = RenderingsUtil.ENDIANESS_UNKNOWN;
-						}
-						
-						if (!bytes[i].isHistoryKnown())
-							allBytesKnown = false;
-						if (bytes[i].isChanged())
-							allBytesUnchanged = false;
-						
-						if (!bytes[i].isReadable())
-							allBytesReadable = false;
-						
-						if (!bytes[i].isWritable())
-							allBytesWritable = false;
-					}
-				}
-				
-				boolean isChanged = allBytesKnown && !allBytesUnchanged;
-				if (allBytesKnown)
-					addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_9, String.valueOf(isChanged));
-				else
-					addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_10, DebugUIMessages.TableRenderingPropertiesPage_11);
-				
-				String dataEndian = DebugUIMessages.TableRenderingPropertiesPage_12;
-				if (endianessKnown)
-				{	
-					if (endianess == RenderingsUtil.BIG_ENDIAN)
-						dataEndian = DebugUIMessages.TableRenderingPropertiesPage_13;
-					else if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-						dataEndian = DebugUIMessages.TableRenderingPropertiesPage_14;
-					else
-						dataEndian = DebugUIMessages.TableRenderingPropertiesPage_15;
-				}
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_16, dataEndian);
-				
-				
-				if (rendering instanceof AbstractIntegerRendering)
-				{
-					
-					AbstractIntegerRendering intRendering = (AbstractIntegerRendering)rendering;
-					String displayEndian = DebugUIMessages.TableRenderingPropertiesPage_17;
-					endianess = intRendering.getDisplayEndianess();
-					
-					if (endianess == RenderingsUtil.BIG_ENDIAN)
-						displayEndian = DebugUIMessages.TableRenderingPropertiesPage_18;
-					else if (endianess == RenderingsUtil.LITTLE_ENDIAN)
-						displayEndian = DebugUIMessages.TableRenderingPropertiesPage_19;
-					else
-					{
-						if (endianessKnown)
-							displayEndian = dataEndian;
-						else
-							displayEndian = DebugUIMessages.TableRenderingPropertiesPage_20;
-					}
-					addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_21, displayEndian);
-				}
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_22, String.valueOf(allBytesReadable));
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_23, String.valueOf(allBytesWritable));
-			}
-			else
-			{
-				String selectedAddress = "0x" + rendering.getSelectedAddress().toString(16).toUpperCase(); //$NON-NLS-1$
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_25, selectedAddress);
-				
-				int unitsPerLine = rendering.getAddressableUnitPerLine();
-				addProperty(composite, DebugUIMessages.TableRenderingPropertiesPage_26, String.valueOf(unitsPerLine));
-			}
-		}
-		
-		return composite;
-	}
-	
-	private void addProperty(Composite composite, String labelStr, String contentStr)
-	{
-		Label label = new Label(composite, SWT.NONE);
-		label.setText(labelStr);
-		Label text = new Label(composite, SWT.WRAP );
-		text.setText(contentStr);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/UnsignedIntegerRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/UnsignedIntegerRendering.java
deleted file mode 100644
index 2d126c5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/UnsignedIntegerRendering.java
+++ /dev/null
@@ -1,241 +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.debug.internal.ui.views.memory.renderings;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Represent unsigned integer rendering
- */
-public class UnsignedIntegerRendering extends AbstractIntegerRendering {
-
-	/**
-	 * @param memBlock
-	 * @param renderingId
-	 */
-	public UnsignedIntegerRendering(String renderingId) {
-		super(renderingId);
-	}
-
-	private String convertToString(byte[] byteArray, int columnSize, int endianess)
-	{
-		String ret;
-		long result = 0;
-		
-		if (columnSize == 1)
-		{
-			result = byteArray[0];
-			result &= 0xff;
-		}
-		else if (columnSize == 2)
-		{	
-			result = RenderingsUtil.convertByteArrayToInt(byteArray, endianess);
-		}
-		else if (columnSize == 4)
-		{
-			result = RenderingsUtil.convertByteArrayToLong(byteArray, endianess);
-		}
-		else if (columnSize == 8)
-		{
-			BigInteger value = RenderingsUtil.convertByteArrayToUnsignedLong(byteArray, endianess);
-			return value.toString();				
-		}
-		else if (columnSize == 16)
-		{
-			BigInteger bigRet = RenderingsUtil.convertByteArrayToUnsignedBigInt(byteArray, endianess);
-			return bigRet.toString();
-		}
-		else
-		{
-			BigInteger bigRet = RenderingsUtil.convertByteArrayToUnsignedBigInt(byteArray, endianess, columnSize);
-			return bigRet.toString();			
-		}
-
-		ret = new Long(result).toString();
-		
-		return ret;
-	}	
-	
-	private byte[] convertToBytes(int colSize, String newValue, int endianess)
-	{
-		try {
-			byte[] bytes;
-			if (colSize == 1)
-			{
-				short i = Short.parseShort(newValue);
-				bytes = RenderingsUtil.convertShortToByteArray(i, endianess);
-				bytes = extractBytes(bytes, endianess, colSize);
-			}
-			// unsigned integer
-			else if (colSize == 2)
-			{	
-				int i = Integer.parseInt(newValue);
-				bytes = RenderingsUtil.convertIntToByteArray(i, endianess);
-				bytes = extractBytes(bytes, endianess, colSize);
-			}
-			else if (colSize == 4)
-			{	
-				long i = Long.parseLong(newValue);
-				bytes = RenderingsUtil.convertLongToByteArray(i, endianess);
-				bytes = extractBytes(bytes, endianess, colSize);
-			}
-			else if (colSize == 8)
-			{	
-				BigInteger i = new BigInteger(newValue);
-				bytes = RenderingsUtil.convertBigIntegerToByteArray(i, endianess);
-				bytes = extractBytes(bytes, endianess, colSize);
-			}
-			else if (colSize == 16)
-			{	
-				BigInteger i = new BigInteger(newValue);
-				bytes = RenderingsUtil.convertUnsignedBigIntegerToByteArray(i, endianess);
-				bytes = extractBytes(bytes, endianess, colSize);
-
-				return bytes;
-			}
-			else
-			{
-				BigInteger i = new BigInteger(newValue);
-				bytes = RenderingsUtil.convertUnsignedBigIntToByteArray(i, endianess, colSize);
-				bytes = extractBytes(bytes, endianess, colSize);
-				return bytes;				
-			}
-			
-			return bytes;
-		} catch (NumberFormatException e) {
-			throw e;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.extended.ui.AbstractMemoryRenderer#getString(java.lang.String, java.math.BigInteger, byte[])
-	 */
-	public String getString(String dataType, BigInteger address, MemoryByte[] data) {
-		
-		String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-		boolean invalid = false;
-		for (int i=0; i<data.length; i++)
-		{
-			if (!data[i].isReadable())
-			{
-				invalid = true;
-				break;
-			}
-		}
-		
-		if (invalid)
-		{
-			StringBuffer strBuf = new StringBuffer();
-			for (int i=0; i<data.length; i++)
-			{
-				strBuf.append(paddedStr);
-			}
-			return strBuf.toString();
-		}
-		
-		int columnSize = getBytesPerColumn();
-		int endianess = getDisplayEndianess();
-		if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-			endianess = getBytesEndianess(data);
-		
-		byte[] byteArray = new byte[data.length];
-		for (int i=0; i<byteArray.length;i ++)
-		{
-			byteArray[i] = data[i].getValue();
-		}
-		
-		// if endianess is unknown, do not render, just return padded string		
-		if (RenderingsUtil.ENDIANESS_UNKNOWN == endianess)
-		{
-			StringBuffer strBuf = new StringBuffer();
-			for (int i=0; i<byteArray.length; i++)
-			{
-				strBuf.append(paddedStr);
-			}
-			return strBuf.toString();
-		}
-		
-		return convertToString(byteArray, columnSize, endianess);
-	}
-
-	/* (non-Javadoc)
-	 * @see com.ibm.debug.extended.ui.AbstractMemoryRenderer#getBytes(java.lang.String, java.math.BigInteger, java.lang.String)
-	 */
-	public byte[] getBytes(String dataType, BigInteger address, MemoryByte[] currentValues, String data) {
-		
-		int columnSize = getBytesPerColumn();
-		int endianess = getDisplayEndianess();
-		if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-			endianess = getBytesEndianess(currentValues);
-		
-		// if endianess is unknown, do not try to render new data to bytes
-		if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
-		{
-			byte[] retBytes = new byte[currentValues.length];
-			for (int i=0 ;i<currentValues.length; i++)
-				retBytes[i] = currentValues[i].getValue();
-			return retBytes;
-		}
-		
-		return convertToBytes(columnSize, data, endianess);
-	}
-	
-	private byte[] extractBytes(byte[] bytes, int endianess, int colSize) {
-		
-		if (colSize > bytes.length)
-			throw new NumberFormatException();
-		
-		// take the least significant 'colSize' bytes out of the bytes array
-		// if it's big endian, it's the last 'colSize' bytes
-		if (endianess == RenderingsUtil.BIG_ENDIAN)
-		{	
-			// check most significan bytes... if data has to be represented
-			// using more than 'colSize' number of bytes, this
-			// number is invalid, throw number format exception
-			for (int i=0; i<colSize; i++)
-			{
-				if (bytes[i] != 0)
-					throw new NumberFormatException();
-			}
-			
-			byte[] copy = new byte[colSize];
-			for (int j=0, k=bytes.length-colSize; j<copy.length && k<bytes.length; j++, k++)
-			{	
-				copy[j] = bytes[k]; 
-			}
-			bytes = copy;
-		}
-		// if it's little endian, it's the first 'colSize' bytes
-		else
-		{
-			// check most significan bytes... if data has to be represented
-			// using more than 'colSize' number of bytes, this
-			// number is invalid, throw number format exception
-			for (int i=colSize; i<bytes.length; i++)
-			{
-				if (bytes[i] != 0)
-					throw new NumberFormatException();
-			}
-			
-			byte[] copy = new byte[colSize];
-			for (int j=0; j<copy.length; j++)
-			{	
-				copy[j] = bytes[j]; 
-			}
-			bytes = copy;							
-		}
-		return bytes;
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/UnsignedIntegerRenderingTypeDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/UnsignedIntegerRenderingTypeDelegate.java
deleted file mode 100644
index fccbe93..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/UnsignedIntegerRenderingTypeDelegate.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.debug.internal.ui.views.memory.renderings;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.memory.IMemoryRendering;
-import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate;
-
-/**
- * Delegate for creating an unsigned integer rendering
- * @since 3.1
- */
-public class UnsignedIntegerRenderingTypeDelegate implements
-		IMemoryRenderingTypeDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate#createRendering(java.lang.String)
-	 */
-	public IMemoryRendering createRendering(String id) throws CoreException {
-		return new UnsignedIntegerRendering(id);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersView.java
deleted file mode 100644
index acee47c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersView.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * QNX Software Systems - Initial API and implementation
-***********************************************************************/
-package org.eclipse.debug.internal.ui.views.registers;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.variables.VariablesView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-
-/**
- * Displays registers and their values with a detail area.
- */
-public class RegistersView extends VariablesView {
-	
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.REGISTERS_VIEW;
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.AbstractDebugView#configureToolBar(org.eclipse.jface.action.IToolBarManager)
-	 */
-	protected void configureToolBar(IToolBarManager tbm) {
-		super.configureToolBar(tbm);
-		tbm.add(new Separator(IDebugUIConstants.EMPTY_REGISTER_GROUP));		
-		tbm.add(new Separator(IDebugUIConstants.REGISTER_GROUP));
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getDetailPanePreferenceKey()
-	 */
-	protected String getDetailPanePreferenceKey() {
-		return IDebugPreferenceConstants.REGISTERS_DETAIL_PANE_ORIENTATION;
-	}
-
-	/**
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getToggleActionLabel()
-	 */
-	protected String getToggleActionLabel() {
-		return RegistersViewMessages.RegistersView_0; 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.VariablesView#getPresentationContextId()
-	 */
-	protected String getPresentationContextId() {
-		return IDebugUIConstants.ID_REGISTER_VIEW;
-	}	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersViewMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersViewMessages.java
deleted file mode 100644
index fee5012..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersViewMessages.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * QNX Software Systems - Initial API and implementation
- * IBM Corporation - Bug 90318
- ***********************************************************************/
-package org.eclipse.debug.internal.ui.views.registers;
-
-import org.eclipse.osgi.util.NLS;
-
-public class RegistersViewMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.views.registers.RegistersViewMessages";//$NON-NLS-1$
-
-    public static String RegistersView_0;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, RegistersViewMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersViewMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersViewMessages.properties
deleted file mode 100644
index d1c175f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/registers/RegistersViewMessages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-#########################################################################
-# Copyright (c) 2004, 2005 QNX Software Systems and others.
-# All rights reserved.   This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# QNX Software Systems - Initial API and implementation
-##########################################################################
-RegistersView_0=Registers View Only
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/AvailableLogicalStructuresAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/AvailableLogicalStructuresAction.java
deleted file mode 100644
index 62644e2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/AvailableLogicalStructuresAction.java
+++ /dev/null
@@ -1,172 +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.debug.internal.ui.views.variables;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILogicalStructureType;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Drop down action that displays available logical structures for a selected
- * variable or expression.
- */
-public class AvailableLogicalStructuresAction extends Action implements IMenuCreator {
-	
-	private VariablesView fView;
-	private Menu fMenu;
-	private IValue fValue;
-	private ILogicalStructureType[] fTypes;
-
-	public AvailableLogicalStructuresAction(VariablesView view) {
-		setView(view);
-		setToolTipText(VariablesViewMessages.AvailableLogicalStructuresAction_0); 
-		setText(VariablesViewMessages.AvailableLogicalStructuresAction_1); 
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.VARIABLES_SELECT_LOGICAL_STRUCTURE);
-		setEnabled(false);
-		setMenuCreator(this);
-		init();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-	}
-	
-	protected VariablesView getView() {
-		return fView;
-	}
-
-	protected void setView(VariablesView view) {
-		fView = view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		fView= null;
-		fValue = null;
-		fTypes = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		return null;
-	}
-
-	protected void addActionToMenu(Menu parent, Action action) {
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		
-		fMenu= new Menu(parent);
-		ILogicalStructureType[] types = getTypes();
-        ILogicalStructureType enabledType = DebugPlugin.getDefaultStructureType(types);
-		if (types != null && types.length > 0) {
-			for (int i = 0; i < types.length; i++) {
-                ILogicalStructureType type= types[i];
-				Action action = new SelectLogicalStructureAction(getView(), type, getValue(), types);
-                action.setChecked(enabledType == type);
-                StringBuffer label= new StringBuffer();
-                //add the numerical accelerator
-                if (i < 9) {
-                    label.append('&');
-                    label.append(i + 1);
-                    label.append(' ');
-                }
-                label.append(action.getText());
-                action.setText(label.toString());
-				addActionToMenu(fMenu, action);
-			}
-		}
-		return fMenu;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void init() {
-		setValue(null);
-		setTypes(null);
-		if (getView().isShowLogicalStructure()) {
-			ISelection s = getView().getViewer().getSelection();
-			if (s instanceof IStructuredSelection) {
-				IStructuredSelection selection = (IStructuredSelection) s;
-				if (selection.size() == 1) {
-					Object obj = selection.getFirstElement();
-					IValue value = null;
-					if (obj instanceof IVariable) {
-						IVariable var = (IVariable) obj;
-						try {
-							value = var.getValue();
-						} catch (DebugException e) {
-						}
-					} else if (obj instanceof IExpression) {
-						IExpression expression = (IExpression)obj;
-						value = expression.getValue();
-					}
-					if (value != null) {
-						ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
-						if (types.length > 0) {
-							setTypes(types);
-							setValue(value);
-							setEnabled(true);
-							return;
-						}
-					}
-				}
-			}
-		}
-		setEnabled(false);
-	}
-	
-	protected ILogicalStructureType[] getTypes() {
-		return fTypes;
-	}
-	
-	private void setTypes(ILogicalStructureType[] types) {
-		fTypes = types;
-	}
-	
-	protected IValue getValue() {
-		return fValue;
-	}
-	
-	private void setValue(IValue value) {
-		fValue = value;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/IndexedValuePartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/IndexedValuePartition.java
deleted file mode 100644
index ecf9ec9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/IndexedValuePartition.java
+++ /dev/null
@@ -1,137 +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.debug.internal.ui.views.variables;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IIndexedValue;
-import org.eclipse.debug.core.model.IVariable;
-
-/**
- * A parition (subrange) of values of an indexed value 
- */
-public class IndexedValuePartition implements IIndexedValue {
-
-	// the starting offset of this parition, into the associated collection
-	private int fOffset;
-	
-	// the length of this partition
-	private int fLength;
-
-	// the indexed value
-	private IIndexedValue fValue;
-	
-	/**
-	 * Creates a parition for an indexed value.
-	 * 
-	 * @param value indexed value
-	 * @param offset beginning offset of this partition (into the value)
-	 * @param length the length of this parition
-	 */
-	public IndexedValuePartition(IIndexedValue value, int offset, int length) {
-		fValue = value;
-		fOffset = offset;
-		fLength = length;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IIndexedValue#getSize()
-	 */
-	public int getSize() {
-		return fLength;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IIndexedValue#getVariable(int)
-	 */
-	public IVariable getVariable(int offset) throws DebugException {
-		return fValue.getVariable(offset);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		return fValue.getReferenceTypeName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#getValueString()
-	 */
-	public String getValueString() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#getVariables()
-	 */
-	public IVariable[] getVariables() throws DebugException {
-		return getVariables(fOffset, fLength);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
-	 */
-	public boolean hasVariables() {
-		return fLength > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
-	 */
-	public boolean isAllocated() throws DebugException {
-		return fValue.isAllocated();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		return fValue.getDebugTarget();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return fValue.getLaunch();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return fValue.getModelIdentifier();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return fValue.getAdapter(adapter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IIndexedValue#getVariables(int, int)
-	 */
-	public IVariable[] getVariables(int offset, int length) throws DebugException {
-		return fValue.getVariables(offset, length);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IIndexedValue#getInitialOffset()
-	 */
-	public int getInitialOffset() {
-		return fOffset;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/IndexedVariablePartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/IndexedVariablePartition.java
deleted file mode 100644
index 7046169..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/IndexedVariablePartition.java
+++ /dev/null
@@ -1,180 +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.debug.internal.ui.views.variables;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IIndexedValue;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * A variable containing a subset/range of values from an indexed value
- * (<code>IIndexedValue</code>).
- */
-public class IndexedVariablePartition extends PlatformObject implements IVariable  {
-	
-	// the starting offset of this partition, into the associated collection
-	private int fOffset;
-	
-	// the length of this partition
-	private int fLength;
-	
-	// the root variable or expression containing the indexed value
-	private IDebugElement fOriginalVariable;
-
-	// the indexed value
-	private IIndexedValue fOriginalValue;
-	
-	// sub-range of values
-	private IIndexedValue fValuePartition;
-	
-	private String fName = null;
-	
-	/**
-	 * Creates a partition for an indexed value.
-	 * 
-	 * @param variable variable or expression containing the indexed value
-	 * @param value indexed value
-	 * @param offset beginning offset of this partition (into the value)
-	 * @param length the length of this partition
-	 */
-	public IndexedVariablePartition(IDebugElement variable, IIndexedValue value, int offset, int length) {
-		fOriginalVariable = variable;
-		fOriginalValue = value;
-		fOffset = offset;
-		fLength = length;
-		fValuePartition = new IndexedValuePartition(value, offset, length);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IVariable#getValue()
-	 */
-	public IValue getValue() {
-		return fValuePartition;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IVariable#getName()
-	 */
-	public String getName() {
-		if (fName == null) {
-			StringBuffer buf = new StringBuffer();
-			buf.append("["); //$NON-NLS-1$
-			buf.append(fOffset);
-			buf.append("..."); //$NON-NLS-1$
-			buf.append(fOffset + fLength - 1);
-			buf.append("]"); //$NON-NLS-1$
-			fName = buf.toString();
-		}
-		return fName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		if (fOriginalVariable instanceof IVariable) {
-			IVariable variable = (IVariable) fOriginalVariable;
-			return variable.getReferenceTypeName();
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
-	 */
-	public boolean hasValueChanged() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return fOriginalValue.getModelIdentifier();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		return fOriginalValue.getDebugTarget();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return fOriginalValue.getLaunch();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String)
-	 */
-	public void setValue(String expression) throws DebugException {
-		throw new DebugException(new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, "Value modification not supported for indexed partitions.", null));  //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue)
-	 */
-	public void setValue(IValue value) throws DebugException {
-		throw new DebugException(new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, "Value modification not supported for indexed partitions.", null));  //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification()
-	 */
-	public boolean supportsValueModification() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String)
-	 */
-	public boolean verifyValue(String expression) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse.debug.core.model.IValue)
-	 */
-	public boolean verifyValue(IValue value) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof IndexedVariablePartition) {
-			IndexedVariablePartition partition = (IndexedVariablePartition)obj;
-			return fOriginalVariable.equals(partition.fOriginalVariable) &&
-				fOffset == partition.fOffset && fLength == partition.fLength;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return fOriginalVariable.hashCode() + fOffset;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/LogicalStructureCache.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/LogicalStructureCache.java
deleted file mode 100644
index dd72ccc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/LogicalStructureCache.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILogicalStructureType;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * Cache that stores evaluated logical structure values to replace raw values.  Cache
- * should be cleared when a RESUME or TERMINATE event is fired so the structure can be
- * reevaluated for new values.
- * 
- * @since 3.3
- *
- */
-public class LogicalStructureCache {
-
-	/**
-	 * Maps a ILogicalStructureType to the cache for that type
-	 */
-	private Map fCacheForType = new HashMap();
-	
-	/**
-	 * Returns the logical value to replace the given value using the specified logical structure.
-	 * The value will be retrieved from the cache if possible, or evaluated if not.
-	 * 
-	 * @param type the logical structure type used to evaluate the logical value
-	 * @param value the raw value to replace with a logical structure
-	 * @return the logical value replacing the raw value or <code>null</code> if there is a problem
-	 */
-	public IValue getLogicalStructure(ILogicalStructureType type, IValue value) throws CoreException {
-		synchronized (fCacheForType) {
-			LogicalStructureTypeCache cache = getCacheForType(type);
-			return cache.getLogicalStructure(value);			
-		}
-	}
-	
-	/**
-	 * Clears the cache of all evaluated values.
-	 */
-	public void clear(){
-		synchronized (fCacheForType) {
-			fCacheForType.clear();	
-		}
-	}
-	
-	/**
-	 * Helper method that returns the cache associated with the given logical structure type.
-	 * If there is not cache associated, one is created.
-	 * 
-	 * @param type the logical structure type to get the cache for
-	 * @return the cache associated with the logical structure type
-	 */
-	protected LogicalStructureTypeCache getCacheForType(ILogicalStructureType type){
-		LogicalStructureTypeCache cache = (LogicalStructureTypeCache)fCacheForType.get(type);
-		if (cache == null){
-			cache = new LogicalStructureTypeCache(type);
-			fCacheForType.put(type, cache);
-		}
-		return cache;			
-	}
-	
-	/**
-	 * Inner class that caches the known and pending values for a given logical
-	 * structure type.
-	 */
-	class LogicalStructureTypeCache{
-		
-		private ILogicalStructureType fType;
-		
-		/**
-		 * Maps a raw IValue to its calculated logical IValue  
-		 */
-		private Map fKnownValues = new HashMap();
-		
-		/**
-		 * Set of raw IValues that logical values are currently being evaluated for.
-		 */
-		private Set fPendingValues = new HashSet();
-		
-		public LogicalStructureTypeCache(ILogicalStructureType type){
-			fType = type;
-		}
-		
-		/**
-		 * Returns the logical structure value for the given raw value.  If the value has been evaluated
-		 * the cached value is returned, otherwise the thread waits until the value is evaluated.
-		 * 
-		 * @param value the raw value
-		 * @return the logical value
-		 * @exception CoreException if an error occurs computing the value
-		 */
-		public IValue getLogicalStructure(IValue value) throws CoreException {
-			// Check if the value has already been evaluated
-			synchronized (fKnownValues) {
-				IValue logical = (IValue)fKnownValues.get(value);
-				if (logical != null){
-					return logical;
-				}
-			}
-			// Check if the logical structure is currently being evaluated
-			synchronized (fPendingValues) {
-				if (fPendingValues.contains(value)){
-					try {
-						fPendingValues.wait();
-						return getLogicalStructure(value);
-					} catch (InterruptedException e) {
-						throw new CoreException(new Status(IStatus.CANCEL, DebugUIPlugin.getUniqueIdentifier(),
-								VariablesViewMessages.LogicalStructureCache_0, e));
-					}
-				} else {
-					fPendingValues.add(value);
-				}
-			}
-			// Start the evaluation to get the logical structure
-			try {
-				IValue result = fType.getLogicalStructure(value);
-				synchronized (fKnownValues) {
-					fKnownValues.put(value, result);
-				}
-				synchronized (fPendingValues) {
-					fPendingValues.remove(value);
-					fPendingValues.notifyAll();
-				}
-				return result;
-			} catch (CoreException e) {
-				synchronized (fPendingValues) {
-					fPendingValues.remove(value);
-					fPendingValues.notifyAll();
-				}
-				throw e;
-			} 
-		}
-		
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/SelectLogicalStructureAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/SelectLogicalStructureAction.java
deleted file mode 100644
index 80bc7b2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/SelectLogicalStructureAction.java
+++ /dev/null
@@ -1,77 +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.debug.internal.ui.views.variables;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILogicalStructureType;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.BusyIndicator;
-
-/**
- * Action to set the logical structure to display for a variable (enables/disables
- * logical structure types for the same variable).
- */
-public class SelectLogicalStructureAction extends Action {
-	
-	private VariablesView fView;
-    private ILogicalStructureType fType;
-    private ILogicalStructureType[] fAvailableTypes;
-
-	/**
-	 * 
-	 * @param view Variables view
-	 * @param type the type that this action will turn on/off
-	 * @param value the value for which logical structures are to be chosen
-	 * @param availableTypes the set of logical structure types that are being offered
-     *  to the user in addition to the type controlled by this action
-	 */
-	public SelectLogicalStructureAction(VariablesView view, ILogicalStructureType type, IValue value, ILogicalStructureType[] availableTypes) {
-		super(type.getDescription(value), IAction.AS_CHECK_BOX);
-		setView(view);
-        fAvailableTypes= availableTypes;
-		fType= type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		valueChanged();
-	}
-
-	private void valueChanged() {
-		if (!getView().isAvailable()) {
-			return;
-		}
-		BusyIndicator.showWhile(getView().getViewer().getControl().getDisplay(), new Runnable() {
-			public void run() {
-                // Checking this action sets the type to fType, unchecking it sets the type
-                // to null ("none selected")
-                ILogicalStructureType type= null;
-                if (isChecked()) {
-                    type= fType;
-                }
-                DebugPlugin.setDefaultStructureType(fAvailableTypes, type);
-				getView().getViewer().refresh();					
-			}
-		});			
-	}
-	
-	protected VariablesView getView() {
-		return fView;
-	}
-
-	protected void setView(VariablesView view) {
-		fView = view;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/SelectionDragAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/SelectionDragAdapter.java
deleted file mode 100644
index f565712..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/SelectionDragAdapter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 	   Wind River - Pawel Piech - Initial Implementation - Drag/Drop to Expressions View (Bug 184057)
- *     IBM Corporation - further implementation and documentation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.util.TransferDragSourceListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.Transfer;
-
-/**
- * Drag adapter for the variables view and expressions view.  Allows selected variables and
- * expressions to be dragged.
- * 
- * @see org.eclipse.debug.internal.ui.views.expression.ExpressionDropAdapter
- * @since 3.4
- */
-public class SelectionDragAdapter extends DragSourceAdapter implements TransferDragSourceListener {
-    
-    /**
-     * The associated viewer for the adapter
-     */
-    private TreeModelViewer fViewer;
-    
-    /**
-     * Constructor, takes the viewer that contains the selection provider 
-     * @param view the associated view, <b>must</b> implement <code>ISelectionProvider</code>
-     */
-    public SelectionDragAdapter(TreeModelViewer viewer) {
-        Assert.isNotNull(viewer);
-        fViewer = viewer;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.util.TransferDragSourceListener#getTransfer()
-     */
-    public Transfer getTransfer() {
-        return LocalSelectionTransfer.getTransfer();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.DragSourceAdapter#dragStart(org.eclipse.swt.dnd.DragSourceEvent)
-     */
-    public void dragStart(DragSourceEvent event) {
-        ISelection selection = fViewer.getSelection();
-        LocalSelectionTransfer.getTransfer().setSelection(selection);
-        LocalSelectionTransfer.getTransfer().setSelectionSetTime(event.time & 0xFFFFFFFFL);
-        event.doit = !selection.isEmpty();
-    }
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
-     */
-    public void dragSetData(DragSourceEvent event) {
-        // For consistency set the data to the selection even though
-        // the selection is provided by the LocalSelectionTransfer
-        // to the drop target adapter.
-        event.data = LocalSelectionTransfer.getTransfer().getSelection();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.DragSourceAdapter#dragFinished(org.eclipse.swt.dnd.DragSourceEvent)
-     */
-    public void dragFinished(DragSourceEvent event) {
-        LocalSelectionTransfer.getTransfer().setSelection(null);
-        LocalSelectionTransfer.getTransfer().setSelectionSetTime(0);
-    }   
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/StatusLineContributionItem.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/StatusLineContributionItem.java
deleted file mode 100644
index 224fcaa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/StatusLineContributionItem.java
+++ /dev/null
@@ -1,112 +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.debug.internal.ui.views.variables;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.StatusLineLayoutData;
-
-public class StatusLineContributionItem extends ContributionItem {
-
-	public final static int DEFAULT_CHAR_WIDTH = 40;
-
-	private int charWidth;
-	private CLabel label;
-	/**
-	 * The composite into which this contribution item has been placed. This
-	 * will be <code>null</code> if this instance has not yet been
-	 * initialized.
-	 */
-	private Composite statusLine = null;
-	private String text= ""; //$NON-NLS-1$
-	private int widthHint = -1;
-
-	public StatusLineContributionItem(String id) {
-		this(id, DEFAULT_CHAR_WIDTH);
-	}
-
-	public StatusLineContributionItem(String id, int charWidth) {
-		super(id);
-		this.charWidth = charWidth;
-		setVisible(false); // no text to start with
-	}
-
-	public void fill(Composite parent) {
-		statusLine = parent;
-		label = new CLabel(statusLine, SWT.NONE);
-		StatusLineLayoutData statusLineLayoutData = new StatusLineLayoutData();
-
-		if (widthHint < 0) {
-			GC gc = new GC(statusLine);
-			gc.setFont(statusLine.getFont());
-			widthHint = gc.getFontMetrics().getAverageCharWidth() * charWidth;
-			gc.dispose();
-		}
-
-		statusLineLayoutData.widthHint = widthHint;
-		label.setLayoutData(statusLineLayoutData);
-		label.setText(text);
-	}
-
-	/**
-	 * An accessor for the current location of this status line contribution
-	 * item -- relative to the display.
-	 * 
-	 * @return The current location of this status line; <code>null</code> if
-	 *         not yet initialized.
-	 */
-	public Point getDisplayLocation() {
-		if ((label != null) && (statusLine != null)) {
-			return statusLine.toDisplay(label.getLocation());
-		}
-
-		return null;
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	public void setText(String text) {
-		if (text == null)
-			throw new NullPointerException();
-
-		this.text = text;
-
-		if (label != null && !label.isDisposed())
-			label.setText(this.text);
-
-		if (this.text.length() == 0) {
-			if (isVisible()) {
-				setVisible(false);
-				IContributionManager contributionManager = getParent();
-
-				if (contributionManager != null)
-					contributionManager.update(true);
-			}
-		} else {
-			if (!isVisible()) {
-				setVisible(true);
-				IContributionManager contributionManager = getParent();
-
-				if (contributionManager != null)
-					contributionManager.update(true);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/ToggleLogicalStructureAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/ToggleLogicalStructureAction.java
deleted file mode 100644
index dca133d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/ToggleLogicalStructureAction.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.debug.internal.ui.views.variables;
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Action to toggle the use of contributed variables content providers on and off.
- * When on, all registered variables content providers for the current debug model
- * are used.  When off, the default content provider (that shows all children)
- * is used for all debug models.
- */
-public class ToggleLogicalStructureAction extends Action {
-	
-	private VariablesView fView;
-
-	public ToggleLogicalStructureAction(VariablesView view) {
-		super(null, IAction.AS_CHECK_BOX);
-		setView(view);
-		setToolTipText(VariablesViewMessages.ToggleObjectBrowsersAction_1);  
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_SHOW_LOGICAL_STRUCTURE));
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_SHOW_LOGICAL_STRUCTURE));
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_SHOW_LOGICAL_STRUCTURE));
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ToggleObjectBrowsersAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.VARIABLES_CONTENT_PROVIDERS_ACTION);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (!getView().isAvailable()) {
-			return;
-		}
-		getView().setShowLogicalStructure(isChecked());	
-		BusyIndicator.showWhile(getView().getViewer().getControl().getDisplay(), new Runnable() {
-			public void run() {
-				getView().getViewer().refresh();					
-			}
-		});		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#setChecked(boolean)
-	 */
-	public void setChecked(boolean value) {
-		super.setChecked(value);
-	}
-	
-	protected VariablesView getView() {
-		return fView;
-	}
-
-	protected void setView(VariablesView view) {
-		fView = view;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/ToggleShowColumnsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/ToggleShowColumnsAction.java
deleted file mode 100644
index 7dee940..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/ToggleShowColumnsAction.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.debug.internal.ui.views.variables;
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Action to toggle the use of contributed variables content providers on and off.
- * When on, all registered variables content providers for the current debug model
- * are used.  When off, the default content provider (that shows all children)
- * is used for all debug models.
- */
-public class ToggleShowColumnsAction extends Action implements IUpdate {
-	
-	private TreeModelViewer fViewer;
-
-	public ToggleShowColumnsAction(TreeModelViewer viewew) {
-		super(VariablesViewMessages.ToggleShowColumnsAction_0, IAction.AS_CHECK_BOX);
-		fViewer = viewew;
-		setToolTipText(VariablesViewMessages.ToggleShowColumnsAction_1);  
-		setImageDescriptor(DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_OBJS_COMMON_TAB));
-		setId(DebugUIPlugin.getUniqueIdentifier() + ".ToggleShowColumsAction"); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.SHOW_COLUMNS_ACTION);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (fViewer.getControl().isDisposed()) {
-			return;
-		}
-		BusyIndicator.showWhile(fViewer.getControl().getDisplay(), new Runnable() {
-			public void run() {
-				fViewer.setShowColumns(isChecked());				
-			}
-		});		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		setEnabled(fViewer.canToggleColumns());
-		setChecked(fViewer.isShowColumns());
-	}	
-	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariableViewToggleAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariableViewToggleAction.java
deleted file mode 100644
index fee97c1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariableViewToggleAction.java
+++ /dev/null
@@ -1,129 +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.debug.internal.ui.views.variables;
-
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * 
- */
-public abstract class VariableViewToggleAction implements IViewActionDelegate, IActionDelegate2 {
-	
-	private IViewPart fView;
-	private IAction fAction;
-
-	public VariableViewToggleAction() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView = view;
-		boolean checked = getPreferenceValue(view);
-		fAction.setChecked(checked);
-		run(fAction);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		fAction = action;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IPreferenceStore store = getPreferenceStore();
-		String key = getView().getSite().getId() + "." + getPreferenceKey(); //$NON-NLS-1$
-		store.setValue(key, action.isChecked());
-	}
-
-	/* (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) {
-	}
-
-	protected IPreferenceStore getPreferenceStore() {
-		return DebugUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Returns the value of this filters preference (on/off) for the given
-	 * view.
-	 * 
-	 * @param part
-	 * @return boolean
-	 */
-	protected boolean getPreferenceValue(IViewPart part) {
-		String baseKey = getPreferenceKey();
-		String viewKey = part.getSite().getId();
-		String compositeKey = viewKey + "." + baseKey; //$NON-NLS-1$
-		IPreferenceStore store = getPreferenceStore();
-		boolean value = false;
-		if (store.contains(compositeKey)) {
-			value = store.getBoolean(compositeKey);
-		} else {
-			value = store.getBoolean(baseKey);
-		}
-		return value;		
-	}
-	
-	/**
-	 * Returns the key for this action's preference
-	 * 
-	 * @return String
-	 */
-	protected abstract String getPreferenceKey(); 
-		
-	protected IViewPart getView() {
-		return fView;
-	}
-	
-	protected StructuredViewer getStructuredViewer() {
-		IDebugView view = (IDebugView)getView().getAdapter(IDebugView.class);
-		if (view != null) {
-			Viewer viewer = view.getViewer();
-			if (viewer instanceof StructuredViewer) {
-				return (StructuredViewer)viewer;
-			}
-		}		
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
deleted file mode 100644
index e8c48e6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
+++ /dev/null
@@ -1,1057 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *     Wind River - Pawel Piech - Drag/Drop to Expressions View (Bug 184057)
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-
-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.debug.core.DebugException;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.LazyModelPresentation;
-import org.eclipse.debug.internal.ui.VariablesViewModelPresentation;
-import org.eclipse.debug.internal.ui.actions.CollapseAllAction;
-import org.eclipse.debug.internal.ui.actions.ConfigureColumnsAction;
-import org.eclipse.debug.internal.ui.actions.variables.ChangeVariableValueAction;
-import org.eclipse.debug.internal.ui.actions.variables.ShowTypesAction;
-import org.eclipse.debug.internal.ui.actions.variables.ToggleDetailPaneAction;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.viewers.model.VirtualFindAction;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.internal.ui.views.DebugModelPresentationContext;
-import org.eclipse.debug.internal.ui.views.IDebugExceptionHandler;
-import org.eclipse.debug.internal.ui.views.variables.details.AvailableDetailPanesAction;
-import org.eclipse.debug.internal.ui.views.variables.details.DetailPaneProxy;
-import org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer;
-import org.eclipse.debug.ui.AbstractDebugView;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.jface.action.IAction;
-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.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-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.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.texteditor.IUpdate;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * This view shows variables and their values for a particular stack frame
- */
-public class VariablesView extends AbstractDebugView implements IDebugContextListener,
-	IPropertyChangeListener, IDebugExceptionHandler,
-	IPerspectiveListener, IModelChangedListener,
-	IViewerUpdateListener, IDetailPaneContainer {
-	
-	/**
-	 * The model presentation used as the label provider for the tree viewer,
-	 * and also as the detail information provider for the detail pane.
-	 */
-	private VariablesViewModelPresentation fModelPresentation;
-	
-	/**
-	 * The UI construct that provides a sliding sash between the variables tree
-	 * and the detail pane.
-	 */
-	private SashForm fSashForm;
-	
-	/**
-	 * The detail pane that displays detailed information about the current selection
-	 * @since 3.3
-	 */
-	private DetailPaneProxy fDetailPane;
-	
-	/**
-	 * Stores whether the tree viewer was the last control to have focus in the
-	 * view. Used to give focus to the correct component if the user leaves the view.    
-	 * @since 3.3
-	 */
-	private boolean fTreeHasFocus = true;
-	
-	/**
-	 * Various listeners used to update the enabled state of actions and also to
-	 * populate the detail pane.
-	 */
-	private ISelectionChangedListener fTreeSelectionChangedListener;
-	
-	/**
-	 * Listener added to the control of the detail pane, allows view to keep track of which
-	 * part last had focus, the tree or the detail pane.
-	 */
-	private Listener fDetailPaneActivatedListener;	
-	
-	/**
-	 * These are used to initialize and persist the position of the sash that
-	 * separates the tree viewer from the detail pane.
-	 */
-	private static final int[] DEFAULT_SASH_WEIGHTS = {13, 6};
-	private int[] fLastSashWeights;
-	private boolean fToggledDetailOnce;
-	private String fCurrentDetailPaneOrientation = IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_HIDDEN;
-	private ToggleDetailPaneAction[] fToggleDetailPaneActions;
-	private ConfigureColumnsAction fConfigureColumnsAction;
-    
-    protected String PREF_STATE_MEMENTO = "pref_state_memento."; //$NON-NLS-1$
-
-	public static final String LOGICAL_STRUCTURE_TYPE_PREFIX = "VAR_LS_"; //$NON-NLS-1$
-	
-	/**
-	 * Presentation context property.
-	 * TODO: make API
-	 * @since 3.3
-	 */
-	public static final String PRESENTATION_SHOW_LOGICAL_STRUCTURES = "PRESENTATION_SHOW_LOGICAL_STRUCTURES"; //$NON-NLS-1$
-	
-	/**
-	 * the preference name for the view part of the sash form
-	 * @since 3.2 
-	 */
-	protected static final String SASH_VIEW_PART = DebugUIPlugin.getUniqueIdentifier() + ".SASH_VIEW_PART"; //$NON-NLS-1$
-	/**
-	 * the preference name for the details part of the sash form
-	 * @since 3.2
-	 */
-	protected static final String SASH_DETAILS_PART = DebugUIPlugin.getUniqueIdentifier() + ".SASH_DETAILS_PART"; //$NON-NLS-1$
-	
-	/**
-	 * Key for "Find..." action.
-	 */
-	protected static final String VARIABLES_FIND_ELEMENT_ACTION = FIND_ACTION + ".Variables"; //$NON-NLS-1$
-
-	/**
-	 * Key for "Select All" action.
-	 */
-	protected static final String VARIABLES_SELECT_ALL_ACTION = SELECT_ALL_ACTION + ".Variables"; //$NON-NLS-1$
-	
-	/**
-	 * Key for "Select All" action.
-	 */
-	protected static final String VARIABLES_COPY_ACTION = COPY_ACTION + ".Variables"; //$NON-NLS-1$	
-	
-    /**
-     * Visits deltas to determine if details should be displayed
-     */
-    class Visitor implements IModelDeltaVisitor {
-        /**
-         * Whether to trigger details display.
-         * 
-         * @since 3.3
-         */
-        private boolean fTriggerDetails = false;
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelDeltaVisitor#visit(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta, int)
-		 */
-		public boolean visit(IModelDelta delta, int depth) {
-			if ((delta.getFlags() & IModelDelta.CONTENT) > 0) {
-				fTriggerDetails = true;
-				return false;
-			}
-			return true;
-		}
-		
-		public void reset() {
-			fTriggerDetails = false;
-		}
-		
-		public boolean isTriggerDetails() {
-			return fTriggerDetails;
-		}
-    	
-    }
-    /**
-     * Delta visitor
-     */
-    private Visitor fVisitor = new Visitor();
-    
-    /**
-     * Job to update details in the UI thread.
-     */
-    private Job fTriggerDetailsJob = new UIJob("trigger details") { //$NON-NLS-1$
-    	
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			if (monitor.isCanceled()) {
-				return Status.CANCEL_STATUS;
-			} 
-			refreshDetailPaneContents();
-			return Status.OK_STATUS;
-		}
-	};
-    
-	/**
-	 * Remove myself as a selection listener
-	 * and preference change listener.
-	 *
-	 * @see IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		
-		DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).removeDebugContextListener(this);
-		getSite().getWorkbenchWindow().removePerspectiveListener(this);
-		DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		JFaceResources.getFontRegistry().removeListener(this);
-		TreeModelViewer viewer = getVariablesViewer();
-		if (viewer != null) {
-			viewer.removeModelChangedListener(this);
-			viewer.removeViewerUpdateListener(this);
-		}
-		if (fDetailPane != null) fDetailPane.dispose();
-		super.dispose();
-	}
-
-	/**
-	 * Sets the input to the viewer
-	 * @param context the object context
-	 */
-	protected void setViewerInput(Object context) {
-		
-		if (context == null) {
-			// Clear the detail pane
-			fDetailPane.display(null);
-		}
-		
-		Object current = getViewer().getInput();
-		
-		if (current == null && context == null) {
-			return;
-		}
-
-		if (current != null && current.equals(context)) {
-			return;
-		}
-		
-		showViewer();
-		getViewer().setInput(context);
-	}
-	
-	/**
-	 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		String propertyName= event.getProperty();
-		if (propertyName.equals(IDebugUIConstants.PREF_CHANGED_DEBUG_ELEMENT_COLOR) || 
-				propertyName.equals(IInternalDebugUIConstants.PREF_CHANGED_VALUE_BACKGROUND) ||
-				propertyName.equals(IInternalDebugUIConstants.VARIABLE_TEXT_FONT)) {
-			getViewer().refresh();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createViewer(Composite)
-	 */
-	public Viewer createViewer(Composite parent) {
-		
-		fTriggerDetailsJob.setSystem(true);
-		
-		// create the sash form that will contain the tree viewer & text viewer
-		fSashForm = new SashForm(parent, SWT.NONE);
-		
-		fModelPresentation = new VariablesViewModelPresentation();
-		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-		JFaceResources.getFontRegistry().addListener(this);
-
-		TreeModelViewer variablesViewer = createTreeViewer(fSashForm);
-			
-		fSashForm.setMaximizedControl(variablesViewer.getControl());
-			
-		fDetailPane = new DetailPaneProxy(this);	
-		fDetailPane.display(null); // Bring up the default pane so the user doesn't see an empty composite
-		
-		createOrientationActions(variablesViewer);
-		IPreferenceStore prefStore = DebugUIPlugin.getDefault().getPreferenceStore();
-		String orientation = prefStore.getString(getDetailPanePreferenceKey());
-		for (int i = 0; i < fToggleDetailPaneActions.length; i++) {
-			fToggleDetailPaneActions[i].setChecked(fToggleDetailPaneActions[i].getOrientation().equals(orientation));
-		}
-		setDetailPaneOrientation(orientation);
-		IMemento memento = getMemento();
-		if (memento != null) {
-			variablesViewer.initState(memento);
-		}
-		
-		variablesViewer.addModelChangedListener(this);
-		variablesViewer.addViewerUpdateListener(this);
-		
-        initDragAndDrop(variablesViewer);
-
-		return variablesViewer;
-	}
-
-    /**
-     * Initializes the drag and/or drop adapters for this view.  Called from createViewer().
-     * 
-     * @param viewer the viewer to add drag/drop support to.
-     * @since 3.4
-     */
-    protected void initDragAndDrop(TreeModelViewer viewer) {
-        // Drag only
-        viewer.addDragSupport(DND.DROP_COPY, new Transfer[] {LocalSelectionTransfer.getInstance()}, new SelectionDragAdapter(viewer));
-    }    
-
-	/* (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);
-		PREF_STATE_MEMENTO = PREF_STATE_MEMENTO + site.getId();
-        IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-        String string = store.getString(PREF_STATE_MEMENTO);
-        if(string.length() > 0) {
-        	ByteArrayInputStream bin = new ByteArrayInputStream(string.getBytes());
-        	InputStreamReader reader = new InputStreamReader(bin);
-        	try {
-        		XMLMemento stateMemento = XMLMemento.createReadRoot(reader);
-        		setMemento(stateMemento);
-        	} catch (WorkbenchException e) {
-        	} finally {
-        		try {
-        			reader.close();
-        			bin.close();
-        		} catch (IOException e){}
-        	}
-        }
-        IMemento mem = getMemento();
-        // check the weights to makes sure they are valid -- bug 154025
-        setLastSashWeights(DEFAULT_SASH_WEIGHTS);
-		if (mem != null) {
-			Integer sw = mem.getInteger(SASH_VIEW_PART);
-			if(sw != null) {
-				int view = sw.intValue();
-				sw = mem.getInteger(SASH_DETAILS_PART);
-				if(sw != null) {
-					int details = sw.intValue();
-					if(view > -1 & details > -1) {
-						setLastSashWeights(new int[] {view, details});
-					}
-				}
-			}
-		}
-		site.getWorkbenchWindow().addPerspectiveListener(this);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.PageBookView#partDeactivated(org.eclipse.ui.IWorkbenchPart)
-     */
-    public void partDeactivated(IWorkbenchPart part) {
-		String id = part.getSite().getId();
-		if (id.equals(getSite().getId())) {
-			ByteArrayOutputStream bout = new ByteArrayOutputStream();
-			OutputStreamWriter writer = new OutputStreamWriter(bout);
-
-			try {
-				XMLMemento memento = XMLMemento.createWriteRoot("VariablesViewMemento"); //$NON-NLS-1$
-				saveViewerState(memento);
-				memento.save(writer);
-
-				IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-				String xmlString = bout.toString();
-				store.putValue(PREF_STATE_MEMENTO, xmlString);
-			} catch (IOException e) {
-			} finally {
-				try {
-					writer.close();
-					bout.close();
-				} catch (IOException e) {
-				}
-			}
-		}
-		super.partDeactivated(part);
-	}
-
-	/**
-	 * Saves the current state of the viewer
-	 * @param memento the memento to write the viewer state into
-	 */
-	public void saveViewerState(IMemento memento) {
-		if (fSashForm != null && !fSashForm.isDisposed()) {
-	        int[] weights = fSashForm.getWeights();
-			memento.putInteger(SASH_VIEW_PART, weights[0]);
-			memento.putInteger(SASH_DETAILS_PART, weights[1]);
-		}
-		getVariablesViewer().saveState(memento);
-	}
-
-	/**
-	 * @return the pref key for the variables view details pane
-	 */
-	protected String getDetailPanePreferenceKey() {
-		return IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_ORIENTATION;
-	}
-		
-	/**
-	 * Create and return the main tree viewer that displays variable.
-	 */
-	protected TreeModelViewer createTreeViewer(Composite parent) {
-		
-		int style = getViewerStyle();
-		final TreeModelViewer variablesViewer = new TreeModelViewer(parent, style,
-				new DebugModelPresentationContext(getPresentationContextId(), fModelPresentation));
-		
-		variablesViewer.getControl().addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				fTreeHasFocus = true;
-				getSite().setSelectionProvider(variablesViewer);
-				setAction(SELECT_ALL_ACTION, getAction(VARIABLES_SELECT_ALL_ACTION));
-				setAction(COPY_ACTION, getAction(VARIABLES_COPY_ACTION));
-				setAction(FIND_ACTION, getAction(VARIABLES_FIND_ELEMENT_ACTION));
-				getViewSite().getActionBars().updateActionBars();
-			}
-			
-			public void focusLost(FocusEvent e){
-				getSite().setSelectionProvider(null);
-				setAction(SELECT_ALL_ACTION, null);
-				setAction(COPY_ACTION,null);
-				setAction(FIND_ACTION, null);
-				getViewSite().getActionBars().updateActionBars();
-			}
-		});
-		variablesViewer.getPresentationContext().addPropertyChangeListener(
-				new IPropertyChangeListener() {
-					public void propertyChange(PropertyChangeEvent event) {
-						if (IPresentationContext.PROPERTY_COLUMNS.equals(event.getProperty())) {
-							IAction action = getAction("ShowTypeNames"); //$NON-NLS-1$
-							if (action != null) {
-								action.setEnabled(event.getNewValue() == null);
-							}
-						}
-					}
-				});
-		
-		getSite().setSelectionProvider(variablesViewer);
-		variablesViewer.addPostSelectionChangedListener(getTreeSelectionChangedListener());
-		DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).addDebugContextListener(this);
-		return variablesViewer;
-	}
-
-	/**
-	 * Returns the presentation context id for this view.
-	 * 
-	 * @return context id
-	 */
-	protected String getPresentationContextId() {
-		return IDebugUIConstants.ID_VARIABLE_VIEW;
-	}
-	
-	/**
-	 * Returns the style bits for the viewer.
-	 * 
-	 * @return SWT style
-	 */
-	protected int getViewerStyle() {
-		return SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL | SWT.FULL_SELECTION;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return IDebugHelpContextIds.VARIABLE_VIEW;		
-	}
-	
-	/**
-	 * Set the orientation of the details pane so that is one of:
-	 * - underneath the main tree view
-	 * - to the right of the main tree view
-	 * - not visible
-	 */
-	public void setDetailPaneOrientation(String orientation) {
-		if (orientation.equals(fCurrentDetailPaneOrientation)) {
-			return;
-		}
-		if (orientation.equals(IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_HIDDEN)) {
-			hideDetailPane();
-		} else {
-			int vertOrHoriz = orientation.equals(IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_UNDERNEATH) ? SWT.VERTICAL : SWT.HORIZONTAL;
-			fSashForm.setOrientation(vertOrHoriz);	
-			if (IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_HIDDEN.equals(fCurrentDetailPaneOrientation)) {
-				showDetailPane();	
-			}
-		}
-		fCurrentDetailPaneOrientation  = orientation;
-		DebugUIPlugin.getDefault().getPreferenceStore().setValue(getDetailPanePreferenceKey(), orientation);
-	}
-	
-	/**
-	 * Hides the details pane
-	 */
-	private void hideDetailPane() {
-		if (fToggledDetailOnce) {
-			setLastSashWeights(fSashForm.getWeights());
-		}
-		fSashForm.setMaximizedControl(getViewer().getControl());		
-	}
-	
-	/**
-	 * Shows the details pane 
-	 */
-	private void showDetailPane() {
-		fSashForm.setMaximizedControl(null);
-		fSashForm.setWeights(getLastSashWeights());
-		refreshDetailPaneContents();
-		revealTreeSelection();
-		fToggledDetailOnce = true;
-	}
-
-	/**
-	 * Make sure the currently selected item in the tree is visible.
-	 */
-	protected void revealTreeSelection() {
-		StructuredViewer viewer = (StructuredViewer) getViewer();
-		if (viewer != null) {
-			ISelection selection = viewer.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				Object selected = ((IStructuredSelection)selection).getFirstElement();
-				if (selected != null) {
-					viewer.reveal(selected);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Return the relative weights that were in effect the last time both panes were
-	 * visible in the sash form, or the default weights if:
-	 * <ul>
-	 * <li> both panes have not yet been made visible</li>
-	 * <li> one of the values persisted before is an invalid value</li>
-	 * </ul>
-	 */
-	protected int[] getLastSashWeights() {
-		if (fLastSashWeights == null) {
-			fLastSashWeights = DEFAULT_SASH_WEIGHTS;
-		}
-		//check the weights to makes sure they are valid -- bug 154025
-		else if(fLastSashWeights[0] < 0 || fLastSashWeights[1] < 0) {
-			fLastSashWeights = DEFAULT_SASH_WEIGHTS;
-		}
-		return fLastSashWeights;
-	}
-	
-	/**
-	 * Set the current relative weights of the controls in the sash form, so that
-	 * the sash form can be reset to this layout at a later time.
-	 */
-	protected void setLastSashWeights(int[] weights) {
-		fLastSashWeights = weights;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createActions()
-	 */
-	protected void createActions() {
-		IAction action = new ShowTypesAction(this);
-		setAction("ShowTypeNames",action); //$NON-NLS-1$
-				
-		action = new ToggleLogicalStructureAction(this);
-		setAction("ToggleContentProviders", action); //$NON-NLS-1$
-		
-		action = new CollapseAllAction((TreeViewer)getViewer());
-		setAction("CollapseAll", action); //$NON-NLS-1$
-
-		action = new ChangeVariableValueAction(this);
-		action.setEnabled(false);
-		setAction("ChangeVariableValue", action); //$NON-NLS-1$
-		
-		action= new VirtualFindAction(getVariablesViewer());
-		setAction(VARIABLES_FIND_ELEMENT_ACTION, action);
-	} 	
-	
-	/* (non-Javadoc)
-	 * 
-	 * Save the copy action so we can restore it on focus lost/gain
-	 * 
-	 * @see org.eclipse.debug.ui.AbstractDebugView#createContextMenu(org.eclipse.swt.widgets.Control)
-	 */
-	protected void createContextMenu(Control menuControl) {
-		super.createContextMenu(menuControl);
-		setAction(VARIABLES_COPY_ACTION, getAction(COPY_ACTION));
-	}
-
-	/**
-	 * Creates the actions that allow the orientation of the detail pane to be changed.
-	 * 
-	 * @param viewer 
-	 */
-	private void createOrientationActions(TreeModelViewer viewer) {
-		IActionBars actionBars = getViewSite().getActionBars();
-		IMenuManager viewMenu = actionBars.getMenuManager();
-		
-		fToggleDetailPaneActions = new ToggleDetailPaneAction[3];
-		fToggleDetailPaneActions[0] = new ToggleDetailPaneAction(this, IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_UNDERNEATH, null);
-		fToggleDetailPaneActions[1] = new ToggleDetailPaneAction(this, IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_RIGHT, null);
-		fToggleDetailPaneActions[2] = new ToggleDetailPaneAction(this, IDebugPreferenceConstants.VARIABLES_DETAIL_PANE_HIDDEN, getToggleActionLabel());
-		viewMenu.add(new Separator());
-		final MenuManager layoutSubMenu = new MenuManager(VariablesViewMessages.VariablesView_40);
-		layoutSubMenu.setRemoveAllWhenShown(true);
-		layoutSubMenu.add(fToggleDetailPaneActions[0]);
-		layoutSubMenu.add(fToggleDetailPaneActions[1]);
-		layoutSubMenu.add(fToggleDetailPaneActions[2]);
-		viewMenu.add(layoutSubMenu);
-		viewMenu.add(new Separator());
-		
-		fConfigureColumnsAction = new ConfigureColumnsAction(viewer);
-		setAction("ToggleColmns", new ToggleShowColumnsAction(viewer)); //$NON-NLS-1$
-		
-		layoutSubMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				layoutSubMenu.add(fToggleDetailPaneActions[0]);
-				layoutSubMenu.add(fToggleDetailPaneActions[1]);
-				layoutSubMenu.add(fToggleDetailPaneActions[2]);
-				IAction action = getAction("ToggleColmns"); //$NON-NLS-1$
-				((IUpdate)action).update();
-				if (action.isEnabled()) {
-					layoutSubMenu.add(action);
-				}
-				fConfigureColumnsAction.update();
-				if (fConfigureColumnsAction.isEnabled()) {
-					layoutSubMenu.add(fConfigureColumnsAction);
-				}
-			}
-		});
-	}
-	
-	/**
-	 * Returns the label to use for the action that toggles the view layout to be the tree viewer only (detail pane is hidden).
-	 * Should be of the style '[view name] View Only'.
-	 * 
-	 * @return action label for toggling the view layout to tree viewer only
-	 */
-	protected String getToggleActionLabel(){
-		return VariablesViewMessages.VariablesView_41;
-	}
-	
-	/**
-	 * Configures the toolBar.
-	 * 
-	 * @param tbm The toolbar that will be configured
-	 */
-	protected void configureToolBar(IToolBarManager tbm) {
-		tbm.add(new Separator(this.getClass().getName()));
-		tbm.add(new Separator(IDebugUIConstants.RENDER_GROUP));
-		tbm.add(getAction("ShowTypeNames")); //$NON-NLS-1$
-		tbm.add(getAction("ToggleContentProviders")); //$NON-NLS-1$
-		tbm.add(getAction("CollapseAll")); //$NON-NLS-1$
-	}
-
-   /**
-	* Adds items to the tree viewer's context menu including any extension defined
-	* actions.
-	* 
-	* @param menu The menu to add the item to.
-	*/
-	protected void fillContextMenu(IMenuManager menu) {
-
-		menu.add(new Separator(IDebugUIConstants.EMPTY_VARIABLE_GROUP));
-		menu.add(new Separator(IDebugUIConstants.VARIABLE_GROUP));
-		menu.add(getAction(VARIABLES_FIND_ELEMENT_ACTION));
-		menu.add(getAction("ChangeVariableValue")); //$NON-NLS-1$
-		menu.add(new Separator());
-		IAction action = new AvailableLogicalStructuresAction(this);
-		if (action.isEnabled()) {
-			menu.add(action);
-		}
-		action = new AvailableDetailPanesAction(this);
-		if (isDetailPaneVisible() && action.isEnabled()) {
-			menu.add(action);
-		}
-		menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
-		menu.add(new Separator(IDebugUIConstants.EMPTY_NAVIGATION_GROUP));
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-	
-   /**
-	 * Lazily instantiate and return a selection listener that populates the detail pane,
-	 * but only if the detail is currently visible. 
-	 */
-    protected ISelectionChangedListener getTreeSelectionChangedListener() {
-        if (fTreeSelectionChangedListener == null) {
-            fTreeSelectionChangedListener = new ISelectionChangedListener() {
-                public void selectionChanged(final SelectionChangedEvent event) {
-                    if (event.getSelectionProvider().equals(getViewer())) {
-                        clearStatusLine();	
-                        // if the detail pane is not visible, don't waste time retrieving details
-                        if (fSashForm.getMaximizedControl() == getViewer().getControl()) {
-                            return;
-                        }	
-                        refreshDetailPaneContents();
-                        treeSelectionChanged(event);
-                    }
-                }					
-            };
-        }
-        return fTreeSelectionChangedListener;
-    }
-    
-	/**
-	 * Selection in the variable tree changed. Perform any updates.
-	 * 
-	 * @param event
-	 */
-	protected void treeSelectionChanged(SelectionChangedEvent event) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentPaneID()
-	 */
-	public String getCurrentPaneID() {
-		return fDetailPane.getCurrentPaneID();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentSelection()
-	 */
-	public IStructuredSelection getCurrentSelection() {
-		if (getViewer() != null){
-			return (IStructuredSelection)getViewer().getSelection();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getParentComposite()
-	 */
-	public Composite getParentComposite() {
-		return fSashForm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getWorkbenchPartSite()
-	 */
-	public IWorkbenchPartSite getWorkbenchPartSite() {
-		return getSite();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#refreshDetailPaneContents()
-	 */
-	public void refreshDetailPaneContents() {
-		fDetailPane.display(getCurrentSelection());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#paneChanged(java.lang.String)
-	 */
-	public void paneChanged(String newPaneID) {
-		if (fDetailPaneActivatedListener == null){
-			fDetailPaneActivatedListener = 	new Listener() {
-				public void handleEvent(Event event) {
-					fTreeHasFocus = false;
-				}
-			};
-		}
-		fDetailPane.getCurrentControl().addListener(SWT.Activate, fDetailPaneActivatedListener);
-	}
-	
-	/**
-	 * @return the model presentation to be used for this view
-	 */
-	protected IDebugModelPresentation getModelPresentation() {
-		if (fModelPresentation == null) {
-			fModelPresentation = new VariablesViewModelPresentation();
-		}
-		return fModelPresentation;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(Class)
-	 */
-	public Object getAdapter(Class required) {
-		if (IDebugModelPresentation.class.equals(required)) {
-			return getModelPresentation();
-		}
-		else if (fDetailPane != null){
-			Object adapter = fDetailPane.getAdapter(required);
-			if (adapter != null) return adapter;
-		}
-		return super.getAdapter(required);
-	}
-
-	/**
-	 * If possible, calls the update method of the action associated with the given ID.
-	 * 
-	 * @param actionId the ID of the action to update
-	 */
-	protected void updateAction(String actionId) {
-		IAction action= getAction(actionId);
-		if (action instanceof IUpdate) {
-			((IUpdate) action).update();
-		}
-	}
-	
-	/**
-	 * @return whether the detail pane is visible to the user
-	 */
-	protected boolean isDetailPaneVisible() {
-		return !fToggleDetailPaneActions[2].isChecked();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#getDefaultControl()
-	 */
-	protected Control getDefaultControl() {
-		return fSashForm;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.IDebugExceptionHandler#handleException(org.eclipse.debug.core.DebugException)
-	 */
-	public void handleException(DebugException e) {
-		showMessage(e.getMessage());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextListener#contextEvent(org.eclipse.debug.internal.ui.contexts.provisional.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			contextActivated(event.getContext());
-		}
-	}
-
-	/**
-	 * Updates actions and sets the viewer input when a context is activated.
-	 * @param selection
-	 */
-	protected void contextActivated(ISelection selection) {
-		if (!isAvailable() || !isVisible()) {
-			return;
-		}
-		
-		if (selection instanceof IStructuredSelection) {
-			setViewerInput(((IStructuredSelection)selection).getFirstElement());
-		}
-		showViewer();
-		
-		updateAction(VARIABLES_FIND_ELEMENT_ACTION);
-		updateAction(FIND_ACTION);
-	}
-		
-	/**
-	 * Delegate to the <code>DOUBLE_CLICK_ACTION</code>,
-	 * if any.
-	 *  
-	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		IAction action = getAction(DOUBLE_CLICK_ACTION);
-		if (action != null && action.isEnabled()) {
-			action.run();
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugView#getPresentation(String)
-	 */
-	public IDebugModelPresentation getPresentation(String id) {
-		if (getViewer() instanceof StructuredViewer) {
-			IDebugModelPresentation lp = getModelPresentation();
-			if (lp instanceof DelegatingModelPresentation) {
-				return ((DelegatingModelPresentation)lp).getPresentation(id);
-			}
-			if (lp instanceof LazyModelPresentation) {
-				if (((LazyModelPresentation)lp).getDebugModelIdentifier().equals(id)) {
-					return lp;
-				}
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailSite#isMainViewerAvailable()
-	 */
-	public boolean isMainViewerAvailable() {
-		return isAvailable();
-	}
-	
-	/**
-	 * @return the presentation context of the viewer
-	 */
-	protected IPresentationContext getPresentationContext() {
-		return getVariablesViewer().getPresentationContext();
-	}
-	
-	/** 
-	 * Sets whether logical structures are being displayed
-	 */
-	public void setShowLogicalStructure(boolean flag) {
-	    getPresentationContext().setProperty(PRESENTATION_SHOW_LOGICAL_STRUCTURES, Boolean.valueOf(flag));
-	}	
-	
-	/** 
-	 * Returns whether logical structures are being displayed 
-	 */
-	public boolean isShowLogicalStructure() {
-		Boolean show = (Boolean) getPresentationContext().getProperty(PRESENTATION_SHOW_LOGICAL_STRUCTURES);
-		return show != null && show.booleanValue();
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#becomesHidden()
-	 */
-	protected void becomesHidden() {
-		setViewerInput(null);
-		super.becomesHidden();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractDebugView#becomesVisible()
-	 */
-	protected void becomesVisible() {
-		super.becomesVisible();
-		ISelection selection = DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).getActiveContext();
-		contextActivated(selection);
-	}
-
-	/**
-	 * @return the tree model viewer displaying variables
-	 */
-	protected TreeModelViewer getVariablesViewer() {
-		return (TreeModelViewer) getViewer();
-	}
-	
-	/**
-	 * Clears the status line of all messages and errors
-	 */
-	protected void clearStatusLine() {
-		IStatusLineManager manager = getViewSite().getActionBars().getStatusLineManager(); 
-		manager.setErrorMessage(null);
-		manager.setMessage(null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
-	 */
-	public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
-	 */
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
-		if(changeId.equals(IWorkbenchPage.CHANGE_RESET)) {
-			setLastSashWeights(DEFAULT_SASH_WEIGHTS);
-			fSashForm.setWeights(DEFAULT_SASH_WEIGHTS);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelChangedListener#modelChanged(org.eclipse.debug.internal.ui.viewers.provisional.IModelDelta)
-	 */
-	public void modelChanged(IModelDelta delta, IModelProxy proxy) {
-		fVisitor.reset();
-		delta.accept(fVisitor);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IViewerUpdateListener#updateComplete(org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousRequestMonitor)
-	 */
-	public void updateComplete(IViewerUpdate update) {
-		IStatus status = update.getStatus();
-		if (!update.isCanceled()) {
-			if (status != null && status.getCode() != IStatus.OK) {
-				showMessage(status.getMessage());
-			} else {
-				showViewer();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IViewerUpdateListener#updateStarted(org.eclipse.debug.internal.ui.viewers.provisional.IAsynchronousRequestMonitor)
-	 */
-	public void updateStarted(IViewerUpdate update) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IViewerUpdateListener#viewerUpdatesBegin()
-	 */
-	public synchronized void viewerUpdatesBegin() {
-		fTriggerDetailsJob.cancel();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.viewers.IViewerUpdateListener#viewerUpdatesComplete()
-	 */
-	public synchronized void viewerUpdatesComplete() {
-		if (fVisitor.isTriggerDetails()) {
-			fTriggerDetailsJob.schedule();
-		}
-	}	
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		boolean success = false; 
-		if (!fTreeHasFocus && fDetailPane != null){
-			success = fDetailPane.setFocus();
-		}
-		// Unless the detail pane successfully set focus to a control, set focus to the variables tree
-		if (!success && getViewer() != null){
-			getViewer().getControl().setFocus();
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewMessages.java
deleted file mode 100644
index ab9e09e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewMessages.java
+++ /dev/null
@@ -1,54 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables;
-
-import org.eclipse.osgi.util.NLS;
-
-public class VariablesViewMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.views.variables.VariablesViewMessages";//$NON-NLS-1$
-
-	public static String DetailPaneMaxLengthDialog_0;
-
-	public static String DetailPaneMaxLengthDialog_1;
-
-	public static String DetailPaneMaxLengthDialog_2;
-
-	public static String DetailPaneMaxLengthDialog_3;
-
-	public static String LogicalStructureCache_0;
-
-	public static String VariablesView__Copy_8;
-	public static String VariablesView__Paste_14;
-	public static String VariablesView_Co_ntent_Assist_3;
-	public static String VariablesView_Cu_t_11;
-	public static String VariablesView_Error_1;
-	public static String VariablesView_Select__All_5;
-	public static String VariablesView_Unable_to_configure_variable_details_area__2;
-	public static String VariablesView_56;
-
-	public static String ToggleObjectBrowsersAction_1;
-	public static String VariablesView_41;
-	public static String ExpressionView_4;
-
-	public static String AvailableLogicalStructuresAction_0;
-	public static String AvailableLogicalStructuresAction_1;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, VariablesViewMessages.class);
-	}
-
-	public static String VariablesView_40;
-
-	public static String ToggleShowColumnsAction_0;
-
-	public static String ToggleShowColumnsAction_1;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewMessages.properties
deleted file mode 100644
index f1813e0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewMessages.properties
+++ /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
-###############################################################################
-
-VariablesView__Copy_8=&Copy
-VariablesView__Paste_14=&Paste
-VariablesView_Co_ntent_Assist_3=Co&ntent Assist
-VariablesView_Cu_t_11=Cu&t
-VariablesView_Error_1=Error
-VariablesView_Select__All_5=Select &All
-VariablesView_Unable_to_configure_variable_details_area__2=Unable to configure variable details area.
-VariablesView_56={0} : {1}
-
-ToggleObjectBrowsersAction_1=Show Logical Structure
-ToggleShowColumnsAction_0=&Show Columns
-ToggleShowColumnsAction_1=Show Columns
-VariablesView_41=Variables View Only
-VariablesView_40=&Layout
-ExpressionView_4=Expressions View Only
-
-AvailableLogicalStructuresAction_0=Select From Available Logical Structures
-AvailableLogicalStructuresAction_1=&Show Structure As
-DetailPaneMaxLengthDialog_0=Configure Details Pane
-DetailPaneMaxLengthDialog_1=&Maximum characters to display in details pane (0 = unlimited):
-DetailPaneMaxLengthDialog_2=Integer must be non-negative
-DetailPaneMaxLengthDialog_3=Enter an integer
-LogicalStructureCache_0=Logical structure canceled
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewResourceBundleMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewResourceBundleMessages.properties
deleted file mode 100644
index 8238898..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesViewResourceBundleMessages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-find_replace_action_label=&Find/Replace...
-find_replace_action_tooltip=Find/Replace
-find_replace_action_image=
-find_replace_action_description=Find/Replace
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/AbstractDetailPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/AbstractDetailPane.java
deleted file mode 100644
index e5a8564..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/AbstractDetailPane.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables.details;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.debug.ui.IDetailPane;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Abstract class that holds common methods used by implementors of IDetailPane.
- * 
- * @see DefaultDetailPane
- * @since 3.3
- */
-public abstract class AbstractDetailPane implements IDetailPane {
-
-	/**
-	 * The <code>IWorkbenchPartSite</code> that the details area (and the 
-	 * variables view) belongs to.
-	 */
-	private IWorkbenchPartSite fWorkbenchPartSite;
-	
-	/**
-	 * Map of actions. Keys are strings, values
-	 * are <code>IAction</code>.
-	 */
-	private Map fActionMap = new HashMap();
-	
-	/**
-	 * Collection to track actions that should be updated when selection occurs.
-	 */
-	private List fSelectionActions = new ArrayList();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#init(org.eclipse.ui.IWorkbenchPartSite)
-	 */
-	public void init(IWorkbenchPartSite workbench) {
-		fWorkbenchPartSite = workbench;
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#dispose()
-	 */
-	public void dispose() {
-		fActionMap.clear();
-		fSelectionActions.clear();
-	}
-
-	/**
-	 * Adds an action to the Map storing actions.  Removes it if action is null.
-	 * 
-	 * @param actionID The ID of the action, used as the key in the Map
-	 * @param action The action associated with the ID
-	 */
-	protected void setAction(String actionID, IAction action) {
-		if (action == null) {
-			fActionMap.remove(actionID);
-		} else {
-			fActionMap.put(actionID, action);
-		}
-	}
-	
-	/**
-	 * Adds the given action to the global action handler for the ViewSite.
-	 * A call to <code>updateActionBars()</code> must be called after changes
-	 * to propagate changes through the workbench.
-	 * 
-	 * @param actionID The ID of the action
-	 * @param action The action to be set globally
-	 */
-	protected void setGlobalAction(String actionID, IAction action){
-		getViewSite().getActionBars().setGlobalActionHandler(actionID, action);
-	}
-	
-	/**
-	 * Adds the given action to the list of actions that will be updated when
-	 * <code>updateSelectionDependentActions()</code> is called.  If the string 
-	 * is null it will not be added to the list.
-	 * 
-	 * @param actionID The ID of the action which should be updated
-	 */
-	protected void setSelectionDependantAction(String actionID){
-		if (actionID != null) fSelectionActions.add(actionID);
-	}
-	
-	/**
-	 * Gets the action out of the map, casts it to an <code>IAction</code>
-	 * 
-	 * @param actionID  The ID of the action to find
-	 * @return The action associated with the ID or null if none is found.
-	 */
-	protected IAction getAction(String actionID) {
-		return (IAction) fActionMap.get(actionID);
-	}
-	
-	/**
-	 * Calls the update method of the action with the given action ID.
-	 * The action must exist in the action map and must be an instance of
-	 * </code>IUpdate</code>
-	 * 
-	 * @param actionId The ID of the action to update
-	 */
-	protected void updateAction(String actionId) {
-		IAction action= getAction(actionId);
-		if (action instanceof IUpdate) {
-			((IUpdate) action).update();
-		}
-	}
-	
-	/**
-	 * Iterates through the list of selection dependent actions and 
-	 * updates them.  Use <code>setSelectionDependentAction(String actionID)</code>
-	 * to add an action to the list.  The action must have been added to the known 
-	 * actions map by calling <code>setAction(String actionID, IAction action)</code>
-	 * before it can be updated by this method.
-	 */
-	protected void updateSelectionDependentActions() {
-		Iterator iterator= fSelectionActions.iterator();
-		while (iterator.hasNext()) {
-			updateAction((String)iterator.next());		
-		}
-	}
-	
-	/**
-	 * Gets the view site for this view.  May be null if this detail pane
-	 * is not part of a view.
-	 * 
-	 * @return The site for this view or <code>null</code>
-	 */
-	protected  IViewSite getViewSite(){
-		if (fWorkbenchPartSite == null){
-			return null;
-		} else {
-			return (IViewSite) fWorkbenchPartSite.getPart().getSite();
-		}
-	}
-
-	/**
-	 * Gets the workbench part site for this view.  May be null if this detail pane
-	 * is not part of a view.
-	 * 
-	 * @return The workbench part site or <code>null</code>
-	 */
-	protected IWorkbenchPartSite getWorkbenchPartSite() {
-		return fWorkbenchPartSite;
-	}
-	
-	/**
-	 * Returns whether this detail pane is being displayed in a view with a workbench part site.
-	 * 
-	 * @return whether this detail pane is being displayed in a view with a workbench part site.
-	 */
-	protected boolean isInView(){
-		return fWorkbenchPartSite != null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/AvailableDetailPanesAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/AvailableDetailPanesAction.java
deleted file mode 100644
index 265c42e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/AvailableDetailPanesAction.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.debug.internal.ui.views.variables.details;
-
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Drop down action that displays the available detail panes for a selection.
- * 
- * @since 3.3
- * @see IDetailPaneContainer
- */
-public class AvailableDetailPanesAction extends Action implements IMenuCreator {
-	
-	private Menu fMenu;
-	private Set fAvailableIDs;
-	private IDetailPaneContainer fDetailPaneContainer;
-	
-	/**
-	 * Each entry in the menu will be of this type.  It represents one possible detail pane
-	 * that the user can select.  If the user selects it, the display is changed to use that
-	 * detail pane and the preferred detail pane map in the pane manager is updated.
-	 * 
-	 * @see DetailPaneManager
-	 * @since 3.3
-	 */
-	private class SetDetailPaneAction extends Action {
-		
-		private String fPaneID;
-		private Set fPossiblePaneIDs;
-		
-		public SetDetailPaneAction(String name, String paneID, Set possiblePaneIDs){
-			super(name,AS_RADIO_BUTTON);
-			fPaneID = paneID;
-			fPossiblePaneIDs = possiblePaneIDs;
-		}
-		
-		public void run() {
-			// Don't change panes unless the user is selecting a different pane than the one currently displayed
-			if (isChecked() && !fDetailPaneContainer.getCurrentPaneID().equals(fPaneID)){
-				DetailPaneManager.getDefault().setPreferredDetailPane(fPossiblePaneIDs, fPaneID);
-				fDetailPaneContainer.refreshDetailPaneContents();
-			}
-		}
-			
-	}
-	
-	public AvailableDetailPanesAction(IDetailPaneContainer detailPaneContainer) {
-		fDetailPaneContainer = detailPaneContainer;
-		setText(DetailMessages.AvailableDetailPanesAction_0);  
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.VARIABLES_SELECT_DETAIL_PANE);
-		
-		setEnabled(false);
-		setMenuCreator(this);
-		init();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		fAvailableIDs.clear();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		return null;
-	}
-	
-	protected void addActionToMenu(Menu parent, IAction action) {
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		
-		fMenu= new Menu(parent);
-		
-		Iterator iter = fAvailableIDs.iterator();
-		int i = 0;
-		while (iter.hasNext()) {
-			String currentID = (String) iter.next();
-			
-			StringBuffer name = new StringBuffer();
-			//add the numerical accelerator
-            i++;
-			if (i < 9) {
-                name.append('&');
-                name.append(i);
-                name.append(' ');
-            }
-			
-			String typeName = DetailPaneManager.getDefault().getNameFromID(currentID);
-			if (typeName != null && typeName.length() > 0){
-				name.append(typeName);
-			} else {
-				name.append(currentID);				
-			}
-					
-			IAction action = new SetDetailPaneAction(name.toString(),currentID,fAvailableIDs);
-			
-			if (currentID.equals(fDetailPaneContainer.getCurrentPaneID())){
-				action.setChecked(true);
-			}
-			
-			addActionToMenu(fMenu, action);	
-		}
-		
-		return fMenu;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void init() {
-		fAvailableIDs = DetailPaneManager.getDefault().getAvailablePaneIDs(fDetailPaneContainer.getCurrentSelection());
-		if (fAvailableIDs.size() > 1){
-			setEnabled(true);
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DefaultDetailPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DefaultDetailPane.java
deleted file mode 100644
index 52606da..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DefaultDetailPane.java
+++ /dev/null
@@ -1,956 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables.details;
-
-import java.util.Iterator;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-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.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.LazyModelPresentation;
-import org.eclipse.debug.internal.ui.VariablesViewModelPresentation;
-import org.eclipse.debug.internal.ui.actions.variables.details.DetailPaneAssignValueAction;
-import org.eclipse.debug.internal.ui.actions.variables.details.DetailPaneMaxLengthAction;
-import org.eclipse.debug.internal.ui.actions.variables.details.DetailPaneWordWrapAction;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.variables.IndexedValuePartition;
-import org.eclipse.debug.internal.ui.views.variables.StatusLineContributionItem;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.debug.ui.IValueDetailListener;
-import org.eclipse.jface.action.IAction;
-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.commands.ActionHandler;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.IFindReplaceTarget;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.IUndoManager;
-import org.eclipse.jface.text.IUndoManagerExtension;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-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.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.console.actions.TextViewerAction;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.operations.OperationHistoryActionHandler;
-import org.eclipse.ui.operations.RedoActionHandler;
-import org.eclipse.ui.operations.UndoActionHandler;
-import org.eclipse.ui.progress.WorkbenchJob;
-import org.eclipse.ui.texteditor.FindReplaceAction;
-import org.eclipse.ui.texteditor.IAbstractTextEditorHelpContextIds;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This detail pane uses a source viewer to display detailed information about the current
- * selection.  It incorporates a large number of actions into its context menu.  It is the
- * default detail pane.
- * 
- * @see DefaultDetailPaneFactory
- * @since 3.3
- *
- */
-public class DefaultDetailPane extends AbstractDetailPane implements IAdaptable, IPropertyChangeListener{
-
-	/**
-	 * These are the IDs for the actions in the context menu
-	 */
-	protected static final String DETAIL_COPY_ACTION = ActionFactory.COPY.getId() + ".SourceDetailPane"; //$NON-NLS-1$
-	protected static final String DETAIL_SELECT_ALL_ACTION = IDebugView.SELECT_ALL_ACTION + ".SourceDetailPane"; //$NON-NLS-1$
-	protected static final String DETAIL_PASTE_ACTION = ActionFactory.PASTE.getId();
-	protected static final String DETAIL_CUT_ACTION = ActionFactory.CUT.getId();
-	
-	protected static final String DETAIL_FIND_REPLACE_TEXT_ACTION = "FindReplaceText"; //$NON-NLS-1$
-	protected static final String DETAIL_CONTENT_ASSIST_ACTION = "ContentAssist"; //$NON-NLS-1$
-	protected static final String DETAIL_ASSIGN_VALUE_ACTION = "AssignValue"; //$NON-NLS-1$
-	
-	protected static final String DETAIL_WORD_WRAP_ACTION = IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP;
-	protected static final String DETAIL_MAX_LENGTH_ACTION = "MaxLength"; //$NON-NLS-1$
-	
-	/**
-	 * The ID, name and description of this pane are stored in constants so that the class
-	 * does not have to be instantiated to access them.
-	 */
-	public static final String ID = DetailMessages.DefaultDetailPane_0;
-	public static final String NAME = DetailMessages.DefaultDetailPane_1;
-	public static final String DESCRIPTION = DetailMessages.DefaultDetailPane_57;
-	
-	/**
-	 * Data structure for the position label value.
-	 */
-	private static class PositionLabelValue {
-		
-		public int fValue;
-		
-		public String toString() {
-			return String.valueOf(fValue);
-		}
-	}
-	
-	/**
-	 * Internal interface for a cursor listener. I.e. aggregation 
-	 * of mouse and key listener.
-	 * @since 3.0
-	 */
-	interface ICursorListener extends MouseListener, KeyListener {
-	}
-	
-	/**
-	 * Job to compute the details for a selection
-	 */
-	class DetailJob extends Job implements IValueDetailListener {
-		
-		private IStructuredSelection fElements;
-		private IDebugModelPresentation fModel;
-		private boolean fFirst = true;
-		// whether a result was collected
-		private boolean fComputed = false;
-		private IProgressMonitor fMonitor;
-		
-		public DetailJob(IStructuredSelection elements, IDebugModelPresentation model) {
-			super("compute variable details"); //$NON-NLS-1$
-			setSystem(true);
-			fElements = elements;
-			fModel = model;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		protected IStatus run(IProgressMonitor monitor) {
-			fMonitor = monitor;
-			Iterator iterator = fElements.iterator();
-			String message = null;
-			while (iterator.hasNext()) {
-				if (monitor.isCanceled()) {
-					break;
-				}
-				Object element = iterator.next();
-				IValue val = null;
-				if (element instanceof IVariable) {
-					try {
-						val = ((IVariable)element).getValue();
-					} catch (DebugException e) {
-						detailComputed(null, e.getStatus().getMessage());
-					}
-				} else if (element instanceof IExpression) {
-					val = ((IExpression)element).getValue();
-				}
-				// When selecting a index partition, clear the pane
-				if (val instanceof IndexedValuePartition) {
-					detailComputed(null, ""); //$NON-NLS-1$
-					val = null;
-				}
-				if (element instanceof String) {
-					message = (String) element;
-				}
-				if (val != null && !monitor.isCanceled()) {
-					fModel.computeDetail(val, this);
-					synchronized (this) {
-						try {
-							// wait for a max of 30 seconds for result, then cancel
-							wait(30000);
-							if (!fComputed) {
-								fMonitor.setCanceled(true);
-							}
-						} catch (InterruptedException e) {
-							break;
-						}
-					}
-				}				
-			}
-			// If no details were computed for the selected variable, clear the pane
-			// or use the message, if the variable was a java.lang.String
-			if (!fComputed){
-				if (message == null) {
-					detailComputed(null,""); //$NON-NLS-1$
-				} else {
-					detailComputed(null, message);
-				}
-			}
-			return Status.OK_STATUS;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#canceling()
-		 */
-		protected void canceling() {
-			super.canceling();
-			synchronized (this) {
-				notifyAll();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.ui.IValueDetailListener#detailComputed(org.eclipse.debug.core.model.IValue, java.lang.String)
-		 */
-		public void detailComputed(IValue value, final String result) {
-			synchronized (this) {
-				fComputed = true;
-			}
-			if (!fMonitor.isCanceled()) {
-				WorkbenchJob append = new WorkbenchJob("append details") { //$NON-NLS-1$
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						if (!fMonitor.isCanceled()) {
-							String insert = result;
-							int length = 0;
-							if (!fFirst) {
-								length = getDetailDocument().getLength();
-							}
-							if (length > 0) {
-								insert = "\n" + result; //$NON-NLS-1$
-							}
-							try {
-								int max = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH);
-								if (max > 0 && insert.length() > max) {
-									insert = insert.substring(0, max) + "..."; //$NON-NLS-1$
-								}
-								if (fFirst) {
-									getDetailDocument().set(insert);
-									fFirst = false;
-								} else {
-									getDetailDocument().replace(length, 0,insert);
-								}
-							} catch (BadLocationException e) {
-								DebugUIPlugin.log(e);
-							}
-						}
-						return Status.OK_STATUS;
-					}
-				};
-				append.setSystem(true);
-				append.schedule();
-			}
-			synchronized (this) {
-				notifyAll();
-			}
-			
-		}
-
-	}
-	
-	/**
-	 * The model presentation used to produce the string details for a 
-	 * selected variable.
-	 */
-	private VariablesViewModelPresentation fModelPresentation;
-	private String fDebugModelIdentifier;
-	
-	/**
-	 * Controls the status line while the details area has focus.
-	 * Displays the current cursor position in the text (line:character).
-	 */
-	private StatusLineContributionItem fStatusLineItem;
-
-	/**
-	 * The source viewer in which the computed string detail
-	 * of selected variables will be displayed.
-	 */
-	private SourceViewer fSourceViewer;
-	
-	/**
-	 * The last selection displayed in the source viewer.
-	 */
-	private IStructuredSelection fLastDisplayed = null;
-	
-	/**
-	 * Variables used to create the detailed information for a selection
-	 */
-	private IDocument fDetailDocument;
-	private DetailJob fDetailJob = null;
-	private final String fPositionLabelPattern = DetailMessages.DefaultDetailPane_56;
-	private final PositionLabelValue fLineLabel = new PositionLabelValue();
-	private final PositionLabelValue fColumnLabel = new PositionLabelValue();
-	private final Object[] fPositionLabelPatternArguments = new Object[] {
-			fLineLabel, fColumnLabel };
-	private ICursorListener fCursorListener;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		
-		fModelPresentation = new VariablesViewModelPresentation();
-		
-		createSourceViewer(parent);
-		
-		if (isInView()){
-			createViewSpecificComponents();
-			createActions();
-			DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-			JFaceResources.getFontRegistry().addListener(this);
-		}
-		
-		return fSourceViewer.getControl();
-	}
-
-	/**
-	 * Creates the source viewer in the given parent composite
-	 * 
-	 * @param parent Parent composite to create the source viewer in
-	 */
-	private void createSourceViewer(Composite parent) {
-		
-		// Create & configure a SourceViewer
-		fSourceViewer = new SourceViewer(parent, null, SWT.V_SCROLL | SWT.H_SCROLL);
-		fSourceViewer.setDocument(getDetailDocument());
-		fSourceViewer.getTextWidget().setFont(JFaceResources.getFont(IInternalDebugUIConstants.DETAIL_PANE_FONT));
-		fSourceViewer.getTextWidget().setWordWrap(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP));
-		fSourceViewer.setEditable(false);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(fSourceViewer.getTextWidget(), IDebugHelpContextIds.DETAIL_PANE);
-		Control control = fSourceViewer.getControl();
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		control.setLayoutData(gd);	
-	}
-
-	/**
-	 * Creates listeners and other components that should only be added to the
-	 * source viewer when this detail pane is inside a view.
-	 */
-	private void createViewSpecificComponents(){
-		
-		// Add a document listener so actions get updated when the document changes
-		getDetailDocument().addDocumentListener(new IDocumentListener() {
-			public void documentAboutToBeChanged(DocumentEvent event) {}
-			public void documentChanged(DocumentEvent event) {
-				updateSelectionDependentActions();
-			}
-		});
-		
-		// Add the selection listener so selection dependent actions get updated.
-		fSourceViewer.getSelectionProvider().addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateSelectionDependentActions();
-			}
-		});
-		
-		// Add a focus listener to update actions when details area gains focus
-		fSourceViewer.getControl().addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				
-				getViewSite().setSelectionProvider(fSourceViewer.getSelectionProvider());
-				
-				setGlobalAction(IDebugView.SELECT_ALL_ACTION, getAction(DETAIL_SELECT_ALL_ACTION));
-				setGlobalAction(IDebugView.CUT_ACTION, getAction(DETAIL_CUT_ACTION));
-				setGlobalAction(IDebugView.COPY_ACTION, getAction(DETAIL_COPY_ACTION));
-				setGlobalAction(IDebugView.PASTE_ACTION, getAction(DETAIL_PASTE_ACTION));
-				setGlobalAction(IDebugView.FIND_ACTION, getAction(DETAIL_FIND_REPLACE_TEXT_ACTION));
-				IAction action = getAction(DETAIL_ASSIGN_VALUE_ACTION);
-				setGlobalAction(action.getActionDefinitionId(), action);
-				action = getAction(DETAIL_CONTENT_ASSIST_ACTION);
-				setGlobalAction(action.getActionDefinitionId(),action);
-				
-				getViewSite().getActionBars().updateActionBars();
-				
-				updateAction(DETAIL_FIND_REPLACE_TEXT_ACTION);
-				
-			}
-			
-			public void focusLost(FocusEvent e) {
-				
-				getViewSite().setSelectionProvider(null);
-				
-				setGlobalAction(IDebugView.SELECT_ALL_ACTION, null);
-				setGlobalAction(IDebugView.CUT_ACTION, null);
-				setGlobalAction(IDebugView.COPY_ACTION, null);
-				setGlobalAction(IDebugView.PASTE_ACTION, null);
-				setGlobalAction(IDebugView.FIND_ACTION, null);
-				setGlobalAction(getAction(DETAIL_ASSIGN_VALUE_ACTION).getActionDefinitionId(), null);
-				setGlobalAction(getAction(DETAIL_CONTENT_ASSIST_ACTION).getActionDefinitionId(), null);
-				
-				getViewSite().getActionBars().updateActionBars();
-				
-			}
-		});
-		
-		// Create a status line item displaying the current cursor location
-		fStatusLineItem = new StatusLineContributionItem("ModeContributionItem"); //$NON-NLS-1$
-		IStatusLineManager manager= getViewSite().getActionBars().getStatusLineManager();
-		manager.add(fStatusLineItem);
-		fSourceViewer.getTextWidget().addMouseListener(getCursorListener());
-		fSourceViewer.getTextWidget().addKeyListener(getCursorListener());
-		
-		// Add a context menu to the detail area
-		createDetailContextMenu(fSourceViewer.getTextWidget());	
-		
-	}
-	
-	/**
-	 * Creates the actions to add to the context menu
-	 */
-	private void createActions() {
-       
-		TextViewerAction textAction= new TextViewerAction(fSourceViewer, ISourceViewer.CONTENTASSIST_PROPOSALS);
-		textAction.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
-		textAction.configureAction(DetailMessages.DefaultDetailPane_Co_ntent_Assist_3, "",""); //$NON-NLS-1$ //$NON-NLS-2$ 
-		textAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ELCL_CONTENT_ASSIST));
-		textAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_CONTENT_ASSIST));
-		textAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_DLCL_CONTENT_ASSIST));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(textAction, IDebugHelpContextIds.DETAIL_PANE_CONTENT_ASSIST_ACTION);
-		setAction(DETAIL_CONTENT_ASSIST_ACTION, textAction);
-		
-		ActionHandler actionHandler = new ActionHandler(textAction);
-        IHandlerService handlerService = (IHandlerService) getViewSite().getService(IHandlerService.class);
-        handlerService.activateHandler(textAction.getActionDefinitionId(), actionHandler);
-			
-		textAction= new TextViewerAction(fSourceViewer, ITextOperationTarget.SELECT_ALL);
-		textAction.configureAction(DetailMessages.DefaultDetailPane_Select__All_5, "", ""); //$NON-NLS-1$ //$NON-NLS-2$ 
-		textAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.SELECT_ALL);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(textAction, IDebugHelpContextIds.DETAIL_PANE_SELECT_ALL_ACTION);
-		setAction(DETAIL_SELECT_ALL_ACTION, textAction);
-		
-		textAction= new TextViewerAction(fSourceViewer, ITextOperationTarget.COPY);
-		textAction.configureAction(DetailMessages.DefaultDetailPane__Copy_8, "", "");  //$NON-NLS-1$ //$NON-NLS-2$
-		textAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(textAction, IDebugHelpContextIds.DETAIL_PANE_COPY_ACTION);
-		setAction(DETAIL_COPY_ACTION, textAction);
-		
-		textAction= new TextViewerAction(fSourceViewer, ITextOperationTarget.CUT);
-		textAction.configureAction(DetailMessages.DefaultDetailPane_Cu_t_11, "", ""); //$NON-NLS-1$ //$NON-NLS-2$ 
-		textAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.CUT);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(textAction, IDebugHelpContextIds.DETAIL_PANE_CUT_ACTION);
-		setAction(DETAIL_CUT_ACTION, textAction);
-		
-		textAction= new TextViewerAction(fSourceViewer, ITextOperationTarget.PASTE);
-		textAction.configureAction(DetailMessages.DefaultDetailPane__Paste_14, "", ""); //$NON-NLS-1$ //$NON-NLS-2$ 
-		textAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(textAction, IDebugHelpContextIds.DETAIL_PANE_PASTE_ACTION);
-		setAction(ActionFactory.PASTE.getId(), textAction);
-		
-		setSelectionDependantAction(DETAIL_COPY_ACTION);
-		setSelectionDependantAction(DETAIL_CUT_ACTION);
-		setSelectionDependantAction(DETAIL_PASTE_ACTION);
-		
-		// TODO: Still using "old" resource access, find/replace won't work in popup dialogs
-		ResourceBundle bundle= ResourceBundle.getBundle("org.eclipse.debug.internal.ui.views.variables.VariablesViewResourceBundleMessages"); //$NON-NLS-1$
-		IAction action = new FindReplaceAction(bundle, "find_replace_action_", getWorkbenchPartSite().getShell(), new FindReplaceTargetWrapper(fSourceViewer.getFindReplaceTarget())); //$NON-NLS-1$
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_REPLACE);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(action, IDebugHelpContextIds.DETAIL_PANE_FIND_REPLACE_ACTION);
-		setAction(DETAIL_FIND_REPLACE_TEXT_ACTION, action);
-			
-		updateSelectionDependentActions();
-		
-		action = new DetailPaneWordWrapAction(fSourceViewer);
-		setAction(DETAIL_WORD_WRAP_ACTION, action);
-		
-		action = new DetailPaneMaxLengthAction(fSourceViewer.getControl().getShell());
-		setAction(DETAIL_MAX_LENGTH_ACTION,action);
-		
-		action = new DetailPaneAssignValueAction(fSourceViewer,getViewSite());
-		setAction(DETAIL_ASSIGN_VALUE_ACTION, action);	
-	}
-	
-	/**
-	 * Create the context menu particular to the detail pane.  Note that anyone
-	 * wishing to contribute an action to this menu must use
-	 * <code>IDebugUIConstants.VARIABLE_VIEW_DETAIL_ID</code> as the
-	 * <code>targetID</code> in the extension XML.
-	 */
-	protected void createDetailContextMenu(Control menuControl) {
-		MenuManager menuMgr= new MenuManager(); 
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager mgr) {
-				fillDetailContextMenu(mgr);
-			}
-		});
-		Menu menu= menuMgr.createContextMenu(menuControl);
-		menuControl.setMenu(menu);
-
-		getViewSite().registerContextMenu(IDebugUIConstants.VARIABLE_VIEW_DETAIL_ID, menuMgr, fSourceViewer.getSelectionProvider());
-
-	}
-	
-	/**
-	* Adds items to the detail pane's context menu including any extension defined
-	* actions.
-	* 
-	* @param menu The menu to add the item to.
-	*/
-	protected void fillDetailContextMenu(IMenuManager menu) {
-		
-		menu.add(new Separator(IDebugUIConstants.VARIABLE_GROUP));
-		if (isInView()){
-			menu.add(getAction(DETAIL_ASSIGN_VALUE_ACTION));
-			menu.add(getAction(DETAIL_CONTENT_ASSIST_ACTION));
-		}
-		menu.add(new Separator());
-		menu.add(getAction(DETAIL_CUT_ACTION));
-		menu.add(getAction(DETAIL_COPY_ACTION)); 
-		menu.add(getAction(DETAIL_PASTE_ACTION));
-		menu.add(getAction(DETAIL_SELECT_ALL_ACTION));
-		menu.add(new Separator("FIND")); //$NON-NLS-1$
-		if (isInView()){
-			menu.add(getAction(DETAIL_FIND_REPLACE_TEXT_ACTION));
-		}
-		menu.add(new Separator());
-		menu.add(getAction(DETAIL_WORD_WRAP_ACTION));
-		menu.add(getAction(DETAIL_MAX_LENGTH_ACTION));
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#display(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void display(IStructuredSelection selection) {
-		
-		if (selection == null){
-			clearSourceViewer();
-			return;
-		}
-				
-		fLastDisplayed = selection;
-		if (isInView()){
-			fSourceViewer.setEditable(true);
-		}
-						
-		if (selection.isEmpty()){
-			clearSourceViewer();
-			return;
-		}
-		
-		Object firstElement = selection.getFirstElement();
-		if (firstElement != null && firstElement instanceof IDebugElement) {
-			String modelID = ((IDebugElement)firstElement).getModelIdentifier();
-			setDebugModel(modelID);
-		}
-		
-		if (isInView()){
-			IAction assignAction = getAction(DETAIL_ASSIGN_VALUE_ACTION);
-			if (assignAction instanceof DetailPaneAssignValueAction){
-				((DetailPaneAssignValueAction)assignAction).updateCurrentVariable(selection);
-			}
-		}
-		
-        synchronized (this) {
-        	if (fDetailJob != null) {
-        		fDetailJob.cancel();
-        	}
-			fDetailJob = new DetailJob(selection,fModelPresentation);
-			fDetailJob.schedule();
-        }
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#setFocus()
-	 */
-	public boolean setFocus(){
-		if (fSourceViewer != null){
-			fSourceViewer.getTextWidget().setFocus();
-			return true;
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.details.AbstractDetailPane#dispose()
-	 */
-	public void dispose(){
-		super.dispose();
-		
-		if (fDetailJob != null) fDetailJob.cancel();
-		if (fModelPresentation != null) fModelPresentation.dispose();
-		fDebugModelIdentifier = null; // Setting this to null makes sure the source viewer is reconfigured with the model presentation after disposal
-		if (fSourceViewer != null && fSourceViewer.getControl() != null) fSourceViewer.getControl().dispose();
-		
-		if (isInView()){
-			disposeUndoRedoAction(ITextEditorActionConstants.UNDO);
-			disposeUndoRedoAction(ITextEditorActionConstants.REDO);
-			
-			getViewSite().getActionBars().getStatusLineManager().remove(fStatusLineItem);
-			
-			DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-			JFaceResources.getFontRegistry().removeListener(this);	
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#getDescription()
-	 */
-	public String getDescription() {
-		return DESCRIPTION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#getID()
-	 */
-	public String getID() {
-		return ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#getName()
-	 */
-	public String getName() {
-		return NAME;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class required) {
-		if (IFindReplaceTarget.class.equals(required)) {
-			return fSourceViewer.getFindReplaceTarget();
-		}
-		if (ITextViewer.class.equals(required)) {
-			return fSourceViewer;
-		}
-		return null;
-	}
-	
-	/**
-	 * Lazily instantiate and return a Document for the detail pane text viewer.
-	 */
-	protected IDocument getDetailDocument() {
-		if (fDetailDocument == null) {
-			fDetailDocument = new Document();
-		}
-		return fDetailDocument;
-	}
-	
-	/**
-	 * Clears the source viewer, removes all text.
-	 */
-	protected void clearSourceViewer(){
-		if (fDetailJob != null) {
-			fDetailJob.cancel();
-		}
-		fLastDisplayed = null;
-		fDetailDocument.set(""); //$NON-NLS-1$
-		fSourceViewer.setEditable(false);
-	}
-
-	/**
-	 * Configures the details viewer for the debug model
-	 * currently being displayed
-	 */
-	protected void configureDetailsViewer() {
-		LazyModelPresentation mp = (LazyModelPresentation)fModelPresentation.getPresentation(getDebugModel());
-		SourceViewerConfiguration svc = null;
-		if (mp != null) {
-			try {
-				svc = mp.newDetailsViewerConfiguration();
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(fSourceViewer.getControl().getShell(), DetailMessages.DefaultDetailPane_Error_1, DetailMessages.DefaultDetailPane_2, e); 
-			}
-		}
-		
-	    if (svc == null) {
-			svc = new SourceViewerConfiguration();
-			fSourceViewer.setEditable(false);
-		}
-	    fSourceViewer.unconfigure();
-	    fSourceViewer.configure(svc);
-		//update actions that depend on the configuration of the source viewer
-		
-		if (isInView()){
-			updateAction(DETAIL_ASSIGN_VALUE_ACTION);
-			updateAction(DETAIL_CONTENT_ASSIST_ACTION);
-		}
-		
-		if (isInView()){
-			createUndoRedoActions();
-		}
-	}
-
-	/**
-	 * @return The formatted string describing cursor position
-	 */
-	protected String getCursorPosition() {
-		
-		if (fSourceViewer == null) {
-			return ""; //$NON-NLS-1$
-		}
-		
-		StyledText styledText= fSourceViewer.getTextWidget();
-		int caret= styledText.getCaretOffset();
-		IDocument document= fSourceViewer.getDocument();
-	
-		if (document == null) {
-			return ""; //$NON-NLS-1$
-		}
-	
-		try {
-			
-			int line= document.getLineOfOffset(caret);
-	
-			int lineOffset= document.getLineOffset(line);
-			int tabWidth= styledText.getTabs();
-			int column= 0;
-			for (int i= lineOffset; i < caret; i++)
-				if ('\t' == document.getChar(i)) {
-					column += tabWidth - (tabWidth == 0 ? 0 : column % tabWidth);
-				} else {
-					column++;
-				}
-					
-			fLineLabel.fValue= line + 1;
-			fColumnLabel.fValue= column + 1;
-			return MessageFormat.format(fPositionLabelPattern, fPositionLabelPatternArguments);
-			
-		} catch (BadLocationException x) {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Returns this view's "cursor" listener to be installed on the view's
-	 * associated details viewer. This listener is listening to key and mouse button events.
-	 * It triggers the updating of the status line.
-	 * 
-	 * @return the listener
-	 */
-	private ICursorListener getCursorListener() {
-		if (fCursorListener == null) {
-			fCursorListener= new ICursorListener() {
-				
-				public void keyPressed(KeyEvent e) {
-					fStatusLineItem.setText(getCursorPosition());
-				}
-				
-				public void keyReleased(KeyEvent e) {
-				}
-				
-				public void mouseDoubleClick(MouseEvent e) {
-				}
-				
-				public void mouseDown(MouseEvent e) {
-				}
-				
-				public void mouseUp(MouseEvent e) {
-					fStatusLineItem.setText(getCursorPosition());
-				}
-			};
-		}
-		return fCursorListener;
-	}
-	
-	/**
-	 * Returns the identifier of the debug model being displayed
-	 * in this view, or <code>null</code> if none.
-	 * 
-	 * @return debug model identifier
-	 */
-	protected String getDebugModel() {
-		return fDebugModelIdentifier;
-	}	
-
-	/**
-	 * Sets the identifier of the debug model being displayed
-	 * in this view, or <code>null</code> if none.
-	 * 
-	 * @param id debug model identifier of the type of debug
-	 *  elements being displayed in this view
-	 */
-	protected void setDebugModel(String id) {
-		if (id != fDebugModelIdentifier) {
-			fDebugModelIdentifier = id;
-			configureDetailsViewer();
-		}
-	}
-	
-	/**
-	 * Creates this editor's undo/re-do actions.
-	 * <p>
-	 * Subclasses may override or extend.</p>
-	 *
-	 * @since 3.2
-	 */
-	protected void createUndoRedoActions() {
-		disposeUndoRedoAction(ITextEditorActionConstants.UNDO);
-		disposeUndoRedoAction(ITextEditorActionConstants.REDO);
-		IUndoContext undoContext= getUndoContext();
-		if (undoContext != null) {
-			// Use actions provided by global undo/re-do
-			
-			// Create the undo action
-			OperationHistoryActionHandler undoAction= new UndoActionHandler(getViewSite(), undoContext);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(undoAction, IAbstractTextEditorHelpContextIds.UNDO_ACTION);
-			undoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.UNDO);
-			setAction(ITextEditorActionConstants.UNDO, undoAction);
-			setGlobalAction(ITextEditorActionConstants.UNDO, undoAction);			
-			
-			// Create the re-do action.
-			OperationHistoryActionHandler redoAction= new RedoActionHandler(getViewSite(), undoContext);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(redoAction, IAbstractTextEditorHelpContextIds.REDO_ACTION);
-			redoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.REDO);
-			setAction(ITextEditorActionConstants.REDO, redoAction);
-			setGlobalAction(ITextEditorActionConstants.REDO, redoAction);
-			
-			getViewSite().getActionBars().updateActionBars();
-		}
-	}	
-	
-	/**
-	 * Disposes of the action with the specified ID
-	 * 
-	 * @param actionId the ID of the action to disposed
-	 */
-	protected void disposeUndoRedoAction(String actionId) {
-		OperationHistoryActionHandler action = (OperationHistoryActionHandler) getAction(actionId);
-		if (action != null) {
-			action.dispose();
-			setAction(actionId, null);
-		}
-	}
-	
-	/**
-	 * Returns this editor's viewer's undo manager undo context.
-	 *
-	 * @return the undo context or <code>null</code> if not available
-	 * @since 3.2
-	 */
-	private IUndoContext getUndoContext() {
-		IUndoManager undoManager= fSourceViewer.getUndoManager();
-		if (undoManager instanceof IUndoManagerExtension)
-			return ((IUndoManagerExtension)undoManager).getUndoContext();
-		return null;
-	}
-
-	/* (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(IInternalDebugUIConstants.DETAIL_PANE_FONT)) {
-			fSourceViewer.getTextWidget().setFont(JFaceResources.getFont(IInternalDebugUIConstants.DETAIL_PANE_FONT));
-		} else if (propertyName.equals(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH)) {
-			display(fLastDisplayed);
-		} else if (propertyName.equals(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP)) {
-			fSourceViewer.getTextWidget().setWordWrap(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP));
-			getAction(DETAIL_WORD_WRAP_ACTION).setChecked(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DETAIL_PANE_WORD_WRAP));	
-		}
-		
-	}
-
-	/**
-	 * Wrapper class that wraps around an IFindReplaceTarget.  Allows the detail pane to scroll
-	 * to text selected by the find/replace action.  The source viewer treats the text as a single
-	 * line, even when the text is wrapped onto several lines so the viewer will not scroll properly
-	 * on it's own.  See bug 178106.
-	 */
-	class FindReplaceTargetWrapper implements IFindReplaceTarget{
-		
-		private IFindReplaceTarget fTarget;
-		
-		/**
-		 * Constructor
-		 * 
-		 * @param target find/replace target this class will wrap around.
-		 */
-		public FindReplaceTargetWrapper(IFindReplaceTarget target){
-			fTarget = target;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IFindReplaceTarget#canPerformFind()
-		 */
-		public boolean canPerformFind() {
-			return fTarget.canPerformFind();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IFindReplaceTarget#findAndSelect(int, java.lang.String, boolean, boolean, boolean)
-		 */
-		public int findAndSelect(int widgetOffset, String findString, boolean searchForward, boolean caseSensitive, boolean wholeWord) {
-			int position = fTarget.findAndSelect(widgetOffset, findString, searchForward, caseSensitive, wholeWord);
-			// Explicitly tell the widget to show the selection because the viewer thinks the text is all on one line, even if wrapping is turned on.
-			if (fSourceViewer != null){
-				StyledText text = fSourceViewer.getTextWidget();
-				if(text != null && !text.isDisposed()) {
-					text.showSelection();
-				}
-			}
-			return position;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IFindReplaceTarget#getSelection()
-		 */
-		public Point getSelection() {
-			return fTarget.getSelection();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IFindReplaceTarget#getSelectionText()
-		 */
-		public String getSelectionText() {
-			return fTarget.getSelectionText();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IFindReplaceTarget#isEditable()
-		 */
-		public boolean isEditable() {
-			return fTarget.isEditable();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IFindReplaceTarget#replaceSelection(java.lang.String)
-		 */
-		public void replaceSelection(String text) {
-			fTarget.replaceSelection(text);
-		}
-	}
-	
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DefaultDetailPaneFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DefaultDetailPaneFactory.java
deleted file mode 100644
index eb3c88e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DefaultDetailPaneFactory.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables.details;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.debug.ui.IDetailPane;
-import org.eclipse.debug.ui.IDetailPaneFactory;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * The default detail pane factory is contributed to the <code>org.eclipse.debug.ui.detailPaneFactories</code>
- * extension without an enablement expression so it is always loaded.  For any given selection (even
- * null or empty selections), the factory can produce a <code>SourceDetailsPane</code>
- * 
- * @see SourceDetailPane
- * @since 3.3
- */
-public class DefaultDetailPaneFactory implements IDetailPaneFactory {
-
-	public static final String DEFAULT_DETAIL_PANE_ID = DefaultDetailPane.ID;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.IDetailsFactory#createDetailsArea(java.lang.String)
-	 */
-	public IDetailPane createDetailPane(String id) {
-		return new DefaultDetailPane();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.IDetailsFactory#getDetailsTypes(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public Set getDetailPaneTypes(IStructuredSelection selection) {
-		Set possibleIDs = new HashSet(1);
-		possibleIDs.add(DefaultDetailPane.ID);
-		return possibleIDs;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPaneFactory#getDefaultDetailPane(java.util.Set, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public String getDefaultDetailPane(IStructuredSelection selection) {
-		// Return null so that any contributed detail pane can override the default
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.IDetailsFactory#getName(java.lang.String)
-	 */
-	public String getDetailPaneName(String id) {
-		if (id.equals(DefaultDetailPane.ID)){
-			return DefaultDetailPane.NAME;
-		}
-		return null;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.views.variables.IDetailsFactory#getDescription(java.lang.String)
-	 */
-	public String getDetailPaneDescription(String id) {
-		if (id.equals(DefaultDetailPane.ID)){
-			return DefaultDetailPane.DESCRIPTION;
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailMessages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailMessages.java
deleted file mode 100644
index e115efa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailMessages.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.debug.internal.ui.views.variables.details;
-
-import org.eclipse.osgi.util.NLS;
-
-public class DetailMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.debug.internal.ui.views.variables.details.DetailMessages"; //$NON-NLS-1$
-	public static String AvailableDetailPanesAction_0;
-	public static String DefaultDetailPane__Copy_8;
-	public static String DefaultDetailPane__Paste_14;
-	public static String DefaultDetailPane_0;
-	public static String DefaultDetailPane_1;
-	public static String DefaultDetailPane_2;
-	public static String DefaultDetailPane_56;
-	public static String DefaultDetailPane_57;
-	public static String DefaultDetailPane_Co_ntent_Assist_3;
-	public static String DefaultDetailPane_Cu_t_11;
-	public static String DefaultDetailPane_Error_1;
-	public static String DefaultDetailPane_Select__All_5;
-	public static String DetailPaneProxy_0;
-	public static String DetailPaneProxy_1;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, DetailMessages.class);
-	}
-
-	private DetailMessages() {
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailMessages.properties
deleted file mode 100644
index b512c3f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailMessages.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2006, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-AvailableDetailPanesAction_0=Show &Details As
-DefaultDetailPane_0=DefaultDetailPane
-DefaultDetailPane_1=Default Viewer
-DefaultDetailPane_56={0} : {1}
-DefaultDetailPane_57=A detail pane that is based on a source viewer.  Displays as text and has actions for assigning values, content assist and text modifications.
-DefaultDetailPane_Co_ntent_Assist_3=Co&ntent Assist
-DefaultDetailPane_Select__All_5=Select &All
-DefaultDetailPane__Copy_8=&Copy
-DefaultDetailPane_Cu_t_11=Cu&t
-DefaultDetailPane__Paste_14=&Paste
-DefaultDetailPane_Error_1=Error
-DefaultDetailPane_2=Unable to configure source viewer detail pane
-DetailPaneProxy_0=Problem displaying detail pane, see log for details.
-DetailPaneProxy_1=There are no detail panes available, see log for details.
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailPaneManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailPaneManager.java
deleted file mode 100644
index cc57ef7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailPaneManager.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables.details;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.Map.Entry;
-
-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.ExpressionTagNames;
-import org.eclipse.core.expressions.IEvaluationContext;
-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.debug.internal.core.IConfigurationElementConstants;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IDetailPane;
-import org.eclipse.debug.ui.IDetailPaneFactory;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Organizes the detail factories contributed through the extension point and keeps
- * track of the detail panes the factories produce.  Accessed as a singleton through
- * the <code>getDefault()</code> method.
- * 
- * @see IDetailPaneFactory
- * @see IDetailPane
- * @since 3.3
- */
-public class DetailPaneManager {
-	
-	/**
-	 * Acts as a proxy between the detail pane manager and the factories contributed
-	 * to the extension point.  Only loads information from the plug-in xml and only 
-	 * instantiates the specified factory if required (lazy loading).
-	 */
-	private class DetailPaneFactoryExtension implements IDetailPaneFactory{
-
-		private IConfigurationElement fConfigElement;
-		private IDetailPaneFactory fFactory;
-		private Expression fEnablementExpression;
-		
-		public DetailPaneFactoryExtension(IConfigurationElement configElement){
-			fConfigElement = configElement;			
-		}
-		
-		/** 
-		 * Instantiates the factory and asks it to produce the IDetailPane for
-		 * the given ID
-		 */
-		public IDetailPane createDetailPane(String paneID){
-			if (getFactory() != null){
-				return getFactory().createDetailPane(paneID);
-			}
-			return null;
-		}
-
-		/** 
-		 * Instantiates the factory and asks it for the set of detail pane
-		 * IDs that the factory can produce for the given selection.
-		 */
-		public Set getDetailPaneTypes(IStructuredSelection selection){
-			if (getFactory() != null){
-				return getFactory().getDetailPaneTypes(selection);
-			}
-			return new HashSet(0);			
-		}
-		
-		/** 
-		 * Instantiates the factory and asks it for the detail pane ID
-		 * that the factory considers the default for the given selection.
-		 */
-		public String getDefaultDetailPane(IStructuredSelection selection) {
-			if (getFactory() != null){
-				return getFactory().getDefaultDetailPane(selection);
-			}
-			return null;
-		}	
-
-		/** 
-		 * Instantiates the factory and asks it to produce the name of the detail pane
-		 * for the given ID.
-		 */
-		public String getDetailPaneName(String paneID) {
-			if (getFactory() != null){
-				return getFactory().getDetailPaneName(paneID);
-			}
-			return null;
-		}
-		
-		/** 
-		 * Instantiates the factory and asks it to produce the description of the 
-		 * detail pane for the given ID.
-		 */
-		public String getDetailPaneDescription(String paneID) {
-			if (getFactory() != null){
-				return getFactory().getDetailPaneDescription(paneID);
-			}
-			return null;
-		}
-		
-		/**
-		 * Returns the instantiated factory specified by the class property. 
-		 */
-		private IDetailPaneFactory getFactory(){
-			if (fFactory != null) return fFactory;
-			try{
-				Object obj = fConfigElement.createExecutableExtension(IConfigurationElementConstants.CLASS);
-				if(obj instanceof IDetailPaneFactory) {
-					fFactory = (IDetailPaneFactory)obj;
-				} else {
-					throw new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.INTERNAL_ERROR, "org.eclipse.debug.ui.detailFactories extension failed to load a detail factory because the specified class does not implement org.eclipse.debug.ui.IDetailPaneFactory.  Class specified was: " + obj, null)); //$NON-NLS-1$
-				}	
-			} catch (CoreException e){
-				DebugUIPlugin.log(e.getStatus());
-				fFactory = null;
-			}
-			return fFactory;
-		}
-		
-		/**
-		 * Checks if the enablement expression for the factory evaluates to true for the
-		 * given selection.
-		 */
-		public boolean isEnabled(IStructuredSelection selection) {
-			boolean enabled = false;
-			// Only the default factory should be enabled for null selections
-			if (selection == null || selection.isEmpty()){
-				return "org.eclipse.debug.ui.defaultDetailPaneFactory".equals(fConfigElement.getAttribute(IConfigurationElementConstants.ID)); //$NON-NLS-1$
-			}
-			Expression expression = getEnablementExpression();
-			if (expression != null) {
-				List list = selection.toList();
-				IEvaluationContext context = new EvaluationContext(null, list);
-				context.addVariable("selection", list); //$NON-NLS-1$
-				enabled = evalEnablementExpression(context, expression);
-			} else {
-				enabled = true;
-			}
-			return enabled;
-		}
-		
-		/**
-		 * Evaluate the given expression within the given context and return
-		 * the result. Returns <code>true</code> iff result is either TRUE or NOT_LOADED.
-		 * This allows optimistic inclusion of shortcuts before plug-ins are loaded.
-		 * Returns <code>false</code> if expression is <code>null</code>.
-		 * 
-		 * @param exp the enablement expression to evaluate or <code>null</code>
-		 * @param context the context of the evaluation. Usually, the
-		 *  user's selection.
-		 * @return the result of evaluating the expression
-		 */
-		private boolean evalEnablementExpression(IEvaluationContext context, Expression exp) {
-			try{
-				if (exp != null){
-					EvaluationResult result = exp.evaluate(context);
-					if (result == EvaluationResult.TRUE || result == EvaluationResult.NOT_LOADED){
-						return true;
-					}
-				}
-			} catch (CoreException e){
-				DebugUIPlugin.log(e.getStatus());
-			}
-			return false;
-		}
-		
-		/**
-		 * Returns an expression that represents the enablement logic for the
-		 * detail pane factory or <code>null</code> if none.
-		 * 
-		 * @return an evaluatable expression or <code>null</code>
-		 */
-		private Expression getEnablementExpression(){
-			// all of this stuff is optional, so...tedious testing is required
-			if (fEnablementExpression == null) {
-				try{
-					IConfigurationElement[] elements = fConfigElement.getChildren(ExpressionTagNames.ENABLEMENT);
-					IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-					if (enablement != null) {
-						fEnablementExpression = ExpressionConverter.getDefault().perform(enablement);
-					}
-				} catch (CoreException e){
-					DebugUIPlugin.log(e.getStatus());
-					fEnablementExpression = null;
-				}
-			}
-			return fEnablementExpression;
-		}
-	
-	}
-	
-	/**
-	 * There should only ever be once instance of this manager for the workbench.
-	 */
-	private static DetailPaneManager fgSingleton;
-	
-	/**
-	 * Maps the IDs of types of detail panes to the factory that can create them.
-	 * There can currently only be one factory for a given type of details pane.
-	 */
-	private Map fFactoriesByPaneID;
-	
-	/**
-	 * Maps a Set of detail pane id's to the one detail pane id that is preferred.
-	 */
-	private Map fPreferredDetailPanes;
-	
-	/**
-	 * The set of all factories that have been loaded from the extension point.
-	 */
-	private Collection fKnownFactories;
-	
-    /**
-     * Preference key for storing the preferred detail panes map.
-     * @see {@link #storePreferredDetailsAreas()}
-     * @see {@link #loadPreferredDetailsAreas()}
-     */
-    public static final String PREF_DETAIL_AREAS = "preferredDetailPanes"; //$NON-NLS-1$
-	
-	private DetailPaneManager(){
-		fFactoriesByPaneID = new HashMap();
-	}
-	
-	public static DetailPaneManager getDefault(){
-		if (fgSingleton == null) fgSingleton = new DetailPaneManager();
-		return fgSingleton;
-	}
-
-	/**
-	 * Returns the ID of the preferred detail pane for the given selection.
-	 * 
-	 * @param selection The selection to display in the detail pane
-	 * @return The ID of the preferred detail pane or null
-	 */
-	public String getPreferredPaneFromSelection(IStructuredSelection selection){
-		Collection possibleFactories = getEnabledFactories(selection);
-		Set possiblePaneIDs = getPossiblePaneIDs(possibleFactories, selection);
-		return chooseDetailsAreaIDInSet(possiblePaneIDs, possibleFactories, selection);
-	}
-	
-	/**
-	 * Returns the set of all possible detail panes the can display the given
-	 * selection.
-	 * 
-	 * @param selection The selection to display in the detail pane
-	 * @return The set of IDs of all possible detail panes for the given selection
-	 */
-	public Set getAvailablePaneIDs(IStructuredSelection selection){
-		Collection possibleFactories = getEnabledFactories(selection);
-		return getPossiblePaneIDs(possibleFactories, selection);
-	}
-	
-	/**
-	 * Given the ID of a details pane, this method will try to find the factory
-	 * that creates it and return an instantiation of that area.
-	 * <p>
-	 * This method will not call the init() method of the IDetailsPane.
-	 * </p>
-	 * 
-	 * @param ID The ID of the requested pane
-	 * @return The instantiated pane or null
-	 */
-	public IDetailPane getDetailPaneFromID(String ID){
-		IDetailPaneFactory factory = (IDetailPaneFactory)fFactoriesByPaneID.get(ID);
-		if (factory != null){
-			return factory.createDetailPane(ID);
-		}
-		return null;
-	}
-	
-	/**
-	 * Given the ID of a details pane, this method will try to find the factory
-	 * that creates it and ask it for the name of the details pane.
-	 * 
-	 * @param ID The ID of the requested pane
-	 * @return The name of the details pane or null
-	 */
-	public String getNameFromID(String ID){
-		IDetailPaneFactory factory = (IDetailPaneFactory)fFactoriesByPaneID.get(ID);
-		if (factory != null){
-			return factory.getDetailPaneName(ID);
-		}
-		return null;
-	}
-	
-	/**
-	 * Given the ID of a details pane, this method will try to find the factory
-	 * that creates it and ask it for the description of the details pane.
-	 * 
-	 * @param ID The ID of the requested pane
-	 * @return The description of the details pane or null
-	 */
-	public String getDescriptionFromID(String ID){
-		IDetailPaneFactory factory = (IDetailPaneFactory)fFactoriesByPaneID.get(ID);
-		if (factory != null){
-			return factory.getDetailPaneDescription(ID);
-		}
-		return null;
-	}
-	
-	
-	/**
-	 * Returns the set of IDetailPaneFactories (they will be DetailPaneFactoryDelegates) that were
-	 * contributed to the extension point and are enabled for the given selection
-	 * (enabled if the factory does not have an enablement expression or if the 
-	 * enablement expression evaluates to true).
-	 * 
-	 * @return The factories enabled for the selection or an empty collection.
-	 */
-	private Collection getEnabledFactories(IStructuredSelection selection){
-		Collection factoriesForSelection = new ArrayList();
-		if (fKnownFactories == null) initializeDetailFactories();
-		Iterator iter = fKnownFactories.iterator();
-		while (iter.hasNext()) {
-			IDetailPaneFactory currentFactory = (IDetailPaneFactory) iter.next();
-			if (currentFactory instanceof DetailPaneFactoryExtension){
-				if (((DetailPaneFactoryExtension)currentFactory).isEnabled(selection)){
-					factoriesForSelection.add(currentFactory);
-				}
-			}			
-		}	
-		return factoriesForSelection;
-	}
-	
-	/**
-	 * Produces the set of IDs for all possible detail panes that can be used to display
-	 * the given selection.
-	 *  
-	 * @param factoriesToQuery The collection of factories to check
-	 * @param selection The selection to be displayed
-	 * @return Set of pane IDs or an empty set
-	 */
-	private Set getPossiblePaneIDs(Collection factoriesToQuery, IStructuredSelection selection){
-		Set idsForSelection = new LinkedHashSet();
-		Iterator factoryIter = factoriesToQuery.iterator();
-		while (factoryIter.hasNext()) {
-			IDetailPaneFactory currentFactory = (IDetailPaneFactory) factoryIter.next();
-			Iterator detailAreaTypes = currentFactory.getDetailPaneTypes(selection).iterator();
-			while (detailAreaTypes.hasNext()) {
-				String currentAreaTypeID = (String) detailAreaTypes.next();
-				fFactoriesByPaneID.put(currentAreaTypeID, currentFactory);
-				idsForSelection.add(currentAreaTypeID);				
-			}			
-		}
-		return idsForSelection;
-	}
-
-	/**
-	 * Given a set of possible detail pane IDs, this method will determine which pane is
-	 * preferred and should be used to display the selection.  This method chooses a pane
-	 * by storing previous choices and can be set using a context menu.
-	 * 
-	 * @param possiblePaneIDs The set of possible detail pane IDs
-	 * @return The preferred detail pane ID or null
-	 */
-	private String chooseDetailsAreaIDInSet(Set possiblePaneIDs, Collection enabledFactories, IStructuredSelection selection){
-		if (possiblePaneIDs == null || possiblePaneIDs.isEmpty()){
-			return null;
-		}
-		
-		String preferredID = getUserPreferredDetailPane(possiblePaneIDs);
-		
-		if (preferredID == null){
-			// If there is no preferred pane already set, check the factories to see there is a default pane
-			Iterator factoryIterator = enabledFactories.iterator();
-			while (preferredID == null && factoryIterator.hasNext()) {
-				IDetailPaneFactory currentFactory = (IDetailPaneFactory) factoryIterator.next();
-				preferredID = currentFactory.getDefaultDetailPane(selection);
-			}
-			// If the factories don't have a default, try to choose the DefaultDetailPane
-			if (preferredID == null){			
-				Iterator paneIterator = possiblePaneIDs.iterator();
-				// If the DefaultDetailPane is not in the set, just use the first in the set
-				preferredID = (String)paneIterator.next();
-				while (paneIterator.hasNext() && preferredID != DefaultDetailPaneFactory.DEFAULT_DETAIL_PANE_ID) {
-					String currentID = (String) paneIterator.next();
-					if (currentID.equals(DefaultDetailPaneFactory.DEFAULT_DETAIL_PANE_ID)){
-						preferredID = currentID;
-					}
-				}
-			}
-			setPreferredDetailPane(possiblePaneIDs, preferredID);
-		}
-
-		return preferredID;
-	}
-	
-	/**
-	 * Initializes the collection of known factories from extension point contributions.
-	 */
-	private synchronized void initializeDetailFactories(){
-		if (fKnownFactories == null){
-			fKnownFactories = new ArrayList();
-			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_DETAIL_FACTORIES);
-			IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
-			DetailPaneFactoryExtension delegate = null;
-			for(int i = 0; i < infos.length; i++) {
-				delegate = new DetailPaneFactoryExtension(infos[i]);
-				fKnownFactories.add(delegate);
-			}		
-		}
-	}
-	
-	/**
-	 * Returns the preferred pane ID from the given set if the mapping has been set.
-	 * 
-	 * @param possibleDetailsAreaIDs Set of possible pane IDs
-	 * @return The preferred ID or null
-	 */
-	public String getUserPreferredDetailPane(Set possibleDetailsAreaIDs){
-		if (fPreferredDetailPanes == null){
-			loadPreferredDetailsAreas();
-		}
-		return (String)fPreferredDetailPanes.get(possibleDetailsAreaIDs);
-		
-	}
-	
-	/**
-	 * Adds or updates the mapping to set which pane ID is preferred for a certain
-	 * set of possible IDs.
-	 * 
-	 * @param possibleDetailsAreaIDs The set of possible IDs
-	 * @param preferredDetailsAreaID The preferred ID in the set.
-	 */
-	public void setPreferredDetailPane(Set possibleDetailsAreaIDs, String preferredDetailsAreaID){
-		if (possibleDetailsAreaIDs == null) return;
-		if (fPreferredDetailPanes == null){
-			loadPreferredDetailsAreas();
-		}
-		String currentKey = (String)fPreferredDetailPanes.get(possibleDetailsAreaIDs);
-		if (currentKey == null || !currentKey.equals(preferredDetailsAreaID)){
-			fPreferredDetailPanes.put(possibleDetailsAreaIDs, preferredDetailsAreaID);
-			storePreferredDetailsAreas();
-		}
-		
-	}
-	
-    /**
-     * Stores the map of preferred detail pane IDs to the preference store in the format:
-     * 
-     * Key1A,Key1B:Value1|Key2A,Key2B,Key2C:Value2| 
-     * 
-     * Where the sub keys (Key1A, Key1B, etc.) are the elements of the set used at the 
-     * key in the mapping and the values are the associated String value in the mapping.
-     */
-    private void storePreferredDetailsAreas() {
-        StringBuffer buffer= new StringBuffer();
-        Iterator iter = fPreferredDetailPanes.entrySet().iterator();
-        while (iter.hasNext()) {
-            Entry entry = (Entry) iter.next();
-            Iterator setIter = ((Set)entry.getKey()).iterator();
-            while (setIter.hasNext()) {
-				String currentID = (String) setIter.next();
-				buffer.append(currentID);
-				buffer.append(',');
-			}
-            buffer.deleteCharAt(buffer.length()-1);
-            buffer.append(':');
-            buffer.append(entry.getValue());
-            buffer.append('|');
-        }
-        DebugUIPlugin.getDefault().getPluginPreferences().setValue(PREF_DETAIL_AREAS, buffer.toString());
-    }
-    
-    /**
-     * Loads the map of preferred detail pane IDs from the preference store.
-     * 
-     * @see DetailPaneManager#storePreferredDetailsArea()
-     */
-    private void loadPreferredDetailsAreas() {
-    	fPreferredDetailPanes = new HashMap();
-    	String preferenceValue = DebugUIPlugin.getDefault().getPluginPreferences().getString(PREF_DETAIL_AREAS);
-    	StringTokenizer entryTokenizer = new StringTokenizer(preferenceValue,"|"); //$NON-NLS-1$
-    	while (entryTokenizer.hasMoreTokens()){
-    		String token = entryTokenizer.nextToken();
-    		int valueStart = token.indexOf(':');
-    		StringTokenizer keyTokenizer = new StringTokenizer(token.substring(0,valueStart),","); //$NON-NLS-1$
-    		Set keys = new LinkedHashSet();
-    		while (keyTokenizer.hasMoreTokens()){
-    			keys.add(keyTokenizer.nextToken());
-    		}
-    		fPreferredDetailPanes.put(keys, token.substring(valueStart+1));
-    	}
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailPaneProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailPaneProxy.java
deleted file mode 100644
index 9248a27..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/DetailPaneProxy.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
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.variables.details;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDetailPane;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * Acts as a proxy between a view and a detail pane. Controls how information is displayed 
- * in the details pane in a view.  Currently used by the variables, registers and expression 
- * views as well as the inspect popup dialog.  The different types of detail panes use the 
- * detailPaneFactories extension and must implement <code>IDetailPane</code>.  This class acts 
- * as a proxy to the current detail pane, each time the detail pane type changes, this class 
- * disposes of the old pane and creates the new one.  Uses a <code>DetailPaneManager</code> to
- * organize and find the panes to display.
- * 
- * @see IDetailPane
- * @see DetailPaneManager
- * @since 3.3
- */
-public class DetailPaneProxy {
-	
-	/**
-	 * The IDetailPane currently being used to display detailed information.
-	 */
-	private IDetailPane fCurrentPane;
-	
-	/**
-	 * The UI control that the current detail pane is using to display details.
-	 */
-	private Control fCurrentControl;
-	
-	/**
-	 * Detail pane container that the detail panes will be added to.
-	 */
-	private IDetailPaneContainer fParentContainer;
-	
-	/**
-	 * Constructor that sets up the detail pane for a view.  Note that no default pane
-	 * is created, so a control will not be created until <code>display</code> is called.
-	 * 
-	 * @param parent the detail pane container that is holding this detail pane
-	 */
-	public DetailPaneProxy(IDetailPaneContainer parent){
-		fParentContainer = parent;		
-	}
-
-	/**
-	 * Displays the given selection in the preferred detail pane for that type of selection.
-	 * Informs the parent container if the type of detail pane changes.
-	 * If a null or empty selection is passed and a current pane exists, that view will be cleared.
-	 * If a null or empty selection is passed and no pane exists, the default view is created.
-	 * 
-	 * @param selection The selection to display detailed information for
-	 */
-	public void display(IStructuredSelection selection){
-		
-		if ((selection == null || selection.isEmpty()) && fCurrentPane != null){
-			fCurrentPane.display(selection);
-			return;
-		}
-		
-		String preferredPaneID = DetailPaneManager.getDefault().getPreferredPaneFromSelection(selection);
-		
-		// Don't change anything if the preferred pane is the current pane
-		if (fCurrentPane != null && preferredPaneID != null && preferredPaneID.equals(fCurrentPane.getID())){
-			fCurrentPane.display(selection);
-			return;
-		}
-		
-		setupPane(preferredPaneID, selection);
-		
-		// Inform the container that a new detail pane is being used
-		fParentContainer.paneChanged(preferredPaneID);
-
-	}
-	
-	/**
-	 * Tells the current detail pane (if one exists) that it is gaining focus.
-	 * 
-	 * @return true if the current pane successfully set focus to a control, false otherwise
-	 */
-	public boolean setFocus(){
-		if (fCurrentPane != null){
-			return fCurrentPane.setFocus();
-		}
-		return false;
-	}
-	
-	/**
-	 * Disposes of the current pane.
-	 */
-	public void dispose(){
-		if (fCurrentPane != null)	fCurrentPane.dispose();
-		if (fCurrentControl != null && !fCurrentControl.isDisposed()) fCurrentControl.dispose();
-	}
-	
-	/**
-	 * Checks if the current pane supports the <code>IAdaptable</code> framework
-	 * and if so, calls its <code>getAdapter()</code> method.
-	 * @param required
-	 * @return
-	 */
-	public Object getAdapter(Class required){
-		if (fCurrentPane != null && fCurrentPane instanceof IAdaptable){
-			return ((IAdaptable)fCurrentPane).getAdapter(required);
-		}
-		else{
-			return null;
-		}
-	}
-	
-	public Control getCurrentControl(){
-		return fCurrentControl;
-	}
-	
-	public String getCurrentPaneID(){
-		if (fCurrentPane != null){
-			return fCurrentPane.getID();
-		}
-		return null;
-	}
-	
-	/**
-	 * Finds or creates an initialized detail pane with the given ID.  Asks the detail
-	 * pane to create the control and display the selection.  
-	 * 
-	 * @param paneID the ID of the pane to display in
-	 * @param selection the selection to display
-	 */
-	private void setupPane(String paneID, IStructuredSelection selection) {
-		if (fCurrentPane != null) fCurrentPane.dispose();
-		if (fCurrentControl != null && !fCurrentControl.isDisposed()) fCurrentControl.dispose();
-		if (paneID != null){
-			fCurrentPane = DetailPaneManager.getDefault().getDetailPaneFromID(paneID);
-			if (fCurrentPane != null){
-				fCurrentPane.init(fParentContainer.getWorkbenchPartSite());
-				fCurrentControl = fCurrentPane.createControl(fParentContainer.getParentComposite());
-				if (fCurrentControl != null){
-					fParentContainer.getParentComposite().layout(true);
-					fCurrentPane.display(selection);
-				} else{
-					createErrorLabel(DetailMessages.DetailPaneProxy_0);
-					DebugUIPlugin.log(new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "The detail pane \""+ fCurrentPane.getID() + "\" did not create and return a control."))); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			} else {
-				createErrorLabel(DetailMessages.DetailPaneProxy_0);
-				DebugUIPlugin.log(new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "Could not create the detail pane with ID " + paneID))); //$NON-NLS-1$
-			}
-		} else {
-			createErrorLabel(DetailMessages.DetailPaneProxy_1);
-			DebugUIPlugin.log(new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), "No detail panes could be found to display the current selection."))); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Creates a label in the detail pane area with the given message.
-	 * 
-	 * @param message The message to display
-	 */
-	private void createErrorLabel(String message){
-		if (fCurrentPane != null) fCurrentPane.dispose();
-		if (fCurrentControl != null && !fCurrentControl.isDisposed()) fCurrentControl.dispose();
-		Label errorLabel = new Label(fParentContainer.getParentComposite(),SWT.LEFT);
-		errorLabel.setText(message);
-		errorLabel.setLayoutData(new GridData(GridData.FILL_BOTH));
-		fCurrentControl = errorLabel;
-		fParentContainer.getParentComposite().layout();
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/IDetailPaneContainer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/IDetailPaneContainer.java
deleted file mode 100644
index 0c5f5cb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/details/IDetailPaneContainer.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.debug.internal.ui.views.variables.details;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPartSite;
-
-/**
- * Interface for UI elements that contain detail panes.  Provides access to 
- * information about the current detail pane and allows the container to be
- * informed of changes.
- *
- * @since 3.3
- * @see AvailableDetailPanesAction
- * @see DetailPaneProxy
- */
-public interface IDetailPaneContainer {
-
-	/**
-	 * Returns the string ID of the detail pane currently being displayed.
-	 * 
-	 * @return the ID of the current detail pane
-	 */
-	public String getCurrentPaneID();
-	
-	/**
-	 * Returns the selection to be displayed in the detail pane.
-	 * 
-	 * @return the selection to be displayed in the detail pane.
-	 */
-	public IStructuredSelection getCurrentSelection();
-	
-	/**
-	 * Returns the composite that detail panes will be added to.
-	 * 
-	 * @return the composite that detail panes will be added to
-	 */
-	public Composite getParentComposite();
-	
-	/**
-	 * Returns the workbench part site that the detail pane is in or <code>null</code>
-	 * if the detail pane is not in a workbench part site.
-	 * 
-	 * @return the workbench part site the detail pane is in or <code>null</code>
-	 */
-	public IWorkbenchPartSite getWorkbenchPartSite();
-	
-	/**
-	 * Refreshes the current detail pane with the current selection.
-	 */
-	public void refreshDetailPaneContents();
-	
-	/**
-	 * Informs the container that the type of detail pane being used has changed.
-	 * 
-	 * @param newPaneID ID of the new detail pane
-	 */
-	public void paneChanged(String newPaneID);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractBreakpointOrganizerDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractBreakpointOrganizerDelegate.java
deleted file mode 100644
index 438180c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractBreakpointOrganizerDelegate.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.debug.ui;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.breakpoints.OtherBreakpointCategory;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Common function for breakpoint organizer delegates.
- * <p>
- * Clients implementing <code>IBreakpointOrganizerDelegate</code> must subclass this class.
- * </p>
- * @since 3.1
- */
-public abstract class AbstractBreakpointOrganizerDelegate implements IBreakpointOrganizerDelegate {
-    
-    // property change listeners
-    private ListenerList fListeners = new ListenerList();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#addBreakpoint(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public void addBreakpoint(IBreakpoint breakpoint, IAdaptable category) {
-        // do noting, not supported by default
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener) {
-        fListeners.add(listener);
-    }
-    
-    /* (non-Javadoc)
-     * 
-     * Subclasses that override should return super.canAdd(...) when they are not able to add
-     * the breakpoint.
-     * 
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#canAdd(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public boolean canAdd(IBreakpoint breakpoint, IAdaptable category) {
-        return category instanceof OtherBreakpointCategory;
-    }
-    
-    /* (non-Javadoc)
-     * 
-     * Subclasses that override should return super.canRemove(...) when they are not able to remove
-     * the breakpoint.
-     * 
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#canRemove(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public boolean canRemove(IBreakpoint breakpoint, IAdaptable category) {
-        return category instanceof OtherBreakpointCategory;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#dispose()
-     */
-    public void dispose() {
-        fListeners = new ListenerList();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#removeBreakpoint(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.runtime.IAdaptable)
-     */
-    public void removeBreakpoint(IBreakpoint breakpoint, IAdaptable category) {
-        // do nothing, not supported by default
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener) {
-        fListeners.remove(listener);
-    }
-    
-    /**
-     * Fires a property change notification for the given category.
-     * 
-     * @param category category that has changed
-     */
-    protected void fireCategoryChanged(IAdaptable category) {
-        if (fListeners.isEmpty()) {
-            return;
-        }
-        final PropertyChangeEvent event = new PropertyChangeEvent(this, P_CATEGORY_CHANGED, category, null);
-        Object[] listeners = fListeners.getListeners();
-        for (int i = 0; i < listeners.length; i++) {
-            final IPropertyChangeListener listener = (IPropertyChangeListener) listeners[i];
-            ISafeRunnable runnable = new ISafeRunnable() {
-                public void handleException(Throwable exception) {
-                    DebugUIPlugin.log(exception);
-                }
-                public void run() throws Exception {
-                    listener.propertyChange(event);
-                }
-            };
-            SafeRunner.run(runnable);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.IBreakpointOrganizerDelegate#getCategories()
-     */
-    public IAdaptable[] getCategories() {
-        return null;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractDebugView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractDebugView.java
deleted file mode 100644
index dc5960e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractDebugView.java
+++ /dev/null
@@ -1,998 +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.debug.ui;
-
-
-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.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.LazyModelPresentation;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-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.preference.IPreferenceStore;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPartListener2;
-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.actions.ActionFactory;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Common function for views related to debugging. Clients implementing
- * views for a debugger should subclass this class. Common function 
- * includes:
- * <ul>
- * <li>Debug view adapter implementation - <code>IDebugView</code></li>
- * <li>Action registry - actions can be stored in this view
- * 		with a key. Actions that implement <code>IUpdate</code>
- *      are updated when <code>updateActions()</code> is
- *		called.</li>
- * <li>Hooks the context menu associated with this view's
- * 		underlying viewer and registers the menu with this
- * 		view's site, such that other plug-ins may contribute.</li>
- * <li>Hooks a key press listener, and invokes the
- * 		<code>REMOVE_ACTION</code> when the delete key 
- * 		is pressed.</li>
- * <li>Hooks a double-click listener, and invokes the
- * 		<code>DOUBLE_CLICK_ACTION</code> when the mouse 
- * 		is double-clicked.</li>
- * <li>Provides a mechanism for displaying an error message
- * 		in the view, via the <code>PageBookView</code> mechanism.
- * 		By default, a page book is created with a page showing
- * 		this view's viewer. A message page is also created
- * 		and shown when <code>showMessage(String)</code> is
- * 		called.</li>
- * <li>Notification when this view becomes visible and becomes
- * 		hidden via <code>becomesVisible()</code> and <code>becomesHidden()</code>.</li>
- * <li>Linking of a help context id via <code>getHelpContextId().</code></li>
- * </ul>
- * <p>
- * This class may be sub-classed.
- * </p>
- * @since 2.0
- */
-
-public abstract class AbstractDebugView extends PageBookView implements IDebugView, IDoubleClickListener {
-	
-	/**
-	 * Underlying viewer that displays the contents of
-	 * this view.
-	 */
-	private Viewer fViewer = null;
-	
-	/**
-	 * This view's message page.
-	 */
-	private MessagePage fMessagePage = null;
-	
-	/**
-	 * Map of actions. Keys are strings, values
-	 * are <code>IAction</code>.
-	 */
-	private Map fActionMap = null;
-	
-	/**
-	 * Map of actions. Keys are strings, values
-	 * are <code>IAction</code>.
-	 */
-	private List fUpdateables = null;
-	
-	/**
-	 * The collection of menu managers that are
-	 * relevant for this view.
-	 */
-	private List fContextMenuManagers;
-	
-	/**
-	 * The memento that was used to persist the state of this view.
-	 * May be <code>null</code>.
-	 */
-	private IMemento fMemento;
-	
-	/**
-	 * Whether this view is currently visible.
-	 */
-	private boolean fIsVisible = false;
-	
-	/**
-	 * The part listener for this view, used to notify this view when it
-	 * becomes visible and hidden. Set to <code>null</code> when this view isn't
-	 * currently listening to part changes.
-	 */
-	private DebugViewPartListener fPartListener= null;
-	
-	/**
-	 * A message was requested to be displayed before the view was fully
-	 * created. The message is cached until it can be properly displayed.
-	 */
-	private String fEarlyMessage= null;
-	
-	private static Set fgGlobalActionIds;
-	static {
-		fgGlobalActionIds = new HashSet();
-		fgGlobalActionIds.add(SELECT_ALL_ACTION);
-		fgGlobalActionIds.add(COPY_ACTION);
-		fgGlobalActionIds.add(CUT_ACTION);
-		fgGlobalActionIds.add(PASTE_ACTION);
-		fgGlobalActionIds.add(FIND_ACTION);
-		fgGlobalActionIds.add(ActionFactory.UNDO.getId());
-		fgGlobalActionIds.add(ActionFactory.REDO.getId());
-	}
-
-	/**
-	 * Part listener that disables updating when the view is not visible and
-	 * re-enables updating when the view appears.
-	 */
-	private class DebugViewPartListener implements IPartListener2 {
-		/**
-		 * 
-		 * @see org.eclipse.ui.IPartListener2#partVisible(IWorkbenchPartReference)
-		 */
-		public void partVisible(IWorkbenchPartReference ref) {
-			IWorkbenchPart part= ref.getPart(false);
-			if (part == AbstractDebugView.this) {
-				fIsVisible = true;
-				becomesVisible();
-			}
-		}
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partHidden(IWorkbenchPartReference)
-		 */
-		public void partHidden(IWorkbenchPartReference ref) {
-			IWorkbenchPart part= ref.getPart(false);
-			if (part == AbstractDebugView.this) {
-				fIsVisible = false;
-				becomesHidden();
-			}
-		}
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partActivated(IWorkbenchPartReference)
-		 */
-		public void partActivated(IWorkbenchPartReference ref) {
-		}
-
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(IWorkbenchPartReference)
-		 */
-		public void partBroughtToTop(IWorkbenchPartReference ref) {
-		}
-
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partClosed(IWorkbenchPartReference)
-		 */
-		public void partClosed(IWorkbenchPartReference ref) {
-		}
-
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partDeactivated(IWorkbenchPartReference)
-		 */
-		public void partDeactivated(IWorkbenchPartReference ref) {
-		}
-
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partOpened(IWorkbenchPartReference)
-		 */
-		public void partOpened(IWorkbenchPartReference ref) {
-		}
-		
-		/**
-		 * @see org.eclipse.ui.IPartListener2#partInputChanged(IWorkbenchPartReference)
-		 */
-		public void partInputChanged(IWorkbenchPartReference ref){
-		}
-
-	}	
-	
-	/**
-	 * Constructs a new debug view.
-	 */
-	public AbstractDebugView() {
-		fActionMap = new HashMap(5);
-		fUpdateables= new ArrayList(3);
-	}
-	
-	/**
-	 * Debug views implement the debug view adapter which
-	 * provides access to a view's underlying viewer and
-	 * debug model presentation for a specific debug model.
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 * @see IDebugView
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == IDebugView.class) {
-			return this;
-		}
-		if (adapter == IDebugModelPresentation.class) {
-			StructuredViewer viewer = getStructuredViewer();
-			if (viewer != null) {
-				IBaseLabelProvider labelProvider = viewer.getLabelProvider();
-				if (labelProvider instanceof IDebugModelPresentation) {
-					return labelProvider;
-				}
-			}
-		}
-		return super.getAdapter(adapter);
-	}
-	
-	/**
-	 * A page in this view's page book that contains this
-	 * view's viewer.
-	 */
-	class ViewerPage extends Page {
-		/**
-		 * @see IPage#createControl(Composite)
-		 */
-		public void createControl(Composite parent) {
-			Viewer viewer = createViewer(parent);
-			setViewer(viewer);			
-		}
-
-		/**
-		 * @see IPage#getControl()
-		 */
-		public Control getControl() {
-			return getDefaultControl();
-		}
-
-		/**
-		 * @see IPage#setFocus()
-		 */
-		public void setFocus() {
-			Viewer viewer= getViewer();
-			if (viewer != null) {
-				Control c = viewer.getControl();
-				if (!c.isFocusControl()) {
-					c.setFocus();
-				}
-			}
-		}
-
-}
-	
-	/**
-	 * Creates this view's underlying viewer and actions.
-	 * Hooks a pop-up menu to the underlying viewer's control,
-	 * as well as a key listener. When the delete key is pressed,
-	 * the <code>REMOVE_ACTION</code> is invoked. Hooks help to
-	 * this view. Subclasses must implement the following methods
-	 * which are called in the following order when a view is
-	 * created:<ul>
-	 * <li><code>createViewer(Composite)</code> - the context
-	 *   menu is hooked to the viewer's control.</li>
-	 * <li><code>createActions()</code></li>
-	 * <li><code>configureToolBar(IToolBarManager)</code></li>
-	 * <li><code>getHelpContextId()</code></li>
-	 * </ul>
-	 * @see IWorkbenchPart#createPartControl(Composite)
-	 * @see AbstractDebugView#createPartControl(Composite)
-	 * @see AbstractDebugView#createActions()
-	 * @see AbstractDebugView#configureToolBar(IToolBarManager)
-	 * @see AbstractDebugView#getHelpContextId()
-	 * @see AbstractDebugView#fillContextMenu(IMenuManager)
-	 */
-	public void createPartControl(Composite parent) {
-		registerPartListener();
-		super.createPartControl(parent);
-		createActions();
-		initializeToolBar();
-		Viewer viewer = getViewer();
-		if (viewer != null) {
-			createContextMenu(viewer.getControl());
-		}
-		String helpId = getHelpContextId();
-		if (helpId != null) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, helpId);
-		}
-		if (viewer != null) {
-			getViewer().getControl().addKeyListener(new KeyAdapter() {
-				public void keyPressed(KeyEvent e) {
-					handleKeyPressed(e);
-				}
-			});
-			if (getViewer() instanceof StructuredViewer) {
-				((StructuredViewer)getViewer()).addDoubleClickListener(this);	
-			}
-		}
-		// create the message page
-		setMessagePage(new MessagePage());
-		getMessagePage().createControl(getPageBook());
-		initPage(getMessagePage());
-		
-		if (fEarlyMessage != null) { //bug 28127
-			showMessage(fEarlyMessage);
-			fEarlyMessage= null;
-		}
-	}	
-	
-	/**
-	 * The default page for a debug view is its viewer.
-	 * 
-	 * @see PageBookView#createDefaultPage(PageBook)
-	 */
-	protected IPage createDefaultPage(PageBook book) {
-		ViewerPage page = new ViewerPage();
-		page.createControl(book);
-		initPage(page);
-		return page;
-	}	
-
-	/**
-	 * Creates and returns this view's underlying viewer.
-	 * The viewer's control will automatically be hooked
-	 * to display a pop-up menu that other plug-ins may
-	 * contribute to. Subclasses must override this method.
-	 * 
-	 * @param parent the parent control
-	 */
-	protected abstract Viewer createViewer(Composite parent);
-	
-	/**
-	 * Creates this view's actions. Subclasses must
-	 * override this method, which is called after
-	 * <code>createViewer(Composite)</code>
-	 */
-	protected abstract void createActions();	
-	
-	/**
-	 * Returns this view's help context id, which is hooked
-	 * to this view on creation.
-	 * 
-	 * @return help context id
-	 */
-	protected abstract String getHelpContextId();
-	
-	/**
-	 * @see IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		saveAllCheckedActionStates();
-		deregisterPartListener();
-		if (getViewer() instanceof StructuredViewer) {
-			((StructuredViewer)getViewer()).removeDoubleClickListener(this);
-		}
-		setViewer(null);
-		fActionMap.clear();
-		super.dispose();
-	}
-	
-	/**
-	 * Saves the checked state for all actions contributed to the toolbar
-	 * manager that function as a toggle action.  The states are saved in
-	 * the Debug UI plugin's preference store.
-	 * 
-	 * @since 2.1
-	 */
-	protected void saveAllCheckedActionStates() {
-		IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
-		IContributionItem[] items= tbm.getItems();
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem iContributionItem = items[i];
-			if (iContributionItem instanceof ActionContributionItem) {
-				ActionContributionItem item= (ActionContributionItem)iContributionItem;
-				IAction action= item.getAction();
-				if (action.getStyle() == IAction.AS_CHECK_BOX && action.isEnabled()) {
-					saveCheckedActionState(action);					
-				}
-			}		
-		}		
-	}
-	
-	/**
-	 * Save the checked state of the specified action in the Debug UI plugin's
-	 * preference store.  The specified action is expected to be enabled and
-	 * support the style <code>IAction.AS_CHECK_BOX</code>.
-	 * 
-	 * @param action the enabled, toggle action whose checked state will be
-	 * saved in preferences
-	 * @since 2.1
-	 */
-	protected void saveCheckedActionState(IAction action) {
-		String prefKey = generatePreferenceKey(action);
-		IPreferenceStore prefStore = getPreferenceStore();
-		prefStore.setValue(prefKey, action.isChecked());
-	}
-	
-	/**
-	 * Generate a String that can be used as a key into a preference store based
-	 * on the specified action.  The resulting String will be unique across
-	 * views.
-	 * 
-	 * @return a String suitable for use as a preference store key for the given
-	 * action
-	 * @since 2.1
-	 */
-	protected String generatePreferenceKey(IAction action) {
-		return getViewSite().getId() + '+' + action.getId();		
-	}
-	
-	/**
-	 * Convenience method to return the preference store for the Debug UI
-	 * plug-in.
-	 * 
-	 * @return the preference store for the Debug UI plug-in
-	 * @since 2.1
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return DebugUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * @see IDebugView#getViewer()
-	 */
-	public Viewer getViewer() {
-		return fViewer;
-	}
-	
-	/**
-	 * Returns this view's viewer as a structured viewer,
-	 * or <code>null</code> if none.
-	 * 
-	 * @return this view's viewer as a structured viewer
-	 * 	or <code>null</code>
-	 */
-	protected StructuredViewer getStructuredViewer() {
-		if (getViewer() instanceof StructuredViewer) {
-			return (StructuredViewer)getViewer();
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns this view's viewer as a text viewer,
-	 * or <code>null</code> if none.
-	 * 
-	 * @return this view's viewer as a text viewer
-	 * 	or <code>null</code>
-	 */
-	protected TextViewer getTextViewer() {
-		if (getViewer() instanceof TextViewer) {
-			return (TextViewer)getViewer();
-		}
-		return null;
-	}	
-	
-	/**
-	 * @see IDebugView#getPresentation(String)
-	 */
-	public IDebugModelPresentation getPresentation(String id) {
-		if (getViewer() instanceof StructuredViewer) {
-			IBaseLabelProvider lp = ((StructuredViewer)getViewer()).getLabelProvider();
-			if (lp instanceof DelegatingModelPresentation) {
-				return ((DelegatingModelPresentation)lp).getPresentation(id);
-			}
-			if (lp instanceof LazyModelPresentation) {
-				if (((LazyModelPresentation)lp).getDebugModelIdentifier().equals(id)) {
-					return (IDebugModelPresentation)lp;
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Creates a pop-up menu on the given control. The menu
-	 * is registered with this view's site, such that other
-	 * plug-ins may contribute to the menu. Subclasses should
-	 * call this method, specifying the menu control as the
-	 * control used in their viewer (for example, tree viewer).
-	 * Subclasses must implement the method
-	 * <code>#fillContextMenu(IMenuManager)</code> which will
-	 * be called each time the context menu is realized.
-	 * 
-	 * @param menuControl the control with which the pop-up
-	 *  menu will be associated with.
-	 */
-	protected void createContextMenu(Control menuControl) {
-		MenuManager menuMgr= new MenuManager("#PopUp"); //$NON-NLS-1$
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager mgr) {
-				fillContextMenu(mgr);
-			}
-		});
-		Menu menu= menuMgr.createContextMenu(menuControl);
-		menuControl.setMenu(menu);
-
-		// register the context menu such that other plug-ins may contribute to it
-		if (getSite() != null) {
-			getSite().registerContextMenu(menuMgr, getViewer());
-		}
-		addContextMenuManager(menuMgr);
-	}
-	
-	/**
-	 * @see IDebugView#getContextMenuManager()
-	 * 
-	 * @deprecated @see AbstractDebugView.getContextMenuManagers()
-	 */
-	public IMenuManager getContextMenuManager() {
-		if (fContextMenuManagers != null) {
-			fContextMenuManagers.get(fContextMenuManagers.size() - 1);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the context menu managers relevant to this view.
-	 * 
-	 * @return the context menu managers relevant to this view
-	 * @since 2.1
-	 */
-	public List getContextMenuManagers() {
-		return fContextMenuManagers;
-	}
-	
-	/**
-	 * Subclasses must override this method to fill the context
-	 * menu each time it is realized.
-	 * 
-	 * @param menu the context menu
-	 */
-	protected abstract void fillContextMenu(IMenuManager menu);	
-	
-	/**
-	 * Configures this view's toolbar. Subclasses implement
-	 * <code>#configureToolBar(IToolBarManager)</code> to
-	 * contribute actions to the toolbar.
-	 * <p>
-	 * To properly initialize toggle actions that are contributed
-	 * to this view, state is restored for toggle actions that have
-	 * a persisted state in the Debug UI plugin's preferences.  As well, any
-	 * toggle actions that have an initial state of 'checked' are invoked. The
-	 * actions' states are restored and the actions are invoked in a runnable,
-	 * after the view is created.
-	 * </p>
-	 */
-	protected void initializeToolBar() {
-		final IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
-		configureToolBar(tbm);
-		getViewSite().getActionBars().updateActionBars();
-		
-		// This is done in a runnable to be run after this view's pane
-		// is created
-		Runnable r = new Runnable() {
-			public void run() {
-				if (!isAvailable()) {
-					return;
-				}
-				IContributionItem[] items = tbm.getItems();
-				if (items != null) {
-					for (int i = 0; i < items.length; i++) {
-						if (items[i] instanceof ActionContributionItem) {
-							IAction action = ((ActionContributionItem)items[i]).getAction();
-							if (action.getStyle() == IAction.AS_CHECK_BOX) {
-								initActionState(action);	
-								if (action.isChecked()) {
-									action.run();
-								}
-							}
-						}
-					}
-					setMemento(null);
-				}
-				updateObjects();
-			}
-		};
-		asyncExec(r);
-	}
-	
-	/**
-	 * Restores the persisted checked state of the specified action that was
-	 * stored in preferences. If the action is disabled, its persisted state
-	 * is not restored (because a disabled action cannot be run).
-	 * 
-	 * @param action the action whose checked state will be restored
-	 * @since 2.1
-	 */
-	protected void initActionState(IAction action) {
-		String id = action.getId();
-		if (id != null && action.isEnabled()) {
-			String prefKey = generatePreferenceKey(action);
-			boolean checked = getPreferenceStore().getBoolean(prefKey);
-			action.setChecked(checked);
-		}
-	}
-
-	/**
-	 * @see IViewPart#init(IViewSite, IMemento)
-	 */
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		//store the memento to be used when this view is created.
-		setMemento(memento);
-	}	 
-
-	/**
-	 * Sets the viewer for this view.
-	 * 
-	 * @param viewer viewer
-     * @since 3.1
-	 */
-	protected void setViewer(Viewer viewer) {
-		fViewer = viewer;
-	}
-	
-	/**
-	 * Subclasses implement this menu to contribute actions
-	 * to the toolbar. This method is called after 
-	 * <code>createActions()</code>.
-	 * 
-	 * @param tbm the tool bar manager for this view's site
-	 * @see #createViewer(Composite)
-	 */
-	protected abstract void configureToolBar(IToolBarManager tbm);	
-	
-	/**
-	 * @see IDebugView#setAction(String, IAction)
-	 */
-	public void setAction(String actionID, IAction action) {
-		if (action == null) {
-			Object removedAction= fActionMap.remove(actionID);
-			fUpdateables.remove(removedAction);
-		} else {
-			fActionMap.put(actionID, action);
-			if (action instanceof IUpdate) {
-				fUpdateables.add(action);
-			}
-		}
-		if (fgGlobalActionIds.contains(actionID)) {
-			IActionBars actionBars = getViewSite().getActionBars();	
-			actionBars.setGlobalActionHandler(actionID, action);
-		}
-	}	
-	
-	/**
-	 * @see IDebugView#getAction(String)
-	 */
-	public IAction getAction(String actionID) {
-		return (IAction) fActionMap.get(actionID);
-	}
-	
-	/**
-	 * Updates all the registered updatables.
-	 */
-	public void updateObjects() {
-		Iterator actions = fUpdateables.iterator();
-		while (actions.hasNext()) {
-			((IUpdate)actions.next()).update();
-		}
-	}
-			
-	/**
-	 * Handles key events in viewer. Invokes
-	 * <ol> 
-	 * <li><code>REMOVE_ACTION</code> when the delete
-	 * key is pressed</li>
-	 */
-	protected void handleKeyPressed(KeyEvent event) {
-		if (event.character == SWT.DEL && event.stateMask == 0) {
-			IAction action = getAction(REMOVE_ACTION);
-			if (action != null && action.isEnabled()) {
-				action.run();
-			}
-		}
-	}	
-	
-	/**
-	 * Delegate to the <code>DOUBLE_CLICK_ACTION</code>,
-	 * if any.
-	 *  
-	 * @see IDoubleClickListener#doubleClick(DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		IAction action = getAction(DOUBLE_CLICK_ACTION);
-		if (action != null && !event.getSelection().isEmpty() && action.isEnabled()) {
-			action.run();
-		}
-	}	
-	
-	/**
-	 * Registers the given runnable with the display
-	 * associated with this view's control, if any.
-	 * 
-	 * @see org.eclipse.swt.widgets.Display#asyncExec(java.lang.Runnable)
-	 */
-	public void asyncExec(Runnable r) {
-		if (isAvailable()) {
-			getControl().getDisplay().asyncExec(r);
-		}
-	}
-	
-	/**
-	 * Returns the control for this view, or <code>null</code> if none.
-	 * 
-	 * @return the control for this view, or <code>null</code> if none
-	 * @since 3.0
-	 */
-	protected Control getControl() {
-		return getViewer().getControl();
-	}
-	
-	/**
-	 * Registers the given runnable with the display
-	 * associated with this view's control, if any.
- 	 *
-	 * @see org.eclipse.swt.widgets.Display#syncExec(java.lang.Runnable)
-	 */
-	public void syncExec(Runnable r) {
-		if (isAvailable()) {
-			getControl().getDisplay().syncExec(r);
-		}
-	}	
-	
-	/**
-	 * Returns the memento that contains the persisted state of
-	 * the view.  May be <code>null</code>.
-	 */
-	protected IMemento getMemento() {
-		return fMemento;
-	}
-
-	/** 
-	 * Sets the memento that contains the persisted state of the 
-	 * view.
-	 */
-	protected void setMemento(IMemento memento) {
-		fMemento = memento;
-	}
-	
-	/**
-	 * Returns the specified view in this view's page
-	 * or <code>null</code> if none.
-	 * 
-	 * @param id view identifier
-	 * @return view part
-	 */
-	protected IViewPart findView(String id) {
-		IWorkbenchPage page = getSite().getPage();
-		IViewPart view = null;
-		if (page != null) {
-			view = page.findView(id);
-		}
-		return view;	
-	}
-	
-	/**
-	 * @see PageBookView#isImportant(IWorkbenchPart)
-	 */
-	protected boolean isImportant(IWorkbenchPart part) {
-		return false;
-	}
-
-	/**
-	 * @see PageBookView#doCreatePage(IWorkbenchPart)
-	 */
-	protected PageRec doCreatePage(IWorkbenchPart part) {
-		return null;
-	}
-
-	/**
-	 * @see PageBookView#doDestroyPage(org.eclipse.ui.IWorkbenchPart, org.eclipse.ui.part.PageBookView.PageRec)
-	 */
-	protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
-	}
-
-	/**
-	 * @see PageBookView#getBootstrapPart()
-	 */
-	protected IWorkbenchPart getBootstrapPart() {
-		return null;
-	}
-
-	/**
-	 * Returns the default control for this view. By default,
-	 * this view's viewer's control is returned. Subclasses
-	 * should override if required - for example, if this
-	 * view has its viewer nested inside other controls.
-	 * 
-	 * @return this view's default control.
-	 */ 
-	protected Control getDefaultControl() {
-		Viewer viewer = getViewer();
-		if (viewer != null) {
-			return viewer.getControl();
-		} 
-		return null;
-	}
-	
-	/**
-	 * Sets this view's message page
-	 * 
-	 * @param page message page
-	 */
-	private void setMessagePage(MessagePage page) {
-		fMessagePage = page;
-	}
-	
-	/**
-	 * Returns this view's message page
-	 * 
-	 * @return message page
-	 */
-	protected MessagePage getMessagePage() {
-		return fMessagePage;
-	}	
-	
-	/**
-	 * Shows the given message in this view's message'
-	 * page. Makes the message page the visible page.
-	 * 
-	 * @param message the message to display
-	 */
-	public void showMessage(String message) {
-		if (getPageBook().isDisposed()) {
-			return;
-		}
-		if (getMessagePage() == null) {
-			//not fully created yet
-			fEarlyMessage= message;
-			return;
-		}
-		getMessagePage().setMessage(message);
-		getPageBook().showPage(getMessagePage().getControl());
-	}
-	
-	/**
-	 * Shows this view's viewer page.
-	 */
-	public void showViewer() {
-		if (getPageBook().isDisposed()) {
-			return;
-		}
-		getPageBook().showPage(getDefaultPage().getControl());
-	}
-	
-	/**
-	 * Returns whether this view's viewer is
-	 * currently available.
-	 * 
-	 * @return whether this view's viewer is
-	 * currently available
-	 */
-	public boolean isAvailable() {
-		return !(getViewer() == null || getViewer().getControl() == null || getViewer().getControl().isDisposed());
-	}	
-	/**
-	 * @see IDebugView#add(IUpdate)
-	 */
-	public void add(IUpdate updatable) {
-		if (!fUpdateables.contains(updatable)) {
-			fUpdateables.add(updatable);
-		}
-	}
-
-	/**
-	 * @see IDebugView#remove(IUpdate)
-	 */
-	public void remove(IUpdate updatable) {
-		fUpdateables.remove(updatable);
-	}
-	
-	/**
-	 * Adds a context menu manager that is relevant to this view.
-	 * @param contextMenuManager The contextMenuManager to add
-	 * 
-	 * @since 2.1
-	 */
-	public void addContextMenuManager(IMenuManager contextMenuManager) {
-		if (fContextMenuManagers == null) {
-			fContextMenuManagers= new ArrayList();
-		}
-		fContextMenuManagers.add(contextMenuManager);
-	}
-	
-	/**
-	 * Notification this view is now visible.
-	 * 
-	 * @since 2.1
-	 */
-	protected void becomesVisible() {
-	}
-	
-	/**
-	 * Notification this view is now hidden.
-	 * 
-	 * @since 2.1
-	 */
-	protected void becomesHidden() {
-	}
-	
-	/**
-	 * Returns whether this view is currently visible.
-	 * 
-	 * @return whether this view is currently visible
-	 * @since 2.1
-	 */
-	public boolean isVisible() {
-		return fIsVisible;
-	}
-	
-	/**
-	 * Creates and registers a part listener with this event handler's page,
-	 * if one does not already exist.
-	 * 
-	 * @since 2.1
-	 */
-	protected void registerPartListener() {
-		if (fPartListener == null) {
-			fPartListener= new DebugViewPartListener();
-			getSite().getPage().addPartListener(fPartListener);
-		}
-	}
-
-	/**
-	 * Unregisters and disposes this event handler's part listener.
-	 * 
-	 * @since 2.1
-	 */
-	protected void deregisterPartListener() {
-		if (fPartListener != null) {
-			getSite().getPage().removePartListener(fPartListener);
-			fPartListener = null;
-		}
-	}	
-
-	/**
-	 * Returns a map of the current attribute settings in the model
-	 * presentation in this view associated with the given debug model.
-	 * 
-	 * @return a map of the current attribute settings in the model
-	 * presentation in this view associated with the given debug model
-	 * @since 3.0
-	 */
-	public Map getPresentationAttributes(String modelId) {
-		IDebugModelPresentation presentation = getPresentation(modelId);
-		if (presentation instanceof DelegatingModelPresentation) {
-			return ((DelegatingModelPresentation)presentation).getAttributeMap();
-		} else if (presentation instanceof LazyModelPresentation) {
-			return ((LazyModelPresentation)presentation).getAttributeMap();
-		}
-		return new HashMap();
-	}
-}	
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractLaunchConfigurationTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractLaunchConfigurationTab.java
deleted file mode 100644
index d7c4385..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractLaunchConfigurationTab.java
+++ /dev/null
@@ -1,374 +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.debug.ui;
-
- 
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.swt.SWT;
-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.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Common function for launch configuration tabs.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @see ILaunchConfigurationTab
- * @since 2.0
- */
-public abstract class AbstractLaunchConfigurationTab implements ILaunchConfigurationTab {
-//	 TODO Add in access methods for createGroup, createLabel and createSingleText from SWTFactory post 3.2 API freeze
-	
-	/**
-	 * The control for this page, or <code>null</code>
-	 */
-	private Control fControl;
-
-	/**
-	 * The launch configuration dialog this tab is
-	 * contained in.
-	 */
-	private ILaunchConfigurationDialog fLaunchConfigurationDialog;
-	
-	/**
-	 * Current error message, or <code>null</code>
-	 */
-	private String fErrorMessage;
-	
-	/**
-	 * Current message, or <code>null</code>
-	 */
-	private String fMessage;
-	
-	/**
-	 * Whether this tab needs to apply changes. This attribute is initialized to
-	 * <code>true</code> to be backwards compatible. If clients want to take advantage
-	 * of such a feature, they should set the flag to false, and check it before
-	 * applying changes to the launch configuration working copy.
-	 * 
-	 * @since 2.1
-	 */
-	private boolean fDirty = true;	
-		
-	/**
-	 * Returns the dialog this tab is contained in, or
-	 * <code>null</code> if not yet set.
-	 * 
-	 * @return launch configuration dialog, or <code>null</code>
-	 */
-	protected ILaunchConfigurationDialog getLaunchConfigurationDialog() {
-		return fLaunchConfigurationDialog;
-	}	
-		
-	/**
-	 * Updates the buttons and message in this page's launch
-	 * configuration dialog.
-	 */
-	protected void updateLaunchConfigurationDialog() {
-		if (getLaunchConfigurationDialog() != null) {
-			//order is important here due to the call to 
-			//refresh the tab viewer in updateButtons()
-			//which ensures that the messages are up to date
-			getLaunchConfigurationDialog().updateButtons();
-			getLaunchConfigurationDialog().updateMessage();
-		}
-	}
-				
-	/**
-	 * @see ILaunchConfigurationTab#getControl()
-	 */
-	public Control getControl() {
-		return fControl;
-	}
-
-	/**
-	 * Sets the control to be displayed in this tab.
-	 * 
-	 * @param control the control for this tab
-	 */
-	protected void setControl(Control control) {
-		fControl = control;
-	}
-
-	/**
-	 * @see ILaunchConfigurationTab#getErrorMessage()
-	 */
-	public String getErrorMessage() {
-		return fErrorMessage;
-	}
-
-	/**
-	 * @see ILaunchConfigurationTab#getMessage()
-	 */
-	public String getMessage() {
-		return fMessage;
-	}
-
-	/**
-	 * By default, do nothing.
-	 * 
-	 * @see ILaunchConfigurationTab#launched(ILaunch)
-	 * @deprecated
-	 */
-	public void launched(ILaunch launch) {
-	}
-
-	/**
-	 * @see ILaunchConfigurationTab#setLaunchConfigurationDialog(ILaunchConfigurationDialog)
-	 */
-	public void setLaunchConfigurationDialog(ILaunchConfigurationDialog dialog) {
-		fLaunchConfigurationDialog = dialog;
-	}
-	
-	/**
-	 * Sets this page's error message, possibly <code>null</code>.
-	 * 
-	 * @param errorMessage the error message or <code>null</code>
-	 */
-	protected void setErrorMessage(String errorMessage) {
-		fErrorMessage = errorMessage;
-	}
-
-	/**
-	 * Sets this page's message, possibly <code>null</code>.
-	 * 
-	 * @param message the message or <code>null</code>
-	 */
-	protected void setMessage(String message) {
-		fMessage = message;
-	}
-	
-	/**
-	 * Convenience method to return the launch manager.
-	 * 
-	 * @return the launch manager
-	 */
-	protected ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}	
-	
-	/**
-	 * By default, do nothing.
-	 * 
-	 * @see ILaunchConfigurationTab#dispose()
-	 */
-	public void dispose() {
-	}
-	
-	/**
-	 * Returns the shell this tab is contained in, or <code>null</code>.
-	 * 
-	 * @return the shell this tab is contained in, or <code>null</code>
-	 */
-	protected Shell getShell() {
-		Control control = getControl();
-		if (control != null) {
-			return control.getShell();
-		}
-		return null;
-	}
-	
-	/**
-	 * Creates and returns a new push button with the given
-	 * label and/or image.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * @param image image of <code>null</code>
-	 * 
-	 * @return a new push button
-	 */
-	protected Button createPushButton(Composite parent, String label, Image image) {
-		return SWTFactory.createPushButton(parent, label, image);	
-	}
-	
-	/**
-	 * Creates and returns a new radio button with the given
-	 * label and/or image.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * 
-	 * @return a new radio button
-	 */
-	protected Button createRadioButton(Composite parent, String label) {
-		return SWTFactory.createRadioButton(parent, label);	
-	}	
-	
-	/**
-	 * Creates and returns a new check button with the given
-	 * label.
-	 * 
-	 * @param parent the parent composite
-	 * @param label the button label
-	 * @return a new check button
-	 * @since 3.0
-	 */
-	protected Button createCheckButton(Composite parent, String label) {
-		return SWTFactory.createCheckButton(parent, label, null, false, 1);
-	}
-	
-	/**
-	 * @see ILaunchConfigurationTab#canSave()
-	 */
-	public boolean canSave() {
-		return true;
-	}
-	
-	/**
-	 * @see ILaunchConfigurationTab#isValid(ILaunchConfiguration)
-	 */
-	public boolean isValid(ILaunchConfiguration launchConfig) {
-		return true;
-	}
-
-	/**
-	 * Creates vertical space in the parent <code>Composite</code>
-	 * @param comp the parent to add the vertical space to
-	 * @param colSpan the number of line of vertical space to add
-	 */
-	protected void createVerticalSpacer(Composite comp, int colSpan) {
-		SWTFactory.createVerticalSpacer(comp, colSpan);
-	}	
-	
-	/**
-	 * Create a horizontal separator.
-	 * 
-	 * @param comp parent widget
-	 * @param colSpan number of columns to span
-	 * @since 3.0
-	 */
-	protected void createSeparator(Composite comp, int colSpan) {
-		Label label = new Label(comp, SWT.SEPARATOR | SWT.HORIZONTAL);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = colSpan;
-		label.setLayoutData(gd);
-	}	
-		
-	/**
-	 * @see ILaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return null;
-	}
-	
-	/**
-	 * Returns this tab's unique identifier or <code>null</code> if none.
-	 * By default, <code>null</code> is returned. Subclasses should override
-	 * as necessary.
-	 * <p>
-	 * Tab identifiers allow contributed tabs to be ordered relative to one
-	 * another.
-	 * </p>
-	 * @return tab id or <code>null</code>
-	 * @since 3.3
-	 */
-	public String getId() {
-		return null;
-	}
-	
-	/**
-	 * Convenience method to set a boolean attribute of on a launch
-	 * configuration. If the value being set is the default, the attribute's
-	 * value is set to <code>null</code>.
-	 * 
-	 * @param attribute attribute identifier
-	 * @param configuration the configuration on which to set the attribute
-	 * @param value the value of the attribute
-	 * @param defaultValue the default value of the attribute
-	 * @since 2.1
-	 */
-	protected void setAttribute(String attribute, ILaunchConfigurationWorkingCopy configuration, boolean value, boolean defaultValue) {
-		if (value == defaultValue) {
-			configuration.setAttribute(attribute, (String)null);
-		} else {
-			configuration.setAttribute(attribute, value);
-		}
-	}
-
-
-
-	/**
-	 * Returns whether this tab is dirty. It is up to clients to set/reset and consult
-	 * this attribute as required. By default, a tab is initialized to dirty.
-	 * 
-	 * @return whether this tab is dirty
-	 * @since 2.1
-	 */
-	protected boolean isDirty() {
-		return fDirty;
-	}
-
-	/**
-	 * Sets the dirty state of the tab. It is up to clients to set/reset and consult
-	 * this attribute as required. By default, a tab is initialized to dirty.
-	 * 
-	 * @param dirty whether this tab is dirty
-	 * @since 2.1
-	 */
-	protected void setDirty(boolean dirty) {
-		fDirty = dirty;
-	}
-	
-	/**
-	 * This method was added to the <code>ILaunchConfigurationTab</code> interface
-	 * in the 3.0 release to allow tabs to distinguish between a tab being activated
-	 * and a tab group be initialized for the first time, from a selected launch
-	 * configuration. To maintain backwards compatible behavior, the default
-	 * implementation provided, calls this tab's <code>initializeFrom</code> method.
-	 * Tabs should override this method as required.
-	 * <p>
-	 * The launch tab framework was originally designed to take care of inter tab
-	 * communication by applying attributes from the active tab to the launch configuration
-	 * being edited, when a tab is exited, and by initializing a tab when activated.
-	 * The addition of the methods <code>activated</code> and <code>deactivated</code>
-	 * allow tabs to determine the appropriate course of action. 
-	 * </p>
-	 * 
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 * @since 3.0
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
-		initializeFrom(workingCopy);
-	}
-
-	/**
-	 * This method was added to the <code>ILaunchConfigurationTab</code> interface
-	 * in the 3.0 release to allow tabs to distinguish between a tab being deactivated
-	 * and saving its attributes to a launch configuration. To maintain backwards
-	 * compatible behavior, the default implementation provided, calls this tab's
-	 * <code>performApply</code> method. Tabs should override this method as required.
-	 * <p>
-	 * The launch tab framework was originally designed to take care of inter tab
-	 * communication by applying attributes from the active tab to the launch configuration
-	 * being edited, when a tab is exited, and by initializing a tab when activated.
-	 * The addition of the methods <code>activated</code> and <code>deactivated</code>
-	 * allow tabs to determine the appropriate course of action. 
-	 * </p>
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 * @since 3.0
-	 */
-	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
-		performApply(workingCopy);
-	}
-
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractLaunchConfigurationTabGroup.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractLaunchConfigurationTabGroup.java
deleted file mode 100644
index defae2d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/AbstractLaunchConfigurationTabGroup.java
+++ /dev/null
@@ -1,115 +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.debug.ui;
-
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-
-/**
- * Common function for launch configuration tab groups.
- * Generally, a launch configuration tab group will subclass
- * this class, and define a method to create and set the tabs
- * in that group.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @see ILaunchConfigurationTabGroup
- * @since 2.0
- */
-public abstract class AbstractLaunchConfigurationTabGroup implements ILaunchConfigurationTabGroup {
-	
-	/**
-	 * The tabs in this tab group, or <code>null</code> if not yet instantiated.
-	 */
-	protected ILaunchConfigurationTab[] fTabs = null;
-
-	/**
-	 * @see ILaunchConfigurationTabGroup#getTabs()
-	 */
-	public ILaunchConfigurationTab[] getTabs() {
-		return fTabs;
-	}
-	
-	/**
-	 * Sets the tabs in this group
-	 * 
-	 * @param tabs the tabs in this group
-	 */
-	protected void setTabs(ILaunchConfigurationTab[] tabs) {
-		fTabs = tabs;
-	}
-
-	/**
-	 * By default, dispose all the tabs in this group.
-	 * 
-	 * @see ILaunchConfigurationTabGroup#dispose()
-	 */
-	public void dispose() {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		if (tabs != null) {
-			for (int i = 0; i < tabs.length; i++) {
-				tabs[i].dispose();
-			}
-		}
-	}
-
-	/**
-	 * By default, delegate to all of the tabs in this group.
-	 * 
-	 * @see ILaunchConfigurationTabGroup#setDefaults(ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		for (int i = 0; i < tabs.length; i++) {
-			tabs[i].setDefaults(configuration);
-		}		
-	}
-
-	/** 
-	 * By default, delegate to all of the tabs in this group.
-	 * 
-	 * @see ILaunchConfigurationTabGroup#initializeFrom(ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		for (int i = 0; i < tabs.length; i++) {
-			tabs[i].initializeFrom(configuration);
-		}		
-	}
-
-	/**
-	 * By default, delegate to all of the tabs in this group.
-	 * 
-	 * @see ILaunchConfigurationTabGroup#performApply(ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		for (int i = 0; i < tabs.length; i++) {
-			tabs[i].performApply(configuration);
-		}		
-	}
-
-	/**
-	 * By default, delegate to all of the tabs in this group.
-	 * 
-	 * @see ILaunchConfigurationTabGroup#launched(ILaunch)
-	 * @deprecated
-	 */
-	public void launched(ILaunch launch) {
-		ILaunchConfigurationTab[] tabs = getTabs();
-		for (int i = 0; i < tabs.length; i++) {
-			tabs[i].launched(launch);
-		}		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/BreakpointTypeCategory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/BreakpointTypeCategory.java
deleted file mode 100644
index 32e60a0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/BreakpointTypeCategory.java
+++ /dev/null
@@ -1,109 +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.debug.ui;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Default implementation for a breakpoint type category.
- * <p>
- * Clients providing breakpoint type category adapters may instantiate
- * and subclass this class.
- * </p>
- * @since 3.1
- */
-public class BreakpointTypeCategory extends PlatformObject implements IBreakpointTypeCategory, IWorkbenchAdapter {
-
-	private String fName;
-	private ImageDescriptor fImageDescriptor = DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_OBJS_BREAKPOINT_TYPE);
-	
-	/**
-	 * Constructs a type category for the given type name.
-	 * 
-	 * @param name breakpoint type name
-	 */
-	public BreakpointTypeCategory(String name) {
-		fName = name;
-	}
-	
-	/**
-	 * Constructs a type category for the given type name with the given
-	 * image.
-	 * 
-	 * @param name breakpoint type name
-	 * @param descriptor image descriptor
-	 */
-	public BreakpointTypeCategory(String name, ImageDescriptor descriptor) {
-		fName = name;
-		if (descriptor != null) {
-			fImageDescriptor = descriptor;
-		}
-	}
-	
-	/**
-	 * Returns the name of this category's breakpoint type.
-	 * 
-	 * @return the name of this category's breakpoint type
-	 */
-	protected String getName() {
-		return fName;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {
-		if (object instanceof BreakpointTypeCategory) {
-			BreakpointTypeCategory type = (BreakpointTypeCategory) object;
-			return type.getName().equals(getName());
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getName().hashCode();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object o) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-	 */
-	public ImageDescriptor getImageDescriptor(Object object) {
-		return fImageDescriptor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-	 */
-	public String getLabel(Object o) {
-		return getName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object o) {
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java
deleted file mode 100644
index 7701277..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java
+++ /dev/null
@@ -1,901 +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.debug.ui;
-
- 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-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.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsMessages;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ContainerSelectionDialog;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.ide.IDEEncoding;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.views.navigator.ResourceComparator;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Launch configuration tab used to specify the location a launch configuration
- * is stored in, whether it should appear in the favorites list, and perspective
- * switching behavior for an associated launch.
- * <p>
- * Clients may instantiate this class. This class is not intended to be subclassed.
- * </p>
- * @since 2.0
- */
-public class CommonTab extends AbstractLaunchConfigurationTab {
-	
-	/**
-	 * Provides a persistable dialog for selecting the shared project location
-	 * @since 3.2
-	 */
-	class SharedLocationSelectionDialog extends ContainerSelectionDialog {
-		private final String SETTINGS_ID = IDebugUIConstants.PLUGIN_ID + ".SHARED_LAUNCH_CONFIGURATON_DIALOG"; //$NON-NLS-1$
-		
-		public SharedLocationSelectionDialog(Shell parentShell, IContainer initialRoot, boolean allowNewContainerName, String message) {
-			super(parentShell, initialRoot, allowNewContainerName, message);
-		}
-
-		protected IDialogSettings getDialogBoundsSettings() {
-			IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-			IDialogSettings section = settings.getSection(SETTINGS_ID);
-			if (section == null) {
-				section = settings.addNewSection(SETTINGS_ID);
-			} 
-			return section;
-		}
-	}
-	
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	
-	/**
-	 * This attribute exists solely for the purpose of making sure that invalid shared locations
-	 * can be revertable. This attribute is not saveable and will never appear in a saved
-	 * launch configuration.
-	 * @since 3.3
-	 */
-	private static final String BAD_CONTAINER = "bad_container_name"; //$NON-NLS-1$
-	
-	// Local/shared UI widgets
-	private Button fLocalRadioButton;
-	private Button fSharedRadioButton;
-	private Text fSharedLocationText;
-	private Button fSharedLocationButton;
-	private Button fLaunchInBackgroundButton;
-    private Button fDefaultEncodingButton;
-    private Button fAltEncodingButton;
-    private Combo fEncodingCombo;
-    private Button fConsoleOutput;
-    private Button fFileOutput;
-    private Button fFileBrowse;
-    private Text fFileText;
-    private Button fVariables;
-    private Button fAppend;
-    private Button fWorkspaceBrowse;
-	
-	/**
-	 * Check box list for specifying favorites
-	 */
-	private CheckboxTableViewer fFavoritesTable;
-			
-	/**
-	 * Modify listener that simply updates the owning launch configuration dialog.
-	 */
-	private ModifyListener fBasicModifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent evt) {
-			updateLaunchConfigurationDialog();
-		}
-	};
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {		
-		Composite comp = new Composite(parent, SWT.NONE);
-		setControl(comp);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_COMMON_TAB);
-		comp.setLayout(new GridLayout(2, true));
-		comp.setFont(parent.getFont());
-		
-		createSharedConfigComponent(comp);
-		createFavoritesComponent(comp);
-		createEncodingComponent(comp);
-		createOutputCaptureComponent(comp);
-		createLaunchInBackgroundComponent(comp);
-	}
-	
-	/**
-	 * Creates the favorites control
-	 * @param parent the parent composite to add this one to
-	 * @since 3.2
-	 */
-	private void createFavoritesComponent(Composite parent) {
-		Group favComp = SWTFactory.createGroup(parent, LaunchConfigurationsMessages.CommonTab_Display_in_favorites_menu__10, 1, 1, GridData.FILL_BOTH);
-		fFavoritesTable = CheckboxTableViewer.newCheckList(favComp, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
-		Control table = fFavoritesTable.getControl();
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		table.setLayoutData(gd);
-		table.setFont(parent.getFont());
-		fFavoritesTable.setContentProvider(new FavoritesContentProvider());
-		fFavoritesTable.setLabelProvider(new FavoritesLabelProvider());
-		fFavoritesTable.addCheckStateListener(new ICheckStateListener() {
-				public void checkStateChanged(CheckStateChangedEvent event) {
-					updateLaunchConfigurationDialog();
-				}
-			});
-	}
-	
-	/**
-	 * Creates the shared config component
-	 * @param parent the parent composite to add this component to
-	 * @since 3.2
-	 */
-	private void createSharedConfigComponent(Composite parent) {
-		Group group = SWTFactory.createGroup(parent, LaunchConfigurationsMessages.CommonTab_0, 3, 2, GridData.FILL_HORIZONTAL);
-		Composite comp = SWTFactory.createComposite(group, parent.getFont(), 3, 3, GridData.FILL_BOTH, 0, 0);
-		fLocalRadioButton = createRadioButton(comp, LaunchConfigurationsMessages.CommonTab_L_ocal_3);
-		GridData gd = new GridData();
-		gd.horizontalSpan = 3;
-		fLocalRadioButton.setLayoutData(gd);
-		fSharedRadioButton = createRadioButton(comp, LaunchConfigurationsMessages.CommonTab_S_hared_4);
-		fSharedRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleSharedRadioButtonSelected();
-			}
-		});
-		fSharedLocationText = SWTFactory.createSingleText(comp, 1);
-		fSharedLocationText.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result =  LaunchConfigurationsMessages.CommonTab_S_hared_4;
-			}
-		});
-		fSharedLocationText.addModifyListener(fBasicModifyListener);
-		fSharedLocationButton = createPushButton(comp, LaunchConfigurationsMessages.CommonTab__Browse_6, null);	 
-		fSharedLocationButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleSharedLocationButtonSelected();
-			}
-		});	
-
-		fLocalRadioButton.setSelection(true);
-		setSharedEnabled(false);	
-	}
-	
-    /**
-     * Creates the component set for the capture output composite
-     * @param parent the parent to add this component to
-     */
-    private void createOutputCaptureComponent(Composite parent) {
-        Group group = SWTFactory.createGroup(parent, LaunchConfigurationsMessages.CommonTab_4, 5, 2, GridData.FILL_HORIZONTAL);
-        Composite comp = SWTFactory.createComposite(group, 5, 5, GridData.FILL_BOTH);
-        GridLayout ld = (GridLayout)comp.getLayout();
-        ld.marginWidth = 1;
-        ld.marginHeight = 1;
-        fConsoleOutput = createCheckButton(comp, LaunchConfigurationsMessages.CommonTab_5); 
-        GridData gd = new GridData(SWT.BEGINNING, SWT.NORMAL, true, false);
-        gd.horizontalSpan = 5;
-        fConsoleOutput.setLayoutData(gd);
-        fConsoleOutput.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                updateLaunchConfigurationDialog();
-            }
-        });
-        
-        fFileOutput = createCheckButton(comp, LaunchConfigurationsMessages.CommonTab_6); 
-        fFileOutput.setLayoutData(new GridData(SWT.BEGINNING, SWT.NORMAL, false, false));
-        fFileOutput.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                enableOuputCaptureWidgets(fFileOutput.getSelection());
-                updateLaunchConfigurationDialog();
-            }
-        });
-        fFileText = SWTFactory.createSingleText(comp, 4);
-        fFileText.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-        	public void getName(AccessibleEvent e) {
-        		e.result = LaunchConfigurationsMessages.CommonTab_6;
-        	}
-        });
-        fFileText.addModifyListener(fBasicModifyListener);
-        
-        Composite bcomp = SWTFactory.createComposite(comp, 3, 5, GridData.HORIZONTAL_ALIGN_END);
-        ld = (GridLayout)bcomp.getLayout();
-        ld.marginHeight = 1;
-        ld.marginWidth = 0;
-        fWorkspaceBrowse = createPushButton(bcomp, LaunchConfigurationsMessages.CommonTab_12, null); 
-        fWorkspaceBrowse.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider());
-                dialog.setTitle(LaunchConfigurationsMessages.CommonTab_13); 
-                dialog.setMessage(LaunchConfigurationsMessages.CommonTab_14); 
-                dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); 
-                dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
-                if (dialog.open() == IDialogConstants.OK_ID) {
-                    IResource resource = (IResource) dialog.getFirstResult();
-                    String arg = resource.getFullPath().toString();
-                    String fileLoc = VariablesPlugin.getDefault().getStringVariableManager().generateVariableExpression("workspace_loc", arg); //$NON-NLS-1$
-                    fFileText.setText(fileLoc);
-                }
-            }
-        });
-        fFileBrowse = createPushButton(bcomp, LaunchConfigurationsMessages.CommonTab_7, null);
-        fFileBrowse.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                String filePath = fFileText.getText();
-                FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
-                filePath = dialog.open();
-                if (filePath != null) {
-                    fFileText.setText(filePath);
-                }
-            }
-        });
-        fVariables = createPushButton(bcomp, LaunchConfigurationsMessages.CommonTab_9, null); 
-        fVariables.addSelectionListener(new SelectionListener() {
-            public void widgetSelected(SelectionEvent e) {
-                StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
-				dialog.open();
-				String variable = dialog.getVariableExpression();
-				if (variable != null) {
-					fFileText.insert(variable);
-				}
-            }
-            public void widgetDefaultSelected(SelectionEvent e) {}
-        });
-        fAppend = createCheckButton(comp, LaunchConfigurationsMessages.CommonTab_11); 
-        gd = new GridData(SWT.LEFT, SWT.TOP, true, false);
-        gd.horizontalSpan = 4;
-        fAppend.setLayoutData(gd);
-		fAppend.addSelectionListener(new SelectionAdapter() {
-		    public void widgetSelected(SelectionEvent e) {
-		        updateLaunchConfigurationDialog();
-		    }
-		});   
-    }
-
-    /**
-     * Enables or disables the output capture widgets based on the the specified enablement
-     * @param enable if the output capture widgets should be enabled or not
-     * @since 3.2
-     */
-    private void enableOuputCaptureWidgets(boolean enable) {
-    	fFileText.setEnabled(enable);
-        fFileBrowse.setEnabled(enable);
-        fWorkspaceBrowse.setEnabled(enable);
-        fVariables.setEnabled(enable);
-        fAppend.setEnabled(enable);
-    }
-    
-    /**
-     * Creates the encoding component
-     * @param parent the parent to add this composite to
-     */
-    private void createEncodingComponent(Composite parent) {
-	    List allEncodings = IDEEncoding.getIDEEncodings();
-	    String defaultEncoding = ResourcesPlugin.getEncoding();
-	    Group group = SWTFactory.createGroup(parent, LaunchConfigurationsMessages.CommonTab_1, 2, 1, GridData.FILL_BOTH);
-	    
-	    fDefaultEncodingButton = createRadioButton(group, MessageFormat.format(LaunchConfigurationsMessages.CommonTab_2, new String[]{defaultEncoding})); 
-	    GridData gd = new GridData(SWT.BEGINNING, SWT.NORMAL, true, false);
-	    gd.horizontalSpan = 2;
-	    fDefaultEncodingButton.setLayoutData(gd);
-	   
-	    fAltEncodingButton = createRadioButton(group, LaunchConfigurationsMessages.CommonTab_3);  
-	    fAltEncodingButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-	    
-	    fEncodingCombo = new Combo(group, SWT.READ_ONLY);
-	    fEncodingCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-	    fEncodingCombo.setFont(parent.getFont());
-        String[] encodingArray = (String[]) allEncodings.toArray(new String[0]);
-	    fEncodingCombo.setItems(encodingArray);
-        if (encodingArray.length > 0) {
-            fEncodingCombo.select(0); 
-        }
-        fEncodingCombo.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-        	public void getName(AccessibleEvent e) {
-        		e.result = LaunchConfigurationsMessages.CommonTab_3;
-        	}
-        });
-	    SelectionListener listener = new SelectionAdapter() {
-	        public void widgetSelected(SelectionEvent e) {
-	        	if(e.getSource() instanceof Button) {
-	        		Button button = (Button)e.getSource();
-	        		if(button.getSelection()) {
-		        		updateLaunchConfigurationDialog();
-			            fEncodingCombo.setEnabled(fAltEncodingButton.getSelection() == true);
-	        		}
-	        	}
-	        	else {
-	        		updateLaunchConfigurationDialog();
-	        	}
-	        }
-	    };
-	    fAltEncodingButton.addSelectionListener(listener);
-	    fDefaultEncodingButton.addSelectionListener(listener);
-	    fEncodingCombo.addSelectionListener(listener);
-	}
-
-	/**
-	 * Creates the controls needed to edit the launch in background
-	 * attribute of an external tool
-	 *
-	 * @param parent the composite to create the controls in
-	 */
-	protected void createLaunchInBackgroundComponent(Composite parent) {
-		fLaunchInBackgroundButton = createCheckButton(parent, LaunchConfigurationsMessages.CommonTab_10); 
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		data.horizontalSpan = 2;
-		fLaunchInBackgroundButton.setLayoutData(data);
-		fLaunchInBackgroundButton.setFont(parent.getFont());
-		fLaunchInBackgroundButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-	}
-
-	/**
-	 * handles the shared radio button being selected
-	 */
-	private void handleSharedRadioButtonSelected() {
-		setSharedEnabled(isShared());
-		updateLaunchConfigurationDialog();
-	}
-	
-	/**
-	 * Sets the widgets for specifying that a launch configuration is to be shared to the enable value
-	 * @param enable the enabled value for 
-	 */
-	private void setSharedEnabled(boolean enable) {
-		fSharedLocationText.setEnabled(enable);
-		fSharedLocationButton.setEnabled(enable);
-	}
-	
-	private String getDefaultSharedConfigLocation(ILaunchConfiguration config) {
-		String path = EMPTY_STRING;
-		try {
-			IResource[] res = config.getMappedResources();
-			if(res != null) {
-				IProject  proj;
-				for (int i = 0; i < res.length; i++) {
-					proj = res[i].getProject();
-					if(proj.isAccessible()) {
-						return proj.getFullPath().toOSString();
-					}
-				}
-			}
-		} 
-		catch (CoreException e) {DebugUIPlugin.log(e);}
-		return path;
-	}
-	
-	/**
-	 * if the shared radio button is selected, indicating that the launch configuration is to be shared
-	 * @return true if the radio button is selected, false otherwise
-	 */
-	private boolean isShared() {
-		return fSharedRadioButton.getSelection();
-	}
-	
-	/**
-	 * Handles the shared location button being selected
-	 */
-	private void handleSharedLocationButtonSelected() { 
-		String currentContainerString = fSharedLocationText.getText();
-		IContainer currentContainer = getContainer(currentContainerString);
-		SharedLocationSelectionDialog dialog = new SharedLocationSelectionDialog(getShell(),
-				   currentContainer,
-				   false,
-				   LaunchConfigurationsMessages.CommonTab_Select_a_location_for_the_launch_configuration_13);
-		dialog.showClosedProjects(false);
-		dialog.open();
-		Object[] results = dialog.getResult();	
-		if ((results != null) && (results.length > 0) && (results[0] instanceof IPath)) {
-			IPath path = (IPath)results[0];
-			String containerName = path.toOSString();
-			fSharedLocationText.setText(containerName);
-		}		
-	}
-	
-	/**
-	 * gets the container form the specified path
-	 * @param path the path to get the container from
-	 * @return the container for the specified path or null if one cannot be determined
-	 */
-	private IContainer getContainer(String path) {
-		Path containerPath = new Path(path);
-		return (IContainer) getWorkspaceRoot().findMember(containerPath);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		boolean isShared = !configuration.isLocal();
-		fSharedRadioButton.setSelection(isShared);
-		fLocalRadioButton.setSelection(!isShared);
-		setSharedEnabled(isShared);
-		fSharedLocationText.setText(getDefaultSharedConfigLocation(configuration));
-		if(isShared) {
-			String containerName = EMPTY_STRING;
-			IFile file = configuration.getFile();
-			if (file != null) {
-				IContainer parent = file.getParent();
-				if (parent != null) {
-					containerName = parent.getFullPath().toOSString();
-				}
-			}
-			fSharedLocationText.setText(containerName);
-		}
-		updateFavoritesFromConfig(configuration);
-		updateLaunchInBackground(configuration);
-		updateEncoding(configuration);
-		updateConsoleOutput(configuration);
-	}
-	
-    /**
-     * Updates the console output form the local configuration
-     * @param configuration the local configuration
-     */
-    private void updateConsoleOutput(ILaunchConfiguration configuration) {
-        boolean outputToConsole = true;
-        String outputFile = null;
-        boolean append = false;
-        
-        try {
-            outputToConsole = configuration.getAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, true);
-            outputFile = configuration.getAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_FILE, (String)null);
-            append = configuration.getAttribute(IDebugUIConstants.ATTR_APPEND_TO_FILE, false);
-        } catch (CoreException e) {
-        }
-        
-        fConsoleOutput.setSelection(outputToConsole);
-        fAppend.setSelection(append);
-        boolean haveOutputFile= outputFile != null;
-        if (haveOutputFile) {
-            fFileText.setText(outputFile);
-        }
-        fFileOutput.setSelection(haveOutputFile);
-        enableOuputCaptureWidgets(haveOutputFile);
-    }
-
-    /**
-     * Updates the launch on background check button
-     * @param configuration the local launch configuration
-     */
-    protected void updateLaunchInBackground(ILaunchConfiguration configuration) { 
-		fLaunchInBackgroundButton.setSelection(isLaunchInBackground(configuration));
-	}
-	
-	/**
-	 * Updates the encoding
-	 * @param configuration the local configuration
-	 */
-	private void updateEncoding(ILaunchConfiguration configuration) {
-	    String encoding = null;
-	    try {
-	        encoding = configuration.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null);
-        } catch (CoreException e) {
-        }
-        
-        if (encoding != null) {
-            fAltEncodingButton.setSelection(true);
-            fDefaultEncodingButton.setSelection(false);
-            fEncodingCombo.setText(encoding);
-            fEncodingCombo.setEnabled(true);
-        } else {
-            fDefaultEncodingButton.setSelection(true);
-            fAltEncodingButton.setSelection(false);
-            fEncodingCombo.setEnabled(false);
-        }
-	}
-	
-	/**
-	 * Returns whether the given configuration should be launched in the background.
-	 * 
-	 * @param configuration the configuration
-	 * @return whether the configuration is configured to launch in the background
-	 */
-	public static boolean isLaunchInBackground(ILaunchConfiguration configuration) {
-		boolean launchInBackground= true;
-		try {
-			launchInBackground= configuration.getAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, true);
-		} catch (CoreException ce) {
-			DebugUIPlugin.log(ce);
-		}
-		return launchInBackground;
-	}
-
-	/**
-	 * Updates the favorites selections from the local configuration
-	 * @param config the local configuration
-	 */
-	private void updateFavoritesFromConfig(ILaunchConfiguration config) {
-		fFavoritesTable.setInput(config);
-		fFavoritesTable.setCheckedElements(new Object[]{});
-		try {
-			List groups = config.getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, new ArrayList());
-			if (groups.isEmpty()) {
-				// check old attributes for backwards compatible
-				if (config.getAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, false)) {
-					groups.add(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-				}
-				if (config.getAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, false)) {
-					groups.add(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-				}
-			}
-			if (!groups.isEmpty()) {
-				List list = new ArrayList();
-				Iterator iterator = groups.iterator();
-				while (iterator.hasNext()) {
-					String id = (String)iterator.next();
-					LaunchGroupExtension extension = getLaunchConfigurationManager().getLaunchGroup(id);
-					list.add(extension);
-				}
-				fFavoritesTable.setCheckedElements(list.toArray());
-			}
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Updates the configuration form the local shared config working copy
-	 * @param config the local shared config working copy
-	 */
-	private void updateConfigFromLocalShared(ILaunchConfigurationWorkingCopy config) {
-		if (isShared()) {
-			String containerPathString = fSharedLocationText.getText();
-			IContainer container = getContainer(containerPathString);
-			if(container == null) {
-				//we need to force an attribute to allow the invalid container path to be revertable
-				config.setAttribute(BAD_CONTAINER, containerPathString);
-			}
-			else {
-				config.setContainer(container);
-			}
-		} else {
-			config.setContainer(null);
-		}
-	}
-	
-	/**
-	 * Convenience accessor
-	 */
-	protected LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}
-	
-	/**
-	 * Update the favorite settings.
-	 * 
-	 * NOTE: set to <code>null</code> instead of <code>false</code> for backwards compatibility
-	 *  when comparing if content is equal, since 'false' is default
-	 * 	and will be missing for older configurations.
-	 */
-	private void updateConfigFromFavorites(ILaunchConfigurationWorkingCopy config) {
-		try {
-			Object[] checked = fFavoritesTable.getCheckedElements();
-			boolean debug = config.getAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, false);
-			boolean run = config.getAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, false);
-			if (debug || run) {
-				// old attributes
-				List groups = new ArrayList();
-				int num = 0;
-				if (debug) {
-					groups.add(getLaunchConfigurationManager().getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
-					num++;
-				}
-				if (run) {
-					num++;
-					groups.add(getLaunchConfigurationManager().getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
-				}
-				// see if there are any changes
-				if (num == checked.length) {
-					boolean different = false;
-					for (int i = 0; i < checked.length; i++) {
-						if (!groups.contains(checked[i])) {
-							different = true;
-							break;
-						}
-					}
-					if (!different) {
-						return;
-					}
-				}
-			} 
-			config.setAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, (String)null);
-			config.setAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, (String)null);
-			List groups = null;
-			for (int i = 0; i < checked.length; i++) {
-				LaunchGroupExtension group = (LaunchGroupExtension)checked[i];
-				if (groups == null) {
-					groups = new ArrayList();
-				}
-				groups.add(group.getIdentifier());
-			}
-			config.setAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, groups);
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}		
-	}	
-	
-	/**
-	 * Convenience method for getting the workspace root.
-	 */
-	private IWorkspaceRoot getWorkspaceRoot() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public boolean isValid(ILaunchConfiguration config) {
-		setMessage(null);
-		setErrorMessage(null);
-		
-		return validateLocalShared() && validateRedirectFile() && validateEncoding();
-	}
-	
-    /**
-     * validates the encoding selection
-     * @return true if the validate encoding is allowable, false otherwise
-     */
-    private boolean validateEncoding() {
-        if (fAltEncodingButton.getSelection()) {
-            if (fEncodingCombo.getSelectionIndex() == -1) {
-                setErrorMessage(LaunchConfigurationsMessages.CommonTab_No_Encoding_Selected);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Validates if the redirect file is valid
-     * @return true if the filename is not zero, false otherwise
-     */
-    private boolean validateRedirectFile() {
-        if(fFileOutput.getSelection()) {
-            int len = fFileText.getText().trim().length();
-            if (len == 0) {
-                setErrorMessage(LaunchConfigurationsMessages.CommonTab_8); 
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * validates the local shared config file location
-     * @return true if the local shared file exists, false otherwise
-     */
-    private boolean validateLocalShared() {
-		if (isShared()) {
-			String path = fSharedLocationText.getText().trim();
-			IContainer container = getContainer(path);
-			if (container == null || container.equals(ResourcesPlugin.getWorkspace().getRoot())) {
-				setErrorMessage(LaunchConfigurationsMessages.CommonTab_Invalid_shared_configuration_location_14); 
-				return false;
-			} else if (!container.getProject().isOpen()) {
-				setErrorMessage(LaunchConfigurationsMessages.CommonTab_Cannot_save_launch_configuration_in_a_closed_project__1); 
-				return false;				
-			}
-		}
-		return true;		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
-		config.setContainer(null);
-		setAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, config, true, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		updateConfigFromLocalShared(configuration);
-		updateConfigFromFavorites(configuration);
-		setAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, configuration, fLaunchInBackgroundButton.getSelection(), true);
-		String encoding = null;
-		if(fAltEncodingButton.getSelection()) {
-		    encoding = fEncodingCombo.getText();
-		}
-		configuration.setAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, encoding);
-		boolean captureOutput = false;
-		if (fConsoleOutput.getSelection()) {
-		    captureOutput = true;
-		    configuration.setAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, (String)null);
-		} else {
-		    configuration.setAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, false);
-		}
-		if (fFileOutput.getSelection()) {
-		    captureOutput = true;
-		    String file = fFileText.getText();
-		    configuration.setAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_FILE, file);
-		    if(fAppend.getSelection()) {
-		        configuration.setAttribute(IDebugUIConstants.ATTR_APPEND_TO_FILE, true);
-		    } else {
-		        configuration.setAttribute(IDebugUIConstants.ATTR_APPEND_TO_FILE, (String)null);
-		    }
-		} else {
-		    configuration.setAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_FILE, (String)null);
-		}
-		
-		if (!captureOutput) {
-		    configuration.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, false);
-		} else {
-		    configuration.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, (String)null);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return LaunchConfigurationsMessages.CommonTab__Common_15; 
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
-	 * @since 3.3
-	 */
-	public String getId() {
-		return "org.eclipse.debug.ui.commonTab"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#canSave()
-	 */
-	public boolean canSave() {
-		return validateLocalShared();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return DebugUITools.getImage(IInternalDebugUIConstants.IMG_OBJS_COMMON_TAB);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {}
-
-	/**
-	 * Content provider for the favorites table
-	 */
-	class FavoritesContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			ILaunchGroup[] groups = DebugUITools.getLaunchGroups();
-			List possibleGroups = new ArrayList();
-			ILaunchConfiguration configuration = (ILaunchConfiguration)inputElement;
-			for (int i = 0; i < groups.length; i++) {
-				ILaunchGroup extension = groups[i];
-				LaunchHistory history = getLaunchConfigurationManager().getLaunchHistory(extension.getIdentifier());
-				if (history != null && history.accepts(configuration)) {
-					possibleGroups.add(extension);
-				} 
-			}
-			return possibleGroups.toArray();
-		}
-
-		public void dispose() {}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-
-	}
-	
-	/**
-	 * Provides the labels for the favorites table
-	 *
-	 */
-	class FavoritesLabelProvider implements ITableLabelProvider {
-		
-		private Map fImages = new HashMap();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			Image image = (Image)fImages.get(element);
-			if (image == null) {
-				ImageDescriptor descriptor = ((LaunchGroupExtension)element).getImageDescriptor();
-				if (descriptor != null) {
-					image = descriptor.createImage();
-					fImages.put(element, image);
-				}
-			}
-			return image;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			String label = ((LaunchGroupExtension)element).getLabel();
-			return DebugUIPlugin.removeAccelerators(label);
-		}
-
-		public void addListener(ILabelProviderListener listener) {}
-
-		public void dispose() {
-			Iterator images = fImages.values().iterator();
-			while (images.hasNext()) {
-				Image image = (Image)images.next();
-				image.dispose();
-			}
-		}
-
-		public boolean isLabelProperty(Object element, String property) {return false;}
-
-		public void removeListener(ILabelProviderListener listener) {}		
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugElementWorkbenchAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugElementWorkbenchAdapter.java
deleted file mode 100644
index f3f1b78..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugElementWorkbenchAdapter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import org.eclipse.debug.internal.ui.views.launch.DebugElementHelper;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.model.IWorkbenchAdapter2;
-
-/**
- * Common function for debug element workbench adapters.
- * <p>
- * Clients may subclass this class to provide custom adapters for elements in a debug
- * model. The debug platform provides <code>IWorkbenchAdapters</code> for the standard debug
- * elements. Clients may override the default content in the debug view by providing an
- * <code>IWorkbenchAdapter</code> or <code>IDeferredWorkbenchAdapter</code> for a debug
- * element.
- * </p>
- * @since 3.1
- */
-public abstract class DebugElementWorkbenchAdapter implements IWorkbenchAdapter, IWorkbenchAdapter2 {
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return DebugElementHelper.getImageDescriptor(object);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-     */
-    public String getLabel(Object o) {
-        return DebugElementHelper.getLabel(o);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getForeground(java.lang.Object)
-     */
-    public RGB getForeground(Object element) {
-        return DebugElementHelper.getForeground(element);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getBackground(java.lang.Object)
-     */
-    public RGB getBackground(Object element) {
-        return DebugElementHelper.getBackground(element);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter2#getFont(java.lang.Object)
-     */
-    public FontData getFont(Object element) {
-        return DebugElementHelper.getFont(element);
-    }
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugPopup.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugPopup.java
deleted file mode 100644
index 4a0f07f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugPopup.java
+++ /dev/null
@@ -1,215 +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.debug.ui;
-
-import com.ibm.icu.text.MessageFormat;
-
-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.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.PopupDialog;
-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.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.keys.IBindingService;
-
-/**
- * A <code>PopupDialog</code> that is automatically positioned relative
- * to a specified anchor point. The popup can be dismissed in the same
- * manor as all popup dialogs, but additionally allows clients the option
- * of specifying a command id that can be used to persist the contents of
- * the dialog.
- * <p>
- * Clients may subclass this.
- * @since 3.2
- */
-public abstract class DebugPopup extends PopupDialog {
-
-    private Point fAnchor;
-
-    private IHandlerActivation fActivation;
-
-    private IHandlerService fHandlerService;
-
-	private String fCommandId;
-	
-	private boolean fPersisted = false;
-
-    /**
-     * Constructs a new popup dialog of type <code>PopupDialog.INFOPOPUPRESIZE_SHELLSTYLE</code>
-     * @param parent The parent shell
-     * @param anchor point at which to anchor the popup dialog in Display coordinate space.
-     * 	Since 3.3, <code>null</code> can be specified to use a default anchor point
-     * @param commandId The command id to be used for persistence of 
-     *  the dialog, or <code>null</code>
-     */
-    public DebugPopup(Shell parent, Point anchor, String commandId) {
-        super(parent, PopupDialog.INFOPOPUPRESIZE_SHELLSTYLE, true, true, true, false, null, null);
-        fAnchor = anchor;
-        fCommandId = commandId;
-    }
-
-    /**
-     * Returns the text to be shown in the popups's information area. 
-     * May return <code>null</code>.
-     * <p>
-     * By default, if this dialog has a persistence command associated with it,
-     * the text displayed is of the form "Press {key-sequence} to {action}". The
-     * action text is specified by the method <code>getActionText()</code>.
-     * </p>
-     * @return The text to be shown in the popup's information area or <code>null</code>
-     */
-    protected String getInfoText() {
-    	if (getCommandId() != null && getActionText() != null) {
-	        IWorkbench workbench = PlatformUI.getWorkbench();
-	        IBindingService bindingService = (IBindingService) workbench.getAdapter(IBindingService.class);
-	        String formattedBinding = bindingService.getBestActiveBindingFormattedFor(getCommandId());
-	        
-	        String infoText = null;
-	        if (formattedBinding != null) {
-	             infoText = MessageFormat.format(DebugUIViewsMessages.InspectPopupDialog_1, new String[] { formattedBinding, getActionText()});
-	        }
-	        return infoText;
-    	}
-    	return null;
-    }
-    
-    /**
-     * Returns the text to be shown as the action performed when this dialog's
-     * persist command is invoked, or <code>null</code>.
-     * <p>
-     * Subclasses should override as necessary.
-     * </p>
-     * @return the text to be shown as the action performed when this dialog's
-     *  persist command is invoked
-     */
-    protected String getActionText() {
-    	return null;
-    }
-
-    /**
-     * Returns the command id to be used for persisting the contents of the
-     * dialog. If the contents should not be persisted, this method should 
-     * return null. 
-     * 
-     * @return The command id to be used for persisting the contents of the
-     * dialog or <code>null</code>
-     */
-    protected String getCommandId() {
-        return fCommandId;
-    }
-
-    /**
-     * Persists the contents of the dialog. Subclasses should override as required,
-     * but also call super.persist().
-     */
-    protected void persist() {
-    	fPersisted = true;
-    }
-    
-    /**
-     * Returns whether the command handler was invoked to persist this popup's result.
-     * 
-     * @return whether the command handler was invoked to persist this popup's result
-     */
-    protected boolean wasPersisted() {
-    	return fPersisted;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.PopupDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-     */
-    protected abstract Control createDialogArea(Composite parent);
-
-
-    /**
-     * Returns the initial location to use for the shell based upon the 
-     * current selection in the viewer. Bottom is preferred to top, and 
-     * right is preferred to left, therefore if possible the popup will
-     * be located below and to the right of the selection.
-     * 
-     * @param initialSize
-     *            the initial size of the shell, as returned by
-     *            <code>getInitialSize</code>.
-     * @return the initial location of the shell
-     */
-    protected Point getInitialLocation(Point initialSize) {
-    	if (fAnchor == null) {
-    		return super.getInitialLocation(initialSize);
-    	}
-        Point point = fAnchor;
-        Rectangle monitor = getShell().getMonitor().getClientArea();
-        if (monitor.width < point.x + initialSize.x) {
-            point.x = Math.max(0, point.x - initialSize.x);
-        }
-        if (monitor.height < point.y + initialSize.y) {
-            point.y = Math.max(0, point.y - initialSize.y);
-        }
-        return point;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.PopupDialog#getDialogSettings()
-     */
-    protected IDialogSettings getDialogSettings() {
-        IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-        return settings;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.PopupDialog#open()
-     */
-    public int open() {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        String commandId = getCommandId();
-        if (commandId != null) {
-            IHandler fCloseHandler = new AbstractHandler() {
-                public Object execute(ExecutionEvent event) throws ExecutionException {
-                    persist();
-                    close();
-                    return null;
-                }
-            };
-
-            fHandlerService = (IHandlerService) workbench.getAdapter(IHandlerService.class);
-            fActivation = fHandlerService.activateHandler(commandId, fCloseHandler);
-        }
-
-        String infoText = getInfoText();
-        if (infoText != null)
-            setInfoText(infoText);
-        
-        return super.open();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.PopupDialog#close()
-     */
-    public boolean close() {
-        if (fActivation != null)
-            fHandlerService.deactivateHandler(fActivation);
-
-        return super.close();
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java
deleted file mode 100644
index ec1ae1e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java
+++ /dev/null
@@ -1,827 +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.debug.ui;
-
-
-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.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.DefaultLabelProvider;
-import org.eclipse.debug.internal.ui.DelegatingModelPresentation;
-import org.eclipse.debug.internal.ui.LazyModelPresentation;
-import org.eclipse.debug.internal.ui.contexts.DebugContextManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPropertiesDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
-import org.eclipse.debug.internal.ui.memory.MemoryRenderingManager;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupFacility;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
-import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
-import org.eclipse.debug.ui.contexts.IDebugContextManager;
-import org.eclipse.debug.ui.memory.IMemoryRenderingManager;
-import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
-import org.eclipse.debug.ui.sourcelookup.ISourceLookupResult;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.console.IConsole;
-
-/**
- * This class provides utilities for clients of the debug UI.
- * <p>
- * Images retrieved from this facility should not be disposed.
- * The images will be disposed when this plug-in is shutdown.
- * </p>
- * <p>
- * This class is not intended to be subclassed or instantiated.
- * </p>
- */
-public class DebugUITools {
-	
-	/**
-	 * Returns the shared image managed under the given key, or <code>null</code>
-	 * if none.
-	 * <p>
-	 * Note that clients <b>MUST NOT</b> dispose the image returned by this method.
-	 * </p>
-	 * <p>
-	 * See <code>IDebugUIConstants</code> for available images.
-	 * </p>
-	 *
-	 * @param key the image key
-	 * @return the image, or <code>null</code> if none
-	 * @see IDebugUIConstants
-	 */
-	public static Image getImage(String key) {
-		return DebugPluginImages.getImage(key);
-	}
-	
-	/**
-	 * Returns the shared image descriptor managed under the given key, or
-	 * <code>null</code> if none.
-	 * <p>
-	 * See <code>IDebugUIConstants</code> for available image descriptors.
-	 * </p>
-	 *
-	 * @param key the image descriptor key
-	 * @return the image descriptor, or <code>null</code> if none
-	 * @see IDebugUIConstants
-	 */
-	public static ImageDescriptor getImageDescriptor(String key) {
-		return DebugPluginImages.getImageDescriptor(key);
-	}
-		
-	/**
-	 * Returns the default image descriptor for the given element
-	 * or <code>null</code> if none is defined.
-	 */
-	public static ImageDescriptor getDefaultImageDescriptor(Object element) {
-		String imageKey= getDefaultImageKey(element);
-		if (imageKey == null) {
-			return null;
-		}
-		return DebugPluginImages.getImageDescriptor(imageKey);
-	}
-	
-	private static String getDefaultImageKey(Object element) {
-		return ((DefaultLabelProvider)DebugUIPlugin.getDefaultLabelProvider()).getImageKey(element);
-	}
-	
-	/**
-	 * Returns the preference store for the debug UI plug-in.
-	 *
-	 * @return preference store
-	 */
-	public static IPreferenceStore getPreferenceStore() {
-		return DebugUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Returns a new debug model presentation that delegates to
-	 * appropriate debug models.
-	 * <p>
-	 * It is the client's responsibility dispose the presentation.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 * @return a debug model presentation
-	 * @since 2.0
-	 */
-	public static IDebugModelPresentation newDebugModelPresentation() {
-		return new DelegatingModelPresentation();
-	}
-	
-	/**
-	 * Returns a new debug model presentation for specified
-	 * debug model, or <code>null</code> if a presentation does
-	 * not exist.
-	 * <p>
-	 * It is the client's responsibility dispose the presentation.
-	 * </p>
-	 * 
-	 * @param identifier debug model identifier
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 * @return a debug model presentation, or <code>null</code>
-	 * @since 2.0
-	 */
-	public static IDebugModelPresentation newDebugModelPresentation(String identifier) {
-		IExtensionPoint point= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.ID_DEBUG_MODEL_PRESENTATION);
-		if (point != null) {
-			IExtension[] extensions= point.getExtensions();
-			for (int i= 0; i < extensions.length; i++) {
-				IExtension extension= extensions[i];
-				IConfigurationElement[] configElements= extension.getConfigurationElements();
-				for (int j= 0; j < configElements.length; j++) {
-					IConfigurationElement elt= configElements[j];
-					String id= elt.getAttribute("id"); //$NON-NLS-1$
-					if (id != null && id.equals(identifier)) {
-						return new LazyModelPresentation(elt);
-					}
-				}
-			}
-		}
-		return null;
-	}	
-	
-	/**
-	 * Returns the currently selected element in the 
-	 * debug view of the current workbench page,
-	 * or <code>null</code> if there is no current
-	 * debug context.
-	 * <p>
-	 * This method used to return <code>null</code> when called from a non-UI thread,
-	 * but since 3.1, this methods also works when called from a non-UI thread.
-	 * </p>
-	 * @return the currently selected debug context, or <code>null</code>
-	 * @since 2.0
-	 */
-	public static IAdaptable getDebugContext() {
-	    IWorkbenchWindow activeWindow = SelectedResourceManager.getDefault().getActiveWindow();
-	    if (activeWindow != null) {
-	    	ISelection activeContext = DebugUITools.getDebugContextManager().getContextService(activeWindow).getActiveContext();
-	    	if (activeContext instanceof IStructuredSelection) {
-	    		IStructuredSelection selection = (IStructuredSelection) activeContext;
-	    		if (!selection.isEmpty()) {
-	    			Object firstElement = selection.getFirstElement();
-	    			if (firstElement instanceof IAdaptable) {
-						return (IAdaptable) firstElement;
-					}
-	    		}
-	    	}
-	    }
-	    return null;
-	}
-
-	/**
-	 * Returns the currently selected resource in the active workbench window,
-	 * or <code>null</code> if none. If an editor is active, the resource adapter
-	 * associated with the editor is returned, if any.
-	 * 
-	 * @return selected resource or <code>null</code>
-	 * @since 3.0
-	 */
-	public static IResource getSelectedResource() {
-		return SelectedResourceManager.getDefault().getSelectedResource();
-	}
-			
-	/**
-	 * Returns the process associated with the current debug context.
-	 * If there is no debug context currently, the most recently
-	 * launched process is returned. If there is no current process
-	 * <code>null</code> is returned.
-	 * 
-	 * @return the current process, or <code>null</code>
-	 * @since 2.0
-	 */
-	public static IProcess getCurrentProcess() {
-		IAdaptable context = getDebugContext();
-		if (context == null) {
-			ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
-			if (launches.length > 0) {
-				context = launches[launches.length - 1];
-			}
-		}
-        
-		if (context instanceof IDebugElement) {
-			return ((IDebugElement)context).getDebugTarget().getProcess();
-		}
-		
-        if (context instanceof IProcess) {
-			return (IProcess)context;
-		}
-		
-        if (context instanceof ILaunch) {
-			ILaunch launch= (ILaunch)context;
-			IDebugTarget target= launch.getDebugTarget();
-			if (target != null) {
-				IProcess process = target.getProcess();
-				if (process != null) {
-					return process;
-				}
-			}
-			IProcess[] ps = launch.getProcesses();
-			if (ps.length > 0) {
-				return ps[ps.length - 1];
-			}
-		}
-        
-        if (context != null) {
-            return (IProcess) context.getAdapter(IProcess.class);
-        }
-        
-		return null;
-	}
-
-	/**
-	 * Open the launch configuration dialog with the specified initial selection.
-	 * The selection may be <code>null</code>, or contain any mix of 
-	 * <code>ILaunchConfiguration</code> or <code>ILaunchConfigurationType</code>
-	 * elements.
-	 * <p>
-	 * Before opening a new dialog, this method checks if there is an existing open
-	 * launch configuration dialog.  If there is, this dialog is used with the
-	 * specified selection.  If there is no existing dialog, a new one is created.
-	 * </p>
-	 * <p>
-	 * Note that if an existing dialog is reused, the <code>mode</code> argument is ignored
-	 * and the existing dialog keeps its original mode.
-	 * </p>
-	 * 
-	 * @param shell the parent shell for the launch configuration dialog
-	 * @param selection the initial selection for the dialog
-	 * @param mode the mode (run or debug) in which to open the launch configuration dialog.
-	 *  This should be one of the constants defined in <code>ILaunchManager</code>.
-	 * @return the return code from opening the launch configuration dialog -
-	 *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-	 * @since 2.0
-	 * @deprecated use openLaunchConfigurationDialogOnGroup(Shell, IStructuredSelection, String)
-	 *  to specify the launch group that the dialog should be opened on. This method will open
-	 *  on the launch group with the specified mode and a <code>null</code> category 
-	 */
-	public static int openLaunchConfigurationDialog(Shell shell, IStructuredSelection selection, String mode) {
-		ILaunchGroup[] groups = getLaunchGroups();
-		for (int i = 0; i < groups.length; i++) {
-			ILaunchGroup group = groups[i];
-			if (group.getMode().equals(mode) && group.getCategory() == null) {
-				return openLaunchConfigurationDialogOnGroup(shell, selection, group.getIdentifier());
-			}
-		}
-		return Window.CANCEL;
-	}
-	
-	/**
-	 * Open the launch configuration dialog with the specified initial selection.
-	 * The selection may be <code>null</code>, or contain any mix of 
-	 * <code>ILaunchConfiguration</code> or <code>ILaunchConfigurationType</code>
-	 * elements.
-	 * <p>
-	 * Before opening a new dialog, this method checks if there is an existing open
-	 * launch configuration dialog.  If there is, this dialog is used with the
-	 * specified selection.  If there is no existing dialog, a new one is created.
-	 * </p>
-	 * <p>
-	 * Note that if an existing dialog is reused, the <code>mode</code> argument is ignored
-	 * and the existing dialog keeps its original mode.
-	 * </p>
-	 * 
-	 * @param shell the parent shell for the launch configuration dialog
-	 * @param selection the initial selection for the dialog
-	 * @param groupIdentifier the identifier of the launch group to display (corresponds to
-	 * the identifier of a launch group extension)
-	 * @return the return code from opening the launch configuration dialog -
-	 *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-	 * @since 2.1
-	 */
-	public static int openLaunchConfigurationDialogOnGroup(Shell shell, IStructuredSelection selection, String groupIdentifier) {
-		return openLaunchConfigurationDialogOnGroup(shell, selection, groupIdentifier, null);
-	}
-	
-	/**
-	 * Open the launch configuration dialog with the specified initial selection.
-	 * The selection may be <code>null</code>, or contain any mix of 
-	 * <code>ILaunchConfiguration</code> or <code>ILaunchConfigurationType</code>
-	 * elements.
-	 * <p>
-	 * Before opening a new dialog, this method checks if there is an existing open
-	 * launch configuration dialog.  If there is, this dialog is used with the
-	 * specified selection.  If there is no existing dialog, a new one is created.
-	 * </p>
-	 * <p>
-	 * Note that if an existing dialog is reused, the <code>mode</code> argument is ignored
-	 * and the existing dialog keeps its original mode.
-	 * </p>
-	 * <p>
-	 * If a status is specified, a status handler is consulted to handle the
-	 * status. The status handler is passed the instance of the launch
-	 * configuration dialog that is opened. This gives the status handler an
-	 * opportunity to perform error handling/initialization as required.
-	 * </p>
-	 * @param shell the parent shell for the launch configuration dialog
-	 * @param selection the initial selection for the dialog
-	 * @param groupIdentifier the identifier of the launch group to display (corresponds to
-	 * the identifier of a launch group extension)
-	 * @param status the status to display in the dialog, or <code>null</code>
-	 * if none
-	 * @return the return code from opening the launch configuration dialog -
-	 *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-	 * @see org.eclipse.debug.core.IStatusHandler
-	 * @since 2.1
-	 */
-	public static int openLaunchConfigurationDialogOnGroup(final Shell shell, final IStructuredSelection selection, final String groupIdentifier, final IStatus status) {
-		final int[] result = new int[1];
-		Runnable r = new Runnable() {
-			/**
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				LaunchConfigurationsDialog dialog = (LaunchConfigurationsDialog) LaunchConfigurationsDialog.getCurrentlyVisibleLaunchConfigurationDialog();
-				if (dialog != null) {
-					dialog.setInitialSelection(selection);
-					dialog.doInitialTreeSelection();
-					if (status != null) {
-						dialog.handleStatus(status); 
-					}
-					result[0] = Window.OK;
-				} else {
-					dialog = new LaunchConfigurationsDialog(shell, DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier));
-					dialog.setOpenMode(LaunchConfigurationsDialog.LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_SELECTION);
-					dialog.setInitialSelection(selection);
-					dialog.setInitialStatus(status);
-					result[0] = dialog.open();			
-				}
-			}
-		};
-		BusyIndicator.showWhile(DebugUIPlugin.getStandardDisplay(), r);
-		return result[0];
-	}
-		
-	/**
-	 * Open the launch configuration properties dialog on the specified launch
-	 * configuration.
-	 *
-	 * @param shell the parent shell for the launch configuration dialog
-	 * @param configuration the configuration to display
-	 * @param groupIdentifier group identifier of the launch group the launch configuration
-	 * belongs to
-	 * @return the return code from opening the launch configuration dialog -
-	 *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-	 * @since 2.1
-	 */
-	public static int openLaunchConfigurationPropertiesDialog(Shell shell, ILaunchConfiguration configuration, String groupIdentifier) {
-		return openLaunchConfigurationPropertiesDialog(shell, configuration, groupIdentifier, null);
-	}
-	
-	/**
-	 * Open the launch configuration properties dialog on the specified launch
-	 * configuration.
-	 *
-	 * @param shell the parent shell for the launch configuration dialog
-	 * @param configuration the configuration to display
-	 * @param groupIdentifier group identifier of the launch group the launch configuration
-	 * belongs to
-	 * @param status the status to display, or <code>null</code> if none
-	 * @return the return code from opening the launch configuration dialog -
-	 *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-	 * @since 3.0
-	 */
-	public static int openLaunchConfigurationPropertiesDialog(Shell shell, ILaunchConfiguration configuration, String groupIdentifier, IStatus status) {
-		LaunchGroupExtension group = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier);
-		if (group != null) {
-			LaunchConfigurationPropertiesDialog dialog = new LaunchConfigurationPropertiesDialog(shell, configuration, group);
-			dialog.setInitialStatus(status);
-			return dialog.open();
-		} 
-		
-		return Window.CANCEL;
-	}
-	
-	/**
-     * Open the launch configuration dialog on the specified launch
-     * configuration. The dialog displays the tabs for a single configuration
-     * only (a tree of launch configuration is not displayed), and provides a
-     * launch (run or debug) button.
-     * <p>
-     * If a status is specified, a status handler is consulted to handle the
-     * status. The status handler is passed the instance of the launch
-     * configuration dialog that is opened. This gives the status handler an
-     * opportunity to perform error handling/initialization as required.
-     * </p>
-     * @param shell the parent shell for the launch configuration dialog
-     * @param configuration the configuration to display
-     * @param groupIdentifier group identifier of the launch group the launch configuration
-     * belongs to
-     * @param status the status to display, or <code>null</code> if none 
-     * @return the return code from opening the launch configuration dialog -
-     *  one  of <code>Window.OK</code> or <code>Window.CANCEL</code>
-     * @since 2.1
-     */
-    public static int openLaunchConfigurationDialog(Shell shell, ILaunchConfiguration configuration, String groupIdentifier, IStatus status) {
-    	LaunchGroupExtension group = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier);
-    	if (group != null) {
-    		LaunchConfigurationDialog dialog = new LaunchConfigurationDialog(shell, configuration, group);
-    		dialog.setInitialStatus(status);
-    		return dialog.open();
-    	} 
-    		
-    	return Window.CANCEL;
-    }
-    
-	/**
-	 * Saves all dirty editors and builds the workspace according to current
-	 * preference settings, and returns whether a launch should proceed.
-	 * <p>
-	 * The following preferences effect whether dirty editors are saved,
-	 * and/or if the user is prompted to save dirty editors:<ul>
-	 * <li>PREF_NEVER_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH</li>
-	 * <li>PREF_PROMPT_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH</li>
-	 * <li>PREF_AUTOSAVE_DIRTY_EDITORS_BEFORE_LAUNCH</li>
-	 * </ul>
-	 * The following preference effects whether a build is performed before
-	 * launching (if required):<ul>
-	 * <li>PREF_BUILD_BEFORE_LAUNCH</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @return whether a launch should proceed
-	 * @since 2.0
-	 * @deprecated Saving has been moved to the launch delegate <code>LaunchConfigurationDelegate</code> to allow for scoped saving
-	 * of resources that are only involved in the current launch, no longer the entire workspace
-	 */
-	public static boolean saveAndBuildBeforeLaunch() {
-		return DebugUIPlugin.saveAndBuild();
-	}
-	
-	/**
-	 * Saves all dirty editors according to current
-	 * preference settings, and returns whether a launch should proceed.
-	 * <p>
-	 * The following preferences effect whether dirty editors are saved,
-	 * and/or if the user is prompted to save dirty editors:<ul>
-	 * <li>PREF_NEVER_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH</li>
-	 * <li>PREF_PROMPT_SAVE_DIRTY_EDITORS_BEFORE_LAUNCH</li>
-	 * <li>PREF_AUTOSAVE_DIRTY_EDITORS_BEFORE_LAUNCH</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @return whether a launch should proceed
-	 * @since 2.1
-	 * @deprecated Saving has been moved to the launch delegate <code>LaunchConfigurationDelegate</code> to allow for scoped saving
-	 * of resources that are only involved in the current launch, no longer the entire workspace
-	 */
-	public static boolean saveBeforeLaunch() {
-		return DebugUIPlugin.preLaunchSave();
-	}	
-	
-	/**
-	 * Saves and builds the workspace according to current preference settings, and
-	 * launches the given launch configuration in the specified mode.
-	 * 
-	 * @param configuration the configuration to launch
-	 * @param mode launch mode - run or debug
-	 * @since 2.1
-	 */
-	public static void launch(final ILaunchConfiguration configuration, final String mode) {
-		boolean launchInBackground= true;
-		try {
-			launchInBackground= configuration.getAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, true);
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e);
-		}
-		if (launchInBackground) {
-			DebugUIPlugin.launchInBackground(configuration, mode);
-		} else {
-			DebugUIPlugin.launchInForeground(configuration, mode);
-		}
-	}
-	
-
-	
-	/**
-	 * Builds the workspace according to current preference settings, and launches
-	 * the given configuration in the specified mode, returning the resulting launch
-	 * object.
-	 * <p>
-	 * The following preference effects whether a build is performed before
-	 * launching (if required):<ul>
-	 * <li>PREF_BUILD_BEFORE_LAUNCH</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param configuration the configuration to launch
-	 * @param mode the mode to launch in
-	 * @param monitor progress monitor
-	 * @return the resulting launch object
-	 * @throws CoreException if building or launching fails
-	 * @since 2.1
-	 */
-	public static ILaunch buildAndLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		return DebugUIPlugin.buildAndLaunch(configuration, mode, monitor);
-	}
-	
-	/**
-	 * Returns the perspective to switch to when a configuration of the given type
-	 * is launched in the given mode, or <code>null</code> if no switch should take
-	 * place.
-	 * 
-	 * In 3.3 this method is equivalent to calling <code>getLaunchPerspective(ILaunchConfigurationType type, Set modes, ILaunchDelegate delegate)</code>,
-	 * with the 'mode' parameter comprising a single element set and passing <code>null</code> as the launch delegate.
-	 * 
-	 * @param type launch configuration type
-	 * @param mode launch mode identifier
-	 * @return perspective identifier or <code>null</code>
-	 * @since 3.0
-	 */
-	public static String getLaunchPerspective(ILaunchConfigurationType type, String mode) {
-		return DebugUIPlugin.getDefault().getPerspectiveManager().getLaunchPerspective(type, mode);
-	}
-	
-	/**
-	 * Returns the perspective id to switch to when a configuration of the given type launched with the specified delegate
-	 * is launched in the given mode set, or <code>null</code> if no switch should occurr.
-	 * @param type the configuration type
-	 * @param delegate the launch delegate
-	 * @param modes the set of modes
-	 * @return the perspective id or <code>null</code> if no switch should occur
-	 * 
-	 * @since 3.3
-	 */
-	public static String getLaunchPerspective(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes) {
-		return DebugUIPlugin.getDefault().getPerspectiveManager().getLaunchPerspective(type, modes, delegate);
-	}
-	
-	/**
-	 * Sets the perspective to switch to when a configuration of the given type
-	 * is launched in the given mode. <code>PERSPECTIVE_NONE</code> indicates no
-	 * perspective switch should take place. <code>PERSPECTIVE_DEFAULT</code> indicates
-	 * a default perspective switch should take place, as defined by the associated
-	 * launch tab group extension.
-	 * 
-	 * In 3.3 this method is equivalent to calling <code>setLaunchPerspective(ILaunchConfigurationType type, Set modes, ILaunchDelegate delegate, String perspectiveid)</code>, 
-	 * with the parameter 'mode' used in the set modes, and null passed as the delegate
-	 * 
-	 * @param type launch configuration type
-	 * @param mode launch mode identifier
-	 * @param perspective identifier, <code>PERSPECTIVE_NONE</code>, or
-	 *   <code>PERSPECTIVE_DEFAULT</code>
-	 * @since 3.0
-	 */
-	public static void setLaunchPerspective(ILaunchConfigurationType type, String mode, String perspective) {
-		DebugUIPlugin.getDefault().getPerspectiveManager().setLaunchPerspective(type, mode, perspective);
-	}	
-	
-	/**
-	 * Sets the perspective to switch to when a configuration of the specified type and launched using the 
-	 * specified launch delegate is launched in the specified modeset. <code>PERSPECTIVE_NONE</code> indicates no
-	 * perspective switch should take place.
-	 * 
-	 * Passing <code>null</code> for the launch delegate is quivalent to using the default perspective for the specified 
-	 * type.
-	 * @param type the configuration type
-	 * @param delegate the launch delegate
-	 * @param modes the set of modes
-	 * @param perspectiveid identifier or <code>PERSPECTIVE_NONE</code>
-	 * 
-	 * @since 3.3
-	 */
-	public static void setLaunchPerspective(ILaunchConfigurationType type, ILaunchDelegate delegate, Set modes, String perspectiveid) {
-		DebugUIPlugin.getDefault().getPerspectiveManager().setLaunchPerspective(type, modes, delegate, perspectiveid);
-	}
-	
-	/**
-	 * Returns whether the given launch configuration is private. Generally,
-	 * private launch configurations should not be displayed to the user. The
-	 * private status of a launch configuration is determined by the
-	 * <code>IDebugUIConstants.ATTR_PRIVATE</code> attribute.
-	 * 
-	 * @param configuration launch configuration
-	 * @return whether the given launch configuration is private
-	 * @since 3.0
-	 */
-	public static boolean isPrivate(ILaunchConfiguration configuration) {
-		return !LaunchConfigurationManager.isVisible(configuration);
-	}
-
-	/**
-	 * Sets whether step filters should be applied to step commands. This
-	 * setting is a global option applied to all registered debug targets. 
-	 * <p>
-	 * Since 3.3, this is equivalent to calling <code>DebugPlugin.setUseStepFilters(boolean)</code>.
-	 * </p>
-	 * @param useStepFilters whether step filters should be applied to step
-	 *  commands
-	 * @since 3.0
-	 * @see org.eclipse.debug.core.model.IStepFilters
-	 */
-	public static void setUseStepFilters(boolean useStepFilters) {
-		DebugPlugin.setUseStepFilters(useStepFilters);
-	}
-		
-	/**
-	 * Returns whether step filters are applied to step commands.
-	 * <p>
-	 * Since 3.3, this is equivalent to calling <code>DebugPlugin.isUseStepFilters()</code>.
-	 * </p>
-	 * @return whether step filters are applied to step commands
-	 * @since 3.0
-	 * @see org.eclipse.debug.core.model.IStepFilters
-	 */
-	public static boolean isUseStepFilters() {
-		return DebugPlugin.isUseStepFilters();
-	}
-		
-	/**
-	 * Returns the console associated with the given process, or 
-	 * <code>null</code> if none.
-	 * 
-	 * @param process a process
-	 * @return console associated with the given process, or 
-	 * <code>null</code> if none
-	 * @since 3.0
-	 */
-	public static IConsole getConsole(IProcess process) {
-		return DebugUIPlugin.getDefault().getProcessConsoleManager().getConsole(process);
-	}
-	
-	/**
-	 * Returns the console associated with the given debug element, or 
-	 * <code>null</code> if none.
-	 * 
-	 * @param element a debug model element
-	 * @return console associated with the given element, or 
-	 * <code>null</code> if none
-	 * @since 3.0
-	 */
-	public static IConsole getConsole(IDebugElement element) {
-		IProcess process = element.getDebugTarget().getProcess();
-		if (process != null) {
-			return getConsole(process);
-		}
-		return null;
-	}	
-	
-	/**
-	 * Returns all registered launch group extensions.
-	 *  
-	 * @return all registered launch group extensions
-	 * @since 3.0
-	 */
-	public static ILaunchGroup[] getLaunchGroups() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroups();
-	}
-	
-	/**
-	 * Returns the last configuration that was launched for specified launch group or
-	 * <code>null</code>, if there is not one. This method does not provide any form of
-	 * filtering on the returned launch configurations.
-	 * 
-	 * @param groupId the unique identifier of a launch group
-	 * @return the last launched configuration for the specified group or <code>null</code>.
-	 * @see DebugUITools#getLaunchGroups()
-	 * @since 3.3
-	 */
-	public static ILaunchConfiguration getLastLaunch(String groupId) {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLastLaunch(groupId);
-	}
-	
-	/**
-	 * Returns the launch group that the given launch configuration belongs
-	 * to, for the specified mode, or <code>null</code> if none.
-	 * 
-	 * @param configuration
-	 * @param mode
-	 * @return the launch group the given launch configuration belongs to, for
-	 * the specified mode, or <code>null</code> if none
-	 * @since 3.0
-	 */
-	public static ILaunchGroup getLaunchGroup(ILaunchConfiguration configuration, String mode) {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(configuration, mode);
-	}
-	
-    /**
-     * Performs source lookup on the given artifact and returns the result.
-     * Optionally, a source locator may be specified.
-     *  
-     * @param artifact object for which source is to be resolved
-     * @param locator the source locator to use, or <code>null</code>. When <code>null</code>
-     *   a source locator is determined from the artifact, if possible. If the artifact
-     *   is a debug element, the source locator from its associated launch is used. 
-     * @return a source lookup result
-     * @since 3.1
-     */
-    public static ISourceLookupResult lookupSource(Object artifact, ISourceLocator locator) {	
-    	return SourceLookupFacility.getDefault().lookup(artifact, locator);
-    }
-	
-    /**
-     * Displays the given source lookup result in an editor in the given workbench
-     * page. Has no effect if the result has an unknown editor id or editor input.
-     * The editor is opened, positioned, and annotated.
-     * <p>
-     * Honors user preference for editors re-use.
-     * </p> 
-     * @param result source lookup result to display
-     * @param page the page to display the result in
-     * @since 3.1
-     */
-    public static void displaySource(ISourceLookupResult result, IWorkbenchPage page) {
-    	SourceLookupFacility.getDefault().display(result, page);
-    }
-    
-    /**
-     * Returns the memory rendering manager.
-     * 
-     * @return the memory rendering manager
-     * @since 3.1
-     */
-    public static IMemoryRenderingManager getMemoryRenderingManager() {
-        return MemoryRenderingManager.getDefault();
-    }
-    
-	/**
-	 * Returns the image associated with the specified type of source container
-	 * or <code>null</code> if none.
-	 * 
-	 * @param id unique identifier for a source container type
-	 * @return image associated with the specified type of source container
-	 *    or <code>null</code> if none
-	 * @since 3.2
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainerType
-	 */
-	public static Image getSourceContainerImage(String id){
-		return SourceLookupUIUtils.getSourceContainerImage(id);
-	}
-	
-	/**
-	 * Returns a new source container browser for the specified type of source container
-	 * or <code>null</code> if a browser has not been registered.
-	 * 
-	 * @param id unique identifier for a source container type
-	 * @return source container browser or <code>null</code> if none
-	 * @since 3.2
-	 * @see org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser
-	 */
-	public static ISourceContainerBrowser getSourceContainerBrowser(String id) {
-		return SourceLookupUIUtils.getSourceContainerBrowser(id);
-	}
-	
-	/**
-	 * Returns the color associated with the specified preference identifier or 
-	 * <code>null</code> if none.
-	 * 
-	 * @param id preference identifier of the color
-	 * @return the color associated with the specified preference identifier
-	 * 	or <code>null</code> if none
-	 * @since 3.2
-	 * @see IDebugUIConstants
-	 */
-	public static Color getPreferenceColor(String id) {
-		return DebugUIPlugin.getPreferenceColor(id);
-	}
-	
-	/**
-	 * Returns the debug context manager.
-	 * 
-	 * @return debug context manager
-	 * @since 3.3
-	 */
-	public static IDebugContextManager getDebugContextManager() {
-		return DebugContextManager.getDefault();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DeferredDebugElementWorkbenchAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DeferredDebugElementWorkbenchAdapter.java
deleted file mode 100644
index 85cf2e0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DeferredDebugElementWorkbenchAdapter.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.debug.ui;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
-import org.eclipse.ui.progress.IElementCollector;
-
-
-/**
- * Common function for a deferred workbench adapter for a debug element. 
- * <p>
- * Clients may subclass this class to provide custom adapters for elements in a debug
- * model. The debug platform provides <code>IDeferredWorkbenchAdapters</code> for the standard debug
- * elements. Clients may override the default content in the debug view by providing an
- * <code>IWorkbenchAdapter</code> or <code>IDeferredWorkbenchAdapter</code> for a debug
- * element.
- * </p>
- * @since 3.1
- */
-public abstract class DeferredDebugElementWorkbenchAdapter extends DebugElementWorkbenchAdapter implements IDeferredWorkbenchAdapter {
-    
-	/**
-	 * An empty collection of children
-	 */
-    protected static final Object[] EMPTY = new Object[0];
-
-	/* (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(Object object) {
-        return null;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#fetchDeferredChildren(java.lang.Object, org.eclipse.ui.progress.IElementCollector, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-	    Object[] children = getChildren(object);
-	    if (monitor.isCanceled()) {
-	    	return;
-	    }
-	    if (children.length > 0) {
-	        collector.add(children, monitor);
-	    }
-	    collector.done();
-	}
-
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/EnvironmentTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/EnvironmentTab.java
deleted file mode 100644
index 6ea6976..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/EnvironmentTab.java
+++ /dev/null
@@ -1,690 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 Keith Seitz and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Keith Seitz (keiths@redhat.com) - initial implementation
- *     IBM Corporation - integration and code cleanup
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.AbstractDebugCheckboxSelectionDialog;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.MultipleInputDialog;
-import org.eclipse.debug.internal.ui.launchConfigurations.EnvironmentVariable;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsMessages;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-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.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.PlatformUI;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Launch configuration tab for configuring the environment passed
- * into Runtime.exec(...) when a config is launched.
- * <p>
- * This class may be instantiated; this class is not intended
- * to be subclassed.
- * </p> 
- * @since 3.0
- */
-public class EnvironmentTab extends AbstractLaunchConfigurationTab {
-
-	protected TableViewer environmentTable;
-	protected String[] envTableColumnHeaders =
-	{
-		LaunchConfigurationsMessages.EnvironmentTab_Variable_1, 
-		LaunchConfigurationsMessages.EnvironmentTab_Value_2, 
-	};
-	protected ColumnLayoutData[] envTableColumnLayouts =
-	{
-		new ColumnWeightData(50),
-		new ColumnWeightData(50)
-	};
-	private static final String NAME_LABEL= LaunchConfigurationsMessages.EnvironmentTab_8; 
-	private static final String VALUE_LABEL= LaunchConfigurationsMessages.EnvironmentTab_9; 
-	protected static final String P_VARIABLE = "variable"; //$NON-NLS-1$
-	protected static final String P_VALUE = "value"; //$NON-NLS-1$
-	protected static String[] envTableColumnProperties =
-	{
-		P_VARIABLE,
-		P_VALUE
-	};
-	protected Button envAddButton;
-	protected Button envEditButton;
-	protected Button envRemoveButton;
-	protected Button appendEnvironment;
-	protected Button replaceEnvironment;
-	protected Button envSelectButton;
-	
-	/**
-	 * Content provider for the environment table
-	 */
-	protected class EnvironmentVariableContentProvider implements IStructuredContentProvider {
-		public Object[] getElements(Object inputElement) {
-			EnvironmentVariable[] elements = new EnvironmentVariable[0];
-			ILaunchConfiguration config = (ILaunchConfiguration) inputElement;
-			Map m;
-			try {
-				m = config.getAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, (Map) null);
-			} catch (CoreException e) {
-				DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, "Error reading configuration", e)); //$NON-NLS-1$
-				return elements;
-			}
-			if (m != null && !m.isEmpty()) {
-				elements = new EnvironmentVariable[m.size()];
-				String[] varNames = new String[m.size()];
-				m.keySet().toArray(varNames);
-				for (int i = 0; i < m.size(); i++) {
-					elements[i] = new EnvironmentVariable(varNames[i], (String) m.get(varNames[i]));
-				}
-			}
-			return elements;
-		}
-		public void dispose() {
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null){
-				return;
-			}
-			if (viewer instanceof TableViewer){
-				TableViewer tableViewer= (TableViewer) viewer;
-				if (tableViewer.getTable().isDisposed()) {
-					return;
-				}
-				tableViewer.setComparator(new ViewerComparator() {
-					public int compare(Viewer iviewer, Object e1, Object e2) {
-						if (e1 == null) {
-							return -1;
-						} else if (e2 == null) {
-							return 1;
-						} else {
-							return ((EnvironmentVariable)e1).getName().compareToIgnoreCase(((EnvironmentVariable)e2).getName());
-						}
-					}
-				});
-			}
-		}
-	}
-	
-	/**
-	 * Label provider for the environment table
-	 */
-	public class EnvironmentVariableLabelProvider extends LabelProvider implements ITableLabelProvider {
-		public String getColumnText(Object element, int columnIndex) 	{
-			String result = null;
-			if (element != null) {
-				EnvironmentVariable var = (EnvironmentVariable) element;
-				switch (columnIndex) {
-					case 0: // variable
-						result = var.getName();
-						break;
-					case 1: // value
-						result = var.getValue();
-						break;
-				}
-			}
-			return result;
-		}
-		public Image getColumnImage(Object element, int columnIndex) {
-			if (columnIndex == 0) {
-				return DebugPluginImages.getImage(IDebugUIConstants.IMG_OBJS_ENV_VAR);
-			}
-			return null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// Create main composite
-		Composite mainComposite = new Composite(parent, SWT.NONE);
-		setControl(mainComposite);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ENVIRONMENT_TAB);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		mainComposite.setLayout(layout);
-		mainComposite.setLayoutData(gridData);
-		mainComposite.setFont(parent.getFont());
-		
-		createEnvironmentTable(mainComposite);
-		createTableButtons(mainComposite);
-		createAppendReplace(mainComposite);
-		
-		Dialog.applyDialogFont(mainComposite);
-	}
-	
-	/**
-	 * Creates and configures the widgets which allow the user to
-	 * choose whether the specified environment should be appended
-	 * to the native environment or if it should completely replace it.
-	 * @param parent the composite in which the widgets should be created
-	 */
-	protected void createAppendReplace(Composite parent) {
-		Composite appendReplaceComposite= new Composite(parent, SWT.NONE);
-		GridData gridData= new GridData();
-		gridData.horizontalSpan= 2;
-		GridLayout layout= new GridLayout();
-		appendReplaceComposite.setLayoutData(gridData);
-		appendReplaceComposite.setLayout(layout);
-		appendReplaceComposite.setFont(parent.getFont());
-		
-		appendEnvironment= createRadioButton(appendReplaceComposite, LaunchConfigurationsMessages.EnvironmentTab_16); 
-		appendEnvironment.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-		replaceEnvironment= createRadioButton(appendReplaceComposite, LaunchConfigurationsMessages.EnvironmentTab_17); 
-	}
-	
-	/**
-	 * Updates the enablement of the append/replace widgets. The
-	 * widgets should disable when there are no environment variables specified.
-	 */
-	protected void updateAppendReplace() {
-		boolean enable= environmentTable.getTable().getItemCount() > 0;
-		appendEnvironment.setEnabled(enable);
-		replaceEnvironment.setEnabled(enable);
-	}
-	
-	/**
-	 * Creates and configures the table that displayed the key/value
-	 * pairs that comprise the environment.
-	 * @param parent the composite in which the table should be created
-	 */
-	protected void createEnvironmentTable(Composite parent) {
-		Font font= parent.getFont();
-		// Create table composite
-		Composite tableComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.numColumns = 1;
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.heightHint = 150;
-		tableComposite.setLayout(layout);
-		tableComposite.setLayoutData(gridData);
-		tableComposite.setFont(font);
-		// Create label
-		Label label = new Label(tableComposite, SWT.NONE);
-		label.setFont(font);
-		label.setText(LaunchConfigurationsMessages.EnvironmentTab_Environment_variables_to_set__3); 
-		// Create table
-		environmentTable = new TableViewer(tableComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
-		Table table = environmentTable.getTable();
-		TableLayout tableLayout = new TableLayout();
-		table.setLayout(tableLayout);
-		table.setHeaderVisible(true);
-		table.setFont(font);
-		gridData = new GridData(GridData.FILL_BOTH);
-		environmentTable.getControl().setLayoutData(gridData);
-		environmentTable.setContentProvider(new EnvironmentVariableContentProvider());
-		environmentTable.setLabelProvider(new EnvironmentVariableLabelProvider());
-		environmentTable.setColumnProperties(envTableColumnProperties);
-		environmentTable.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				handleTableSelectionChanged(event);
-			}
-		});
-		environmentTable.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				if (!environmentTable.getSelection().isEmpty()) {
-					handleEnvEditButtonSelected();
-				}
-			}
-		});
-		// Create columns
-		for (int i = 0; i < envTableColumnHeaders.length; i++) {
-			tableLayout.addColumnData(envTableColumnLayouts[i]);
-			TableColumn tc = new TableColumn(table, SWT.NONE, i);
-			tc.setResizable(envTableColumnLayouts[i].resizable);
-			tc.setText(envTableColumnHeaders[i]);
-		}
-	}
-	
-	/**
-	 * Responds to a selection changed event in the environment table
-	 * @param event the selection change event
-	 */
-	protected void handleTableSelectionChanged(SelectionChangedEvent event) {
-		int size = ((IStructuredSelection)event.getSelection()).size();
-		envEditButton.setEnabled(size == 1);
-		envRemoveButton.setEnabled(size > 0);
-	}
-	
-	/**
-	 * Creates the add/edit/remove buttons for the environment table
-	 * @param parent the composite in which the buttons should be created
-	 */
-	protected void createTableButtons(Composite parent) {
-		// Create button composite
-		Composite buttonComposite = new Composite(parent, SWT.NONE);
-		GridLayout glayout = new GridLayout();
-		glayout.marginHeight = 0;
-		glayout.marginWidth = 0;
-		glayout.numColumns = 1;
-		GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END);
-		buttonComposite.setLayout(glayout);
-		buttonComposite.setLayoutData(gdata);
-		buttonComposite.setFont(parent.getFont());
-
-		createVerticalSpacer(buttonComposite, 1);
-		// Create buttons
-		envAddButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_New_4, null); 
-		envAddButton.addSelectionListener(new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent event) {
-				handleEnvAddButtonSelected();
-			}
-				});
-		envSelectButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_18, null); 
-		envSelectButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				handleEnvSelectButtonSelected();
-			}
-		});
-		envEditButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_Edit_5, null); 
-		envEditButton.addSelectionListener(new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent event) {
-				handleEnvEditButtonSelected();
-			}
-		});
-		envEditButton.setEnabled(false);
-		envRemoveButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_Remove_6, null); 
-		envRemoveButton.addSelectionListener(new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent event) {
-				handleEnvRemoveButtonSelected();
-			}
-		});
-		envRemoveButton.setEnabled(false);
-	}
-	
-	/**
-	 * Adds a new environment variable to the table.
-	 */
-	protected void handleEnvAddButtonSelected() {
-		MultipleInputDialog dialog = new MultipleInputDialog(getShell(), LaunchConfigurationsMessages.EnvironmentTab_22); 
-		dialog.addTextField(NAME_LABEL, null, false);
-		dialog.addVariablesField(VALUE_LABEL, null, true);
-		
-		if (dialog.open() != Window.OK) {
-			return;
-		}
-		
-		String name = dialog.getStringValue(NAME_LABEL);
-		String value = dialog.getStringValue(VALUE_LABEL);
-		
-		if (name != null && value != null && name.length() > 0 && value.length() >0) {
-			addVariable(new EnvironmentVariable(name.trim(), value.trim()));
-			updateAppendReplace();
-		}
-	}
-	
-	/**
-	 * Attempts to add the given variable. Returns whether the variable
-	 * was added or not (as when the user answers not to overwrite an
-	 * existing variable).
-	 * @param variable the variable to add
-	 * @return whether the variable was added
-	 */
-	protected boolean addVariable(EnvironmentVariable variable) {
-		String name= variable.getName();
-		TableItem[] items = environmentTable.getTable().getItems();
-		for (int i = 0; i < items.length; i++) {
-			EnvironmentVariable existingVariable = (EnvironmentVariable) items[i].getData();
-			if (existingVariable.getName().equals(name)) {
-				boolean overWrite= MessageDialog.openQuestion(getShell(), LaunchConfigurationsMessages.EnvironmentTab_12, MessageFormat.format(LaunchConfigurationsMessages.EnvironmentTab_13, new String[] {name})); // 
-				if (!overWrite) {
-					return false;
-				}
-				environmentTable.remove(existingVariable);
-				break;
-			}
-		}
-		environmentTable.add(variable);
-		updateLaunchConfigurationDialog();
-		return true;
-	}
-	
-	/**
-	 * Displays a dialog that allows user to select native environment variables 
-	 * to add to the table.
-	 */
-	private void handleEnvSelectButtonSelected() {
-		//get Environment Variables from the OS
-		Map envVariables = getNativeEnvironment();
-		
-		//get Environment Variables from the table
-		TableItem[] items = environmentTable.getTable().getItems();
-		for (int i = 0; i < items.length; i++) {
-			EnvironmentVariable var = (EnvironmentVariable) items[i].getData();
-			envVariables.remove(var.getName());
-		}
-		
-		NativeEnvironmentSelectionDialog dialog = new NativeEnvironmentSelectionDialog(getShell(), envVariables); 
-		dialog.setTitle(LaunchConfigurationsMessages.EnvironmentTab_20); 
-		
-		int button = dialog.open();
-		if (button == Window.OK) {
-			Object[] selected = dialog.getResult();		
-			for (int i = 0; i < selected.length; i++) {
-				environmentTable.add(selected[i]);				
-			}
-		}
-		
-		updateAppendReplace();
-		updateLaunchConfigurationDialog();
-	}
-
-	/**
-	 * Gets native environment variable from the LaunchManager. Creates EnvironmentVariable objects.
-	 * @return Map of name - EnvironmentVariable pairs based on native environment.
-	 */
-	private Map getNativeEnvironment() {
-		Map stringVars = DebugPlugin.getDefault().getLaunchManager().getNativeEnvironmentCasePreserved();
-		HashMap vars = new HashMap();
-		for (Iterator i = stringVars.keySet().iterator(); i.hasNext(); ) {
-			String key = (String) i.next();
-			String value = (String) stringVars.get(key);
-			vars.put(key, new EnvironmentVariable(key, value));
-		}
-		return vars;
-	}
-
-	/**
-	 * Creates an editor for the value of the selected environment variable.
-	 */
-	private void handleEnvEditButtonSelected() {
-		IStructuredSelection sel= (IStructuredSelection) environmentTable.getSelection();
-		EnvironmentVariable var= (EnvironmentVariable) sel.getFirstElement();
-		if (var == null) {
-			return;
-		}
-		String originalName= var.getName();
-		String value= var.getValue();
-		MultipleInputDialog dialog= new MultipleInputDialog(getShell(), LaunchConfigurationsMessages.EnvironmentTab_11); 
-		dialog.addTextField(NAME_LABEL, originalName, false);
-		dialog.addVariablesField(VALUE_LABEL, value, true);
-		
-		if (dialog.open() != Window.OK) {
-			return;
-		}
-		String name= dialog.getStringValue(NAME_LABEL);
-		value= dialog.getStringValue(VALUE_LABEL);
-		if (!originalName.equals(name)) {
-			if (addVariable(new EnvironmentVariable(name, value))) {
-				environmentTable.remove(var);
-			}
-		} else {
-			var.setValue(value);
-			environmentTable.update(var, null);
-			updateLaunchConfigurationDialog();
-		}
-	}
-
-	/**
-	 * Removes the selected environment variable from the table.
-	 */
-	private void handleEnvRemoveButtonSelected() {
-		IStructuredSelection sel = (IStructuredSelection) environmentTable.getSelection();
-		environmentTable.getControl().setRedraw(false);
-		for (Iterator i = sel.iterator(); i.hasNext(); ) {
-			EnvironmentVariable var = (EnvironmentVariable) i.next();	
-		environmentTable.remove(var);
-		}
-		environmentTable.getControl().setRedraw(true);
-		updateAppendReplace();
-		updateLaunchConfigurationDialog();
-	}
-
-	/**
-	 * Updates the environment table for the given launch configuration
-	 * @param configuration
-	 */
-	protected void updateEnvironment(ILaunchConfiguration configuration) {
-		environmentTable.setInput(configuration);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		configuration.setAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		boolean append= true;
-		try {
-			append = configuration.getAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, true);
-		} catch (CoreException e) {
-			DebugUIPlugin.log(e.getStatus());
-		}
-		if (append) {
-			appendEnvironment.setSelection(true);
-	        replaceEnvironment.setSelection(false);
-		} else {
-			replaceEnvironment.setSelection(true);
-			appendEnvironment.setSelection(false);
-		}
-		updateEnvironment(configuration);
-		updateAppendReplace();
-	}
-
-	/**
-	 * Stores the environment in the given configuration
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {	
-		// Convert the table's items into a Map so that this can be saved in the
-		// configuration's attributes.
-		TableItem[] items = environmentTable.getTable().getItems();
-		Map map = new HashMap(items.length);
-		for (int i = 0; i < items.length; i++)
-		{
-			EnvironmentVariable var = (EnvironmentVariable) items[i].getData();
-			map.put(var.getName(), var.getValue());
-		} 
-		if (map.size() == 0) {
-			configuration.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, (Map) null);
-		} else {
-			configuration.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, map);
-		}
-		configuration.setAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, appendEnvironment.getSelection());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return LaunchConfigurationsMessages.EnvironmentTab_Environment_7; 
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 * 
-	 * @since 3.3
-	 */
-	public String getId() {
-		return "org.eclipse.debug.ui.environmentTab"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return DebugPluginImages.getImage(IDebugUIConstants.IMG_OBJS_ENVIRONMENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
-		// do nothing when activated
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
-		// do nothing when de-activated
-	}
-	
-	/**
-	 * This dialog allows users to select one or more known native environment variables from a list.
-	 */
-	private class NativeEnvironmentSelectionDialog extends AbstractDebugCheckboxSelectionDialog {
-		
-		private Object fInput;
-		
-		public NativeEnvironmentSelectionDialog(Shell parentShell, Object input) {
-			super(parentShell);
-			fInput = input;
-			setShellStyle(getShellStyle() | SWT.RESIZE);
-			setShowSelectAllButtons(true);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getDialogSettingsId()
-		 */
-		protected String getDialogSettingsId() {
-			return IDebugUIConstants.PLUGIN_ID + ".ENVIRONMENT_TAB.NATIVE_ENVIROMENT_DIALOG"; //$NON-NLS-1$
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getHelpContextId()
-		 */
-		protected String getHelpContextId() {
-			return IDebugHelpContextIds.SELECT_NATIVE_ENVIRONMENT_DIALOG;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerInput()
-		 */
-		protected Object getViewerInput() {
-			return fInput;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getViewerLabel()
-		 */
-		protected String getViewerLabel() {
-			return LaunchConfigurationsMessages.EnvironmentTab_19;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getLabelProvider()
-		 */
-		protected IBaseLabelProvider getLabelProvider() {
-			return new ILabelProvider() {
-				public Image getImage(Object element) {
-					return DebugPluginImages.getImage(IDebugUIConstants.IMG_OBJS_ENVIRONMENT);
-				}
-				public String getText(Object element) {
-					EnvironmentVariable var = (EnvironmentVariable) element;
-					return MessageFormat.format(LaunchConfigurationsMessages.EnvironmentTab_7, new String[] {var.getName(), var.getValue()}); 
-				}
-				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.debug.internal.ui.launchConfigurations.AbstractDebugSelectionDialog#getContentProvider()
-		 */
-		protected IContentProvider getContentProvider() {
-			return new IStructuredContentProvider() {
-				public Object[] getElements(Object inputElement) {
-					EnvironmentVariable[] elements = null;
-					if (inputElement instanceof HashMap) {
-						Comparator comparator = new Comparator() {
-							public int compare(Object o1, Object o2) {
-								String s1 = (String)o1;
-								String s2 = (String)o2;
-								return s1.compareTo(s2);
-							}
-						};
-						TreeMap envVars = new TreeMap(comparator);
-						envVars.putAll((Map)inputElement);
-						elements = new EnvironmentVariable[envVars.size()];
-						int index = 0;
-						for (Iterator iterator = envVars.keySet().iterator(); iterator.hasNext(); index++) {
-							Object key = iterator.next();
-							elements[index] = (EnvironmentVariable) envVars.get(key);
-						}
-					}
-					return elements;
-				}
-				public void dispose() {	
-				}
-				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-				}
-			};
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointOrganizerDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointOrganizerDelegate.java
deleted file mode 100644
index c0422fe..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointOrganizerDelegate.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-/**
- * A breakpoint organizer is used to categorize breakpoints and provides
- * change notification when categorization has changed. Categories are represented
- * as arbitrary adaptable objects. For example, projects could be used to
- * categorize breakpoints. Images and labels for categories are generated
- * via workbench adapters.
- * <p>
- * Organizers may optionally support breakpoint recategorization. 
- * </p>
- * <p>
- * Following is example plug-in XML for contributing a breakpoint organizer.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.breakpointOrganizers"&gt;
- * 	&lt;breakpointOrganizer
- * 		class="com.example.BreakpointOrganizer"
- *      id="com.example.BreakpointOrganizer"
- *      label="Example Organizer"
- *      icon="icons/full/obj16/example_org.gif"/&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>class</code> Fully qualified name of a Java class that implements
- * {@link IBreakpointOrganizerDelegate}.</li>
- * <li><code>id</code> Unique identifier for this breakpoint organizer.</li>
- * <li><code>label</code> Label for this organizer which is suitable for
- * presentation to the user.</li>
- * <li><code>icon</code> Optional path to an icon which can be shown for this
- * organizer</li>
- * </ul>
- * </p>
- * <p>
- * Clients contributing a breakpoint organizer are intended to implement
- * this interface.
- * </p>
- * @since 3.1
- */
-public interface IBreakpointOrganizerDelegate {
-    
-    /**
-     * Change event id when a category's breakpoints have changed.
-     * The <code>oldValue</code> of the <code>PropertyChangeEvent</code> will be the
-     * category that has changed, and the source of the event will the the
-     * breakpoint organizer. Breakpoints in the category will be
-     * recategorized when this event is fired.
-     *
-     * @see IPropertyChangeListener
-     */
-    public static final String P_CATEGORY_CHANGED = DebugUIPlugin.getUniqueIdentifier() + ".P_CATEGORY_CHANGED"; //$NON-NLS-1$
-
-    /**
-     * Returns objects representing the categories of the specified
-     * breakpoint or <code>null</code> if this organizer cannot classify
-     * the breakpoint. Categories must return <code>true</code> when sent
-     * the message <code>equals(Object)</code> with an equivalent category
-     * as an argument.
-     * 
-     * @param breakpoint breakpoint to classify
-     * @return categories of the given breakpoint or <code>null</code>
-     */
-    public IAdaptable[] getCategories(IBreakpoint breakpoint);
-    
-    /**
-     * Adds the specified listener. Has no effect if an identical listener is
-     * already registered.
-     * 
-     * @param listener listener to add
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Removes the specified listener. Has no effect if an identical listener
-     * is not already registered.
-     * 
-     * @param listener listener to remove
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Adds the specified breakpoint to the given category. Only called
-     * if <code>canAdd(...)</code> returns <code>true</code> for the given
-     * breakpoint and category.
-     * 
-     * @param breakpoint breakpoint to recategorize
-     * @param category the breakpoint's new category
-     */
-    public void addBreakpoint(IBreakpoint breakpoint, IAdaptable category);
-    
-    /**
-     * Removes the specified breakpoint from the given category. Only
-     * called if <code>canRemove(...)</code> returns <code>true</code> for
-     * the given breakpoint and category.
-     * 
-     * @param breakpoint breakpoint to recategorize
-     * @param category the category the breakpoint is remove from
-     */
-    public void removeBreakpoint(IBreakpoint breakpoint, IAdaptable category);
-    
-    /**
-     * Returns whether the given breakpoint can be categorized in the
-     * specified category.
-     *  
-     * @param breakpoint breakpoint to recatogorize
-     * @param category the category to add the breakpoint to
-     * @return whether the given breakpoint can be categorized in the
-     * specified category
-     */
-    public boolean canAdd(IBreakpoint breakpoint, IAdaptable category);
-    
-    /**
-     * Returns whether the given breakpoint can be removed from the given
-     * category.
-     * 
-     * @param breakpoint breakpoint to recategorize
-     * @param category the category to remove the breakpoint from
-     * @return whether the given breakpoint can be removed from the given
-     * category
-     */
-    public boolean canRemove(IBreakpoint breakpoint, IAdaptable category);
-    
-    /**
-     * Returns all categories managed by this organizer, or <code>null</code>.
-     * When <code>null</code> is returned, the breakpoints view only displays
-     * categories that contain breakpoints. When a collection of categories
-     * is returned the breakpoints will display all of the categories, some of
-     * which may be empty.
-     *  
-     * @return all categories managed by this organizer, or <code>null</code>
-     */
-    public IAdaptable[] getCategories();
-    
-    /**
-     * Disposes this breakpoint organizer.
-     */
-    public void dispose();
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointOrganizerDelegateExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointOrganizerDelegateExtension.java
deleted file mode 100644
index 9bff24a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointOrganizerDelegateExtension.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.debug.ui;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IBreakpoint;
-
-/**
- * Optional enhancements to the {@link IBreakpointOrganizerDelegate} interface.
- * Supports operations on more than one breakpoint at a time.
- * <p>
- * Clients contributing a breakpoint organizer may optionally implement this
- * interface when implementing {@link IBreakpointOrganizerDelegate}.
- * </p>
- * @since 3.3
- */
-public interface IBreakpointOrganizerDelegateExtension extends IBreakpointOrganizerDelegate {
-    
-    /**
-     * Adds the specified breakpoints to the given category. Only called
-     * if <code>canAdd(...)</code> returns <code>true</code> for the given
-     * breakpoints and category.
-     * 
-     * @param breakpoints breakpoints add
-     * @param category the breakpoints' new category
-     */
-    public void addBreakpoints(IBreakpoint[] breakpoints, IAdaptable category);
-    
-    /**
-     * Removes the specified breakpoints from the given category. Only
-     * called if <code>canRemove(...)</code> returns <code>true</code> for
-     * the given breakpoints and category.
-     * 
-     * @param breakpoints breakpoints to remove
-     * @param category the category the breakpoint is remove from
-     */
-    public void removeBreakpoints(IBreakpoint[] breakpoints, IAdaptable category);
-        
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointTypeCategory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointTypeCategory.java
deleted file mode 100644
index ddb1ea8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IBreakpointTypeCategory.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.debug.ui;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Represents a breakpoint's type to support organization of breakpoints
- * by type in the breakpoints view. A default breakpoint type adapter
- * is provided for breakpoints by the debug platform, but clients may override
- * the default adapter by providing their own adapter for breakpoints.
- * <p>
- * A breakpoint type category is an adaptable that must provide an
- * <code>IWorkbenchAdapter</code> such that it can be rendered in the
- * breakpoints view.
- * </p>
- * <p>
- * Implementations should ensure that <code>equals</code> and <code>hashCode</code>
- * are implemented properly to reflect the equality of type categories.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.ui.BreakpointTypeCategory
- * @since 3.1
- */
-public interface IBreakpointTypeCategory extends IAdaptable {
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugEditorPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugEditorPresentation.java
deleted file mode 100644
index dcef24c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugEditorPresentation.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.debug.ui;
-
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A debug model presentation may implement this interface to override
- * standard editor positioning and annotations associated with
- * source code display for stack frames.
- * 
- * @since 3.0
- */
-public interface IDebugEditorPresentation {
-	/**
-	 * Positions and adds annotations to the given editor for the specified
-	 * stack frame and returns whether any annotations were added. When
-	 * <code>true</code> is returned, a call will be made to remove annotations
-	 * when the source selection is cleared for the stack frame. When
-	 * <code>false</code> is returned, the debugger will position and add
-	 * standard annotations to the editor, and a corresponding call to remove
-	 * annotations will not be made. This method is called when the debugger is
-	 * has opened an editor to display source for the given stack frame. 
-	 * 
-	 * @param editorPart the editor the debugger has opened
-	 * @param frame the stack frame for which the debugger is displaying
-	 *  source
-	 */
-	public boolean addAnnotations(IEditorPart editorPart, IStackFrame frame);
-	
-	/**
-	 * Removes any debug related annotations from the given editor.
-	 * This method is called when the debugger clears the source selection
-	 * in an editor opened by the debugger. For example, when a debug
-	 * session is resumed or terminated.
-	 *   
-	 * @param editorPart an editor that annotations were added to for
-	 *  a stack frame
-	 * @param thread the thread for which stack frame annotations were
-	 *  added to the editor
-	 */
-	public void removeAnnotations(IEditorPart editorPart, IThread thread);	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugModelPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugModelPresentation.java
deleted file mode 100644
index cdcbc3c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugModelPresentation.java
+++ /dev/null
@@ -1,143 +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.debug.ui;
-
-
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A debug model presentation is responsible for providing labels, images,
- * and editors associated with debug elements in a specific debug model.
- * Extensions of type <code>org.eclipse.debug.ui.debugModelPresentations</code> implement
- * this interface. Generally, a debug model implementation will also provide a
- * debug model presentation extension to render and display its elements. A debug
- * model presentation is registered for a specific debug model, and is responsible
- * for the presentation elements defined/implemented by that model.
- * <p>
- * A debug model presentation extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a debug model presentation extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.debugModelPresentations"&gt;
- *   &lt;debugModelPresentation 
- *      id="com.example.debugModelIdentifier"
- *      class="com.example.ExamplePresentation"
- *      detailsViewerConfiguration="com.example.ExampleSourceViewerConfiguration"&gt;
- *   &lt;/debugModelPresentation&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies the identifier of the debug model this presentation
- *    is responsible for. Corresponds to the model identifier returned from a debug
- *	element - see <code>IDebugElement.getModelIndentifier</code></li>
- * <li><code>class</code> specifies the fully qualified name of the Java class
- *   that implements this interface.</li>
- * <li><code>detailsViewerConfiguration</code> optionally specifies the fully qualified name of the Java class
- *   that is an instance of <code>org.eclipse.jface.text.source.SourceViewerConfiguration</code>.
- *   When specified, the source viewer configuration will be used in the "details" area of the
- *   variables and expressions view when displaying the details of an element from the
- *   debug model associated with this debug model presentation. When unspecified,
- *   a default configuration is used.</li>
- * </ul>
- * </p>
- * <p>
- * To allow for an extensible configuration, this interface defines
- * a <code>setAttribute</code> method. The debug UI plug-in defines
- * one presentation attribute:
- * <ul>
- *  <li><code>DISPLAY_VARIABLE_TYPE_NAMES</code> - This is a boolean attribute 
- *     indicating whether variable elements should be rendered with the declared
- *     type of a variable. For example, a Java debug model presentation would render
- *     an integer as <code>"int x = 3"</code> when true, and <code>"x = 3"</code>
- *     when false.</li>
- * </ul>
- * </p>
- * <p>
- * Clients may define new presentation attributes. For example, a client may wish
- * to define a "hexadecimal" property to display numeric values in hexadecimal. Implementations
- * should honor the presentation attributes defined by this interface where possible,
- * but do not need to honor presentation attributes defined by other clients.
- * To access the debug model presentation for a debug view, clients should use
- * <code>IDebugView#getPresentation(String)</code>.
- * </p>
- * <p>
- * Since 3.1, debug model presentations may optionally implement <code>IColorProvider</code>
- * and <code>IFontProvider</code> to override default fonts and colors for debug elements. 
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.debug.core.model.IDebugElement
- * @see org.eclipse.jface.viewers.ILabelProvider
- * @see org.eclipse.debug.ui.IDebugView
- */
-
-public interface IDebugModelPresentation extends ILabelProvider, ISourcePresentation {
-	/** 
-	 * Variable type names presentation property (value <code>"org.eclipse.debug.ui.displayVariableTypeNames"</code>).
-	 * When <code>DISPLAY_VARIABLE_TYPE_NAMES</code> is set to <code>true</code>,
-	 * this label provider should include the reference type of a variable  when rendering
-	 * variables. When set to <code>false</code>, this label provider 
-	 * should not include the reference type of a variable when rendering
-	 * variables.
-	 * @see #setAttribute(String, Object)
-	 */
-	public final static String DISPLAY_VARIABLE_TYPE_NAMES= IDebugUIConstants.PLUGIN_ID + ".displayVariableTypeNames"; //$NON-NLS-1$
-	/**
-	 * Sets a presentation attribute of this label provider. For example,
-	 * see the presentation attribute <code>DISPLAY_VARIABLE_TYPE_NAMES</code>
-	 * defined by this interface.
-	 *
-	 * @param attribute the presentation attribute identifier
-	 * @param value the value of the attribute
-	 */
-	void setAttribute(String attribute, Object value);
-	/**
-	 * Returns an image for the element, or <code>null</code> if a default
-	 * image should be used.
-	 *
-	 * @param element the debug model element
-	 * @return an image for the element, or <code>null</code> if a default
-	 *    image should be used
-	 * @see ILabelProvider
-	 */
-	public Image getImage(Object element);
-	/**
-	 * Returns a label for the element, or <code>null</code> if a default
-	 * label should be used.
-	 *
-	 * @param element the debug model element
-	 * @return a label for the element, or <code>null</code> if a default
-	 *    label should be used
-	 * @see ILabelProvider
-	 */
-	public String getText(Object element);
-	
-	/**
-	 * Computes a detailed description of the given value, reporting
-	 * the result to the specified listener. This allows a presentation
-	 * to provide extra details about a selected value in the variable detail
-	 * portion of the variables view. Since this can be a long-running operation,
-	 * the details are reported back to the specified listener asynchronously.
-	 * If <code>null</code> is reported, the value's value string is displayed
-	 * (<code>IValue.getValueString()</code>).
-	 * 
-	 * @param value the value for which a detailed description
-	 * 	is required
-	 * @param listener the listener to report the details to
-	 * 	asynchronously
-	 * @since 2.0
-	 */
-	void computeDetail(IValue value, IValueDetailListener listener);	
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java
deleted file mode 100644
index f60c5f5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java
+++ /dev/null
@@ -1,1170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     QNX Software Systems - Mikhail Khodjaiants - Registers View (Bug 53640)
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-
-import org.eclipse.debug.core.DebugPlugin;
- 
-/**
- * Constant definitions for debug UI plug-in.
- * <p>
- * Popup menus in the debug UI support action contribution via the
- * <code>org.eclipse.ui.popupMenus</code>  extension. Actions may be
- * contributed to any group on the menu. To facilitate insertion of actions
- * in between existing groups, empty groups have been defined
- * in the menu. Each group prefixed by "empty" indicates an empty group.
- * </p>
- * <h3>Debug View Popup Menu</h3>
- * <ul>
- *   <li>Empty edit group</li>
- *   <li>Edit group</li>
- *   <li>Copy stack action</li>
- *   <li>Empty step group</li>
- *   <li>Step group</li>
- *   <li>Step into group</li>
- *   <li>Step into action</li>
- * 	 <li>Step over group</li>
- *   <li>Step over action</li>
- *   <li>Step return group</li> 
- *   <li>Step return action</li>
- *   <li>Empty thread group</li>
- *   <li>Thread group</li>
- *   <li>Resume action</li>
- *   <li>Suspend action</li>
- *   <li>Terminate action</li>
- *   <li>Disconnect action</li>
- *   <li>Empty launch group</li>
- *   <li>Launch group</li>
- *   <li>Remove all terminated action</li>
- *   <li>Terminate and Remove action</li>
- *   <li>Relaunch action</li>
- *   <li>Terminate all action</li>
- *   <li>Empty render group</li>
- *   <li>Render group</li>
- *   <li>Property group</li>
- *   <li>Property dialog action</li>
- *   <li>Additions group</li>
- * </ul>
- * <h3>Variables View Popup Menus</h3>
- * <ul>
- *   <li>Empty variable group</li>
- *   <li>Variable group</li>
- *   <li>Select all action</li>
- *   <li>Copy to clipboard action</li>
- *   <li>Find action</li>
- *   <li>Change value action</li>
- *   <li>Available logical structures action</li>
- *   <li>Available detail panes action</li>
- *   <li>Empty render group</li>
- *   <li>Render group</li>
- *   <li>Show type names action</li>
- *   <li>Additions group</li>
- * </ul>
- * <h3>Breakpoints View Popup Menu</h3>
- * <ul>
- *   <li>Empty Navigation group</li>
- *   <li>Navigation group</li>
- *   <li>Open action</li>
- *   <li>Empty Breakpoint group</li>
- *   <li>Breakpoint group</li>
- *   <li>Enable action</li> 
- *   <li>Disable action</li>
- *   <li>Remove action</li>
- *   <li>Remove all action</li>
- *   <li>Empty render group</li>
- *   <li>Render group</li>
- * 	 <li>Show breakpoints for model action</li>
- *   <li>Additions group</li>
- * </ul>
- * <h3>Expressions View Popup Menu</h3>
- * <ul>
- *   <li>Empty Expression group</li>
- *   <li>Expression group</li>
- *   <li>Select all action</li>
- * 	 <li>Copy to clipboard action</li>	 
- *   <li>Remove action</li>
- *   <li>Remove all action</li>
- *   <li>Find action</li>
- *   <li>Change variable value action</li>
- *   <li>Available logical structures action</li>
- *   <li>Available detail panes action</li>
- *   <li>Empty Render group</li>
- *   <li>Render group</li>
- * 	 <li>Show type names action</li>
- *   <li>Additions group</li>
- * </ul>
- * <p>
- * Constants only; not intended to be implemented or extended.
- * </p>
- */
-
-public interface IDebugUIConstants {
-	
-	/**
-	 * Debug UI plug-in identifier (value <code>"org.eclipse.debug.ui"</code>).
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.debug.ui"; //$NON-NLS-1$;
-	
-	/**
-	 * Debug perspective identifier (value <code>"org.eclipse.debug.ui.DebugPerspective"</code>).
-	 */
-	public static final String ID_DEBUG_PERSPECTIVE = PLUGIN_ID + ".DebugPerspective"; //$NON-NLS-1$
-	
-	/**
-	 * Console type identifier (value <code>"org.eclipse.debug.ui.ProcessConsoleType"</code>).
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ID_PROCESS_CONSOLE_TYPE = PLUGIN_ID + ".ProcessConsoleType"; //$NON-NLS-1$
-	
-	/**
-	 * Constant for referring to no perspective.
-	 */
-	public static final String PERSPECTIVE_NONE = "perspective_none"; //$NON-NLS-1$
-	
-	/**
-	 * Constant for referring to a default perspective.
-	 */
-	public static final String PERSPECTIVE_DEFAULT = "perspective_default"; //$NON-NLS-1$
-
-	// Preferences
-
-	/**
-	 * String preference that identifies the default 'switch to perspective id' when running a 
-	 * launch configuration.  This default is used if a particular launch configuration does not
-	 * override the 'switch to perspective when in run mode' attribute with something else.
-	 */
-	public static final String PREF_SHOW_RUN_PERSPECTIVE_DEFAULT= PLUGIN_ID + ".show_run_perspective_default";  //$NON-NLS-1$
-	
-	/**
-	 * String preference that identifies the default 'switch to perspective id' when debugging a 
-	 * launch configuration.  This default is used if a particular launch configuration does not
-	 * override the 'switch to perspective when in debug mode' attribute with something else.
-	 */
-	public static final String PREF_SHOW_DEBUG_PERSPECTIVE_DEFAULT= PLUGIN_ID + ".show_debug_perspective_default";  //$NON-NLS-1$
-	
-	/**
-	 * Boolean preference controlling whether a build is done before
-	 * launching a program (if one is needed).
-	 */
-	public static final String PREF_BUILD_BEFORE_LAUNCH= PLUGIN_ID + ".build_before_launch"; //$NON-NLS-1$
-	/**
-	 * Boolean preference controlling automatic removal of terminated launches
-	 * when a new launch is registered.
-	 * @since 2.0
-	 */
-	public static final String PREF_AUTO_REMOVE_OLD_LAUNCHES= PLUGIN_ID + ".auto_remove_old_launches"; //$NON-NLS-1$
-
-	/**
-	 * Boolean preference controlling whether the debugger re-uses non-dirty editors
-	 * that it opens when displaying source. When <code>true</code> the debugger
-	 * re-uses the same editor when showing source for a selected stack frame (unless
-	 * the editor is dirty).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String PREF_REUSE_EDITOR = PLUGIN_ID + ".reuse_editor"; //$NON-NLS-1$
-	
-	/**
-	 * Integer preference that specifies the length of the Run & Debug launch history lists.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String PREF_MAX_HISTORY_SIZE = PLUGIN_ID + ".max_history_size"; //$NON-NLS-1$
-	
-	/**
-	 * Boolean preference controlling whether the debugger shows types names
-	 * in its variable view. When <code>true</code> the debugger
-	 * will display type names in new variable views.
-	 * 
-	 * @since 2.0
-	 * @deprecated no longer used
-	 */
-	public static final String PREF_SHOW_TYPE_NAMES = PLUGIN_ID + ".show_type_names"; //$NON-NLS-1$	
-	
-	/**
-	 * Boolean preference controlling whether the debugger shows the detail pane
-	 * in its variable view. When <code>true</code> the debugger
-	 * will show the detail panes in new variable views.
-	 * 
-	 * @since 2.0
-	 * @deprecated no longer used
-	 */
-	public static final String PREF_SHOW_DETAIL_PANE = PLUGIN_ID + ".show_detail_pane"; //$NON-NLS-1$
-	
-	/**
-	 * Boolean preference controlling whether the debugger will force activate the active
-	 * shell/window of the Eclipse workbench when a breakpoint is hit.
-	 * 
-	 * @since 2.1
-	 */
-	public static final String PREF_ACTIVATE_WORKBENCH= PLUGIN_ID + ".activate_workbench"; //$NON-NLS-1$
-	
-	/**
-	 * Boolean preference controlling whether breakpoints are
-	 * automatically skipped during a Run To Line operation.
-	 * If true, breakpoints will be skipped automatically
-	 * during Run To Line. If false, they will be hit.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE= PLUGIN_ID + ".skip_breakpoints_during_run_to_line"; //$NON-NLS-1$
-	
-	/**
-	 * String preference controlling in which perspectives view
-	 * management will occur. The value is a comma-separated list
-	 * of plug-in identifiers.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String PREF_MANAGE_VIEW_PERSPECTIVES= PLUGIN_ID + ".manage_view_perspectives"; //$NON-NLS-1$
-	
-	/**
-	 * Font preference setting for the process console.
-	 * 
-	 * @since 3.3
-	 */
-	public static final String PREF_CONSOLE_FONT= "org.eclipse.debug.ui.consoleFont"; //$NON-NLS-1$
-	
-	/**
-	 * Debug view identifier (value <code>"org.eclipse.debug.ui.DebugView"</code>).
-	 */
-	public static final String ID_DEBUG_VIEW= "org.eclipse.debug.ui.DebugView"; //$NON-NLS-1$
-	
-	/**
-	 * Breakpoint view identifier (value <code>"org.eclipse.debug.ui.BreakpointView"</code>).
-	 */
-	public static final String ID_BREAKPOINT_VIEW= "org.eclipse.debug.ui.BreakpointView"; //$NON-NLS-1$
-	
-	/**
-	 * Variable view identifier (value <code>"org.eclipse.debug.ui.VariableView"</code>).
-	 */
-	public static final String ID_VARIABLE_VIEW= "org.eclipse.debug.ui.VariableView"; //$NON-NLS-1$
-	
-	/**
-	 * Expression view identifier (value <code>"org.eclipse.debug.ui.ExpressionView"</code>).
-	 * @since 2.0
-	 */
-	public static final String ID_EXPRESSION_VIEW= "org.eclipse.debug.ui.ExpressionView"; //$NON-NLS-1$
-		
-	/**
-	 * Register view identifier (value <code>"org.eclipse.debug.ui.RegisterView"</code>).
-	 * @since 3.0
-	 */
-	public static final String ID_REGISTER_VIEW= "org.eclipse.debug.ui.RegisterView"; //$NON-NLS-1$
-		
-	/**
-	 * Console view identifier (value <code>"org.eclipse.debug.ui.ConsoleView"</code>).
-	 * @deprecated Use org.eclipse.ui.console.IConsoleConstants.ID_CONSOLE_VIEW 
-	 * @since 3.0
-	 */
-	public static final String ID_CONSOLE_VIEW= "org.eclipse.debug.ui.ConsoleView"; //$NON-NLS-1$
-	
-	// Console stream identifiers
-	
-	/**
-	 * Identifier for the standard out stream.
-	 * 
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#getColor(String)
-	 * @since 2.1
-	 */
-	public static final String ID_STANDARD_OUTPUT_STREAM = IDebugUIConstants.PLUGIN_ID + ".ID_STANDARD_OUTPUT_STREAM"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for the standard error stream.
-	 *
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#getColor(String)
-	 * @since 2.1
-	 */	
-	public static final String ID_STANDARD_ERROR_STREAM = IDebugUIConstants.PLUGIN_ID + ".ID_STANDARD_ERROR_STREAM"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for the standard input stream.
-	 *
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#getColor(String)
-	 * @since 2.1
-	 */	
-	public static final String ID_STANDARD_INPUT_STREAM = IDebugUIConstants.PLUGIN_ID + ".ID_STANDARD_INPUT_STREAM"; //$NON-NLS-1$
-	
-	// Debug Action images
-	
-	/**
-	 * Debug action image identifier.
-	 */
-	public static final String IMG_ACT_DEBUG= "IMG_ACT_DEBUG"; //$NON-NLS-1$
-
-	/**
-	 * Run action image identifier.
-	 */
-	public static final String IMG_ACT_RUN= "IMG_ACT_RUN"; //$NON-NLS-1$
-    
-    /** "Link with View" action image identifier. */
-    public static final String IMG_ACT_SYNCED= "IMG_ACT_SYNCED"; //$NON-NLS-1$
-	
-	/** "Skip Breakpoints" action image identifier */
-	public static final String IMG_SKIP_BREAKPOINTS= "IMG_SKIP_BREAKPOINTS"; //$NON-NLS-1$
-	
-	/** Clear action image identifier. 
-	 * @deprecated */
-	public static final String IMG_LCL_CLEAR= "IMG_LCL_CLEAR"; //$NON-NLS-1$
-	
-	/** Display variable type names action image identifier. */
-	public static final String IMG_LCL_TYPE_NAMES= "IMG_LCL_TYPE_NAMES"; //$NON-NLS-1$
-	
-	/** Toggle detail pane action image identifier.*/
-	public static final String IMG_LCL_DETAIL_PANE= "IMG_LCL_DETAIL_PANE"; //$NON-NLS-1$
-	
-	/** Change variable value action image identifier.*/
-	public static final String IMG_LCL_CHANGE_VARIABLE_VALUE= "IMG_LCL_CHANGE_VARIABLE_VALUE"; //$NON-NLS-1$
-		
-	/**
-	 * Disconnect action image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_LCL_DISCONNECT= "IMG_LCL_DISCONNECT"; //$NON-NLS-1$
-	
-	/**
-	 * Scroll lock action image identifier
-	 * 
-	 * @since 2.1
-	 */
-	public static final String IMG_LCL_LOCK = "IMG_LCL_LOCK"; //$NON-NLS-1$	
-	
-	/**
-	 * Remove all action image identifier
-	 * 
-	 * @since 2.1
-	 */
-	public static final String IMG_LCL_REMOVE_ALL = "IMG_LCL_REMOVE_ALL"; //$NON-NLS-1$	
-	
-    /**
-     * Remove action image identifier
-     * 
-     * @since 3.2
-     */
-    public static final String IMG_LCL_REMOVE = "IMG_LCL_REMOVE"; //$NON-NLS-1$
-    
-	/**
-	 * Content assist action image identifier.
-	 */
-	public static final String IMG_LCL_CONTENT_ASSIST= "IMG_LCL_CONTENT_ASSIST"; //$NON-NLS-1$
-		
-	/**
-	 * Content assist action image identifier (enabled).
-	 */
-	public static final String IMG_ELCL_CONTENT_ASSIST= "IMG_ELCL_CONTENT_ASSIST"; //$NON-NLS-1$
-	
-	/**
-	 * Content assist action image identifier (disabled).
-	 */
-	public static final String IMG_DLCL_CONTENT_ASSIST= "IMG_DLCL_CONTENT_ASSIST"; //$NON-NLS-1$
-	
-	/**
-	 * Content assist action image identifier.
-	 */
-	public static final String IMG_LCL_DETAIL_PANE_UNDER= "IMG_LCL_DETAIL_PANE_UNDER"; //$NON-NLS-1$
-	
-	/**
-	 * Content assist action image identifier.
-	 */
-	public static final String IMG_LCL_DETAIL_PANE_RIGHT= "IMG_LCL_DETAIL_PANE_RIGHT"; //$NON-NLS-1$
-	
-	/**
-	 * Content assist action image identifier.
-	 */
-	public static final String IMG_LCL_DETAIL_PANE_HIDE= "IMG_LCL_DETAIL_PANE_HIDE"; //$NON-NLS-1$
-	
-	// Debug element images
-	
-	/** Debug mode launch image identifier. */
-	public static final String IMG_OBJS_LAUNCH_DEBUG= "IMG_OBJS_LAUNCH_DEBUG"; //$NON-NLS-1$
-	
-	/** Run mode launch image identifier. */
-	public static final String IMG_OBJS_LAUNCH_RUN= "IMG_OBJS_LAUNCH_RUN"; //$NON-NLS-1$
-	
-	/** Terminated run mode launch image identifier. */
-	public static final String IMG_OBJS_LAUNCH_RUN_TERMINATED= "IMG_OBJS_LAUNCH_RUN_TERMINATED"; //$NON-NLS-1$
-	
-	/** Running debug target image identifier. */
-	public static final String IMG_OBJS_DEBUG_TARGET= "IMG_OBJS_DEBUG_TARGET"; //$NON-NLS-1$
-	
-	/** Suspended debug target image identifier. */
-	public static final String IMG_OBJS_DEBUG_TARGET_SUSPENDED= "IMG_OBJS_DEBUG_TARGET_SUSPENDED"; //$NON-NLS-1$
-	
-	/** Terminated debug target image identifier. */
-	public static final String IMG_OBJS_DEBUG_TARGET_TERMINATED= "IMG_OBJS_DEBUG_TARGET_TERMINATED"; //$NON-NLS-1$
-	
-	/** Running thread image identifier. */
-	public static final String IMG_OBJS_THREAD_RUNNING= "IMG_OBJS_THREAD_RUNNING"; //$NON-NLS-1$
-	
-	/** Suspended thread image identifier. */
-	public static final String IMG_OBJS_THREAD_SUSPENDED= "IMG_OBJS_THREAD_SUSPENDED"; //$NON-NLS-1$
-	
-	/** Terminated thread image identifier. */
-	public static final String IMG_OBJS_THREAD_TERMINATED= "IMG_OBJS_THREAD_TERMINATED"; //$NON-NLS-1$
-	
-	/** Stack frame (suspended) image identifier. */
-	public static final String IMG_OBJS_STACKFRAME= "IMG_OBJS_STACKFRAME"; //$NON-NLS-1$
-	
-	/** Stack frame (running) image identifier. */
-	public static final String IMG_OBJS_STACKFRAME_RUNNING= "IMG_OBJS_STACKFRAME_RUNNING"; //$NON-NLS-1$
-	
-	/** Enabled breakpoint image identifier. */
-	public static final String IMG_OBJS_BREAKPOINT= "IMG_OBJS_BREAKPOINT"; //$NON-NLS-1$
-	
-	/** Disabled breakpoint image identifier. */
-	public static final String IMG_OBJS_BREAKPOINT_DISABLED= "IMG_OBJS_BREAKPOINT_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Breakpoint group image identifier.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String IMG_OBJS_BREAKPOINT_GROUP = "IMG_OBJS_BREAKPOINT_GROUP"; //$NON-NLS-1$
-	
-	/**
-	 * Disabled breakpoint group image identifier.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String IMG_OBJS_BREAKPOINT_GROUP_DISABLED = "IMG_OBJS_BREAKPOINT_GROUP_DISABLED"; //$NON-NLS-1$
-		
-	/**
-	 * Enabled watchpoint image identifier (access & modification).
-	 * @since 3.0
-	 */
-	public static final String IMG_OBJS_WATCHPOINT= "IMG_OBJS_WATCHPOINT"; //$NON-NLS-1$
-	
-	/**
-	 * Disabled watchpoint image identifier (access & modification).
-	 * @since 3.0
-	 */
-	public static final String IMG_OBJS_WATCHPOINT_DISABLED= "IMG_OBJS_WATCHPOINT_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Enabled access watchpoint image identifier.
-	 * @since 3.1
-	 */
-	public static final String IMG_OBJS_ACCESS_WATCHPOINT= "IMG_OBJS_ACCESS_WATCHPOINT"; //$NON-NLS-1$
-	
-	/**
-	 * Disabled access watchpoint image identifier.
-	 * @since 3.1
-	 */
-	public static final String IMG_OBJS_ACCESS_WATCHPOINT_DISABLED= "IMG_OBJS_ACCESS_WATCHPOINT_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Enabled modification watchpoint image identifier.
-	 * @since 3.1
-	 */
-	public static final String IMG_OBJS_MODIFICATION_WATCHPOINT= "IMG_OBJS_MODIFICATION_WATCHPOINT"; //$NON-NLS-1$
-	
-	/**
-	 * Disabled modification watchpoint image identifier.
-	 * @since 3.1
-	 */
-	public static final String IMG_OBJS_MODIFICATION_WATCHPOINT_DISABLED= "IMG_OBJS_MODIFICATION_WATCHPOINT_DISABLED"; //$NON-NLS-1$
-
-	/** Running system process image identifier. */
-	public static final String IMG_OBJS_OS_PROCESS= "IMG_OBJS_OS_PROCESS"; //$NON-NLS-1$
-	
-	/** Terminated system process image identifier. */
-	public static final String IMG_OBJS_OS_PROCESS_TERMINATED= "IMG_OBJS_OS_PROCESS_TERMINATED"; //$NON-NLS-1$
-		
-	/**
-	 * Expression image identifier.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_OBJS_EXPRESSION= "IMG_OBJS_EXPRESSION"; //$NON-NLS-1$
-	
-	/**
-	 * Generic variable image identifier.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_OBJS_VARIABLE= "IMG_OBJS_VARIABLE"; //$NON-NLS-1$
-
-	/**
-	 * Generic identifier of register group image.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String IMG_OBJS_REGISTER_GROUP= "IMG_OBJS_REGISTER_GROUP"; //$NON-NLS-1$
-
-	/**
-	 * Generic register image identifier.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String IMG_OBJS_REGISTER= "IMG_OBJS_REGISTER"; //$NON-NLS-1$
-
-	/**
-	 * Environment image identifier.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String IMG_OBJS_ENVIRONMENT = "IMG_OBJS_ENVIRONMENT"; //$NON-NLS-1$
-	
-	/**
-	 * Environment variable image identifier.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String IMG_OBJS_ENV_VAR = "IMG_OBJS_ENV_VAR"; //$NON-NLS-1$	
-	
-	// views
-	
-	/** 
-	 * Launches view image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_VIEW_LAUNCHES= "IMG_VIEW_LAUNCHES"; //$NON-NLS-1$
-	
-	/** 
-	 * Breakpoints view image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_VIEW_BREAKPOINTS= "IMG_VIEW_BREAKPOINTS"; //$NON-NLS-1$	
-
-	/** 
-	 * Variables view image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_VIEW_VARIABLES= "IMG_VIEW_VARIABLES"; //$NON-NLS-1$
-	
-	/** 
-	 * Expressions view image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_VIEW_EXPRESSIONS= "IMG_VIEW_EXPRESSIONS"; //$NON-NLS-1$	
-
-	/** 
-	 * Console view image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_VIEW_CONSOLE= "IMG_VIEW_CONSOLE"; //$NON-NLS-1$
-	
-	// perspective
-	/** 
-	 * Debug perspective image identifier
-	 * 
-	 * @since 2.0
-	 */
-	public static final String IMG_PERSPECTIVE_DEBUG= "IMG_PERSPECTIVE_DEBUG"; //$NON-NLS-1$			
-			
-	// wizard banners
-	/** Debug wizard banner image identifier. */
-	public static final String IMG_WIZBAN_DEBUG= "IMG_WIZBAN_DEBUG"; //$NON-NLS-1$
-	
-	/** Run wizard banner image identifier. */
-	public static final String IMG_WIZBAN_RUN= "IMG_WIZBAN_RUN"; //$NON-NLS-1$
-	
-	// overlays
-	/** Error overlay image identifier. */
-	public static final String IMG_OVR_ERROR = "IMG_OVR_ERROR";  //$NON-NLS-1$
-
-    /**
-     * Skip breakpoint image overlay identifier.
-     * @since 3.1
-     */
-    public static final String IMG_OVR_SKIP_BREAKPOINT = "IMG_OVR_SKIP_BREAKPOINT"; //$NON-NLS-1$
-    
-	/**
-	 * Debug action set identifier (value <code>"org.eclipse.debug.ui.debugActionSet"</code>).
-	 */
-	public static final String DEBUG_ACTION_SET= PLUGIN_ID + ".debugActionSet"; //$NON-NLS-1$
-
-	
-	/**
-	 * Launch action set identifier (value <code>"org.eclipse.debug.ui.launchActionSet"</code>).
-	 */
-	public static final String LAUNCH_ACTION_SET= PLUGIN_ID + ".launchActionSet"; //$NON-NLS-1$
-	
-	// extensions
-	/**
-	 * Identifier for the standard 'debug' launch group.
-	 * @since 2.1 
-	 */
-	public static final String ID_DEBUG_LAUNCH_GROUP = PLUGIN_ID + ".launchGroup.debug"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for the standard 'run' launch group.
-	 * @since 2.1 
-	 */
-	public static final String ID_RUN_LAUNCH_GROUP = PLUGIN_ID + ".launchGroup.run"; //$NON-NLS-1$	
-	
-	/**
-	 * Identifier for the standard 'profile' launch group.
-	 * @since 3.0 
-	 */
-	public static final String ID_PROFILE_LAUNCH_GROUP = PLUGIN_ID + ".launchGroup.profile"; //$NON-NLS-1$	
-	
-	// menus 
-	
-	/** 
-	 * Identifier for an empty group preceding an
-	 * edit group in a menu (value <code>"emptyEditGroup"</code>).
-	 */
-	public static final String EMPTY_EDIT_GROUP = "emptyEditGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for an edit group in a menu (value <code>"editGroup"</code>).
-	 */
-	public static final String EDIT_GROUP = "editGroup"; //$NON-NLS-1$
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * step group in a menu (value <code>"emptyStepGroup"</code>).
-	 */
-	public static final String EMPTY_STEP_GROUP = "emptyStepGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a step group in a menu or toolbar (value <code>"stepGroup"</code>).
-	 */
-	public static final String STEP_GROUP = "stepGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a step into group in a menu or toolbar (value <code>"stepIntoGroup"</code>).
-	 */
-	public static final String STEP_INTO_GROUP = "stepIntoGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a step over group in a menu or toolbar (value <code>"stepOverGroup"</code>).
-	 */
-	public static final String STEP_OVER_GROUP = "stepOverGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a step return group in a menu or toolbar (value <code>"stepReturnGroup"</code>).
-	 */
-	public static final String STEP_RETURN_GROUP = "stepReturnGroup"; //$NON-NLS-1$
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * thread group in a menu (value <code>"emptyThreadGroup"</code>).
-	 */
-	public static final String EMPTY_THREAD_GROUP = "emptyThreadGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a thread group in a menu or toolbar(value <code>"threadGroup"</code>).
-	 */
-	public static final String THREAD_GROUP = "threadGroup"; //$NON-NLS-1$
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * launch group in a menu (value <code>"emptyLaunchGroup"</code>).
-	 */
-	public static final String EMPTY_LAUNCH_GROUP = "emptyLaunchGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a launch group in a menu (value <code>"launchGroup"</code>).
-	 */
-	public static final String LAUNCH_GROUP = "launchGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for an output group in a menu (value
-	 * <code>"outputGroup"</code>).
-	 */
-	public static final String OUTPUT_GROUP = "outputGroup"; //$NON-NLS-1$	
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * variable group in a menu (value <code>"emptyVariableGroup"</code>).
-	 */
-	public static final String EMPTY_VARIABLE_GROUP = "emptyVariableGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a variable group in a menu (value <code>"variableGroup"</code>).
-	 */
-	public static final String VARIABLE_GROUP = "variableGroup"; //$NON-NLS-1$
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * navigation group in a menu (value <code>"emptyNavigationGroup"</code>).
-	 */
-	public static final String EMPTY_NAVIGATION_GROUP = "emptyNavigationGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a navigation group in a menu (value <code>"navigationGroup"</code>).
-	 */
-	public static final String NAVIGATION_GROUP = "navigationGroup"; //$NON-NLS-1$
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * breakpoint group in a menu (value <code>"emptyBreakpointGroup"</code>).
-	 */
-	public static final String EMPTY_BREAKPOINT_GROUP = "emptyBreakpointGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a breakpoint group in a menu (value <code>"breakpointGroup"</code>).
-	 */
-	public static final String BREAKPOINT_GROUP = "breakpointGroup"; //$NON-NLS-1$
-		
-	/**
-	 * Identifier for a "breakpoint group" group in a menu (value <code>"breakpointGroupGroup"</code>).
-	 * 
-	 * @since 3.1
-	 */
-	public static final String BREAKPOINT_GROUP_GROUP = "breakpointGroupGroup"; //$NON-NLS-1$
-		
-	/** 
-	 * Identifier for an empty group preceding an
-	 * expression group in a menu (value <code>"emptyExpressionGroup"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EMPTY_EXPRESSION_GROUP = "emptyExpressionGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for an expression group in a menu (value <code>"expressionGroup"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXPRESSION_GROUP = "expressionGroup"; //$NON-NLS-1$
-	/** 
-	 * Identifier for an empty group preceding a
-	 * render group in a menu (value <code>"emptyRenderGroup"</code>).
-	 */
-	public static final String EMPTY_RENDER_GROUP = "emptyRenderGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a render group in a menu or toolbar(value <code>"renderGroup"</code>).
-	 */
-	public static final String RENDER_GROUP = "renderGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a property group in a menu (value <code>"propertyGroup"</code>).
-	 */
-	public static final String PROPERTY_GROUP = "propertyGroup"; //$NON-NLS-1$
-	
-	/** 
-	 * Identifier for an empty group preceding a
-	 * register group in a menu (value <code>"emptyRegisterGroup"</code>).
-	 */
-	public static final String EMPTY_REGISTER_GROUP = "emptyRegisterGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for a register group in a menu (value <code>"registerGroup"</code>).
-	 */
-	public static final String REGISTER_GROUP = "registerGroup"; //$NON-NLS-1$
-	
-	/**
-	 * Id for the popup menu associated with the variables (tree viewer) part of the VariableView
-	 */
-	public static final String VARIABLE_VIEW_VARIABLE_ID = "org.eclipse.debug.ui.VariableView.variables"; //$NON-NLS-1$
-	
-	/**
-	 * Id for the popup menu associated with the detail (text viewer) part of the VariableView
-	 */
-	public static final String VARIABLE_VIEW_DETAIL_ID = "org.eclipse.debug.ui.VariableView.detail"; //$NON-NLS-1$
-	
-	// status codes
-	/**
-	 * Status indicating an invalid extension definition.
-	 */
-	public static final int STATUS_INVALID_EXTENSION_DEFINITION = 100;
-		
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;		
-	
-	// launch configuration attribute keys
-	/**
-	 * Launch configuration attribute - the perspective to
-	 * switch to when a launch configuration is launched in
-	 * run mode (value <code>org.eclipse.debug.ui.target_run_perspective</code>).
-	 * Value is a string corresponding to a perspective identifier,
-	 * or <code>null</code> indicating no perspective change.
-	 * 
-	 * @since 2.0
-	 * @deprecated Since 3.0, this launch configuration attribute is no longer supported.
-	 *  Use <code>DebugUITools.setLaunchPerspective(ILaunchConfigurationType type, String mode, String perspective)</code>.
-	 */
-	public static final String ATTR_TARGET_RUN_PERSPECTIVE = PLUGIN_ID + ".target_run_perspective";	 //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute - the perspective to
-	 * switch to when a launch configuration is launched in
-	 * debug mode (value <code>org.eclipse.debug.ui.target_debug_perspective</code>).
-	 * Value is a string corresponding to a perspective identifier,
-	 * or <code>null</code> indicating no perspective change.
-	 * 
-	 * @since 2.0
-	 * @deprecated Since 3.0, this launch configuration attribute is no longer supported.
-	 *  Use <code>DebugUITools.setLaunchPerspective(ILaunchConfigurationType type, String mode, String perspective)</code>.
-	 */
-	public static final String ATTR_TARGET_DEBUG_PERSPECTIVE = PLUGIN_ID + ".target_debug_perspective";		 //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute - the container where the configuration file
-	 * is stored.  The container is set via the 'setContainer()' call on ILaunchConfigurationWorkingCopy.
-	 * This constant is only needed for persisting and reading the default value of the
-	 * container value for individual resources.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String ATTR_CONTAINER = PLUGIN_ID + ".container"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute - a boolean value that indicates if the launch configuration
-	 * is 'private'.  A private configuration is one that does not appear to the user in the launch
-	 * history or the launch configuration dialog.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String ATTR_PRIVATE = PLUGIN_ID + ".private"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute - a boolean value that indicates if the launch configuration
-	 * is displayed in the debug favorites menu. Default value is
-	 * <code>false</code> if absent.
-	 * 
-	 * @since 2.0
-	 * @deprecated use <code>ATTR_FAVORITE_GROUPS</code> instead
-	 */
-	public static final String ATTR_DEBUG_FAVORITE = PLUGIN_ID + ".debugFavorite"; //$NON-NLS-1$	
-	
-	/**
-	 * Launch configuration attribute - a boolean value that indicates if the launch configuration
-	 * is displayed in the run favorites menu.Default value is
-	 * <code>false</code> if absent.
-	 * 
-	 * @since 2.0
-	 * @deprecated use <code>ATTR_FAVORITE_GROUPS</code> instead
-	 */
-	public static final String ATTR_RUN_FAVORITE = PLUGIN_ID + ".runFavorite"; //$NON-NLS-1$		
-	
-	/**
-	 * Launch configuration attribute - a list of launch group identifiers
-	 * representing the favorite histories a launch configuration should appear
-	 * in. When <code>null</code>, the configuration does not appear in any
-	 * favorite lists.
-	 * 
-	 * @since 2.1
-	 */
-	public static final String ATTR_FAVORITE_GROUPS = PLUGIN_ID + ".favoriteGroups"; //$NON-NLS-1$
-		
-	/**
-	 * Launch configuration attribute - a boolean value indicating whether a
-	 * configuration should be launched in the background. Default value is <code>true</code>.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String ATTR_LAUNCH_IN_BACKGROUND = PLUGIN_ID + ".ATTR_LAUNCH_IN_BACKGROUND"; //$NON-NLS-1$
-	
-	/**
-	 * ProcessConsole attribute - references the process that was launched.
-	 * 
-	 * @since 3.1 
-	 */
-	public static final String ATTR_CONSOLE_PROCESS = PLUGIN_ID + ".ATTR_CONSOLE_PROCESS"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute specifying the encoding that the console should use.
-	 * When unspecified, the default encoding is used. Encoding names are available 
-	 * from {@link org.eclipse.ui.WorkbenchEncoding}.
-	 * 
-	 * @since 3.1
-     * @deprecated in 3.3 Please use DebugPlugin.ATTR_CONSOLE_ENCODING instead.
-	 */
-	public static final String ATTR_CONSOLE_ENCODING = DebugPlugin.ATTR_CONSOLE_ENCODING;
-	
-	/**
-	 * Launch configuration boolean attribute specifying whether output from the launched process will
-	 * be captured and written to the console. Default value is <code>true</code>.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ATTR_CAPTURE_IN_CONSOLE = PLUGIN_ID + ".ATTR_CONSOLE_OUTPUT_ON"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute specifying a file name that console output should
-	 * be written to or <code>null</code> if none. Default value is <code>null</code>.
-	 * When specified, all output from the launched process will be written to the file.
-	 * The file name attribute may contain variables which will be resolved by the
-	 * {@link org.eclipse.core.variables.IStringVariableManager}.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ATTR_CAPTURE_IN_FILE = PLUGIN_ID + ".ATTR_CAPTURE_IN_FILE"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute specifying whether process output will be appended to the
-	 * file specified by the <code>ATTR_CAPTURE_IN_FILE</code> attribute instead of overwriting
-	 * the file. Default value is <code>false</code>.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ATTR_APPEND_TO_FILE = PLUGIN_ID + ".ATTR_APPEND_TO_FILE"; //$NON-NLS-1$
-	
-	// Extension points
-	
-	/**
-	 * Debug model presentation simple extension point identifier (value <code>"debugModelPresentations"</code>).
-	 */
-	public static final String ID_DEBUG_MODEL_PRESENTATION= "debugModelPresentations"; //$NON-NLS-1$
-	
-	/**
-	 * Debug action groups extension point identifier
-	 * (value <code>"debugActionGroups"</code>).
-	 * 
-	 * @since 2.0
-	 * @deprecated The Debug Action Groups extension point no longer exists. Product
-	 *  vendors should use Activities instead. 
-	 */
-	public static final String EXTENSION_POINT_DEBUG_ACTION_GROUPS= "debugActionGroups";	 //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration tab groups extension point identifier
-	 * (value <code>"launchConfigurationTabGroups"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_CONFIGURATION_TAB_GROUPS= "launchConfigurationTabGroups";	 //$NON-NLS-1$	
-
-	/**
-	 * Contributed Launch Configuration Tab extension point identifier
-	 * (value <code>"launchConfigurationTabs"</code>).
-	 * 
-	 * @since 3.3
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_TABS = "launchConfigurationTabs"; //$NON-NLS-1$
-	
-	/**
-	 * Launch shortcuts extension point identifier
-	 * (value <code>"launchShortcuts"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_SHORTCUTS= "launchShortcuts";	 //$NON-NLS-1$
-	
-	/**
-	 * Extension point for launch configuration type images.
-	 * 
-	 * @since 2.0
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_CONFIGURATION_TYPE_IMAGES = "launchConfigurationTypeImages"; //$NON-NLS-1$	
-	
-	/**
-	 * Console document color provider extension point identifier
-	 * (value <code>"consoleColorProviders"</code>).
-	 * 
-	 * @since 2.1
-	 */
-	public static final String EXTENSION_POINT_CONSOLE_COLOR_PROVIDERS = "consoleColorProviders";	 //$NON-NLS-1$
-	
-	/**
-	 * Launch groups extension point identifier (value
-	 * <code>"launchGroups"</code>).
-	 * 
-	 * @since 2.1
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_GROUPS = "launchGroups";	 //$NON-NLS-1$
-	
-	/**
-	 * Console line trackers extension point identifier (value
-	 * <code>"consoleLineTrackers"</code>).
-	 *
-	 * @since 2.1
-	 */
-	public static final String EXTENSION_POINT_CONSOLE_LINE_TRACKERS = "consoleLineTrackers";	 //$NON-NLS-1$		
-		
-	/**
-	 * Variables content providers extension point identifier (value
-	 * <code>"variablesContentProviders"</code>).
-	 *
-	 * @since 3.0
-	 */
-	public static final String EXTENSION_POINT_OBJECT_BROWSERS = "objectBrowsers";	 //$NON-NLS-1$
-		
-	/**
-	 * Launch variable components extension point identifier (value
-	 * <code>"launchVariableComponents"</code>). The launch variable
-	 * components extension point specifies an <code>IVariableComponent</code>
-	 * for an <code>IContextLaunchVariable</code>.
-	 */
-	public static final String EXTENSION_POINT_LAUNCH_VARIABLE_COMPONENTS = "launchVariableComponents";		//$NON-NLS-1$
-		
-	/**
-	 * Variable value editors extension point identifier (value
-	 * <code>"variableValueEditors"</code>
-     * 
-     * @since 3.1
-	 */
-	public static final String EXTENSION_POINT_VARIABLE_VALUE_EDITORS = "variableValueEditors"; //$NON-NLS-1$
-	
-    /**
-     * Memory renderings extension point identifier (value
-     * <code>"memoryRenderings"</code>
-     * 
-     * @since 3.1
-     */
-    public static final String EXTENSION_POINT_MEMORY_RENDERIGNS = "memoryRenderings"; //$NON-NLS-1$
-    
-    /**
-     * Breakpoint organizers extension point identifier (value
-     * <code>"breakpointOrganizers"</code>
-     * 
-     * @since 3.1
-     */
-    public static final String EXTENSION_POINT_BREAKPOINT_ORGANIZERS = "breakpointOrganizers"; //$NON-NLS-1$    
-	
-	/**
-	 * Simple identifier constant (value <code>"detailPaneFactories"</code>) for the
-	 * detail pane factories extension point.
-	 * 
-	 * @since 3.3
-	 */
-	public static final String EXTENSION_POINT_DETAIL_FACTORIES = "detailPaneFactories"; //$NON-NLS-1$
-	
-    /**
-     * Update policies extension point identifier (value
-     * <code>"updatePolicies"</code>
-     * 
-     * @since 3.2
-     */
-    public static final String EXTENSION_POINT_UPDATE_POLICIES = "updatePolicies"; //$NON-NLS-1$    
-
-	/**
-	 * Padded string preference for renderings.  Padded string is the string to be used in place of 
-	 * of a memory byte if a rendering cannot render the data properly.
-	 * @since 3.1
-	 */
-	public static final String PREF_PADDED_STR = PLUGIN_ID + ".memory.paddedStr"; //$NON-NLS-1$
-
-	/**
-	 * ASCII code page for rendering memory to ASCII strings.
-	 * @since 3.1
-	 */
-	public static final String PREF_DEFAULT_ASCII_CODE_PAGE = PLUGIN_ID + ".defaultAsciiCodePage"; //$NON-NLS-1$
-
-	/**
-	 * EBCDIC code page for rendering memory to EBCDIC strings.
-	 * @since 3.1
-	 */
-	public static final String PREF_DEFAULT_EBCDIC_CODE_PAGE = PLUGIN_ID + ".defaultEbcdicCodePage"; //$NON-NLS-1$
-
-	/**
-	 * Maximum number of characters to display in the details area of the variables
-	 * view, or 0 if unlimited.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_MAX_DETAIL_LENGTH = PLUGIN_ID + ".max_detail_length"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for breakpoint working set type.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String BREAKPOINT_WORKINGSET_ID = "org.eclipse.debug.ui.breakpointWorkingSet"; //$NON-NLS-1$	
-
-	/**
-	 * Memory view identifier (value <code>"org.eclipse.debug.ui.MemoryView"</code>).
-	 * 
-	 * @since 3.2
-	 */
-	public static String ID_MEMORY_VIEW = "org.eclipse.debug.ui.MemoryView";  //$NON-NLS-1$
-
-	/**
-	 * Memory view's rendering view pane identifier for the rendering view pane
-	 * on the left. (value <code>"org.eclipse.debug.ui.MemoryView.RenderingViewPane.1"</code>).
-	 * 
-	 * @since 3.2
-	 */
-	public static String ID_RENDERING_VIEW_PANE_1 = "org.eclipse.debug.ui.MemoryView.RenderingViewPane.1"; //$NON-NLS-1$
-
-	/**
-	 * Memory view's rendering view pane identifier for the rendering view pane
-	 * on the right. (value <code>"org.eclipse.debug.ui.MemoryView.RenderingViewPane.2"</code>).
-	 * 
-	 * @since 3.2 
-	 */
-	public static String ID_RENDERING_VIEW_PANE_2 = "org.eclipse.debug.ui.MemoryView.RenderingViewPane.2"; //$NON-NLS-1$
-
-	/**
-	 * Preference color to indicate that a <code>MemoryByte</code> does not have history.
-	 * (value <code> org.eclipse.debug.ui.MemoryHistoryUnknownColor </code>)
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_MEMORY_HISTORY_UNKNOWN_COLOR = PLUGIN_ID + ".MemoryHistoryUnknownColor"; //$NON-NLS-1$
-
-	/**
-	 * 	Preference color to indicate that a <code>MemoryByte</code> has history.
-	 * (value <code> org.eclipse.debug.ui.MemoryHistoryKnownColor </code>)
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PREF_MEMORY_HISTORY_KNOWN_COLOR = PLUGIN_ID + ".MemoryHistoryKnownColor"; //$NON-NLS-1$
-	
-    /**
-     * Annotation type identifier for default annotation of the current instruction
-     * pointer (top stack frame in a thread). Value is <code>org.eclipse.debug.ui.currentIP</code>,
-     * identifying a <code>org.eclipse.ui.editors.markerAnnotationSpecification</code>
-     * extension.
-     * 
-     * @since 3.2
-     */
-    public static final String ANNOTATION_TYPE_INSTRUCTION_POINTER_CURRENT = "org.eclipse.debug.ui.currentIP"; //$NON-NLS-1$
-    
-    /**
-     * Annotation type identifier for default annotation of secondary instruction pointers
-     * (non top stack frames). Value is <code>org.eclipse.debug.ui.secondaryIP</code>,
-     * identifying a <code>org.eclipse.ui.editors.markerAnnotationSpecification</code>
-     * extension.
-     * 
-     * @since 3.2
-     */
-    public static final String ANNOTATION_TYPE_INSTRUCTION_POINTER_SECONDARY = "org.eclipse.debug.ui.secondaryIP"; //$NON-NLS-1$	
-
-	/**
-	 * Editor Identifier for the "Common Source Not Found" editor.
-	 * Value is <code>org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor</code>
-	 * 
-	 * @since 3.2
-	 */
-	public static final String ID_COMMON_SOURCE_NOT_FOUND_EDITOR="org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor"; //$NON-NLS-1$
-
-	/**
-	 * Preference color used to render debug elements that have changed
-	 * (value <code>org.eclipse.debug.ui.changedDebugElement</code>).
-	 * For example, when a variable value changes, variables are rendered in this
-	 * color.
-	 * 
-	 * @since 3.2
-	 * @see DebugUITools
-	 */
-	public static final String PREF_CHANGED_DEBUG_ELEMENT_COLOR= "org.eclipse.debug.ui.changedDebugElement"; //$NON-NLS-1$
-
-	/**
-	 * Instruction pointer image for editor ruler for the currently executing
-	 * instruction in the top stack frame.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String IMG_OBJS_INSTRUCTION_POINTER_TOP = "IMG_OBJS_INSTRUCTION_POINTER_TOP"; //$NON-NLS-1$
-
-	/**
-	 * Instruction pointer image for editor ruler for secondary (non-top) stack frames.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String IMG_OBJS_INSTRUCTION_POINTER = "IMG_OBJS_INSTRUCTION_POINTER"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugView.java
deleted file mode 100644
index fd46a55..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugView.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.debug.ui;
-
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Common function for debug views. Provides access to the underlying viewer and
- * debug model presentation being used by a viewer. This allows clients to do
- * such things as add and remove filters to a viewer, and configure a debug
- * model presentation.
- * <p>
- * Clients may implement this interface. Generally, clients should subclass
- * <code>AbstractDebugView</code> when creating a new debug view.
- * </p>
- * @see org.eclipse.core.runtime.IAdaptable
- * @see org.eclipse.debug.ui.IDebugModelPresentation
- * @see org.eclipse.debug.ui.AbstractDebugView
- * @since 2.0
- */
-
-public interface IDebugView extends IViewPart {
-	
-	/**
-	 * Action id for a view's copy action. Any view
-	 * with a copy action that should be invoked when
-	 * CTRL+C is pressed should store their
-	 * copy action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String COPY_ACTION = ActionFactory.COPY.getId();
-
-	/**
-	 * Action id for a view's cut action. Any view
-	 * with a cut action that should be invoked when
-	 * CTRL+X is pressed should store their
-	 * copy action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String CUT_ACTION = ActionFactory.CUT.getId();
-
-	/**
-	 * Action id for a view's double-click action. Any view
-	 * with an action that should be invoked when
-	 * the mouse is double-clicked should store their
-	 * action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String DOUBLE_CLICK_ACTION = "Double_Click_ActionId";	 //$NON-NLS-1$
-
-	/**
-	 * Action id for a view's find action. Any view
-	 * with a find action that should be invoked when
-	 * CTRL+F is pressed should store their
-	 * copy action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String FIND_ACTION = ActionFactory.FIND.getId();
-
-	/**
-	 * Action id for a view's paste action. Any view
-	 * with a paste action that should be invoked when
-	 * CTRL+V is pressed should store their
-	 * copy action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String PASTE_ACTION = ActionFactory.PASTE.getId();
-
-	/**
-	 * Action id for a view's remove action. Any view
-	 * with a remove action that should be invoked when
-	 * the delete key is pressed should store their
-	 * remove action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String REMOVE_ACTION = "Remove_ActionId"; //$NON-NLS-1$
-
-	/**
-	 * Action id for a view's select all action. Any view
-	 * with a select all action that should be invoked when
-	 * CTRL+A is pressed should store their
-	 * select all action with this key.
-	 * 
-	 * @see #setAction(String, IAction)
-	 */
-	public static final String SELECT_ALL_ACTION = ActionFactory.SELECT_ALL.getId();
-	
-	/**
-	 * Returns the viewer contained in this debug view.
-	 *
-	 * @return viewer
-	 */
-	public Viewer getViewer();
-	
-	/**
-	 * Returns the debug model presentation for this view specified
-	 * by the debug model identifier.
-	 *
-	 * @param id the debug model identifier that corresponds to the <code>id</code>
-	 *     attribute of a debug model presentation extension
-	 * @return the debug model presentation, or <code>null</code> if no
-	 *     presentation is registered for the specified id
-	 */
-	public IDebugModelPresentation getPresentation(String id);
-	
-	/**
-	 * Installs the given action under the given action id.
-	 *
-	 * If the action has an id that maps to one of the global
-	 * action ids defined by this interface, the action is registered 
-	 * as a global action handler.
-	 *
-	 * If the action is an instance of <code>IUpdate</code> it is added/remove
-	 * from the collection of updateables associated with this view.
-	 * 
-	 * @param actionID the action id
-	 * @param action the action, or <code>null</code> to clear it
-	 * @see #getAction
-	 */
-	public void setAction(String actionID, IAction action);
-	
-	/**
-	 * Adds the given IUpdate to this view's collection of updatable
-	 * objects.  Allows the view to periodically update these registered
-	 * objects.  
-	 * Has no effect if an identical IUpdate is already registered.
-	 * 
-	 * @param updatable The IUpdate instance to be added
-	 */
-	public void add(IUpdate updatable);
-	
-	/**
-	 * Removes the given IUpdate from this view's collection of updatable
-	 * objects.
- 	 * Has no effect if an identical IUpdate was not already registered.
- 	 * 
-	 * @param updatable The IUpdate instance to be removed
-	 */
-	public void remove(IUpdate updatable);
-	
-	/**
-	 * Returns the action installed under the given action id.
-	 *
-	 * @param actionID the action id
-	 * @return the action, or <code>null</code> if none
-	 * @see #setAction
-	 */
-	public IAction getAction(String actionID);
-	
-	/**
-	 * Returns the context menu manager for this view.
-	 *
-	 * @return the context menu manager for this view, or <code>null</code> if none
-	 * @deprecated See AbstractDebugView#getContextMenuManagers()
-	 */
-	public IMenuManager getContextMenuManager();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDetailPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDetailPane.java
deleted file mode 100644
index c39815d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDetailPane.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbenchPartSite;
-
-/**
- * A detail pane is created from a detail pane factory and displays detailed information about
- * a current selection with an SWT <code>Control</code>. Use the
- * <code>org.eclipse.debug.ui.detailFactories</code> extension point to contribute a detail pane
- * factory.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IDetailPaneFactory
- * @since 3.3 
- */
-public interface IDetailPane {
-
-	/**
-	 * Initializes this detail pane for the given workbench part site. This is the first method
-	 * invoked on a detail pane after instantiation.  If this detail pane is being added to a
-	 * non-view component such as a dialog, the passed workbench part site will be <code>null</code>.
-	 * 
-	 * @param partSite The workbench part site that this detail pane has been created in or <code>null</code>
-	 */
-	public void init(IWorkbenchPartSite partSite);
-	
-	/**
-	 * Creates and returns the main control for this detail pane using the given composite as a
-	 * parent.
-	 * 
-	 * @param parent The parent composite that UI components should be added to
-	 * @return The main control for this detail pane
-	 */
-	public Control createControl(Composite parent);
-	
-	/**
-	 * Disposes this detail pane. This is the last method invoked on a detail pane and should
-	 * dispose of all UI components including the main composite returned in <code>createControl()</code>.
-	 */
-	public void dispose();
-	
-	/**
-	 * Displays details for the given selection, possible <code>null</code>.  An empty selection
-	 * or <code>null</code> should clear this detail pane.
-	 * 
-	 * @param selection The selection to be displayed, possibly empty or <code>null</code>
-	 */
-	public void display(IStructuredSelection selection);
-	
-	/**
-	 * Allows this detail pane to give focus to an appropriate control, and returns whether
-	 * the detail pane accepted focus. If this detail pane does not want focus, it should
-	 * return <code>false</code>, allowing the containing view to choose another target
-	 * for focus.
-	 * 
-	 * @return whether focus was taken
-	 */
-	public boolean setFocus();
-	
-	/**
-	 * Returns a unique identifier for this detail pane.
-	 * 
-	 * @return A unique identifier for this detail pane
-	 */
-	public String getID();
-	
-	/**
-	 * The human readable name of this detail pane. This is a short description of the type
-	 * of details this pane displays that appears in the context menu.
-	 * 
-	 * @return name of this detail pane
-	 */
-	public String getName();
-	
-	/**
-	 * A brief description of this detail pane, or <code>null</code> if none
-	 * 
-	 * @return a description of this detail pane, or <code>null</code> if none
-	 */
-	public String getDescription();
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDetailPaneFactory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDetailPaneFactory.java
deleted file mode 100644
index 2dbfdfb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDetailPaneFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import java.util.Set;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * A detail pane factory creates one or more types of detail panes. 
- * <p>
- * Detail pane factories are contributed via the <code>org.eclipse.debug.ui.detailPaneFactories</code>
- * extension point. Following is an example of a detail pane factory extension:
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.detailPaneFactories"&gt;
- *     &lt;detailFactories
- *           class="org.eclipse.temp.TableDetailPaneFactory"
- *           name="Table Detail Factory"&gt;
- *     &lt;/detailFactories&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * <p>
- * Clients contributing a detail pane factory are intended to implement this interface.
- * @see IDetailPane  
- * @since 3.3
- *
- */
-public interface IDetailPaneFactory {
-
-	/**
-	 * Returns all possible types detail panes that this factory can
-	 * create for the given selection, possibly empty. Detail panes are returned
-	 * as a set of detail pane identifiers.
-	 * 
-	 * @param selection The current selection
-	 * @return Set of String IDs for possible detail pane types, possibly empty
-	 */
-	public Set getDetailPaneTypes(IStructuredSelection selection);
-	
-	/**
-	 * Returns the identifier of the default detail pane type to use for the given 
-	 * selection, or <code>null</code> if this factory has no preference. 
-	 * A factory can override the platform's default detail pane by returning
-	 * a non-<code>null</code> value.  
-	 * 
-	 * @param selection The current selection
-	 * @return a detail pane type identifier or <code>null</code>
-	 */
-	public String getDefaultDetailPane(IStructuredSelection selection);
-	
-	/**
-	 * Creates and returns a detail pane corresponding to the given detail pane
-	 * type identifier that this factory can produce (according to 
-	 * <code>getDetailPaneTypes(IStructuredSelection selection)</code>).
-	 *  
-	 * @param paneID The id of the detain pane type to be created
-	 * @return detail pane or <code>null</code> if one could not be created
-	 */
-	public IDetailPane createDetailPane(String paneID);
-	
-	/**
-	 * Returns a name for the detail pane type associated with the given ID
-	 * or <code>null</code> if none. Used to
-	 * populate the context menu with meaningful names of the pane types.
-	 * 
-	 * @param paneID detail pane type identifier
-	 * @return detail pane name or <code>null</code> if none
-	 */
-	public String getDetailPaneName(String paneID);
-	
-	/**
-	 * Returns a description for the detail pane type associated with the given ID
-	 * or <code>null</code> if none.
-	 * 
-	 * @param paneID detail pane type identifier
-	 * @return detail pane description or <code>null</code> if none
-	 */
-	public String getDetailPaneDescription(String paneID);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IInstructionPointerPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IInstructionPointerPresentation.java
deleted file mode 100644
index 3b90b38..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IInstructionPointerPresentation.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A debug model presentation may implement this interface to override
- * standard annotations used to display instruction pointers for stack frames.
- * <p>
- * A client has several options when overriding default instruction pointer
- * annotations, and the debug platform uses the following prioritized order
- * when computing an annotation for a stack frame.
- * <ol>
- * <li>Specify the annotation object to use. This is done by returning a non-<code>null</code>
- *  value from <code>getInstructionPointerAnnotation(..)</code>.</li>
- * <li>Specify an <code>annotationType</code> extension to use.
- *  This is done by returning a non-<code>null</code> value from 
- *  <code>getInstructionPointerAnnotationType(..)</code>. When specified, the annotation
- *  type controls the image displayed via its associated
- *  <code>markerAnnotationSpecification</code>.</li>
- * <li>Specify the image to use. This is done by returning a non-<code>null</code>
- *  value from <code>getInstructionPointerImage(..)</code>.</li>
- * </ol>
- * Additionally, when specifying an annotation type or image the text
- * for the instruction pointer may be specified by returning a non-<code>null</code>
- * value from <code>getInstructionPointerText(..)</code>.
- * </p>
- * <p>
- * These methods are called when the debugger has opened an editor to display
- * source for the given stack frame. The image will be positioned based on stack frame
- * line number and character ranges.
- * </p>
- * <p>
- * By default, the debug platform uses different annotations for top stack
- * frames and non-top stack frames in a thread. The default platform annotations
- * are contributed as <code>annotationType</code> extensions with
- * the identifiers <code>IDebugUIConstants.ANNOTATION_INSTRUCTION_POINTER_CURRENT</code>
- * and <code>IDebugUIConstants.ANNOTAION_INSTRUCTION_POINTER_SECONDARY</code>.
- * </p>
- * <p>
- * Clients implementing a debug model presentation may also implement this interface.
- * </p>
- * @since 3.2
- */
-public interface IInstructionPointerPresentation extends IDebugModelPresentation {
-	/**
-	 * Returns an annotation used for the specified stack frame in the specified
-	 * editor, or <code>null</code> if a default annotation should be used.
-     * 
-	 * @param editorPart the editor the debugger has opened
-	 * @param frame the stack frame for which the debugger is displaying
-	 *  source
-	 *  @return annotation or <code>null</code>
-	 */
-	public Annotation getInstructionPointerAnnotation(IEditorPart editorPart, IStackFrame frame);
-	
-	/**
-	 * Returns an identifier of a <code>org.eclipse.ui.editors.annotationTypes</code> extension used for
-	 * the specified stack frame in the specified editor, or <code>null</code> if a default annotation
-	 * should be used.
-	 * 
-	 * @param editorPart the editor the debugger has opened
-	 * @param frame the stack frame for which the debugger is displaying
-	 *  source
-	 *  @return annotation type identifier or <code>null</code>
-	 */	
-	public String getInstructionPointerAnnotationType(IEditorPart editorPart, IStackFrame frame);
-	
-	/**
-	 * Returns the instruction pointer image used for the specified stack frame in the specified
-	 * editor, or <code>null</code> if a default image should be used.
-	 * <p>
-	 * By default, the debug platform uses different images for top stack
-	 * frames and non-top stack frames in a thread.
-	 * </p>
-	 * @param editorPart the editor the debugger has opened
-	 * @param frame the stack frame for which the debugger is displaying
-	 *  source
-	 *  @return image or <code>null</code>
-	 */		
-	public Image getInstructionPointerImage(IEditorPart editorPart, IStackFrame frame);
-	
-	/**
-	 * Returns the text to associate with the instruction pointer annotation used for the
-	 * specified stack frame in the specified editor, or <code>null</code> if a default
-	 * message should be used.
-	 * <p>
-	 * By default, the debug platform uses different images for top stack
-	 * frames and non-top stack frames in a thread.
-	 * </p>
-	 * @param editorPart the editor the debugger has opened
-	 * @param frame the stack frame for which the debugger is displaying
-	 *  source
-	 *  @return message or <code>null</code>
-	 */			
-	public String getInstructionPointerText(IEditorPart editorPart, IStackFrame frame);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationDialog.java
deleted file mode 100644
index 6d39f3f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationDialog.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.debug.ui;
-
-import org.eclipse.jface.operation.IRunnableContext;
-
- 
- /**
-  * A launch configuration dialog is used to edit and launch
-  * launch configurations. It contains a launch configuration
-  * tab group.
-  * <p>
-  * Clients are not intended to implement this interface.
-  * </p>
-  * @see ILaunchConfigurationTabGroup
-  * @see ILaunchConfigurationTab
-  * @since 2.0
-  */
-
-public interface ILaunchConfigurationDialog extends IRunnableContext {
-	
-	/**
-	 * Return value from <code>open()</code> method of a
-	 * launch configuration dialog when a launch completed
-	 * successfully with a single click (without opening a
-	 * launch configuration dialog).
-	 * 
-	 * @deprecated the launch dialog no longer supports launching without
-	 * 	opening - this constant will never be returned by the dialog
-	 */
-	public static final int LAUNCHED_BEFORE_OPENING = 2;
-			
-	/**
-	 * Adjusts the enable state of this dialog's buttons
-	 * to reflect the state of the active tab group.
-	 * <p>
-	 * This may be called by to force a button state
-	 * update.
-	 * </p>
-	 */
-	public void updateButtons();
-	
-	/**
-	 * Updates the message (or error message) shown in the message line to 
-	 * reflect the state of the currently active tab in this launch
-	 * configuration dialog.
-	 * <p>
-	 * This method may be called to force a message 
-	 * update.
-	 * </p>
-	 */
-	public void updateMessage();
-	
-	/**
-	 * Sets the contents of the name field to the given name.
-	 * 
-	 * @param name new name value
-	 */ 
-	public void setName(String name);
-	
-	/**
-	 * Returns a unique launch configuration name, using the given name
-	 * as a seed.
-	 * 
-	 * @param name seed from which to generate a new unique name
-	 */ 
-	public String generateName(String name);
-	
-	/**
-	 * Returns the tabs currently being displayed, or
-	 * <code>null</code> if none.
-	 * 
-	 * @return currently displayed tabs, or <code>null</code>
-	 */
-	public ILaunchConfigurationTab[] getTabs();
-	
-	/**
-	 * Returns the currently active <code>ILaunchConfigurationTab</code>
-	 * being displayed, or <code>null</code> if there is none.
-	 * 
-	 * @return currently active <code>ILaunchConfigurationTab</code>, or <code>null</code>.
-	 */
-	public ILaunchConfigurationTab getActiveTab();
-	
-	/**
-	 * Returns the mode in which this dialog was opened -
-	 * run or debug.
-	 * 
-	 * @return one of <code>RUN_MODE</code> or <code>DEBUG_MODE</code> defined in <code>ILaunchManager</code>
-	 * @see org.eclipse.debug.core.ILaunchManager
-	 */
-	public String getMode();	
-	
-	/**
-	 * Sets the displayed tab to the given tab. Has no effect if the specified
-	 * tab is not one of the tabs being displayed in the dialog currently.
-	 * 
-	 * @param tab the tab to display/activate
-	 * @since 2.1
-	 */
-	public void setActiveTab(ILaunchConfigurationTab tab);
-	
-	/**
-	 * Sets the displayed tab to the tab with the given index. Has no effect if
-	 * the specified index is not within the limits of the tabs returned by
-	 * <code>getTabs()</code>.
-	 * 
-	 * @param index the index of the tab to display
-	 * @since 2.1
-	 */
-	public void setActiveTab(int index);	
-		
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationTab.java
deleted file mode 100644
index e7256f5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationTab.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
- 
-/**
- * A launch configuration tab is used to edit/view attributes
- * of a specific type of launch configuration. Launch
- * configurations are presented in a dialog, with a tab folder.
- * Each tab manipulates one ore more attributes of a launch
- * configuration. 
- * <p>
- * A tab has the following lifecycle methods:
- * <ul>
- * <li><code>setLaunchConfigurationDialog(ILaunchConfigurationDialog)</code> - 
- *  this is the first method called on a tab after it is instantiated.</li>
- * <li><code>initializeFrom(ILaunchConfiguration)</code> - called when a 
- *  launch configuration is selected to be displayed.</li>
- * <li><code>activated(ILaunchConfigurationWorkingCopy)</code> - called when
- *  a tab is entered.</li>
- * <li><code>deactivated(ILaunchConfigurationWorkingCopy)</code> - called when
- *  a tab is exited.</li>
- * <li><code>performApply(ILaunchConfigurationWorkingCopy)</code> - called when
- *  a tab is to write its values to a launch configuration.</li>
- * <li><code>dispose()</code> - the last method called on a tab, when it is
- *  to perform any required cleanup. Note that a tab can be disposed before its control
- * has been created.</li>
- * </ul>
- * The method <code>setDefaults(ILaunchConfigurationWorkingCopy)</code>
- * can be called before a tab's controls are created.
- * <p>
- * The launch tab framework was originally designed to handle inter tab
- * communication by applying attributes from the active tab to a launch configuration
- * being edited, when a tab is exited, and by initializing a tab when activated.
- * In 3.0, the addition of the methods <code>activated</code> and <code>deactivated</code>
- * allow tabs to determine the appropriate course of action. The default implementation
- * in <code>AbstractLaunchConfigurationTab</code> is to call the old methods
- * (<code>initializeFrom</code> and <code>performApply</code>). Tabs should override
- * the new methods as required.
- * </p>
- * <p>
- * This interface is intended to be implemented by clients.
- * </p>
- * @see org.eclipse.debug.core.ILaunchConfigurationType
- * @see org.eclipse.debug.core.ILaunchConfiguration
- * @since 2.0
- */
-public interface ILaunchConfigurationTab {
-
-	/**
-	 * Creates the top level control for this launch configuration
-	 * tab under the given parent composite.  This method is called once on
-	 * tab creation, after <code>setLaunchConfigurationDialog</code>
-	 * is called.
-	 * <p>
-	 * Implementors are responsible for ensuring that
-	 * the created control can be accessed via <code>getControl</code>
-	 * </p>
-	 *
-	 * @param parent the parent composite
-	 */
-	public void createControl(Composite parent);
-	
-	/**
-	 * Returns the top level control for this tab.
-	 * <p>
-	 * May return <code>null</code> if the control
-	 * has not been created yet.
-	 * </p>
-	 *
-	 * @return the top level control or <code>null</code>
-	 */
-	public Control getControl();	
-	
-	/**
-	 * Initializes the given launch configuration with
-	 * default values for this tab. This method
-	 * is called when a new launch configuration is created
-	 * such that the configuration can be initialized with
-	 * meaningful values. This method may be called before this
-	 * tab's control is created.
-	 * 
-	 * @param configuration launch configuration
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration);	
-	
-	/**
-	 * Initializes this tab's controls with values from the given
-	 * launch configuration. This method is called when
-	 * a configuration is selected to view or edit, after this
-	 * tab's control has been created.
-	 * 
-	 * @param configuration launch configuration
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration);		
-	
-	/**
-	 * Notifies this launch configuration tab that it has
-	 * been disposed. Marks the end of this tab's lifecycle,
-	 * allowing this tab to perform any cleanup required.
-	 */
-	public void dispose();
-	
-	/**
-	 * Copies values from this tab into the given 
-	 * launch configuration.
-	 * 
-	 * @param configuration launch configuration
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration);
-	
-	/**
-	 * Returns the current error message for this tab.
-	 * May be <code>null</code> to indicate no error message.
-	 * <p>
-	 * An error message should describe some error state,
-	 * as opposed to a message which may simply provide instruction
-	 * or information to the user.
-	 * </p>
-	 * 
-	 * @return the error message, or <code>null</code> if none
-	 */
-	public String getErrorMessage();
-	
-	/**
-	 * Returns the current message for this tab.
-	 * <p>
-	 * A message provides instruction or information to the 
-	 * user, as opposed to an error message which should 
-	 * describe some error state.
-	 * </p>
-	 * 
-	 * @return the message, or <code>null</code> if none
-	 */
-	public String getMessage();	
-	
-	/**
-	 * Returns whether this tab is in a valid state in the context of the specified launch configuration.
-	 * <p>
-	 * This information is typically used by the launch configuration
-	 * dialog to decide when it is okay to launch.
-	 * </p>
-	 *
-	 * @param launchConfig launch configuration which provides context for validating this tab.
-	 *         This value must not be <code>null</code>.
-	 *
-	 * @return whether this tab is in a valid state
-	 */
-	public boolean isValid(ILaunchConfiguration launchConfig);
-	
-	/**
-	 * Returns whether this tab is in a state that allows the launch configuration whose values
-	 * this tab is showing to be saved.  This differs from <code>isValid()</code> in that <code>canSave()</code>
-	 * determines if this tab prevents the current launch configuration from being saved, whereas
-	 * <code>isValid()</code> determines if this tab prevents the current launch configuration from
-	 * being launched.
-	 * 
-	 * <p>
-	 * This information is typically used by the launch configuration
-	 * dialog to decide when it is okay to save a launch configuration.
-	 * </p>
-	 * 
-	 * @return whether this tab is in a state that allows the current launch configuration to be saved
-	 */
-	public boolean canSave();
-	
-	/**
-	 * Sets the launch configuration dialog that hosts this tab.
-	 * This is the first method called on a launch configuration
-	 * tab, and marks the beginning of this tab's lifecycle.
-	 * 
-	 * @param dialog launch configuration dialog
-	 */
-	public void setLaunchConfigurationDialog(ILaunchConfigurationDialog dialog);
-	
-	/**
-	 * Notifies this tab that the specified configuration has been
-	 * launched, resulting in the given launch. This method can be
-	 * called when a tab's control does not exist, to support single-click
-	 * launching.
-	 * 
-	 * @param launch the result of launching the current
-	 *  launch configuration
-	 * @deprecated As of R3.0, this method is no longer called by the launch
-	 *  framework. Since tabs do not exist when launching is performed elsewhere
-	 *  than the launch dialog, this method cannot be relied upon for launching
-	 *  functionality.
-	 */
-	public void launched(ILaunch launch);
-	
-	/**
-	 * Returns the name of this tab.
-	 * 
-	 * @return the name of this tab
-	 */
-	public String getName();
-	
-	/**
-	 * Returns the image for this tab, or <code>null</code> if none
-	 * 
-	 * @return the image for this tab, or <code>null</code> if none
-	 */
-	public Image getImage();	
-	
-	/**
-	 * Notification that this tab has become the active tab in the launch
-	 * configuration dialog.
-	 * 
-	 * @param workingCopy the launch configuration being edited
-	 * @since 3.0
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy);
-	
-	/**
-	 * Notification that this tab is no longer the active tab in the launch
-	 * configuration dialog.
-	 *  
-	 * @param workingCopy the launch configuration being edited
-	 * @since 3.0
-	 */
-	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy);
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationTabGroup.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationTabGroup.java
deleted file mode 100644
index 1f4f117..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchConfigurationTabGroup.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.debug.ui;
-
-
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
- 
-/**
- * A launch configuration tab group is used to edit/view attributes
- * of a specific type of launch configuration. Launch
- * configurations are presented in a dialog, with a tab folder.
- * Each tab manipulates one or more attributes of a launch
- * configuration. The tab group controls which tabs are
- * displayed for a specific type of launch configuration,
- * and provides a mechanism for overriding configuration
- * initialization performed by tabs.
- * <p>
- * A tab group has the following lifecycle methods:
- * <ul>
- * <li><code>createTabs(ILaunchConfigurationDialog, String)</code> - 
- *  this is the first method called on a tab group after it is instantiated.</li>
- * <li><code>initializeFrom(ILaunchConfiguration)</code> - called when a 
- *  launch configuration is selected to be displayed.</li>
- * <li><code>performApply(ILaunchConfigurationWorkingCopy)</code> - called when
- *  a tab group's values are to be written to a launch configuration.</li>
- * <li><code>dispose()</code> - the last method called on a tab group, when it is
- *  to perform any required cleanup. Note that a tab can be disposed before its control
- *  has been created.</li>
- * </ul>
- * The method <code>setDefaults(ILaunchConfigurationWorkingCopy)</code>
- * can be called before a tab's controls are created.
- * </p>
- * <p>
- * The launch tab framework was originally designed to handle inter tab
- * communication by applying attributes from the active tab to a launch configuration
- * being edited, when a tab is exited, and by initializing a tab when activated.
- * In 3.0, the addition of the methods <code>activated</code> and <code>deactivated</code>
- * allow tabs to determine the appropriate course of action. The default implementation
- * in <code>AbstractLaunchConfigurationTab</code> is to call the old methods
- * (<code>initializeFrom</code> and <code>performApply</code>). Tabs should override
- * the new methods as required.
- * </p>
- * <p>
- * A launch configuration group extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a launch configuration
- * group extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.launchConfigurationTabGroups"&gt;
- *   &lt;launchConfigurationTabGroup 
- *      id="com.example.ExampleTabGroup"
- *      type="com.example.ExampleLaunchConfigurationTypeIdentifier"
- *      class="com.example.ExampleLaunchConfigurationTabGroupClass"&gt;
- *   &lt;/launchConfigurationTabGroup&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this launch configuration
- *  tab group.</li>
- * <li><code>type</code> specifies launch configuration type that this tab
- *  group is applicable to (corresponds to the id of a launch configuration type
- *  extension).</li>
- * <li><code>class</code> specifies a fully qualified name of a Java class
- *  that implements <code>ILaunchConfigurationTabGroup</code>.</li>
- * </ul>
- * </p>
- * <p>
- * This interface is intended to be implemented by clients.
- * </p>
- * @see org.eclipse.debug.core.ILaunchConfigurationType
- * @see org.eclipse.debug.core.ILaunchConfiguration
- * @see org.eclipse.debug.ui.ILaunchConfigurationTab
- * @since 2.0
- */
-public interface ILaunchConfigurationTabGroup {
-
-	/**
-	 * Creates the tabs contained in this tab group for the specified
-	 * launch mode. The tabs control's are not created. This is the
-	 * fist method called in the lifecycle of a tab group.
-	 * 
-	 * @param dialog the launch configuration dialog this tab group
-	 *  is contained in
-	 * @param mode the mode the launch configuration dialog was
-	 *  opened in
-	 */
-	public void createTabs(ILaunchConfigurationDialog dialog, String mode);
-	
-	/**
-	 * Returns the tabs contained in this tab group.
-	 * 
-	 * @return the tabs contained in this tab group
-	 */
-	public ILaunchConfigurationTab[] getTabs();
-
-	/**
-	 * Notifies this launch configuration tab group that it has
-	 * been disposed, and disposes this group's tabs. Marks the end
-	 * of this tab group's lifecycle, allowing this tab group to
-	 * perform any cleanup required.
-	 */
-	public void dispose();
-			
-	/**
-	 * Initializes the given launch configuration with
-	 * default values for this tab group. This method
-	 * is called when a new launch configuration is created
-	 * such that the configuration can be initialized with
-	 * meaningful values. This method may be called before
-	 * tab controls are created.
-	 * 
-	 * @param configuration launch configuration
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration);	
-	
-	/**
-	 * Initializes this group's tab controls with values from the given
-	 * launch configuration. This method is called when
-	 * a configuration is selected to view or edit.
-	 * 
-	 * @param configuration launch configuration
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration);		
-		
-	/**
-	 * Copies values from this group's tabs into the given 
-	 * launch configuration.
-	 * 
-	 * @param configuration launch configuration
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration);
-	
-	/**
-	 * Notifies this tab that a configuration has been
-	 * launched, resulting in the given launch. This method can be
-	 * called when a tab's control does not exist, to support single-click
-	 * launching.
-	 * 
-	 * @param launch the result of launching the current
-	 *  launch configuration
-	 * @deprecated As of R3.0, this method is no longer called by the launch
-	 *  framework. Since tabs do not exist when launching is performed elsewhere
-	 *  than the launch dialog, this method cannot be relied upon for launching
-	 *  functionality.
-	 */
-	public void launched(ILaunch launch);
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchGroup.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchGroup.java
deleted file mode 100644
index d666958..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchGroup.java
+++ /dev/null
@@ -1,94 +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.debug.ui;
- 
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * A launch group identifies a group of launch configurations by a launch
- * mode and category. The launch configuration dialog can be opened on
- * a launch group, and a launch history is maintained for each group.
- * A launch group is defined in plug-in XML via the <code>launchGroups</code>
- * extension point.
- * <p> 
- * Following is an example of a launch group contribution:
- * <pre>
- * 	&lt;extension point="org.eclipse.debug.ui.launchGroups"&gt;
- * 		&lt;launchGroup
- * 			  id="com.example.ExampleLaunchGroupId"
- * 			  mode="run"
- * 			  label="Run"
- * 			  image="icons\run.gif"
- * 		&lt;/launchGroup&gt;
- * 	&lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface ILaunchGroup {
-	
-	/**
-	 * Returns the image for this launch group, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the image for this launch group, or <code>null</code> if none
-	 */
-	public ImageDescriptor getImageDescriptor();
-	
-	/**
-	 * Returns the banner image for this launch group, or <code>null</code> if
-	 * none
-	 * 
-	 * @return the banner image for this launch group, or <code>null</code> if
-	 * none
-	 */
-	public ImageDescriptor getBannerImageDescriptor();
-	
-	/**
-	 * Returns the label for this launch group
-	 * 
-	 * @return the label for this launch group
-	 */
-	public String getLabel();
-		
-	/**
-	 * Returns the id for this launch group
-	 * 
-	 * @return the id for this launch group
-	 */
-	public String getIdentifier();
-	
-	/**
-	 * Returns the category for this launch group, possibly <code>null</code>
-	 * 
-	 * @return the category for this launch group, possibly <code>null</code>
-	 */
-	public String getCategory();
-	
-	/**
-	 * Returns the mode for this launch group
-	 * 
-	 * @return the mode for this launch group
-	 */
-	public String getMode();
-	
-	/**
-	 * Returns whether this launch group is public
-	 *  
-	 * @return boolean
-	 */
-	public boolean isPublic();
-	
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchShortcut.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchShortcut.java
deleted file mode 100644
index 978e10c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchShortcut.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.debug.ui;
-
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A launch shortcut is capable of launching a selection
- * or active editor in the workbench. The delegate is responsible for
- * interpreting the selection or active editor (if it applies), and launching
- * an application. This may require creating a new launch configuration
- * with default values, or re-using an existing launch configuration.
- * <p>
- * A launch shortcut is defined as an extension
- * of type <code>org.eclipse.debug.ui.launchShortcuts</code>.
- * A shortcut specifies the perspectives in which is should be available
- * from the "Run/Debug" cascade menus.
- * </p>
- * <p>
- * A launch shortcut extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a launch shortcut extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.launchShortcuts"&gt;
- *   &lt;launchShortcut
- *      id="com.example.ExampleLaunchShortcut"
- *      class="com.example.ExampleLaunchShortcutClass"
- *      filterClass="com.example.ExampleLaunchShortcutFilterClass"
- * 		label="Example Label"
- * 		icon="\icons\exampleshortcut.gif"
- * 		helpContextId="com.example.shortcut_context"
- * 		modes="run, debug"&gt;
- *      &lt;perspective id="com.example.perspectiveId1"/&gt;
- *      &lt;perspective id="com.example.perspectiveId2"/&gt;
- *      &lt;filter
- *           name="NameMatches"
- *           value="*.java"/&gt;
- *      &lt;filter
- *        	name="ContextualLaunchActionFilter"
- *        	value="supportsContextualLaunch"/&gt;
- *      &lt;contextLabel
- *        	mode="run"
- *        	label="%RunJavaApplet.label"/&gt;
- * 	    &lt;contextLabel
- * 		 	mode="debug"
- * 		 	label="%DebugJavaApplet.label"/&gt;
- * 		  ...
- *   &lt;/launchShortcut&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this launch shortcut.</li>
- * <li><code>class</code> specifies a fully qualified name of a Java class
- *  that implements <code>ILaunchShortcut</code>.</li><li>
- * <code>filterClass</code> optionally specifies a fully qualified name of a Java class
- *  that implements <code>ILaunchFilter</code> for context menu filtering.</li>
- * <li><code>label</code> specifies a label used to render this shortcut.</li>
- * <li><code>icon</code> specifies a plug-in relative path to an icon used to
- * 	render this shortcut.</li>
- * <li><code>helpContextId</code> optional attribute specifying the help context
- * identifier to associate with the launch shortcut action in a menu.</li>
- * <li><code>modes</code> specifies a comma separated list of modes this shortcut
- *  supports.</li>
- * <li><code>perspective</code> one or more perspective entries enumerate the
- * 	perspectives that this shortcut is available in, from the run/debug cascade
- * 	menus.</li>
- * <li><code>filter</code> zero or more filter entries specify the attribute
- * <code>name</code> and attribute <code>value</code> that will be supplied to
- * the <code>testAttribute</code> method implemented by the <code>filterClass</code>
- * Java Class. If all filters in this list return <code>true</code> when applied
- * to a selection target, the shortcut will be available in the run/debug context menu.
- * 	menu.</li>
- * <li><code>contextLabel</code> zero or more context menu labels. For
- * shortcuts that pass their filter tests, the specified label will appear
- * in the "Run ->" context menu and be bound to a launch action of the
- * specified mode (e.g. run,debug,profile).</li>
- * </ul>
- * </p>
- * <p>
- * Clients contributing a launch shortcut are intended to implement this interface.
- * </p>
- * @since 2.0
- */
-public interface ILaunchShortcut {
-
-	/**
-	 * Locates a launchable entity in the given selection and launches
-	 * an application in the specified mode. This launch configuration
-	 * shortcut is responsible for progress reporting as well
-	 * as error handling, in the event that a launchable entity cannot
-	 * be found, or launching fails.
-	 * 
-	 * @param selection workbench selection
-	 * @param mode one of the launch modes defined by the 
-	 * 	launch manager
-	 * @see org.eclipse.debug.core.ILaunchManager
-	 */
-	public void launch(ISelection selection, String mode);
-	
-	/**
-	 * Locates a launchable entity in the given active editor, and launches
-	 * an application in the specified mode. This launch configuration
-	 * shortcut is responsible for progress reporting as well as error
-	 * handling, in the event that a launchable entity cannot be found,
-	 * or launching fails.
-	 * 
-	 * @param editor the active editor in the workbench
-	 * @param mode one of the launch modes defined by the launch
-	 * 		manager
-	 * @see org.eclipse.debug.core.ILaunchManager
-	 */
-	public void launch(IEditorPart editor, String mode);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ISourcePresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ISourcePresentation.java
deleted file mode 100644
index 329ce6b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ISourcePresentation.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.debug.ui;
-
-
-import org.eclipse.ui.IEditorInput;
- 
-/**
- * A source presentation is used to resolve an editor in
- * which to display a debug model element, breakpoint, or
- * source element. By default, a debug model presentation
- * (which implements this interface) is used to resolve
- * editors when performing source lookup. However, a source
- * locator may override default editor resolution by implementing
- * this interface. 
- * <p>
- * Source lookup consists of the following steps:<ol>
- * <li>Locating a source element - the source locator associated
- *  with a launch is queried for the source element associated
- *  with a stack frame.</li>
- * <li>Resolving an editor in which to display a source element -
- *  by default, the debug model presentation associated with the
- *  debug model being debugged is queried for an editor input
- *  and editor id in which to display a source element. However,
- *  clients may override editor resolution by specifying a source
- *  locator that is an instance of <code>ISourcePresentation</code>.
- *  When a source presentation is specified as a source locator,
- *  the source presentation is used to resolve an editor, rather
- *  than the default debug model presentation.</li>
- * </ol>
- * </p>
- * <p>
- * Clients may implement this interface as part of an
- * {@link org.eclipse.debug.ui.IDebugModelPresentation} or as an optional
- * extension to an {@link org.eclipse.debug.core.model.ISourceLocator}.
- * </p>
- * @since 2.0
- */ 
-public interface ISourcePresentation {
-
-	/**
-	 * Returns an editor input that should be used to display the given object
-	 * in an editor or <code>null</code> if unable to provide an editor input
-	 * for the given object.
-	 *
-	 * @param element a debug model element, breakpoint, or a source element
-	 *  that was returned by a source locator's <code>getSourceElement(IStackFrame)</code>
-	 *  method
-	 * @return an editor input, or <code>null</code> if none
-	 */
-	public IEditorInput getEditorInput(Object element);
-	
-	/**
-	 * Returns the id of the editor to use to display the
-	 * given editor input and object, or <code>null</code> if
-	 * unable to provide an editor id.
-	 *
-	 * @param input an editor input that was previously retrieved from this
-	 *    source presentation's <code>getEditorInput</code> method
-	 * @param element the object that was used in the call to
-	 *  <code>getEditorInput</code>, that corresponds to the given editor
-	 *  input
-	 * @return an editor id, or <code>null</code> if none
-	 */
-	public String getEditorId(IEditorInput input, Object element);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IValueDetailListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IValueDetailListener.java
deleted file mode 100644
index 05bcc48..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IValueDetailListener.java
+++ /dev/null
@@ -1,34 +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.debug.ui;
-
-
-import org.eclipse.debug.core.model.IValue;
-
-/**
- * Notified of detailed value descriptions.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IDebugModelPresentation
- * @since 2.0
- */
-
-public interface IValueDetailListener {
-	/**
-	 * Notifies this listener that the details for the given
-	 * value have been computed as the specified result.
-	 *  
-	 * @param value the value for which the detail is provided
-	 * @param result the detailed description of the given value
-	 */
-	public void detailComputed(IValue value, String result);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java
deleted file mode 100644
index efbd60c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
-import org.eclipse.debug.internal.ui.views.variables.VariablesView;
-import org.eclipse.debug.internal.ui.views.variables.details.DefaultDetailPane;
-import org.eclipse.debug.internal.ui.views.variables.details.DetailPaneProxy;
-import org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-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.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PartInitException;
-
-/**
- * A <code>DebugPopup</code> that can be used to inspect an 
- * <code>IExpression</code> object.
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * @since 3.2
- */
-public class InspectPopupDialog extends DebugPopup {
-    
-	private static final String PREF_INSPECT_POPUP_SASH_WEIGHTS = DebugUIPlugin.getUniqueIdentifier() + "inspectPopupSashWeights"; //$NON-NLS-1$
-	
-	private static final int[] DEFAULT_SASH_WEIGHTS = new int[] { 90, 10 };
-    private static final int MIN_WIDTH = 250;
-    private static final int MIN_HEIGHT = 200;
-
-    private TreeModelViewer fViewer;
-    private SashForm fSashForm;
-    private Composite fDetailPaneComposite;
-    private DetailPaneProxy fDetailPane;
-    private Tree fTree;
-    private IExpression fExpression;
-    
-    /**
-     * Creates a new inspect popup.
-     * 
-     * @param shell The parent shell
-     * @param anchor point at which to anchor the popup in Display coordinates. Since
-     *  3.3 <code>null</code> indicates a default location should be used.
-     * @param commandId The command id to be used for persistence of 
-     * the dialog (possibly <code>null</code>)
-     * @param expression The expression being inspected
-     */
-    public InspectPopupDialog(Shell shell, Point anchor, String commandId, IExpression expression) {
-        super(shell, anchor, commandId);
-        fExpression = expression;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.DebugPopup#createDialogArea(org.eclipse.swt.widgets.Composite)
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite composite = new Composite(parent, parent.getStyle());
-        GridLayout layout = new GridLayout();
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        fSashForm = new SashForm(composite, parent.getStyle());
-        fSashForm.setOrientation(SWT.VERTICAL);
-        fSashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        VariablesView view = getViewToEmulate();
-        IPresentationContext context;
-        if (view == null) {
-        	context = new PresentationContext(IDebugUIConstants.ID_VARIABLE_VIEW);
-        } else {
-        	context = ((TreeModelViewer)view.getViewer()).getPresentationContext();
-        }
-        fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, context);
-
-        fDetailPaneComposite = SWTFactory.createComposite(fSashForm, 1, 1, GridData.FILL_BOTH);
-        
-        fDetailPane = new DetailPaneProxy(new DetailPaneContainer());
-        fDetailPane.display(null); // Bring up the default pane so the user doesn't see an empty composite
-      
-        fTree = fViewer.getTree();
-        fTree.addSelectionListener(new SelectionListener() {
-            public void widgetSelected(SelectionEvent e) {
-            	fDetailPane.display((IStructuredSelection)fViewer.getSelection());
-            }
-            public void widgetDefaultSelected(SelectionEvent e) {}
-        });
-
-        initSashWeights();
-      
-        fViewer.getContentProvider();
-        if (view != null) {
-            StructuredViewer structuredViewer = (StructuredViewer) view.getViewer();
-            if (structuredViewer != null) {
-                ViewerFilter[] filters = structuredViewer.getFilters();
-                for (int i = 0; i < filters.length; i++) {
-                    fViewer.addFilter(filters[i]);
-                }
-            }
-        }
-               
-        TreeRoot treeRoot = new TreeRoot();
-        fViewer.addViewerUpdateListener(new ViewerListener(fExpression));
-        fViewer.setInput(treeRoot);
-
-        return fTree;
-    }
-    
-    /**
-     * Initializes the sash form weights from the preference store (using default values if 
-     * no sash weights were stored previously).
-     */
-    protected void initSashWeights(){
-    	String prefWeights = DebugUIPlugin.getDefault().getPreferenceStore().getString(PREF_INSPECT_POPUP_SASH_WEIGHTS);
-    	if (prefWeights.length() > 0){
-	    	String[] weights = prefWeights.split(":"); //$NON-NLS-1$
-	    	if (weights.length == 2){
-	    		try{
-	    			int[] intWeights = new int[2];
-	    			intWeights[0] = Integer.parseInt(weights[0]);
-	    			intWeights[1] = Integer.parseInt(weights[1]);
-	    			fSashForm.setWeights(intWeights);
-	    			return;
-	    		} catch (NumberFormatException e){} 
-	    	}
-    	}
-    	fSashForm.setWeights(DEFAULT_SASH_WEIGHTS);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.PopupDialog#saveDialogBounds(org.eclipse.swt.widgets.Shell)
-     */
-    protected void saveDialogBounds(Shell shell) {
-    	super.saveDialogBounds(shell);
-    	if (fSashForm != null && !fSashForm.isDisposed()){
-	    	int[] weights = fSashForm.getWeights();
-	    	if (weights.length == 2){
-	    		String weightString = weights[0] + ":" + weights[1]; //$NON-NLS-1$
-	    		DebugUIPlugin.getDefault().getPluginPreferences().setValue(PREF_INSPECT_POPUP_SASH_WEIGHTS, weightString);
-	    	}
-	    }
-    }
-    
-    /**
-     * Creates the content for the root element of the tree viewer in the inspect
-     * popup dialog.  Always has one child, the expression this popup is displaying.
-     *
-     */
-    private class TreeRoot extends ElementContentProvider {
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-		 */
-		protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-			return 1;
-		}
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-		 */
-		protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-			return new Object[] { fExpression };
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-		 */
-		protected boolean supportsContextId(String id) {
-			return true;
-		}
-    }
-       
-    /**
-     * Attempts to find an appropriate view to emulate, this will either be the
-     * variables view or the expressions view.
-     * @return a view to emulate or <code>null</code>
-     */
-    private VariablesView getViewToEmulate() {
-        IWorkbenchPage page = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage();
-        VariablesView expressionsView = (VariablesView) page.findView(IDebugUIConstants.ID_EXPRESSION_VIEW);
-        if (expressionsView != null && expressionsView.isVisible()) {
-            return expressionsView;
-        }
-        VariablesView variablesView = (VariablesView) page.findView(IDebugUIConstants.ID_VARIABLE_VIEW);
-        if (variablesView != null && variablesView.isVisible()) {
-            return variablesView;
-        }
-        if (expressionsView != null) {
-            return expressionsView;
-        }
-        return variablesView;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.DebugPopup#close()
-     */
-    public boolean close() {
-    	if (!wasPersisted()) {
-    		fExpression.dispose();
-    	}
-    	fDetailPane.dispose();
-		return super.close();
-	}
-
-	/* (non-Javadoc)
-     * @see org.eclipse.debug.ui.DebugPopup#getActionText()
-     */
-    protected String getActionText() {
-		return DebugUIViewsMessages.InspectPopupDialog_0;
-	}
-
-	/* (non-Javadoc)
-     * @see org.eclipse.debug.ui.DebugPopup#persist()
-     */
-    protected void persist() {
-    	super.persist();
-        DebugPlugin.getDefault().getExpressionManager().addExpression(fExpression);
-
-        fExpression = null;
-        IWorkbenchPage page = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage();
-        IViewPart part = page.findView(IDebugUIConstants.ID_EXPRESSION_VIEW);
-        if (part == null) {
-            try {
-                page.showView(IDebugUIConstants.ID_EXPRESSION_VIEW);
-            } catch (PartInitException e) {
-            }
-        } else {
-            page.bringToTop(part);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.PopupDialog#getInitialSize()
-     */
-    protected Point getInitialSize() {
-        Point initialSize = super.getInitialSize();
-        initialSize.x = Math.max(initialSize.x, MIN_WIDTH);
-        initialSize.y = Math.max(initialSize.y, MIN_HEIGHT);
-        return initialSize;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.PopupDialog#getBackgroundColorExclusions()
-	 */
-	protected List getBackgroundColorExclusions() {
-		List list = super.getBackgroundColorExclusions();
-		list.add(fSashForm);
-		return list;
-	}
-
-	/**
-	 * Inner class implementing IDetailPaneContainer methods.  Handles changes to detail
-	 * pane and provides limited access to the detail pane proxy.
-	 */
-	private class DetailPaneContainer implements IDetailPaneContainer{
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentPaneID()
-		 */
-		public String getCurrentPaneID() {
-			return fDetailPane.getCurrentPaneID();
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentSelection()
-		 */
-		public IStructuredSelection getCurrentSelection() {
-			return (IStructuredSelection)fViewer.getSelection();
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#refreshDetailPaneContents()
-		 */
-		public void refreshDetailPaneContents() {		
-			fDetailPane.display(getCurrentSelection());
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getParentComposite()
-		 */
-		public Composite getParentComposite() {
-			return fDetailPaneComposite;
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getWorkbenchPartSite()
-		 */
-		public IWorkbenchPartSite getWorkbenchPartSite() {
-			return null;
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#paneChanged(java.lang.String)
-		 */
-		public void paneChanged(String newPaneID) {
-			if (newPaneID.equals(DefaultDetailPane.ID)){
-				applyBackgroundColor(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND), fDetailPane.getCurrentControl());
-			}
-		}
-	
-	}
-	
-	private class ViewerListener implements IViewerUpdateListener {
-
-		private Object rootElement;
-		
-		ViewerListener(Object root) {
-			rootElement = root;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#updateComplete(org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
-		 */
-		public void updateComplete(IViewerUpdate update) {
-			if (update instanceof IHasChildrenUpdate) {
-				IHasChildrenUpdate hcu = (IHasChildrenUpdate) update;
-				if (hcu.getElement().equals(rootElement)) {
-					fViewer.removeViewerUpdateListener(this);
-					fViewer.expandToLevel(update.getElementPath(), 1);
-				}
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#updateStarted(org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
-		 */
-		public void updateStarted(IViewerUpdate update) {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#viewerUpdatesBegin()
-		 */
-		public void viewerUpdatesBegin() {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#viewerUpdatesComplete()
-		 */
-		public void viewerUpdatesComplete() {
-		}
-
-		
-	}
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/RefreshTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/RefreshTab.java
deleted file mode 100644
index 1b1b7f6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/RefreshTab.java
+++ /dev/null
@@ -1,618 +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.debug.ui;
-
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import com.ibm.icu.text.MessageFormat;
-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.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog;
-import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
-import org.eclipse.debug.internal.ui.stringsubstitution.StringSubstitutionMessages;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
-
-/**
- * A launch configuration tab which allows the user to specify
- * which resources should be refreshed when the launch
- * terminates.
- * <p>
- * This class may be instantiated; this class is not intended
- * to be subclassed.
- * </p>
- * @since 3.0
- */
-public class RefreshTab extends AbstractLaunchConfigurationTab {
-
-	/**
-	 * Boolean attribute indicating if a refresh scope is recursive. Default
-	 * value is <code>false</code>.
-	 */
-	public static final String ATTR_REFRESH_RECURSIVE = DebugPlugin.getUniqueIdentifier() + ".ATTR_REFRESH_RECURSIVE"; //$NON-NLS-1$
-
-	/**
-	 * String attribute identifying the scope of resources that should be
-	 * refreshed after an external tool is run. The value is either a refresh
-	 * variable or the default value, <code>null</code>, indicating no refresh.
-	 */
-	public static final String ATTR_REFRESH_SCOPE = DebugPlugin.getUniqueIdentifier() + ".ATTR_REFRESH_SCOPE"; //$NON-NLS-1$
-	
-	// indicates no working set has been selected
-	private static final String NO_WORKING_SET = "NONE"; //$NON-NLS-1$
-	
-	// Check Buttons
-	private Button fRefreshButton;
-	private Button fRecursiveButton;
-	
-	// Group box
-	private Group fGroup;
-	
-	// Radio Buttons
-	private Button fContainerButton;
-	private Button fProjectButton;
-	private Button fResourceButton;
-	private Button fWorkingSetButton;
-	private Button fWorkspaceButton;
-	
-	// Push Button
-	private Button fSelectButton;
-	
-	// Working set
-	private IWorkingSet fWorkingSet;
-
-	/**
-	 * XML tag used to designate the root of the persisted IWorkingSet
-	 */
-	private static final String TAG_LAUNCH_CONFIGURATION_WORKING_SET= "launchConfigurationWorkingSet"; //$NON-NLS-1$
-
-	/**
-	 * XML tag used for setting / getting the factory ID of the persisted IWorkingSet
-	 * Bug 37143
-	 */	
-	private static final String TAG_FACTORY_ID = "factoryID"; //$NON-NLS-1$
-	
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite mainComposite = new Composite(parent, SWT.NONE);
-		setControl(mainComposite);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_REFRESH_TAB);
-		
-		GridLayout layout = new GridLayout();
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		mainComposite.setLayout(layout);
-		mainComposite.setLayoutData(gd);
-		mainComposite.setFont(parent.getFont());
-		
-		fRefreshButton = createCheckButton(mainComposite, StringSubstitutionMessages.RefreshTab_31); 
-		fRefreshButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateEnabledState();
-				updateLaunchConfigurationDialog();
-			}
-		});
-		
-		fGroup = new Group(mainComposite, SWT.NONE);
-		fGroup.setFont(mainComposite.getFont());
-		layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		fGroup.setLayout(layout);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fGroup.setLayoutData(gd);
-
-		SelectionAdapter adapter = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (((Button)e.getSource()).getSelection()) {
-					updateEnabledState();
-					updateLaunchConfigurationDialog();
-				}
-			}
-		};
-		
-		fWorkspaceButton = createRadioButton(fGroup, StringSubstitutionMessages.RefreshTab_32); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fWorkspaceButton.setLayoutData(gd);
-		fWorkspaceButton.addSelectionListener(adapter);
-
-		fResourceButton = createRadioButton(fGroup, StringSubstitutionMessages.RefreshTab_33); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fResourceButton.setLayoutData(gd);
-		fResourceButton.addSelectionListener(adapter);
-
-		fProjectButton = createRadioButton(fGroup, StringSubstitutionMessages.RefreshTab_34); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fProjectButton.setLayoutData(gd);		
-		fProjectButton.addSelectionListener(adapter);
-
-		fContainerButton = createRadioButton(fGroup, StringSubstitutionMessages.RefreshTab_35); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fContainerButton.setLayoutData(gd);
-		fContainerButton.addSelectionListener(adapter);
-				
-		fWorkingSetButton = createRadioButton(fGroup, StringSubstitutionMessages.RefreshTab_36); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		fWorkingSetButton.setLayoutData(gd);
-		fWorkingSetButton.addSelectionListener(adapter);		
-		
-		fSelectButton = createPushButton(fGroup, StringSubstitutionMessages.RefreshTab_37, null); 
-		gd = (GridData)fSelectButton.getLayoutData();
-		gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_END;
-		fSelectButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				selectResources();
-			}
-		});
-		
-		createVerticalSpacer(fGroup, 2);
-		createRecursiveComponent(fGroup);
-	}
-
-	/**
-	 * Prompts the user to select the resources to refresh.
-	 */
-	private void selectResources() {
-		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
-		
-		if (fWorkingSet == null){
-			fWorkingSet = workingSetManager.createWorkingSet(StringSubstitutionMessages.RefreshTab_40, new IAdaptable[0]); 
-		}
-		IWorkingSetEditWizard wizard = workingSetManager.createWorkingSetEditWizard(fWorkingSet);
-		WizardDialog dialog = new WizardDialog(((LaunchConfigurationsDialog)LaunchConfigurationsDialog.getCurrentlyVisibleLaunchConfigurationDialog()).getShell(), wizard);
-		dialog.create();		
-		
-		if (dialog.open() == Window.CANCEL) {
-			return;
-		}
-		fWorkingSet = wizard.getSelection();
-		updateLaunchConfigurationDialog();
-	}
-	
-	/**
-	 * Creates the controls needed to edit the refresh recursive
-	 * attribute of a launch configuration
-	 * 
-	 * @param parent the composite to create the controls in
-	 */
-	private void createRecursiveComponent(Composite parent) {
-		fRecursiveButton = createCheckButton(parent, StringSubstitutionMessages.RefreshTab_0); 
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		data.horizontalSpan = 2;
-		fRecursiveButton.setLayoutData(data);
-		fRecursiveButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		updateRefresh(configuration);
-		updateRecursive(configuration);
-		updateScope(configuration);
-		updateEnabledState();		
-	}
-	
-	/**
-	 * Updates the tab to display the refresh scope specified by the launch config
-	 */
-	private void updateScope(ILaunchConfiguration configuration) {
-		String scope = null;
-		try {
-			scope= configuration.getAttribute(ATTR_REFRESH_SCOPE, (String)null);
-		} catch (CoreException ce) {
-			DebugUIPlugin.log(DebugUIPlugin.newErrorStatus("Exception reading launch configuration", ce)); //$NON-NLS-1$
-		}
-		fWorkspaceButton.setSelection(false);
-		fResourceButton.setSelection(false);
-		fContainerButton.setSelection(false);
-		fProjectButton.setSelection(false);
-		fWorkingSetButton.setSelection(false);
-		if (scope == null) {
-			// select the workspace by default
-			fWorkspaceButton.setSelection(true);
-		} else {
-			if (scope.equals("${workspace}")) { //$NON-NLS-1$
-				fWorkspaceButton.setSelection(true);
-			} else if (scope.equals("${resource}")) { //$NON-NLS-1$
-				fResourceButton.setSelection(true);
-			} else if (scope.equals("${container}")) { //$NON-NLS-1$
-				fContainerButton.setSelection(true);
-			} else if (scope.equals("${project}")) { //$NON-NLS-1$
-				fProjectButton.setSelection(true);
-			} else if (scope.startsWith("${resource:")) { //$NON-NLS-1$
-				fWorkingSetButton.setSelection(true);
-				try {
-					IResource[] resources = getRefreshResources(scope);
-					IWorkingSetManager workingSetManager= PlatformUI.getWorkbench().getWorkingSetManager();
-					fWorkingSet = workingSetManager.createWorkingSet(StringSubstitutionMessages.RefreshTab_40, resources);					 
-				} catch (CoreException e) {
-					fWorkingSet = null;
-				}
-			} else if (scope.startsWith("${working_set:")) { //$NON-NLS-1$
-				fWorkingSetButton.setSelection(true);
-				String memento = scope.substring(14, scope.length() - 1);
-				fWorkingSet = restoreWorkingSet(memento);
-			}
-		}
-	}
-	/**
-	 * Method updateRecursive.
-	 * @param configuration
-	 */
-	private void updateRecursive(ILaunchConfiguration configuration) {
-		boolean recursive= true;
-		try {
-			recursive= configuration.getAttribute(ATTR_REFRESH_RECURSIVE, true);
-		} catch (CoreException ce) {
-			DebugUIPlugin.log(DebugUIPlugin.newErrorStatus("Exception reading launch configuration", ce)); //$NON-NLS-1$
-		}
-		fRecursiveButton.setSelection(recursive);
-	}
-	/**
-	 * Method updateRefresh.
-	 * @param configuration
-	 */
-	private void updateRefresh(ILaunchConfiguration configuration) {
-		String scope= null;
-		try {
-			scope= configuration.getAttribute(ATTR_REFRESH_SCOPE, (String)null);
-		} catch (CoreException ce) {
-			DebugUIPlugin.log(DebugUIPlugin.newErrorStatus("Exception reading launch configuration", ce)); //$NON-NLS-1$
-		}
-		fRefreshButton.setSelection(scope != null);
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		if (fRefreshButton.getSelection()) {
-			String scope = generateScopeMemento();
-			configuration.setAttribute(ATTR_REFRESH_SCOPE, scope);
-			setAttribute(ATTR_REFRESH_RECURSIVE, configuration, fRecursiveButton.getSelection(), true);
-		} else {
-			//clear the refresh attributes
-			configuration.setAttribute(ATTR_REFRESH_SCOPE, (String)null);
-			setAttribute(ATTR_REFRESH_RECURSIVE, configuration, true, true);
-		}
-	}
-
-	/**
-	 * Generates a memento for the refresh scope. This is based on old refresh
-	 * variables.
-	 * 
-	 * @return a memento
-	 */
-	private String generateScopeMemento() {
-		if (fWorkspaceButton.getSelection()) {
-			return "${workspace}"; //$NON-NLS-1$
-		}
-		if (fResourceButton.getSelection()) {
-			return "${resource}"; //$NON-NLS-1$
-		}
-		if (fContainerButton.getSelection()) {
-			return "${container}"; //$NON-NLS-1$
-		}
-		if (fProjectButton.getSelection()) {
-			return "${project}"; //$NON-NLS-1$
-		}
-		if (fWorkingSetButton.getSelection()) {
-			return getRefreshAttribute(fWorkingSet);
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return StringSubstitutionMessages.RefreshTab_6; 
-	}
-	
-	/**
-	 * Updates the enablement state of the fields.
-	 */
-	private void updateEnabledState() {
-		boolean enabled= fRefreshButton.getSelection();
-		fRecursiveButton.setEnabled(enabled);
-		fGroup.setEnabled(enabled);
-		fWorkspaceButton.setEnabled(enabled);
-		fResourceButton.setEnabled(enabled);
-		fContainerButton.setEnabled(enabled);
-		fProjectButton.setEnabled(enabled);
-		fWorkingSetButton.setEnabled(enabled);
-		fSelectButton.setEnabled(enabled && fWorkingSetButton.getSelection());
-		if (!enabled) {
-			super.setErrorMessage(null);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_OBJS_REFRESH_TAB);
-	}
-
-	public boolean isValid(ILaunchConfiguration launchConfig) {
-		setErrorMessage(null);
-		setMessage(null);
-		if (fRefreshButton.getSelection() && (fWorkingSetButton.getSelection() && (fWorkingSet == null || fWorkingSet.getElements().length == 0))) {
-			setErrorMessage(StringSubstitutionMessages.RefreshTab_42); 
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Refreshes the resources as specified by the given launch configuration.
-	 * 
-	 * @param configuration launch configuration
-	 * @param monitor progress monitor which may be <code>null</code>
-	 * @throws CoreException if an exception occurs while refreshing resources
-	 */
-	public static void refreshResources(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		String scope = getRefreshScope(configuration);
-		IResource[] resources= null;
-		if (scope != null) {
-			resources = getRefreshResources(scope);
-		}
-		if (resources == null || resources.length == 0){
-			return;
-		}
-		int depth = IResource.DEPTH_ONE;
-		if (isRefreshRecursive(configuration))
-			depth = IResource.DEPTH_INFINITE;
-	
-		if (monitor.isCanceled()) {
-			return;
-		}
-	
-		monitor.beginTask(StringSubstitutionMessages.RefreshTab_7, 
-			resources.length);
-	
-		MultiStatus status = new MultiStatus(DebugUIPlugin.getUniqueIdentifier(), 0, StringSubstitutionMessages.RefreshTab_8, null); 
-		for (int i = 0; i < resources.length; i++) {
-			if (monitor.isCanceled())
-				break;
-			if (resources[i] != null && resources[i].isAccessible()) {
-				try {
-					resources[i].refreshLocal(depth, null);
-				} catch (CoreException e) {
-					status.merge(e.getStatus());
-				}
-			}
-			monitor.worked(1);
-		}
-	
-		monitor.done();
-		if (!status.isOK()) {
-			throw new CoreException(status);
-		}
-	}
-
-	/**
-	 * Returns a collection of resources referred to by a refresh scope attribute.
-	 * 
-	 * @param scope refresh scope attribute (<code>ATTR_REFRESH_SCOPE</code>)
-	 * @return collection of resources referred to by the refresh scope attribute
-	 * @throws CoreException if unable to resolve a set of resources
-	 */
-	public static IResource[] getRefreshResources(String scope) throws CoreException {
-		if (scope.startsWith("${resource:")) { //$NON-NLS-1$
-			// This is an old format that is replaced with 'working_set'
-			String pathString = scope.substring(11, scope.length() - 1);
-			Path path = new Path(pathString);
-			IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-			if (resource == null) {
-				throw new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, MessageFormat.format(StringSubstitutionMessages.RefreshTab_43, new String[]{pathString}), null)); 
-			} 
-			return new IResource[]{resource};
-		} else if (scope.startsWith("${working_set:")) { //$NON-NLS-1$
-			IWorkingSet workingSet =  getWorkingSet(scope);
-			if (workingSet == null) {
-				throw new CoreException(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, StringSubstitutionMessages.RefreshTab_44, null));  
-			} 
-			IAdaptable[] elements = workingSet.getElements();
-			IResource[] resources = new IResource[elements.length];
-			for (int i = 0; i < elements.length; i++) {
-				IAdaptable adaptable = elements[i];
-				if (adaptable instanceof IResource) {
-					resources[i] = (IResource) adaptable;
-				} else {
-					resources[i] = (IResource) adaptable.getAdapter(IResource.class);
-				}
-			}
-			return resources;				
-		} else if(scope.equals("${workspace}")) { //$NON-NLS-1$
-			return new IResource[]{ResourcesPlugin.getWorkspace().getRoot()};
-		} else {
-			IResource resource = SelectedResourceManager.getDefault().getSelectedResource();
-			if (resource == null) {
-				// empty selection
-				return new IResource[]{};
-			}
-			if (scope.equals("${resource}")) { //$NON-NLS-1$
-				// resource = resource
-			} else if (scope.equals("${container}")) { //$NON-NLS-1$
-				resource = resource.getParent();
-			} else if (scope.equals("${project}")) { //$NON-NLS-1$
-				resource = resource.getProject();
-			}
-			return new IResource[]{resource};
-		}
-	}
-	
-	/**
-	 * Restores a working set based on the XMLMemento represented within
-	 * the mementoString.
-	 * 
-	 * @param mementoString The string memento of the working set
-	 * @return the restored working set or <code>null</code> if problems occurred restoring the
-	 * working set.
-	 */
-	private static IWorkingSet restoreWorkingSet(String mementoString) {
-		if (NO_WORKING_SET.equals(mementoString)) {
-			return null;
-		}
-		StringReader reader= new StringReader(mementoString);
-		XMLMemento memento= null;
-		try {
-			memento = XMLMemento.createReadRoot(reader);
-		} catch (WorkbenchException e) {
-			DebugUIPlugin.log(e);
-			return null;
-		}
-
-		IWorkingSetManager workingSetManager= PlatformUI.getWorkbench().getWorkingSetManager();
-		return workingSetManager.createWorkingSet(memento);
-	}	
-	
-	/**
-	 * Returns the refresh scope attribute specified by the given launch configuration
-	 * or <code>null</code> if none.
-	 * 
-	 * @param configuration launch configuration
-	 * @return refresh scope attribute (<code>ATTR_REFRESH_SCOPE</code>)
-	 * @throws CoreException if unable to access the associated attribute
-	 */
-	public static String getRefreshScope(ILaunchConfiguration configuration) throws CoreException {
-		return configuration.getAttribute(ATTR_REFRESH_SCOPE, (String) null);
-	}
-
-	/**
-	 * Returns whether the refresh scope specified by the given launch
-	 * configuration is recursive.
-	 * 
-	 * @param configuration
-	 * @return whether the refresh scope is recursive
-	 * @throws CoreException if unable to access the associated attribute
-	 */
-	public static boolean isRefreshRecursive(ILaunchConfiguration configuration) throws CoreException {
-		return configuration.getAttribute(ATTR_REFRESH_RECURSIVE, true);
-	}	
-	
-	/**
-	 * Creates and returns a memento for the given working set, to be used as a
-	 * refresh attribute.
-	 * 
-	 * @param workingSet a working set, or <code>null</code>
-	 * @return an equivalent refresh attribute
-	 */
-	public static String getRefreshAttribute(IWorkingSet workingSet) {
-		String set = null;
-		if (workingSet == null || workingSet.getElements().length == 0) {
-			set = NO_WORKING_SET;
-		} else {
-			XMLMemento workingSetMemento = XMLMemento.createWriteRoot(TAG_LAUNCH_CONFIGURATION_WORKING_SET);
-			workingSetMemento.putString(RefreshTab.TAG_FACTORY_ID, workingSet.getFactoryId());
-			workingSet.saveState(workingSetMemento);
-			StringWriter writer= new StringWriter();
-			try {
-				workingSetMemento.save(writer);
-			} catch (IOException e) {
-				DebugUIPlugin.log(e);
-			}
-			set = writer.toString();
-		}
-		if (set != null) {
-			StringBuffer memento = new StringBuffer();
-			memento.append("${working_set:"); //$NON-NLS-1$
-			memento.append(set);
-			memento.append("}"); //$NON-NLS-1$
-			return memento.toString();
-		}
-		return null;
-	}
-	
-	/**
-	 * Creates and returns a working set from the given refresh attribute created by
-	 * the method <code>getRefreshAttribute(IWorkingSet)</code>, or <code>null</code>
-	 * if none.
-	 * 
-	 * @param refreshAttribute a refresh attribute that represents a working set
-	 * @return equivalent working set, or <code>null</code>
-	 */
-	public static IWorkingSet getWorkingSet(String refreshAttribute) {
-		if (refreshAttribute.startsWith("${working_set:")) { //$NON-NLS-1$
-			String memento = refreshAttribute.substring(14, refreshAttribute.length() - 1);
-			return  restoreWorkingSet(memento);
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
-		// do nothing on activation
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
-		// do nothing on deactivation
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/StringVariableSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/StringVariableSelectionDialog.java
deleted file mode 100644
index 5d31e9a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/StringVariableSelectionDialog.java
+++ /dev/null
@@ -1,287 +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.debug.ui;
-
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IStringVariable;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.preferences.StringVariablePreferencePage;
-import org.eclipse.debug.internal.ui.stringsubstitution.IArgumentSelector;
-import org.eclipse.debug.internal.ui.stringsubstitution.StringSubstitutionMessages;
-import org.eclipse.debug.internal.ui.stringsubstitution.StringVariableLabelProvider;
-import org.eclipse.debug.internal.ui.stringsubstitution.StringVariablePresentationManager;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.preference.PreferenceNode;
-import org.eclipse.jface.preference.PreferencePage;
-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.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-
-/**
- * A dialog that prompts the user to choose and configure a string
- * substitution variable.
- * <p>
- * Clients may instantiate this class; not intended to be subclassed.
- * </p>
- * @since 3.1
- */
-public class StringVariableSelectionDialog extends ElementListSelectionDialog {
-	
-	// button to configure variable's argument
-	private Button fArgumentButton;
-	// variable description
-	private Text fDescriptionText;
-	// the argument value
-	private Text fArgumentText;
-	private String fArgumentValue;
-	private Button fEditVariablesButton;
-
-	/**
-	 * Constructs a new string substitution variable selection dialog.
-	 *  
-	 * @param parent parent shell
-	 */
-	public StringVariableSelectionDialog(Shell parent) {
-		super(parent, new StringVariableLabelProvider());
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-		setTitle(StringSubstitutionMessages.StringVariableSelectionDialog_2); 
-		setMessage(StringSubstitutionMessages.StringVariableSelectionDialog_3); 
-		setMultipleSelection(false);
-		setElements(VariablesPlugin.getDefault().getStringVariableManager().getVariables());
-	}
-	
-	/**
-	 * Returns the variable expression the user generated from this
-	 * dialog, or <code>null</code> if none.
-	 *  
-	 * @return variable expression the user generated from this
-	 * dialog, or <code>null</code> if none
-	 */
-	public String getVariableExpression() {
-		Object[] selected = getResult();
-		if (selected != null && selected.length == 1) {
-			IStringVariable variable = (IStringVariable)selected[0];
-			StringBuffer buffer = new StringBuffer();
-			buffer.append("${"); //$NON-NLS-1$
-			buffer.append(variable.getName());
-			if (fArgumentValue != null && fArgumentValue.length() > 0) {
-				buffer.append(":"); //$NON-NLS-1$
-				buffer.append(fArgumentValue);
-			}
-			buffer.append("}"); //$NON-NLS-1$
-			return buffer.toString();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Control control = super.createDialogArea(parent);
-		createArgumentArea((Composite)control);
-		return control;
-	}
-
-	/**
-	 * Creates an area to display a description of the selected variable
-	 * and a button to configure the variable's argument.
-	 * 
-	 * @param parent parent widget
-	 */
-	private void createArgumentArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(gd);
-		container.setFont(parent.getFont());
-		
-		fEditVariablesButton = new Button(container, SWT.PUSH);
-		fEditVariablesButton.setFont(container.getFont());
-		fEditVariablesButton.setText(StringSubstitutionMessages.StringVariableSelectionDialog_0); 
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		gd.horizontalSpan = 2;
-		fEditVariablesButton.setLayoutData(gd);
-		fEditVariablesButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editVariables();
-			}
-		});	
-		
-		Label desc = new Label(container, SWT.NONE);
-		desc.setFont(parent.getFont());
-		desc.setText(StringSubstitutionMessages.StringVariableSelectionDialog_6); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		desc.setLayoutData(gd);		
-		
-		Composite args = new Composite(container, SWT.NONE);
-		layout = new GridLayout(2, false);
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		args.setLayout(layout);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		args.setLayoutData(gd);
-		args.setFont(container.getFont());
-		
-		fArgumentText = new Text(args, SWT.BORDER);
-		fArgumentText.setFont(container.getFont());
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		fArgumentText.setLayoutData(gd);		
-		
-		fArgumentButton = new Button(args, SWT.PUSH);
-		fArgumentButton.setFont(parent.getFont());
-		fArgumentButton.setText(StringSubstitutionMessages.StringVariableSelectionDialog_7); 
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		gd.widthHint = SWTFactory.getButtonWidthHint(fArgumentButton);
-		fArgumentButton.setLayoutData(gd);
-		fArgumentButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				configureArgument();
-			}
-		});
-
-		
-		desc = new Label(container, SWT.NONE);
-		desc.setFont(parent.getFont());
-		desc.setText(StringSubstitutionMessages.StringVariableSelectionDialog_8); 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		desc.setLayoutData(gd);
-		
-		fDescriptionText = new Text(container, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
-		fDescriptionText.setFont(container.getFont());
-		fDescriptionText.setEditable(false);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		gd.heightHint = 50;
-		fDescriptionText.setLayoutData(gd);
-	}
-
-	protected void editVariables() {
-		PreferencePage page = new StringVariablePreferencePage();
-		page.setTitle(StringSubstitutionMessages.StringVariableSelectionDialog_1); 
-		final IPreferenceNode targetNode = new PreferenceNode("org.eclipse.debug.ui.StringVariablePreferencePage", page); //$NON-NLS-1$
-		
-		PreferenceManager manager = new PreferenceManager();
-		manager.addToRoot(targetNode);
-		final PreferenceDialog dialog = new PreferenceDialog(getShell(), manager);
-		
-		final Display display = DebugUIPlugin.getStandardDisplay();
-		BusyIndicator.showWhile(display, new Runnable() {
-			public void run() {
-				dialog.create();
-				dialog.setMessage(targetNode.getLabelText());
-				if(dialog.open() == IDialogConstants.OK_ID) {
-					final IStringVariable[] elements = VariablesPlugin.getDefault().getStringVariableManager().getVariables();
-					display.asyncExec(new Runnable() {
-						public void run() {
-							setListElements(elements);
-						}
-					});
-				}
-			}
-		});		
-	}
-
-	/**
-	 * Configures the argument for the selected variable.
-	 */
-	protected void configureArgument() {
-		Object[] objects = getSelectedElements();
-		IStringVariable variable = (IStringVariable)objects[0];
-		IArgumentSelector selector = StringVariablePresentationManager.getDefault().getArgumentSelector(variable);
-		String value = selector.selectArgument(variable, getShell());
-		if (value != null) {
-			fArgumentText.setText(value);
-		}
-	}
-
-	/**
-	 * Update variable description and argument button enablement.
-	 * 
-	 * @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#handleSelectionChanged()
-	 */
-	protected void handleSelectionChanged() {
-		super.handleSelectionChanged();
-		Object[] objects = getSelectedElements();
-		boolean buttonEnabled = false;
-		boolean argEnabled = false;
-		String text = null;
-		if (objects.length == 1) {
-			IStringVariable variable = (IStringVariable)objects[0];
-			 IArgumentSelector selector = StringVariablePresentationManager.getDefault().getArgumentSelector(variable);
-			 if (variable instanceof IDynamicVariable) {
-			 	argEnabled = ((IDynamicVariable)variable).supportsArgument();
-			 }
-			 buttonEnabled = argEnabled && selector != null;
-			 text = variable.getDescription();
-		}
-		if (text == null) {
-			text = ""; //$NON-NLS-1$
-		}
-		fArgumentText.setEnabled(argEnabled);
-		fArgumentButton.setEnabled(buttonEnabled);
-		fDescriptionText.setText(text);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		fArgumentValue = fArgumentText.getText().trim();
-		super.okPressed();
-	}
-
-	/**
-	 * Returns the name of the section that this dialog stores its settings in
-	 * 
-	 * @return String
-	 */
-	private String getDialogSettingsSectionName() {
-		return IDebugUIConstants.PLUGIN_ID + ".STRING_VARIABLE_SELECTION_DIALOG_SECTION"; //$NON-NLS-1$
-	}
-	
-	 /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
-     */
-    protected IDialogSettings getDialogBoundsSettings() {
-    	 IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-         IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
-         if (section == null) {
-             section = settings.addNewSection(getDialogSettingsSectionName());
-         } 
-         return section;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchHistoryAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchHistoryAction.java
deleted file mode 100644
index 57e1f7e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchHistoryAction.java
+++ /dev/null
@@ -1,464 +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.debug.ui.actions;
-
- 
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.ILaunchHistoryChangedListener;
-import org.eclipse.debug.internal.ui.ILaunchLabelChangedListener;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Abstract implementation of an action that displays a drop-down launch
- * history for a specific launch group.
- * 
- * @see LaunchingResourceManager
- * @see ILaunchLabelChangedListener
- * 
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 2.1
- */
-public abstract class AbstractLaunchHistoryAction implements IWorkbenchWindowPulldownDelegate2, ILaunchHistoryChangedListener {
-
-	/**
-	 * The menu created by this action
-	 */
-	private Menu fMenu;
-		
-	/**
-	 * The action used to render this delegate.
-	 */
-	private IAction fAction;
-	
-	/**
-	 * The associated <code>ILaunchGroup</code>
-	 * @since 3.3
-	 */
-	private ILaunchGroup fLaunchGroup = null;
-	
-	/**
-	 * Indicates whether the launch history has changed and
-	 * the sub menu needs to be recreated.
-	 */
-	protected boolean fRecreateMenu = false;
-	
-	/**
-	 * Constructs a launch history action.
-	 * 
-	 * @param launchGroupIdentifier unique identifier of the launch group
-	 * extension that this action displays a launch history for.
-	 */
-	public AbstractLaunchHistoryAction(String launchGroupIdentifier) {
-		fLaunchGroup = getLaunchConfigurationManager().getLaunchGroup(launchGroupIdentifier);
-	}
-	
-	/**
-	 * A listener to be notified of launch label updates
-	 * @since 3.3
-	 */
-	private ILaunchLabelChangedListener fLabelListener = new ILaunchLabelChangedListener() {
-		public ILaunchGroup getLaunchGroup() {
-			return fLaunchGroup;
-		}
-		public void labelChanged() {
-			updateTooltip();
-		}
-	};
-	
-	/**
-	 * Sets the action used to render this delegate.
-	 * 
-	 * @param action the action used to render this delegate
-	 */
-	private void setAction(IAction action) {
-		fAction = action;
-	}
-
-	/**
-	 * Returns the action used to render this delegate.
-	 * 
-	 * @return the action used to render this delegate
-	 */
-	protected IAction getAction() {
-		return fAction;
-	}
-	
-	/**
-	 * Adds the given action to the specified menu with an accelerator specified
-	 * by the given number.
-	 * 
-	 * @param menu the menu to add the action to
-	 * @param action the action to add
-	 * @param accelerator the number that should appear as an accelerator
-	 */
-	protected void addToMenu(Menu menu, IAction action, int accelerator) {
-		StringBuffer label= new StringBuffer();
-		if (accelerator >= 0 && accelerator < 10) {
-			//add the numerical accelerator
-			label.append('&');
-			label.append(accelerator);
-			label.append(' ');
-		}
-		label.append(action.getText());
-		action.setText(label.toString());
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(menu, -1);
-	}
-
-	/**
-	 * Initialize this action so that it can dynamically set its tool-tip.  Also set the enabled state
-	 * of the underlying action based on whether there are any registered launch configuration types that 
-	 * understand how to launch in the mode of this action.
-	 */
-	private void initialize(IAction action) {
-		getLaunchConfigurationManager().addLaunchHistoryListener(this);
-		setAction(action);
-		updateTooltip(); 		
-		action.setEnabled(existsConfigTypesForMode());	
-	}
-	
-	/**
-	 * Return whether there are any registered launch configuration types for
-	 * the mode of this action.
-	 * 
-	 * @return whether there are any registered launch configuration types for
-	 * the mode of this action
-	 */
-	private boolean existsConfigTypesForMode() {
-		ILaunchConfigurationType[] configTypes = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
-		for (int i = 0; i < configTypes.length; i++) {
-			if (configTypes[i].supportsMode(getMode())) {
-				return true;
-			}
-		}		
-		return false;
-	}
-	
-	/**
-	 * Updates this action's tool-tip. The tooltip is based on user preference settings
-	 * for launching - either the previous launch, or based on the selection and which
-	 * configuration will be launched.
-	 * <p>
-	 * Subclasses may override as required.
-	 * </p>
-	 */
-	protected void updateTooltip() {
-		getAction().setToolTipText(getToolTip());
-	}
-	
-	/**
-	 * Returns the tooltip specific to a configuration.
-	 * 
-	 * @param configuration a <code>ILauncConfiguration</code>
-	 * @return the string for the tool tip
-	 */
-	protected String getToolTip(ILaunchConfiguration configuration) {
-		String launchName= configuration.getName();
-		String mode= getMode();
-		String label;
-		if (mode.equals(ILaunchManager.RUN_MODE)) {
-			label= ActionMessages.AbstractLaunchHistoryAction_1; 
-		} else if (mode.equals(ILaunchManager.DEBUG_MODE)){
-			label= ActionMessages.AbstractLaunchHistoryAction_2; 
-		} else if (mode.equals(ILaunchManager.PROFILE_MODE)){
-			label= ActionMessages.AbstractLaunchHistoryAction_3; 
-		} else {
-			label= ActionMessages.AbstractLaunchHistoryAction_4; 
-		}
-		return MessageFormat.format(ActionMessages.AbstractLaunchHistoryAction_0, new String[] {label, launchName}); 
-	}
-	
-	/**
-	 * Returns this action's tooltip. The tooltip is retrieved from the launch resource manager
-	 * which builds tool tips asynchronously for context launching support.
-	 * 
-	 * @return the string for the tool tip
-	 */
-	private String getToolTip() {
-		String launchName = getLaunchingResourceManager().getLaunchLabel(fLaunchGroup);
-		if(launchName == null) {
-			return DebugUIPlugin.removeAccelerators(internalGetHistory().getLaunchGroup().getLabel());
-		}
-		String label = null;
-		String mode = getMode();
-		if (mode.equals(ILaunchManager.RUN_MODE)) {
-			label = ActionMessages.AbstractLaunchHistoryAction_1; 
-		} else if (mode.equals(ILaunchManager.DEBUG_MODE)){
-			label = ActionMessages.AbstractLaunchHistoryAction_2; 
-		} else if (mode.equals(ILaunchManager.PROFILE_MODE)){
-			label = ActionMessages.AbstractLaunchHistoryAction_3; 
-		} else {
-			label = ActionMessages.AbstractLaunchHistoryAction_4; 
-		}
-		if("".equals(launchName)) { //$NON-NLS-1$
-			return MessageFormat.format(ActionMessages.AbstractLaunchHistoryAction_5, new String[] {label});
-		}
-		else {
-			return MessageFormat.format(ActionMessages.AbstractLaunchHistoryAction_0, new String[] {label, launchName});
-		}
-	}
-
-	/**
-	 * @see ILaunchHistoryChangedListener#launchHistoryChanged()
-	 */
-	public void launchHistoryChanged() {
-		fRecreateMenu = true;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		setMenu(null);
-		getLaunchConfigurationManager().removeLaunchHistoryListener(this);
-		getLaunchingResourceManager().removeLaunchLabelChangedListener(fLabelListener);
-	}
-	
-	/**
-	 * Return the last launch in this action's launch history.
-	 * 
-	 * @return the most recent configuration that was launched from this
-	 *  action's launch history that is not filtered from the menu
-	 */
-	protected ILaunchConfiguration getLastLaunch() {
-		return getLaunchConfigurationManager().getFilteredLastLaunch(getLaunchGroupIdentifier());
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowPulldownDelegate#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		setMenu(new Menu(parent));
-		fillMenu(fMenu);
-		initMenu();
-		return fMenu;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		setMenu(new Menu(parent));
-		fillMenu(fMenu);
-		initMenu();
-		return fMenu;
-	}
-	
-	/**
-	 * Creates the menu for the action
-	 */
-	private void initMenu() {
-		// Add listener to re-populate the menu each time
-		// it is shown because of dynamic history list
-		fMenu.addMenuListener(new MenuAdapter() {
-			public void menuShown(MenuEvent e) {
-				if (fRecreateMenu) {
-					Menu m = (Menu)e.widget;
-					MenuItem[] items = m.getItems();
-					for (int i=0; i < items.length; i++) {
-						items[i].dispose();
-					}
-					fillMenu(m);
-					fRecreateMenu= false;
-				}
-			}
-		});
-	}
-
-	/**
-	 * Sets this action's drop-down menu, disposing the previous menu.
-	 * 
-	 * @param menu the new menu
-	 */
-	private void setMenu(Menu menu) {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		fMenu = menu;
-	}
-
-	/**
-	 * Fills the drop-down menu with favorites and launch history
-	 * 
-	 * @param menu the menu to fill
-	 */
-	protected void fillMenu(Menu menu) {	
-		ILaunchConfiguration[] historyList= getHistory();
-		ILaunchConfiguration[] favoriteList = getFavorites();
-		
-		// Add favorites
-		int accelerator = 1;
-		for (int i = 0; i < favoriteList.length; i++) {
-			ILaunchConfiguration launch= favoriteList[i];
-			LaunchAction action= new LaunchAction(launch, getMode());
-			addToMenu(menu, action, accelerator);
-			accelerator++;
-		}		
-		
-		// Separator between favorites and history
-		if (favoriteList.length > 0 && historyList.length > 0) {
-			addSeparator(menu);
-		}
-		
-		// Add history launches next
-		for (int i = 0; i < historyList.length; i++) {
-			ILaunchConfiguration launch= historyList[i];
-			LaunchAction action= new LaunchAction(launch, getMode());
-			addToMenu(menu, action, accelerator);
-			accelerator++;
-		}
-	}
-	
-	/**
-	 * Adds a separator to the given menu
-	 * 
-	 * @param menu 
-	 */
-	protected void addSeparator(Menu menu) {
-		new MenuItem(menu, SWT.SEPARATOR);
-	}
-	
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// do nothing - this is just a menu
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection){
-		if (fAction == null) {
-			initialize(action);
-		} 
-	}
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		if (this instanceof AbstractLaunchToolbarAction) {
-			getLaunchingResourceManager().addLaunchLabelUpdateListener(fLabelListener);
-		}
-	}
-	
-	/**
-	 * Returns the launch history associated with this action's launch group.
-	 * 
-	 * @return the launch history associated with this action's launch group
-	 * @deprecated this method returns a class that is not API and is not intended
-	 *  for clients of the debug platform. Instead, use <code>getHistory()</code>,
-	 *  <code>getFavorites()</code>, and <code>getLastLaunch()</code>.
-	 */
-	protected LaunchHistory getLaunchHistory() {
-		return getLaunchConfigurationManager().getLaunchHistory(getLaunchGroupIdentifier());
-	} 
-	
-	/**
-	 * Returns the launch history associated with this action's launch group.
-	 * 
-	 * @return the launch history associated with this action's launch group
-	 * @since 3.3
-	 */
-	private LaunchHistory internalGetHistory() {
-		return getLaunchConfigurationManager().getLaunchHistory(getLaunchGroupIdentifier());
-	}
-	
-	/**
-	 * Returns the launch history associated with this action's launch mode and group in most
-	 * recently launched order. Configurations associated with disabled activities are not included
-	 * in the list. As well, configurations are filtered based on workspace preference settings
-	 * to filter configurations from closed projects, deleted projects, working sets and to filter
-	 * specific launch configuration types.
-	 *  
-	 * @return launch history
-	 * @since 3.3
-	 */
-	protected ILaunchConfiguration[] getHistory() {
-		return LaunchConfigurationManager.filterConfigs(internalGetHistory().getHistory());
-	}
-	
-	/**
-	 * Returns the launch favorites associated with this action's launch mode and group in user
-	 * preference order. Configurations associated with disabled activities are not included
-	 * in the list. As well, configurations are filtered based on workspace preference settings
-	 * to filter configurations from closed projects, deleted projects, working sets and to filter
-	 * specific launch configuration types.
-	 * 
-	 * @return favorite launch configurations
-	 * @since 3.3
-	 */
-	protected ILaunchConfiguration[] getFavorites() {
-		return LaunchConfigurationManager.filterConfigs(internalGetHistory().getFavorites());
-	}
-		
-	/**
-	 * Returns the mode (e.g., 'run' or 'debug') of this drop down.
-	 * 
-	 * @return the mode of this action
-	 */
-	protected String getMode() {
-		return internalGetHistory().getLaunchGroup().getMode();
-	}
-	
-	/**
-	 * Returns the launch configuration manager.
-	 * 
-	 * @return launch configuration manager
-	 */
-	private LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}
-	
-	/**
-	 * Returns the <code>ContextualLaunchingResourceManager</code>
-	 * 
-	 * @return <code>ContextualLaunchingResourceManager</code>
-	 */
-	private LaunchingResourceManager getLaunchingResourceManager() {
-		return DebugUIPlugin.getDefault().getLaunchingResourceManager();
-	}
-	
-	/**
-	 * Returns the identifier of the launch group this action is associated
-	 * with.
-	 * 
-	 * @return the identifier of the launch group this action is associated
-	 * with
-	 */
-	protected String getLaunchGroupIdentifier() {
-		return fLaunchGroup.getIdentifier();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java
deleted file mode 100644
index d7f41bb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java
+++ /dev/null
@@ -1,91 +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.debug.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.contextlaunching.ContextRunner;
-import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.OrganizeFavoritesAction;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * A launch history action that also includes launch shortcut actions (run/debug
- * as), and an action to open the launch configuration dialog.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 2.1
- */
-public class AbstractLaunchToolbarAction extends AbstractLaunchHistoryAction {
-
-
-	/**
-	 * Constructs a launch toolbar action.
-	 *
-	 * @param launchGroupIdentifier unique identifier of the launch group
-	 * extension that this action displays a launch history, shortcuts, and
-	 * launch configuration dialog for.
-	 */
-	public AbstractLaunchToolbarAction(String launchGroupIdentifier) {
-		super(launchGroupIdentifier);
-	}
-
-	/**
-	 * Fills the drop-down menu with favorites and launch history,
-	 * launch shortcuts, and an action to open the launch configuration dialog.
-	 *
-	 * @param menu the menu to fill
-	 */
-	protected void fillMenu(Menu menu) {
-		super.fillMenu(menu);
-		// Separator between history and common actions
-		if (menu.getItemCount() > 0) {
-			addSeparator(menu);
-		}
-		addToMenu(menu, new LaunchShortcutsAction(getLaunchGroupIdentifier()), -1);
-		addToMenu(menu, getOpenDialogAction(), -1);
-		addToMenu(menu, new OrganizeFavoritesAction(getLaunchGroupIdentifier()), -1);
-	}
-	
-	/**
-	 * Returns an action to open the launch dialog
-	 * @since 3.1
-	 */
-	protected IAction getOpenDialogAction() {
-		return new OpenLaunchDialogAction(getLaunchGroupIdentifier());
-	}
-	
-	/**
-	 * Launch the last launch, or open the launch config dialog if none.
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		//always ignore external tools during context launching
-		if(LaunchingResourceManager.isContextLaunchEnabled() && 
-				!getLaunchGroupIdentifier().equals("org.eclipse.ui.externaltools.launchGroup")) { //$NON-NLS-1$
-			ContextRunner.getDefault().launch(DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(getLaunchGroupIdentifier()));
-		}
-		else {
-			ILaunchConfiguration configuration = getLastLaunch();
-			if (configuration == null) {
-				DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), new StructuredSelection(), getLaunchGroupIdentifier());
-			} else {
-				DebugUITools.launch(configuration, getMode());
-			}
-		}
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AddMemoryRenderingActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AddMemoryRenderingActionDelegate.java
deleted file mode 100644
index aa40696..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AddMemoryRenderingActionDelegate.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IActionDelegate2;
-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;
-
-/**
- * A cascade menu to add a memory rendering to the memory view. This action delegate can be
- * contributed to a an editor, view or object via standard workbench extension points. 
- * The action works on the {@link IAddMemoryRenderingsTarget} adapter provided 
- * by the active debug context, creating a context menu to add applicable renderings
- * to the memory view.
- * <p>
- * Clients may reference/contribute this class as an action delegate
- * in plug-in XML. This class is not intended to be subclassed.
- * </p>
- * @since 3.2
- */
-public class AddMemoryRenderingActionDelegate extends Action implements IViewActionDelegate, IEditorActionDelegate, IObjectActionDelegate, IActionDelegate2{
-	
-	private IAction fAction;
-	private IWorkbenchPart fPart;
-	private ISelection fCurrentSelection;
-	private IAddMemoryRenderingsTarget fActionDelegate;
-	private IMenuCreator fMenuCreator;
-	private IAdaptable fDebugContext;
-	private IWorkbenchWindow fWindow;
-	private DebugContextListener fDebugContextListener = new DebugContextListener();
-	
-	private class AddMemoryRenderingAction extends Action
-	{
-		private IMemoryRenderingType fRenderingType;			// type of rendering to add
-		AddMemoryRenderingAction(IMemoryRenderingType renderingType)
-		{
-			super(renderingType.getLabel());
-			fRenderingType = renderingType;
-		}
-
-		public void runWithEvent(Event event) {
-			if (fActionDelegate != null)
-			{
-				try {
-					fActionDelegate.addMemoryRenderings(fPart, fCurrentSelection, new IMemoryRenderingType[]{fRenderingType});
-				} catch (CoreException e) {
-					DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.AddMemoryRenderingActionDelegate_0, ActionMessages.AddMemoryRenderingActionDelegate_1, e);
-				}
-			}
-		}
-	}
-	
-	private class AddMemoryRenderingMenuCreator implements IMenuCreator
-	{
-
-		public void dispose() {
-			
-		}
-
-		public Menu getMenu(Control parent) {
-			return null;
-		}
-
-		public Menu getMenu(Menu parent) {
-			Menu menu = new Menu(parent);
-			menu.addMenuListener(new MenuAdapter() {
-				public void menuShown(MenuEvent e) {
-					Menu m = (Menu)e.widget;
-					MenuItem[] items = m.getItems();
-					for (int i=0; i < items.length; i++) {
-						items[i].dispose();
-					}
-					fillMenu(m);
-				}
-			});		
-			return menu;
-		}
-		
-		private void fillMenu(Menu parent)
-		{
-			if (fActionDelegate != null)
-			{
-				IMemoryRenderingType[] types = fActionDelegate.getMemoryRenderingTypes(fPart, fCurrentSelection);
-				
-				for (int i=0; i<types.length; i++)
-				{
-					AddMemoryRenderingAction action = new AddMemoryRenderingAction(types[i]);
-					ActionContributionItem item = new ActionContributionItem(action);
-					item.fill(parent, -1);
-				}
-			}
-		}
-	}	
-	
-	private class DebugContextListener implements IDebugContextListener
-	{
-
-		private void contextActivated(ISelection selection) {
-			setupActionDelegate(selection);
-			updateAction(fAction, fCurrentSelection);
-			
-		}
-
-		public void debugContextChanged(DebugContextEvent event) {
-			contextActivated(event.getContext());
-		}
-
-		
-	}
-	
-	private void setupActionDelegate(ISelection context)
-	{
-		IAdaptable debugContext = null;
-		if (context instanceof IStructuredSelection)
-		{
-			if (((IStructuredSelection)context).getFirstElement() instanceof IAdaptable)
-				debugContext = (IAdaptable)((IStructuredSelection)context).getFirstElement();
-		}
-		
-		if (debugContext == null)
-			fActionDelegate = null;
-		
-		if (debugContext == fDebugContext)
-			return;
-		
-		fDebugContext = debugContext;
-		
-		if (fDebugContext == null)
-			return;
-		
-		IMemoryBlockRetrieval retrieval = (IMemoryBlockRetrieval)fDebugContext.getAdapter(IMemoryBlockRetrieval.class);
-		if (retrieval == null && fDebugContext instanceof IDebugElement)
-		{
-			retrieval = ((IDebugElement)fDebugContext).getDebugTarget();
-		}
-		
-		if (retrieval == null)
-			return;
-		
-		IAddMemoryRenderingsTarget target = null;
-		if (fCurrentSelection instanceof IStructuredSelection)
-		{
-			// get target from current selection
-			IStructuredSelection strucSel = (IStructuredSelection)fCurrentSelection;
-			Object obj = strucSel.getFirstElement();
-			target = getAddMemoryRenderingTarget(obj);
-		}
-		if (target == null)
-		{
-			// get the target from Debug View
-			target = getAddMemoryRenderingTarget(fDebugContext);
-		}
-		if (target == null)
-		{
-			// try to get target from memory block retrieval
-			target = getAddMemoryRenderingTarget(retrieval);
-		}
-		
-		fActionDelegate = target;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		bindPart(view);	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// do nothing
-	}
-
-	/* (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) {
-		bindAction(action);
-		fCurrentSelection = selection;
-		updateAction(action, selection);
-	}
-	
-	private void updateAction(IAction action, ISelection selection)
-	{
-		if (fActionDelegate != null)
-		{
-			action.setEnabled(fActionDelegate.canAddMemoryRenderings(fPart, selection));
-			bindAction(action);
-		}
-		else
-		{
-			action.setEnabled(false);
-		}
-	}
-
-	private void bindAction(IAction action) {
-		if (action == null)
-			return;
-		
-		if (action != fAction) {
-			if (fMenuCreator == null)
-				fMenuCreator = new AddMemoryRenderingMenuCreator();
-	        action.setMenuCreator(fMenuCreator);
-	        fAction= action;
-	    }
-	}
-
-	private IAddMemoryRenderingsTarget getAddMemoryRenderingTarget(Object elmt) {
-		IAddMemoryRenderingsTarget target = null;
-		
-		if (elmt instanceof IAddMemoryRenderingsTarget)
-		{
-			target = (IAddMemoryRenderingsTarget)elmt;
-		}
-		else if (elmt instanceof IAdaptable)
-		{
-			target = (IAddMemoryRenderingsTarget)((IAdaptable)elmt).getAdapter(IAddMemoryRenderingsTarget.class);
-		}
-		return target;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
-	 */
-	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		bindPart(targetEditor);
-		bindAction(action);
-		updateAction(action, fCurrentSelection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		bindPart(targetPart);
-		bindAction(action);
-		updateAction(action, fCurrentSelection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {		
-		bindAction(action);
-		if (action != null)
-		{
-			action.setText(ActionMessages.AddMemoryRenderingActionDelegate_2);
-			action.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_MONITOR_EXPRESSION));
-			action.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_MONITOR_EXPRESSION));
-			action.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_MONITOR_EXPRESSION));
-		}	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		// remove as debug context listener
-		fAction = null;
-		fPart = null;
-		fCurrentSelection = null;
-		fActionDelegate = null;
-		
-		// remove debug context listener
-		bindPart(null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		// do nothing
-	}
-	
-	private void bindPart(IWorkbenchPart part)
-	{
-		IWorkbenchWindow window = null;
-		if (part != null)
-		{
-			window = part.getSite().getWorkbenchWindow();
-		}
-		if (window != fWindow)
-		{
-				
-			if (fWindow != null)
-			{
-				DebugUITools.getDebugContextManager().getContextService(fWindow).removeDebugContextListener(fDebugContextListener);
-			}
-			
-			if (window != null)
-			{
-				DebugUITools.getDebugContextManager().getContextService(window).addDebugContextListener(fDebugContextListener);
-			}
-			fWindow = window;
-		}
-		
-		if (part != fPart)
-			fPart = part;
-		
-		if (fWindow != null)
-			setupActionDelegate(DebugUITools.getDebugContextManager().getContextService(fWindow).getActiveContext());
-	}
-
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ContextualLaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ContextualLaunchAction.java
deleted file mode 100644
index 60f6a87..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ContextualLaunchAction.java
+++ /dev/null
@@ -1,316 +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.debug.ui.actions;
-
-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.expressions.EvaluationContext;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.LaunchConfigurationAction;
-import org.eclipse.debug.internal.ui.actions.LaunchShortcutAction;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension;
-import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * An action delegate that builds a context menu with applicable launch shortcuts
- * for a specific launch mode.
- * <p>
- * This class can be sub-classed and contributed as an object contribution pop-up
- * menu extension action. When invoked, it becomes a sub-menu that dynamically
- * builds a list of applicable launch shortcuts for the current selection.
- * Each launch shortcut may have optional information to support a context menu action.
- * </p>
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.0
- */
-public abstract class ContextualLaunchAction implements IObjectActionDelegate, IMenuCreator {
-
-	private IAction fDelegateAction;
-	private String fMode;
-	// default launch group for this mode (null category)
-	private ILaunchGroup fGroup = null;
-	// map of launch groups by (non-null) categories, for this mode
-	private Map fGroupsByCategory = null;
-	// whether to re-fill the menu (reset on selection change)
-	private boolean fFillMenu = true;
-	
-	/**
-	 * Constructs a contextual launch action for the given launch mode.
-	 * 
-	 * @param mode launch mode
-	 */
-	public ContextualLaunchAction(String mode) {
-		fMode = mode;
-		ILaunchGroup[] groups = DebugUITools.getLaunchGroups();
-		fGroupsByCategory = new HashMap(3);
-		for (int i = 0; i < groups.length; i++) {
-			ILaunchGroup group = groups[i];
-			if (group.getMode().equals(mode)) {
-				if (group.getCategory() == null) {
-					fGroup = group;
-				} else {
-					fGroupsByCategory.put(group.getCategory(), group);
-				}
-			}
-		}
-	}
-	
-	/*
-	 * @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 have a need for the active part.
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		// nothing to do
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		// never called
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		//Create the new menu. The menu will get filled when it is about to be shown. see fillMenu(Menu).
-		Menu menu = new Menu(parent);
-		/**
-		 * Add listener to re-populate the menu each time
-		 * it is shown because MenuManager.update(boolean, boolean) 
-		 * doesn't dispose pull-down ActionContribution items for each popup menu.
-		 */
-		menu.addMenuListener(new MenuAdapter() {
-			public void menuShown(MenuEvent e) {
-				if (fFillMenu) {
-					Menu m = (Menu)e.widget;
-					MenuItem[] items = m.getItems();
-					for (int i=0; i < items.length; i++) {
-						items[i].dispose();
-					}
-					fillMenu(m);
-					fFillMenu = false;
-				}
-			}
-		});
-		return menu;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// Never called because we become a menu.
-	}
-	
-	/*
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		// if the selection is an IResource, save it and enable our action
-		if (selection instanceof IStructuredSelection) {
-			fFillMenu = true;
-			if (fDelegateAction != action) {
-				fDelegateAction = action;
-				fDelegateAction.setMenuCreator(this);
-			}
-			//enable our menu
-			action.setEnabled(true);
-			return;
-		}
-		action.setEnabled(false);
-	}
-	
-	/**
-	 * Returns the launch manager
-	 * @return the launch manager
-	 * @since 3.3
-	 */
-	protected ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-	
-    /**
-     * Fills the menu with applicable launch shortcuts
-     * @param menu The menu to fill
-     */
-	protected void fillMenu(Menu menu) {
-		IStructuredSelection ss = SelectedResourceManager.getDefault().getCurrentSelection();
-		int accelerator = 1;
-		if(!ss.isEmpty()) {
-			try {
-				//try to add the shared config it the context is one.
-				ILaunchConfiguration config = getLaunchConfigurationManager().isSharedConfig(ss.getFirstElement());
-		        if(config != null && config.exists() && config.supportsMode(fMode)) {
-		        	IAction action = new LaunchConfigurationAction(config, fMode, config.getName(), DebugUITools.getDefaultImageDescriptor(config), accelerator++);
-		            ActionContributionItem item = new ActionContributionItem(action);
-		            item.fill(menu, -1);
-				}
-			}
-			catch (CoreException ce) {}
-		}
-		
-		List allShortCuts = getLaunchConfigurationManager().getLaunchShortcuts();
-		Iterator iter = allShortCuts.iterator();
-		List filteredShortCuts = new ArrayList(10);
-	
-	//create a context
-		List selection = ss.toList();
-		IEvaluationContext context = new EvaluationContext(null, selection);
-		context.setAllowPluginActivation(true);
-		context.addVariable("selection", selection); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next();
-			try {
-				if (!WorkbenchActivityHelper.filterItem(ext) && isApplicable(ext, context)) {
-					filteredShortCuts.add(ext);
-				}
-			} 
-			catch (CoreException e) {}
-		}
-		iter = filteredShortCuts.iterator();
-	
-	//we need a separator iff the shared config entry has been added and there are following shortcuts
-		if(menu.getItemCount() > 0 && filteredShortCuts.size() > 0) {
-			 new MenuItem(menu, SWT.SEPARATOR);
-		}
-		List categories = new ArrayList();
-		while (iter.hasNext()) {
-			LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next();
-			Set modes = ext.getModes(); // supported launch modes
-			Iterator modeIter = modes.iterator();
-			while (modeIter.hasNext()) {
-				String mode = (String) modeIter.next();
-				if (mode.equals(fMode)) {
-					String category = ext.getCategory();
-					// NOTE: category can be null
-					if (categories!= null && !categories.contains(category)) {
-						categories.add(category);
-					}
-					populateMenuItem(mode, ext, menu, accelerator++);
-				}
-			}
-		}
-		
-	// add in the open ... dialog shortcut(s)
-		if (categories.isEmpty()) {
-			if (accelerator > 1) {
-				new MenuItem(menu, SWT.SEPARATOR);
-			}
-			IAction action = new OpenLaunchDialogAction(fGroup.getIdentifier());
-		    ActionContributionItem item = new ActionContributionItem(action);
-		    item.fill(menu, -1);
-		} else {
-			boolean addedSep = false;
-			iter = categories.iterator();
-			while (iter.hasNext()) {
-				// NOTE: category can be null
-				String category = (String) iter.next();
-				ILaunchGroup group = fGroup;
-				if (category != null) {
-					group = (ILaunchGroup) fGroupsByCategory.get(category);
-				}
-				if (group != null) {
-					if (accelerator > 1 && !addedSep) {
-						new MenuItem(menu, SWT.SEPARATOR);
-						addedSep = true;
-					}
-				    IAction action = new OpenLaunchDialogAction(group.getIdentifier());
-				    ActionContributionItem item= new ActionContributionItem(action);
-				    item.fill(menu, -1);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * Evaluate the enablement logic in the contextualLaunch
-	 * element description. A true result means that we should
-	 * include this shortcut in the context menu.
-	 * @return true iff shortcut should appear in context menu
-	 */
-	private boolean isApplicable(LaunchShortcutExtension ext, IEvaluationContext context) throws CoreException {
-		Expression expr = ext.getContextualLaunchEnablementExpression();
-		return ext.evalEnablementExpression(context, expr);
-	}
-
-	/**
-	 * Add the shortcut to the context menu's launch sub-menu.
-	 */
-	private void populateMenuItem(String mode, LaunchShortcutExtension ext, Menu menu, int accelerator) {
-		LaunchShortcutAction action = new LaunchShortcutAction(mode, ext);
-		action.setActionDefinitionId(ext.getId() + "." + mode); //$NON-NLS-1$
-		String helpContextId = ext.getHelpContextId();
-		if (helpContextId != null) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId);
-		}
-		StringBuffer label= new StringBuffer();
-		if (accelerator >= 0 && accelerator < 10) {
-			//add the numerical accelerator
-			label.append('&');
-			label.append(accelerator);
-			label.append(' ');
-		}
-		String contextLabel= ext.getContextLabel(mode);
-		// replace default action label with context label if specified.
-		label.append((contextLabel != null) ? contextLabel : action.getText());
-		action.setText(label.toString());
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(menu, -1);
-	}
-
-	/**
-	 * Returns the launch configuration manager.
-	*
-	* @return launch configuration manager
-	*/
-	private LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugAction.java
deleted file mode 100644
index 009cf94..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugAction.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.debug.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.actions.ExecutionAction;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Action to launch the last launch configuration that was successfully
- * launched, in debug mode. If no configurations have been launched, the launch
- * configuration dialog is opened.
- * <p>
- * This class is not intended to be subclassed. This class may
- * be instantiated.
- * </p>
- * @since 2.0
- */
-public final class DebugAction extends ExecutionAction {
-	
-	public DebugAction() {
-		super(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
-	}
-
-	/**
-	 * @see ExecutionAction#getMode()
-	 */
-	protected String getMode() {
-		return ILaunchManager.DEBUG_MODE;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ExportBreakpointsOperation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ExportBreakpointsOperation.java
deleted file mode 100644
index 5f72cba..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ExportBreakpointsOperation.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.debug.ui.actions;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.lang.reflect.InvocationTargetException;
-
-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.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.IImportExportConstants;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.ImportExportMessages;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-
-/**
- * Exports breakpoints to a file. 
- * <p>
- * This class may be instantiated; not intended to be subclassed.
- * <p>
- * @since 3.2
- */
-public class ExportBreakpointsOperation implements IRunnableWithProgress {
-
-	private IBreakpoint[] fBreakpoints = null;
-	private String fFileName = null;
-	
-	/**
-	 * Constructs an operation to export breakpoints to a file.
-	 * 
-	 * @param breakpoints the breakpoints to export
-	 * @param fileName absolute path of file to export breakpoints to - the file
-	 * 	will be overwritten if it already exists
-	 */
-	public ExportBreakpointsOperation(IBreakpoint[] breakpoints, String fileName) {
-		fBreakpoints = breakpoints;
-		fFileName = fileName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException {
-		XMLMemento memento = XMLMemento.createWriteRoot(IImportExportConstants.IE_NODE_BREAKPOINTS); 
-		monitor.beginTask(ImportExportMessages.ExportOperation_0, fBreakpoints.length);
-		try {
-			for (int i = 0; i < fBreakpoints.length; i++) {
-				IBreakpoint breakpoint = fBreakpoints[i];
-				//in the event we are in working set view, we can have multiple selection of the same breakpoint
-				//so do a simple check for it
-				IMarker marker = breakpoint.getMarker();
-				IMemento root = memento.createChild(IImportExportConstants.IE_NODE_BREAKPOINT);
-				root.putString(IImportExportConstants.IE_BP_ENABLED, Boolean.toString(breakpoint.isEnabled()));
-				root.putString(IImportExportConstants.IE_BP_REGISTERED, Boolean.toString(breakpoint.isRegistered()));
-				root.putString(IImportExportConstants.IE_BP_PERSISTANT, Boolean.toString(breakpoint.isPersisted()));
-				//write out the resource information
-				IResource resource = marker.getResource();
-				IMemento child = root.createChild(IImportExportConstants.IE_NODE_RESOURCE);
-				child.putString(IImportExportConstants.IE_NODE_PATH, resource.getFullPath().toPortableString());
-				child.putInteger(IImportExportConstants.IE_NODE_TYPE, resource.getType());
-				//a generalized (name, value) pairing for attributes each stored as an ATTRIB element
-				root = root.createChild(IImportExportConstants.IE_NODE_MARKER);
-				root.putString(IImportExportConstants.IE_NODE_TYPE, marker.getType());
-				Object val = marker.getAttribute(IMarker.LINE_NUMBER);
-				root.putString(IMarker.LINE_NUMBER, (val != null) ? val.toString() : null);
-				val = marker.getAttribute(IImportExportConstants.CHARSTART); 
-				root.putString(IImportExportConstants.CHARSTART, (val != null) ? val.toString() : null);
-				for(java.util.Iterator iter = marker.getAttributes().keySet().iterator(); iter.hasNext();) {
-					String iterval = iter.next().toString();
-					if(!iterval.equals(IMarker.LINE_NUMBER)) {
-						child = root.createChild(IImportExportConstants.IE_NODE_ATTRIB);
-						child.putString(IImportExportConstants.IE_NODE_NAME, iterval);
-						child.putString(IImportExportConstants.IE_NODE_VALUE, marker.getAttribute(iterval).toString());
-					}
-				}
-			}
-			OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fFileName), "UTF-8"); //$NON-NLS-1$
-			memento.save(osw);
-			osw.close();
-		} catch (CoreException e) {
-			throw new InvocationTargetException(e);
-		} catch (IOException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IAddMemoryBlocksTarget.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IAddMemoryBlocksTarget.java
deleted file mode 100644
index aad493c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IAddMemoryBlocksTarget.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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An adapter for an "add memory block" operation. The Memory View provides
- * a retargettable "add memory block" action that debuggers may plug into
- * by providing an adapter (see <code>IAdaptable</code>) of this type.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- */
-public interface IAddMemoryBlocksTarget {
-	
-	/**
-	 * Returns whether an add memory block operation can be performed from the specified
-	 * part and the given selection.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection the selection on which the action has been invoked
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public boolean canAddMemoryBlocks(IWorkbenchPart part, ISelection selection) throws CoreException;
-	
-	/**
-	 * Returns whether this target will support adding memory block from the specified
-	 * part.
-	 * @param part
-	 * @return true if the target wants to support adding memory block from the given
-	 * part, false otherwise.
-	 */
-	public boolean supportsAddMemoryBlocks(IWorkbenchPart part);
-	
-	
-	/**
-	 * Perform an add memory block on the given element that is 
-	 * currently selected in the Debug view. If a memory block can be successfully
-	 * created, implementations must add the resulted memory block to <code>IMemoryBlockManager</code>
-	 * In addition, implementations must query to see if default renderings should be created
-	 * for the given memory block and add these renderings accordingly.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection the selection on which the action has been invoked
-	 * @throws CoreException if unable to perform the action 
-	 * 
-	 * @see org.eclipse.debug.core.model.IMemoryBlockRetrieval
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingManager
-	 * @see org.eclipse.debug.core.IMemoryBlockManager
-	 */
-	public void addMemoryBlocks(IWorkbenchPart part, ISelection selection) throws CoreException;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IAddMemoryRenderingsTarget.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IAddMemoryRenderingsTarget.java
deleted file mode 100644
index 5d912ff..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IAddMemoryRenderingsTarget.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.memory.IMemoryRenderingType;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Adapter for the platform's retargettable "add memory rendering" action. 
- * Clients implementing this adapter are expected to add the necessary memory blocks
- * and renderings when the adapter is invoked.
- * <p>
- * Typically, to add a memory rendering, client needs to do the following:
- * <ol>
- * <li>Create a new memory block</li>
- * <li>Add the new memory block to the Memory Block Manager. (<code>IMemoryBlockManager</code>)</li>
- * <li>Create the new rendering from <code>IMemoryRenderingTypeDelegate</code></li>
- * <li>Bring the required memory view to the top. (<code>IMemoryRenderingSite</code>)</li>
- * <li>Find the container from the memory view to host the new memory rendering.
- *    (<code>IMemoryRenderingContainer</code>)</li> 
- * <li>Initialize the new rendering with the appropriate memory block and container.</li>
- * <li>Add the new rendering to the container.</li>
- * </ol> 
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- * @see AddMemoryRenderingActionDelegate
- */
-public interface IAddMemoryRenderingsTarget {
-	/**
-	 * Returns whether a memory rendering can be added from the specified
-	 * part, based on the the given selection, which is the active debug context
-	 * in the current workbench window.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection the active debug context in the active workbench window	
-	 * @throws CoreException if an error has occurred
-	 */
-	public boolean canAddMemoryRenderings(IWorkbenchPart part, ISelection selection);
-	
-	/**
-	 * Adds memory renderings. Based on the part and selection (active debug context), this 
-	 * adapter does the following:
-	 * <ol>
-	 * <li>creates and adds the required memory block to the memory block manager</li>
-	 * <li>creates the specified renderings and add the them
-	 *   to the appropriate memory rendering containers</li>
-	 * </ol>
-	 * @param part the part on which the action has been invoked
-	 * @param selection the active debug context
-	 * @param renderingTypes renderings to add
-	 * @throws CoreException if unable to perform the action 
-	 * 
-	 * @see org.eclipse.debug.core.model.IMemoryBlockRetrieval
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingManager
-	 * @see org.eclipse.debug.core.IMemoryBlockManager
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingSite
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingContainer
-	 */
-	public void addMemoryRenderings(IWorkbenchPart part, ISelection selection, IMemoryRenderingType[] renderingTypes) throws CoreException;
-	
-	/**
-	 * Returns a list of rendering types that can be added from the given workbench part and active
-	 * debug context, possibly empty.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection the active debug context
-	 * @return a list of rendering types that can be added, possibly empty
-	 */
-	public IMemoryRenderingType[] getMemoryRenderingTypes(IWorkbenchPart part, ISelection selection);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ILaunchable.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ILaunchable.java
deleted file mode 100644
index fddbcc9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ILaunchable.java
+++ /dev/null
@@ -1,29 +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.debug.ui.actions;
-
-/**
- * Interface used to tag objects as launchable. Objects that provide
- * an adapter of this type will be considered by the contextual
- * launch support. 
- * <p>
- * This interface is not intended to be implemented. Instead clients
- * may contribute an adapter of this type for launchable objects
- * via the <code>org.eclipse.core.runtime.adapters</code> extension
- * point. A factory and implementation of this interface are not actually
- * required.
- * </p>
- * @see org.eclipse.debug.ui.actions.ContextualLaunchAction
- * @since 3.0
- */
-public interface ILaunchable {
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IRunToLineTarget.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IRunToLineTarget.java
deleted file mode 100644
index 234c6fd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IRunToLineTarget.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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An adapter for a "run to line" operation. The debug platform provides
- * a retargettable "run to line" action that debuggers may plug into
- * by providing an adapter (see <code>IAdaptable</code>) of this type.
- * This allows the platform to provide one command and key binding for
- * the "run to line" function to be shared by many debuggers.
- * <p>
- * When a part is activated, a retargettable action asks the part
- * for its <code>IRunToLineTarget</code> adapter. If one exists,
- * that adapter is delegated to to perform "run to line" operations when
- * the user invokes an associated action. If an adapter does not exist
- * for the part, the retargettable actions asks selected objects in the
- * active part for an adapter. Generally, a debug implementation will
- * provide breakpoint adapters for relevant editors and model objects. 
- * </p>  
- * <p>
- * Clients are intended to implement this interface and provide instances as
- * an adapter on applicable parts (for example, editors) that support the
- * operation.
- * </p>
- * @since 3.0
- */
-public interface IRunToLineTarget {
-	
-	/**
-	 * Perform a run to line operation on the given element that is 
-	 * currently selected and suspended in the Debug view. Implementations
-	 * must honor the user preference of whether to skip breakpoints
-	 * during the operation -
-	 * see <code>IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE</code>.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection the selection on which the action has been invoked
-	 * @param target suspended element to perform the "run to line" action on
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public void runToLine(IWorkbenchPart part, ISelection selection, ISuspendResume target) throws CoreException;
-
-	/**
-	 * Returns whether a run to line operation can be performed on the given
-	 * element that is currently selected and suspended in the Debug view.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection the selection on which the action has been invoked
-	 * @param target suspended element to perform the "run to line" action on
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public boolean canRunToLine(IWorkbenchPart part, ISelection selection, ISuspendResume target);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IToggleBreakpointsTarget.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IToggleBreakpointsTarget.java
deleted file mode 100644
index c0f9c8b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IToggleBreakpointsTarget.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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An adapter to support breakpoint creation/deletion for an active part
- * or selection within an active part. The debug platform provides
- * retargettable actions for toggling line breakpoints, method breakpoints,
- * and watchpoints. A debug implementation can plug into the global actions
- * by providing an adapter of this type on relevant parts and objects.
- * The debug platform provides one command and key binding for each breakpoint
- * operation.
- * <p>
- * When a part is activated, a retargettable action asks the part
- * for its <code>IToggleBreakpointTarget</code> adapter. If one exists,
- * that adapter is delegated to to perform breakpoint operations when
- * the user invokes an associated action. If an adapter does not exist
- * for the part, the retargettable actions asks selected objects in the
- * active part for an adapter. Generally, a debug implementation will
- * provide breakpoint adapters for relevant editors and model objects. 
- * </p> 
- * <p>
- * Clients are intended to implement this interface and provide instances as
- * an adapter on applicable parts (for example, editors) and objects (for
- * example, methods and fields) that support breakpoint toggling.
- * </p>
- * @since 3.0
- */
-public interface IToggleBreakpointsTarget {
-	
-	/**
-	 * Creates new line breakpoints or removes existing breakpoints.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked  
-	 * @param selection selection on which line breakpoints should be toggled
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException;
-	
-	/**
-	 * Returns whether line breakpoints can be toggled on the given selection.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection selection on which line breakpoints may be toggled
-	 * @return whether line breakpoints can be toggled on the given selection
-	 */
-	public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection);
-
-	/**
-	 * Creates new method breakpoints or removes existing breakpoints.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked  
-	 * @param selection selection on which method breakpoints should be toggled
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public void toggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException;
-	
-	/**
-	 * Returns whether method breakpoints can be toggled on the given selection.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection selection on which method breakpoints may be toggled
-	 * @return whether method breakpoints can be toggled on the given selection
-	 */
-	public boolean canToggleMethodBreakpoints(IWorkbenchPart part, ISelection selection);
-	
-	/**
-	 * Creates new watchpoints or removes existing breakpoints.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked  
-	 * @param selection selection on which watchpoints should be toggled
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public void toggleWatchpoints(IWorkbenchPart part, ISelection selection) throws CoreException;
-	
-	/**
-	 * Returns whether watchpoints can be toggled on the given selection.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection selection on which watchpoints may be toggled
-	 * @return whether watchpoints can be toggled on the given selection
-	 */
-	public boolean canToggleWatchpoints(IWorkbenchPart part, ISelection selection);	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IToggleBreakpointsTargetExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IToggleBreakpointsTargetExtension.java
deleted file mode 100644
index 99e7e08..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IToggleBreakpointsTargetExtension.java
+++ /dev/null
@@ -1,56 +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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Extension interface for {@link org.eclipse.debug.ui.actions.IToggleBreakpointsTarget}.
- * This interface provides the ability to selectively create any type of breakpoint
- * when invoked, rather than a specific type of breakpoint (for example, a line
- * breakpoint). This allows targets to choose the type of breakpoint to create
- * when the user double-clicks in the vertical ruler. 
- * <p>
- * Clients implementing <code>IToggleBreakpointsTarget</code> may optionally
- * implement this interface.
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.ui.actions.ToggleBreakpointAction
- */
-public interface IToggleBreakpointsTargetExtension extends IToggleBreakpointsTarget {
-	
-	/**
-	 * Creates new line breakpoints or removes existing breakpoints.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked  
-	 * @param selection selection on which line breakpoints should be toggled
-	 * @throws CoreException if unable to perform the action 
-	 */
-	public void toggleBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException;
-	
-	/**
-	 * Returns whether line breakpoints can be toggled on the given selection.
-	 * The selection varies depending on the given part. For example,
-	 * a text selection is provided for text editors, and a structured
-	 * selection is provided for tree views, and may be a multi-selection.
-	 * 
-	 * @param part the part on which the action has been invoked
-	 * @param selection selection on which line breakpoints may be toggled
-	 * @return whether line breakpoints can be toggled on the given selection
-	 */
-	public boolean canToggleBreakpoints(IWorkbenchPart part, ISelection selection);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IVariableValueEditor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IVariableValueEditor.java
deleted file mode 100644
index 0fc8f98..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IVariableValueEditor.java
+++ /dev/null
@@ -1,74 +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 implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.actions;
-
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A variable value editor allows the user to edit a variable's value.
- * Variable value editors are contributed for a debug model via the
- * <code>org.eclipse.debug.ui.variableValueEditors</code> extension point.
- * <p>
- * Following is example plug-in XML for contributing a variable value editor.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.variableValueEditors"&gt;
- *    &lt;variableEditor
- *       modelId="com.examples.myDebugModel"
- *       class="com.examples.variables.MyVariableValueEditor"/&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>modelId</code> the debug model identifier for which the given
- * variable value editor is applicable</li>
- * <li><code>class</code> fully qualified name of a class that implements 
- * {@link IVariableValueEditor}</li>
- * </ul>
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IVariableValueEditor {
-
-    /**
-     * Edits the given variable, if appropriate. If this editor does not apply to
-     * the given variable this method returns false, which indicates that the
-     * Debug Platform's default variable edit dialog should be used.
-     * 
-     * @param variable the variable to edit
-     * @param shell the currently active shell, which can be used to open a dialog
-     *  for the user
-     * @return whether this editor has completed the edit operation for the given variable.
-     *  <code>true</code> if no more work should be done, <code>false</code> if the debug
-     *  platform should prompt the user to edit the given variable using the default
-     *  variable editor
-     */
-    public boolean editVariable(IVariable variable, Shell shell);
-    
-    /**
-     * Saves the given expression to the given variable, if appropriate. If this
-     * editor does not set the given variable's value from the given expression, this
-     * method returns false. Returning false indicates that the Debug Platform should
-     * perform the default operation to set a variable's value based on a String.
-     * 
-     * @param variable the variable to edit
-     * @param expression the expression to assign to the given variable
-     * @param shell the currently active shell, which can be used to report errors to the
-     *  user. May be <code>null</code> if no active shell could be found.
-     * @return whether this editor has completed the save operation for the given variable.
-     *  <code>true</code> if no more work should be done, <code>false</code> if the debug
-     *  platform should perform the default save operation
-     */
-    public boolean saveVariable(IVariable variable, String expression, Shell shell);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IWatchExpressionFactoryAdapter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IWatchExpressionFactoryAdapter.java
deleted file mode 100644
index d6199cd..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IWatchExpressionFactoryAdapter.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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IVariable;
-
-/**
- * An optional adapter used to create a watch expression for a selected variable.
- * <p>
- * The 'Create Watch Expression' action is enabled for instances of
- * {@link org.eclipse.debug.core.model.IVariable} that have an associated
- * {@link org.eclipse.debug.core.model.IWatchExpressionDelegate} registered
- * for that debug model.
- * When a watch expression factory adapter is available for a variable, the factory is
- * consulted to create a watch expression for that variable. When no adapter is provided,
- * the watch expression is generated based on the variable's name.
- * </p>
- * <p>
- * Also see the optional interface {@link IWatchExpressionFactoryAdapterExtension}.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- */
-public interface IWatchExpressionFactoryAdapter {
-	
-	/**
-	 * Creates and returns an expression for the specified variable
-	 * which is used to created an {@link org.eclipse.debug.core.model.IWatchExpression}.
-	 * 
-	 * @param variable variable a watch expression is required for
-	 * @return text used to create a watch expression
-	 * @exception org.eclipse.core.runtime.CoreException if unable to create a watch
-	 *  expression
-	 */
-	public String createWatchExpression(IVariable variable) throws CoreException;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IWatchExpressionFactoryAdapterExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IWatchExpressionFactoryAdapterExtension.java
deleted file mode 100644
index fd277f1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/IWatchExpressionFactoryAdapterExtension.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.debug.ui.actions;
-
-import org.eclipse.debug.core.model.IVariable;
-
-/**
- * Optional extension to the watch expression factory adapter to dynamically enable the
- * 'Create Watch Expression' action, based on the selected variable.
- * <p>
- * By default, the 'Create Watch Expression' action is enabled for instances of
- * {@link org.eclipse.debug.core.model.IVariable} that have an associated
- * {@link org.eclipse.debug.core.model.IWatchExpressionDelegate} registered
- * for that debug model. 
- * When a watch expression factory adapter is available for a variable that implements
- * this interface, the factory is consulted to enable the action.
- * </p>
- * <p>
- * Clients may implementing {@link IWatchExpressionFactoryAdapter} may also implement
- * this interface.
- * </p>
- * @since 3.3
- */
-public interface IWatchExpressionFactoryAdapterExtension extends IWatchExpressionFactoryAdapter {
-	
-	/**
-	 * Returns whether a watch expression can be created for the specified variable.
-	 * 
-	 * @param variable variable a watch expression is required for
-	 * @return whether an expression can be created
-	 * @exception org.eclipse.core.runtime.CoreException if unable to create a watch
-	 *  expression
-	 */
-	public boolean canCreateWatchExpression(IVariable variable);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ImportBreakpointsOperation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ImportBreakpointsOperation.java
deleted file mode 100644
index f2ccf19..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ImportBreakpointsOperation.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.ui.actions;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-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.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.internal.core.BreakpointManager;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.IImportExportConstants;
-import org.eclipse.debug.internal.ui.importexport.breakpoints.ImportExportMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.XMLMemento;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Imports breakpoints from a file into the workspace.
- * <p>
- * This class may be instantiated; not intended to be subclassed.
- * <p>
- * @since 3.2
- */
-public class ImportBreakpointsOperation implements IRunnableWithProgress {
-
-	private boolean fOverwriteAll = false;
-
-	private String fFileName = null;
-
-	private boolean fCreateWorkingSets = false;
-
-	private ArrayList fAdded = new ArrayList();
-
-	private BreakpointManager fManager = (BreakpointManager) DebugPlugin.getDefault().getBreakpointManager();
-
-	/**
-	 * Constructs an operation to import breakpoints.
-	 * 
-	 * @param fileName the file to read breakpoints from - the file should have been 
-	 *            created from an export operation
-	 * @param overwrite whether imported breakpoints will overwrite existing equivalent breakpoints
-	 * @param createWorkingSets whether breakpoint working sets should be created. Breakpoints
-	 * 	are exported with information about the breakpoint working sets they belong to. Those
-	 * 	working sets can be optionally re-created on import if they do not already exist in the
-	 *            workspace.
-	 */
-	public ImportBreakpointsOperation(String fileName, boolean overwrite, boolean createWorkingSets) {
-		fFileName = fileName;
-		fOverwriteAll = overwrite;
-		fCreateWorkingSets = createWorkingSets;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void run(final IProgressMonitor monitor) throws InvocationTargetException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor wmonitor) throws CoreException {
-				try {
-					XMLMemento memento = XMLMemento.createReadRoot(new InputStreamReader(new FileInputStream(fFileName), "UTF-8")); //$NON-NLS-1$
-					IMemento[] nodes = memento.getChildren(IImportExportConstants.IE_NODE_BREAKPOINT);
-					IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-					IMemento node = null;
-					monitor.beginTask(ImportExportMessages.ImportOperation_0, nodes.length);
-					for(int i = 0; i < nodes.length; i++) {
-						if(!monitor.isCanceled()) {
-							node = nodes[i].getChild(IImportExportConstants.IE_NODE_RESOURCE);
-							IResource resource = workspace.findMember(node.getString(IImportExportConstants.IE_NODE_PATH));
-							// filter resource breakpoints that do not exist in this workspace
-							if(resource != null) {
-								// create a marker, we must do each one, as a straight copy set values as Objects, destroying
-								// the actual value types that they are.
-								node = nodes[i].getChild(IImportExportConstants.IE_NODE_MARKER);
-								IMarker marker = findGeneralMarker(resource, node.getString(IMarker.LINE_NUMBER), 
-										node.getString(IImportExportConstants.IE_NODE_TYPE),
-										node.getInteger(IImportExportConstants.CHARSTART));
-								if(marker == null) {
-									marker = resource.createMarker(node.getString(IImportExportConstants.IE_NODE_TYPE));
-									restoreBreakpoint(marker, nodes[i]);
-								}
-								else {
-									if(fOverwriteAll) {
-										marker.setAttributes(null);
-										restoreBreakpoint(marker, nodes[i]);
-									}
-								}
-							}
-							monitor.worked(i+1);
-						} else {
-							return;
-						}
-					}
-					fManager.addBreakpoints((IBreakpoint[])fAdded.toArray(new IBreakpoint[fAdded.size()]));
-				} 
-				catch(FileNotFoundException e) {
-					throw new CoreException(new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, 
-							MessageFormat.format("Breakpoint import file not found: {0}", new String[]{fFileName}), e)); //$NON-NLS-1$
-				}
-				catch (UnsupportedEncodingException e) {
-					throw new CoreException(new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, 
-							MessageFormat.format("The import file was written in non-UTF-8 encoding.", new String[]{fFileName}), e)); //$NON-NLS-1$
-				}
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(wr, monitor);
-		} catch(CoreException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-
-	/**
-	 * Restores a breakpoint on the given marker with information from the passed memento
-	 * @param marker the marker to restore to
-	 * @param node the memento to get the restore information from
-	 */
-	private void restoreBreakpoint(IMarker marker, IMemento node) throws CoreException {
-		IMemento[] childnodes = null;
-		IMemento child = null;
-		// get the marker attributes
-		child = node.getChild(IImportExportConstants.IE_NODE_MARKER);
-		marker.setAttribute(IMarker.LINE_NUMBER, child.getInteger(IMarker.LINE_NUMBER));
-		marker.setAttribute(IImportExportConstants.IE_NODE_TYPE, child.getString(IImportExportConstants.IE_NODE_TYPE));
-		marker.setAttribute(IImportExportConstants.CHARSTART, child.getString(IImportExportConstants.CHARSTART));
-		childnodes = child.getChildren(IImportExportConstants.IE_NODE_ATTRIB);
-		String workingsets = ""; //$NON-NLS-1$
-		for (int j = 0; j < childnodes.length; j++) {
-			// get the attribute and try to convert it to either Integer, Boolean or leave it alone (String)
-			String name = childnodes[j].getString(IImportExportConstants.IE_NODE_NAME), 
-				   value = childnodes[j].getString(IImportExportConstants.IE_NODE_VALUE);
-			if (value != null & name != null) {
-				if (name.equals(IInternalDebugUIConstants.WORKING_SET_NAME)) {
-					workingsets = value;
-				}
-				try {
-					marker.setAttribute(name, Integer.valueOf(value));
-				} catch (NumberFormatException e) {
-					if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("true")) { //$NON-NLS-1$ //$NON-NLS-2$
-						marker.setAttribute(name, Boolean.valueOf(value));
-					}
-					else {
-						marker.setAttribute(name, value);
-					}
-				}
-			}
-		}
-		// create the breakpoint
-		IBreakpoint breakpoint = fManager.createBreakpoint(marker);
-		breakpoint.setEnabled(Boolean.valueOf(node.getString(IImportExportConstants.IE_BP_ENABLED)).booleanValue());
-		breakpoint.setPersisted(Boolean.valueOf(node.getString(IImportExportConstants.IE_BP_PERSISTANT)).booleanValue());
-		breakpoint.setRegistered(Boolean.valueOf(node.getString(IImportExportConstants.IE_BP_REGISTERED)).booleanValue());
-		// bug fix 110080
-		fAdded.add(breakpoint);
-		if (fCreateWorkingSets) {
-			String[] names = workingsets.split("\\" + IImportExportConstants.DELIMITER); //$NON-NLS-1$
-			for (int m = 1; m < names.length; m++) {
-				createWorkingSet(names[m], breakpoint);
-			}
-		}
-	}
-
-	/**
-	 * Creates a working set and sets the values
-	 * @param breakpoint the restored breakpoint to add to the new working set
-	 */
-	private void createWorkingSet(String setname, IAdaptable element) {
-		IWorkingSetManager wsmanager = PlatformUI.getWorkbench().getWorkingSetManager();
-		IWorkingSet set = wsmanager.getWorkingSet(setname);
-		if (set == null) {
-			set = wsmanager.createWorkingSet(setname, new IAdaptable[] {});
-			set.setId(IDebugUIConstants.BREAKPOINT_WORKINGSET_ID);
-			wsmanager.addWorkingSet(set);
-		}
-		if (!setContainsBreakpoint(set, (IBreakpoint) element)) {
-			IAdaptable[] elements = set.getElements();
-			IAdaptable[] newElements = new IAdaptable[elements.length + 1];
-			newElements[newElements.length - 1] = element;
-			System.arraycopy(elements, 0, newElements, 0, elements.length);
-			set.setElements(newElements);
-		}
-	}
-
-	/**
-	 * Method to ensure markers and breakpoints are not both added to the working set
-	 * @param set the set to check
-	 * @param breakpoint the breakpoint to check for existence
-	 * @return true if it is present false otherwise
-	 */
-	private boolean setContainsBreakpoint(IWorkingSet set, IBreakpoint breakpoint) {
-		IAdaptable[] elements = set.getElements();
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i].equals(breakpoint)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * This method is used internally to find a non-specific marker on a given resource.
-	 * With this method we can search for similar markers even though they may have differing IDs
-	 * 
-	 * @param resource the resource to search for the marker
-	 * @param line the line number or <code>null</code>
-	 * @param type the type of the marker
-	 * @param charstart the charstart attribute of the marker or <code>null</code>
-	 * @return the marker if found, or <code>null</code>
-	 */
-	private IMarker findGeneralMarker(IResource resource, String line, String type, Integer charstart) throws CoreException {
-		IMarker[] markers = resource.findMarkers(null, false, IResource.DEPTH_ZERO);
-		if (type != null) {
-			for (int i = 0; i < markers.length; i++) {
-				Object localline = markers[i].getAttribute(IMarker.LINE_NUMBER);
-				String localtype = markers[i].getType();
-				if (type.equals(localtype)) {
-					if (localline != null & line != null) {
-						if (line.equals(localline.toString())) {
-							Integer markerCharstart = (Integer) markers[i].getAttribute(IImportExportConstants.CHARSTART);
-							if (charstart == null) {
-								if (markerCharstart == null) {
-									return markers[i];
-								}
-							} else if (charstart.equals(markerCharstart)) {
-								return markers[i];
-							}
-						}
-					} else {
-						return markers[i];
-					}
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAction.java
deleted file mode 100644
index 8d64068..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAction.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.debug.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Launches a launch configuration in a specific mode.
- * <p>
- * Clients are not intended to subclass this class; clients may instantiate this
- * class.
- * </p>
- * @since 2.1
- */
-public class LaunchAction extends Action {
-
-	/**
-	 * The configuration to launch.
-	 */
-	private ILaunchConfiguration fConfiguration;
-	/**
-	 * The mode to launch in
-	 */
-	private String fMode;
-	
-	/**
-	 * Constructs an action that launches the specified launch configuration
-	 * in the specified mode.
-	 * 
-	 * @param configuration launch configuration
-	 * @param mode launch mode - one of <code>ILaunchManager.RUN_MODE</code> or
-	 * <code>ILaunchManager.DEBUG_MODE</code>
-	 */
-	public LaunchAction(ILaunchConfiguration configuration, String mode) {
-		fConfiguration = configuration;
-		fMode = mode;
-		setText(configuration.getName());
-		setImageDescriptor(DebugUITools.getDefaultImageDescriptor(configuration));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-			this,
-			IDebugHelpContextIds.RELAUNCH_HISTORY_ACTION);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		DebugUITools.launch(fConfiguration, fMode);
-	}
-	
-	/**
-	 * If the user has control-clicked the launch history item, open the launch
-	 * configuration dialog on the launch configuration, rather than running it.
-	 * 
-	 * @see org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(Event event) {
-		if ((event.stateMask & SWT.MOD1) > 0) {
-			IStructuredSelection selection = new StructuredSelection(fConfiguration);
-			String id = DebugUITools.getLaunchGroup(fConfiguration, fMode).getIdentifier();
-			DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), selection, id); 
-		} else {
-			run();
-		}
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java
deleted file mode 100644
index 14db8a2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.actions;
-
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.LaunchShortcutAction;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * A cascading sub-menu that shows all launch shortcuts pertinent to a
- * launch group.
- * <p>
- * Clients may instantiate this class; not intended to be subclassed.
- * </p>
- * @since 2.1
- * @deprecated The use of perspective based launch shortcuts has been deprecated
- *  in the 3.1 release. Instead, selection sensitive launch is supported in the top level
- *  menus. Use <code>LaunchShorcutsAction</code> instead.
- */
-public class LaunchAsAction extends Action implements IMenuCreator, IWorkbenchWindowPulldownDelegate2 {
-	
-	/**
-	 * Cascading menu 
-	 */
-	private Menu fCreatedMenu;
-	
-	/**
-	 * Launch group identifier 
-	 */
-	private String fLaunchGroupIdentifier;
-	
-	/**
-	 * Presentation wrapper for this action
-	 */
-	private IAction fAction;
-	
-	/**
-	 * Creates a cascading menu action to populate with shortcuts in the given
-	 * launch group.
-	 *  
-	 * @param launchGroupIdentifier launch group identifier
-	 */
-	public LaunchAsAction(String launchGroupIdentifier) {
-		super();
-		fLaunchGroupIdentifier = launchGroupIdentifier;
-		ILaunchMode launchMode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(getMode());
-		setText(launchMode.getLaunchAsLabel()); 
-		setMenuCreator(this);
-	}
-	
-	/**
-	 * Returns the launch group associated with this action.
-	 * 
-	 * @return the launch group associated with this action
-	 */
-	private LaunchGroupExtension getLaunchGroup() {
-		return getLaunchConfigurationManager().getLaunchGroup(fLaunchGroupIdentifier);
-	}
-
-	/**
-	 * @see IAction#run()
-	 */
-	public void run() {
-		//do nothing, this action just creates a cascading menu.
-	}
-		
-	private void createAction(Menu parent, IAction action, int count) {
-		StringBuffer label= new StringBuffer();
-		//add the numerical accelerator
-		if (count < 10) {
-			label.append('&');
-			label.append(count);
-			label.append(' ');
-		}
-		label.append(action.getText());
-		action.setText(label.toString());
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-	
-	/**
-	 * @see IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (getCreatedMenu() != null) {
-			getCreatedMenu().dispose();
-		}
-	}
-	
-	/**
-	 * @see IMenuCreator#getMenu(Control)
-	 */
-	public Menu getMenu(Control parent) {
-		return null;
-	}
-	
-	/**
-	 * @see IMenuCreator#getMenu(Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		if (getCreatedMenu() != null) {
-			 getCreatedMenu().dispose();
-		 }
-		setCreatedMenu(new Menu(parent));
-		fillMenu();
-		initMenu();
-		return getCreatedMenu();
-	}
-	
-	private void fillMenu() {
-		//Retrieve the current perspective and the registered shortcuts
-		 List shortcuts = null;
-		 String activePerspID = getActivePerspectiveID();
-		 if (activePerspID != null) {
-			 shortcuts = getLaunchConfigurationManager().getLaunchShortcuts(activePerspID, getCategory());
-		 }
-	
-		 // If NO shortcuts are listed in the current perspective, add ALL shortcuts
-		 // to avoid an empty cascading menu
-		 if (shortcuts == null || shortcuts.isEmpty()) {
-			 shortcuts = getLaunchConfigurationManager().getLaunchShortcuts(getCategory());
-		 }
-
-		 int menuCount = 1;
-		 
-		 Iterator iter = shortcuts.iterator();
-		 while (iter.hasNext()) {
-			 LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next();
-			 if (ext.getModes().contains(getMode()) && !WorkbenchActivityHelper.filterItem(ext)) {
-				populateMenu(ext, getCreatedMenu(), menuCount);
-				menuCount++;
-			 }
-		 }
-	}
-	
-	/**
-	 * Creates the menu for the action
-	 */
-	private void initMenu() {
-		// Add listener to repopulate the menu each time
-		// it is shown to reflect changes in selection or active perspective
-		fCreatedMenu.addMenuListener(new MenuAdapter() {
-			public void menuShown(MenuEvent e) {
-				Menu m = (Menu)e.widget;
-				MenuItem[] items = m.getItems();
-				for (int i=0; i < items.length; i++) {
-					items[i].dispose();
-				}
-				fillMenu();
-			}
-		});
-	}
-		
-	/**
-	 * Add the shortcut to the menu.
-	 */
-	private void populateMenu(LaunchShortcutExtension ext, Menu menu, int menuCount) {
-		LaunchShortcutAction action = new LaunchShortcutAction(getMode(), ext);
-		action.setActionDefinitionId(ext.getId() + "." + getMode()); //$NON-NLS-1$
-		String helpContextId = ext.getHelpContextId();
-		if (helpContextId != null) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId);
-		}
-		/*if (fKeyBindingService != null) {
-			fKeyBindingService.registerGlobalAction(action);	
-		}*/
-		createAction(menu, action, menuCount);
-	}
-	
-	/**
-	 * Return the ID of the currently active perspective, or <code>null</code>
-	 * if there is none.
-	 */
-	private String getActivePerspectiveID() {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				IPerspectiveDescriptor persp = page.getPerspective();
-				if (persp != null) {
-					return persp.getId();
-				}
-			}
-		}
-		return null;
-	}
-		
-	/**
-	 * Returns the mode of this action - run or debug 
-	 * 
-	 * @return the mode of this action - run or debug
-	 */
-	private String getMode() {
-		return getLaunchGroup().getMode();
-	}
-	
-	/**
-	 * Returns the category of this action - possibly <code>null</code>
-	 *
-	 * @return the category of this action - possibly <code>null</code>
-	 */
-	private String getCategory() {
-		return getLaunchGroup().getCategory();
-	}
-	
-	private Menu getCreatedMenu() {
-		return fCreatedMenu;
-	}
-	
-	private void setCreatedMenu(Menu createdMenu) {
-		fCreatedMenu = createdMenu;
-	}
-	
-	/**
-	 * Returns the launch configuration manager.
-	 *
-	 * @return launch configuration manager
-	 */
-	private LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}	
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-//		if (window instanceof WorkbenchWindow) {
-//			fKeyBindingService= ((WorkbenchWindow)window).getKeyBindingService();
-//		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// do nothing - this is just a menu
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (fAction == null) {
-			initialize(action);
-		}
-	}
-	
-	/**
-	 * Set the enabled state of the underlying action based on whether there are any
-	 * registered launch shortcuts for this launch mode.
-	 */
-	private void initialize(IAction action) {
-		fAction = action;
-		action.setEnabled(existsShortcutsForMode());	
-	}	
-
-	/**
-	 * Return whether there are any registered launch shortcuts for
-	 * the mode of this action.
-	 * 
-	 * @return whether there are any registered launch shortcuts for
-	 * the mode of this action
-	 */
-	private boolean existsShortcutsForMode() {
-		List shortcuts = getLaunchConfigurationManager().getLaunchShortcuts(getCategory());
-		Iterator iter = shortcuts.iterator();
-		while (iter.hasNext()) {
-			LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next();
-			if (ext.getModes().contains(getMode())) {
-				return true;
-			}
-		}		
-		return false;
-	}	
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java
deleted file mode 100644
index 26b84f5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java
+++ /dev/null
@@ -1,351 +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.debug.ui.actions;
-
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchMode;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.actions.LaunchConfigurationAction;
-import org.eclipse.debug.internal.ui.actions.LaunchShortcutAction;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchShortcutExtension;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-
-/**
- * A cascading sub-menu that shows all launch shortcuts pertinent to a
- * selection. This action is similar to <code>ContextualLaunchAction</code>
- * except this action is an <code>IAction</code> rather than an action
- * delegate.
- * <p> 
- * This action appears in the main Run menu
- * </p> 
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.1
- */
-public class LaunchShortcutsAction extends Action implements IMenuCreator, IWorkbenchWindowPulldownDelegate2 {
-	
-	/**
-	 * Cascading menu 
-	 */
-	private Menu fCreatedMenu;
-	
-	/**
-	 * Launch group
-	 */
-	private ILaunchGroup fGroup;
-	
-	/**
-	 * Whether this actions enablement has been initialized
-	 */
-	private boolean fInitialized = false;
-		
-	/**
-	 * Creates a cascading menu action to populate with shortcuts in the given
-	 * launch group.
-	 *  
-	 * @param launchGroupIdentifier launch group identifier
-	 */
-	public LaunchShortcutsAction(String launchGroupIdentifier) {
-		super();
-		fGroup = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(launchGroupIdentifier);
-		ILaunchMode mode = DebugPlugin.getDefault().getLaunchManager().getLaunchMode(fGroup.getMode());
-		setText(mode.getLaunchAsLabel()); 
-		setMenuCreator(this);
-		setEnabled(existsConfigTypesForMode());
-	}
-
-	/**
-	 * @see IAction#run()
-	 */
-	public void run() {
-		//do nothing, this action just creates a cascading menu.
-	}
-	
-	/**
-	 * @see IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (fCreatedMenu != null) {
-			fCreatedMenu.dispose();
-		}
-	}
-	
-	/**
-	 * @see IMenuCreator#getMenu(Control)
-	 */
-	public Menu getMenu(Control parent) {
-		return null;
-	}
-	
-	/**
-	 * @see IMenuCreator#getMenu(Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		if (fCreatedMenu != null) {
-			 fCreatedMenu.dispose();
-		 }
-		fCreatedMenu = new Menu(parent);
-		initMenu();
-		return fCreatedMenu;
-	}
-	
-	/**
-	 * @return an Evaluation context with default variable = selection
-	 */
-	private IEvaluationContext createContext() {
-	    List list = null;
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-			    IWorkbenchPart activePart = page.getActivePart();
-			    if (activePart instanceof IEditorPart) {
-			        list = new ArrayList();
-			        list.add(((IEditorPart)activePart).getEditorInput());
-			    } else if (activePart != null) {
-			        IWorkbenchPartSite site = activePart.getSite();
-			        if (site != null) {
-	                    ISelectionProvider selectionProvider = site.getSelectionProvider();
-	                    if (selectionProvider != null) {
-	                        ISelection selection = selectionProvider.getSelection();
-					        if (selection instanceof IStructuredSelection) {
-					            list = ((IStructuredSelection)selection).toList();
-					        }
-	                    }
-			        }
-			    }
-			}
-		}	    
-		// create a default evaluation context with default variable
-		// of the user selection or editor input
-		if (list == null) {
-		    list = Collections.EMPTY_LIST;
-		}
-		IEvaluationContext context = new EvaluationContext(null, list);
-		context.setAllowPluginActivation(true);
-		context.addVariable("selection", list); //$NON-NLS-1$
-		return context;
-	}	
-	
-	/**
-	 * Fills the flyout menu 
-	 */
-	private void fillMenu() {
-		IEvaluationContext context = createContext();
-		int accelerator = 1;
-		List allShortCuts = getLaunchConfigurationManager().getLaunchShortcuts(fGroup.getCategory());
-		Iterator iter = allShortCuts.iterator();
-		List filteredShortCuts = new ArrayList(10);
-		while (iter.hasNext()) {
-			LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next();
-			try {
-				if (!WorkbenchActivityHelper.filterItem(ext) && isApplicable(ext, context)) {
-					filteredShortCuts.add(ext);
-				}
-			} catch (CoreException e) {/*not supported*/}
-		}
-		//first add the launch config if it is one
-		try {
-			ILaunchConfiguration config = getLaunchConfigurationManager().isSharedConfig(getSelection(context));
-	        if(config != null && config.exists() && config.supportsMode(getMode())) {
-	        	IAction action = new LaunchConfigurationAction(config, getMode(), config.getName(), DebugUITools.getDefaultImageDescriptor(config), accelerator++);
-	            ActionContributionItem item = new ActionContributionItem(action);
-	            item.fill(fCreatedMenu, -1);
-	            if(!filteredShortCuts.isEmpty()) {
-	    			new MenuItem(fCreatedMenu, SWT.SEPARATOR);
-	    		}
-			}
-		}
-		catch(CoreException ce) {DebugUIPlugin.log(ce);}
-		//second add the launch shortcuts if any
-		iter = filteredShortCuts.iterator();
-		while (iter.hasNext()) {
-			LaunchShortcutExtension ext = (LaunchShortcutExtension) iter.next();
-			Set modes = ext.getModes(); // supported launch modes
-			Iterator modeIter = modes.iterator();
-			while (modeIter.hasNext()) {
-				String mode = (String) modeIter.next();
-				if (mode.equals(getMode())) {
-					populateMenuItem(mode, ext, fCreatedMenu, accelerator++);
-				}
-			}
-		}
-		if (accelerator == 1) {
-			// No shortcuts added. Add "none available" action.
-			IAction action= new Action(ActionMessages.LaunchShortcutsAction_1) {}; 
-			action.setEnabled(false);
-			ActionContributionItem item= new ActionContributionItem(action);
-			item.fill(fCreatedMenu, -1);
-		}
-	}
-	
-	/**
-	 * Returns the first element of the current selection
-	 * @param context the current evaluation context
-	 * @return the first item in the selection, or <code>null</code> if none
-	 * @since 3.3
-	 */
-	private Object getSelection(IEvaluationContext context) {
-		List list = (List) context.getVariable("selection"); //$NON-NLS-1$
-		return (list.isEmpty() ? null : list.get(0));
-	}
-	
-	/**
-	 * Add the shortcut to the context menu's launch sub-menu.
-	 */
-	private void populateMenuItem(String mode, LaunchShortcutExtension ext, Menu menu, int accelerator) {
-		LaunchShortcutAction action = new LaunchShortcutAction(mode, ext);
-		action.setActionDefinitionId(ext.getId() + "." + mode); //$NON-NLS-1$
-		String helpContextId = ext.getHelpContextId();
-		if (helpContextId != null) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId);
-		}
-		StringBuffer label= new StringBuffer();
-		if (accelerator >= 0 && accelerator < 10) {
-			//add the numerical accelerator
-			label.append('&');
-			label.append(accelerator);
-			label.append(' ');
-		}
-		String contextLabel= ext.getContextLabel(mode);
-		// replace default action label with context label if specified.
-		label.append((contextLabel != null) ? contextLabel : action.getText());
-		action.setText(label.toString());
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(menu, -1);
-	}
-	
-	/**
-	 * Evaluate the enablement logic in the contextualLaunch
-	 * element description. A true result means that we should
-	 * include this shortcut in the context menu.
-	 * @return true iff shortcut should appear in context menu
-	 */
-	private boolean isApplicable(LaunchShortcutExtension ext, IEvaluationContext context) throws CoreException {
-		Expression expr = ext.getContextualLaunchEnablementExpression();
-		return ext.evalEnablementExpression(context, expr);
-	}
-	
-	/**
-	 * Creates the menu for the action
-	 */
-	private void initMenu() {
-		// Add listener to re-populate the menu each time
-		// it is shown to reflect changes in selection or active perspective
-		fCreatedMenu.addMenuListener(new MenuAdapter() {
-			public void menuShown(MenuEvent e) {
-				Menu m = (Menu)e.widget;
-				MenuItem[] items = m.getItems();
-				for (int i=0; i < items.length; i++) {
-					items[i].dispose();
-				}
-				fillMenu();
-			}
-		});
-	}
-		
-	/**
-	 * Returns the mode of this action - run or debug 
-	 * 
-	 * @return the mode of this action - run or debug
-	 */
-	protected String getMode() {
-		return fGroup.getMode();
-	}
-	
-	/**
-	 * Returns the launch configuration manager.
-	 *
-	 * @return launch configuration manager
-	 */
-	private LaunchConfigurationManager getLaunchConfigurationManager() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
-	}	
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// do nothing - this is just a menu
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	    if (!fInitialized) {
-	        action.setEnabled(existsConfigTypesForMode());
-	        fInitialized = true;
-	    }
-	}
-
-	/**
-	 * Return whether there are any registered launch configuration types for
-	 * the mode of this action.
-	 * 
-	 * @return whether there are any registered launch configuration types for
-	 * the mode of this action
-	 */
-	private boolean existsConfigTypesForMode() {
-		ILaunchConfigurationType[] configTypes = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
-		for (int i = 0; i < configTypes.length; i++) {
-			ILaunchConfigurationType configType = configTypes[i];
-			if (configType.supportsMode(getMode())) {
-				return true;
-			}
-		}		
-		return false;
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/OpenLaunchDialogAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/OpenLaunchDialogAction.java
deleted file mode 100644
index 3d5a201..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/OpenLaunchDialogAction.java
+++ /dev/null
@@ -1,150 +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.debug.ui.actions;
-
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchGroup;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Opens the launch configuration dialog in the context of a launch group.
- * <p>
- * Clients are not intended to subclass this class; clients may instantiate this
- * class.
- * </p>
- * @since 2.1
- */
-public class OpenLaunchDialogAction extends Action implements IActionDelegate2, IWorkbenchWindowActionDelegate {
-
-	/**
-	 * Launch group identifier
-	 */
-	private String fIdentifier;
-	
-	/**
-	 * Constructs an action that opens the launch configuration dialog in
-	 * the context of the specified launch group.
-	 * 
-	 * @param identifier unique identifier of a launch group extension
-	 */
-	public OpenLaunchDialogAction(String identifier) {
-		fIdentifier = identifier;
-		ILaunchGroup group = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(fIdentifier);
-		if(group != null) {
-			setImageDescriptor(group.getImageDescriptor());
-			String lbl = group.getLabel();
-			String actionLabel = MessageFormat.format(ActionMessages.OpenLaunchDialogAction_1, new String[] {lbl});
-			setText(DebugUIPlugin.adjustDBCSAccelerator(actionLabel));
-		}
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.OPEN_LAUNCH_CONFIGURATION_ACTION);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		LaunchHistory history = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchHistory(fIdentifier);
-		ILaunchConfiguration configuration = history.getRecentLaunch();
-		IStructuredSelection selection = null;
-		if (configuration == null) {
-			selection = new StructuredSelection();
-		} else {
-			selection = new StructuredSelection(configuration);
-		}
-		int result = DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), selection, fIdentifier);
-		notifyResult(result == Window.OK);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		run();
-	}
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		if(action != null) {
-			action.setEnabled(existsConfigTypesForMode());
-		}
-	}
-	
-	/**
-	 * Return whether there are any registered launch configuration types for
-	 * the mode of this action.
-	 * 
-	 * @return whether there are any registered launch configuration types for
-	 * the mode of this action
-	 */
-	private boolean existsConfigTypesForMode() {
-		ILaunchConfigurationType[] configTypes = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
-		for (int i = 0; i < configTypes.length; i++) {
-			ILaunchConfigurationType configType = configTypes[i];
-			if (configType.supportsMode(getMode())) {
-				return true;
-			}
-		}		
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {}
-	
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {}
-	
-	/**
-	 * Returns the launch mode for this action.
-	 * 
-	 * @return launch mode
-	 */
-	private String getMode() {
-		return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(fIdentifier).getMode();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerBreakpointAction.java
deleted file mode 100644
index 62ab35d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerBreakpointAction.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.debug.ui.actions;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
-
-/**
- * Abstract action that works on breakpoints in the vertical ruler.
- * <p>
- * This class may be subclassed.
- * </p>
- * @since 3.2
- */
-public abstract class RulerBreakpointAction extends Action {
-	
-	private ITextEditor fEditor;
-	private IVerticalRulerInfo fRulerInfo;
-	
-	/**
-	 * Constructs an action to work on breakpoints in the specified
-	 * text editor with the specified vertical ruler information.
-	 * 
-	 * @param editor text editor
-	 * @param info vertical ruler information
-	 */
-	public RulerBreakpointAction(ITextEditor editor, IVerticalRulerInfo info) {
-		fEditor = editor;
-		fRulerInfo = info;
-	}
-
-	/**
-	 * Returns the breakpoint at the last line of mouse activity in the ruler
-	 * or <code>null</code> if none.
-	 * 
-	 * @return breakpoint associated with activity in the ruler or <code>null</code>
-	 */
-	protected IBreakpoint getBreakpoint() {
-		IAnnotationModel annotationModel = fEditor.getDocumentProvider().getAnnotationModel(fEditor.getEditorInput());
-		IDocument document = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
-		if (annotationModel != null) {
-			Iterator iterator = annotationModel.getAnnotationIterator();
-			while (iterator.hasNext()) {
-				Object object = iterator.next();
-				if (object instanceof SimpleMarkerAnnotation) {
-					SimpleMarkerAnnotation markerAnnotation = (SimpleMarkerAnnotation) object;
-					IMarker marker = markerAnnotation.getMarker();
-					try {
-						if (marker.isSubtypeOf(IBreakpoint.BREAKPOINT_MARKER)) {
-							Position position = annotationModel.getPosition(markerAnnotation);
-							int line = document.getLineOfOffset(position.getOffset());
-							if (line == fRulerInfo.getLineOfLastMouseButtonActivity()) {
-								IBreakpoint breakpoint = DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(marker);
-								if (breakpoint != null) {
-									return breakpoint;
-								}
-							}
-						}
-					} catch (CoreException e) {
-					} catch (BadLocationException e) {
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the editor this action was created for.
-	 * 
-	 * @return editor
-	 */
-	protected ITextEditor getEditor() {
-		return fEditor;
-	}
-	
-	/**
-	 * Returns the vertical ruler information this action was created for.
-	 * 
-	 * @return vertical ruler information
-	 */
-	protected IVerticalRulerInfo getVerticalRulerInfo() {
-		return fRulerInfo;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerEnableDisableBreakpointActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerEnableDisableBreakpointActionDelegate.java
deleted file mode 100644
index 4b58aeb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerEnableDisableBreakpointActionDelegate.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.debug.ui.actions;
-
-import org.eclipse.debug.internal.ui.actions.breakpoints.RulerEnableDisableBreakpointAction;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Toggles enablement of a breakpoint in a vertical ruler.
- * This action can be contributed to a vertical ruler context menu via the
- * <code>popupMenus</code> extension point, by referencing the ruler's context
- * menu identifier in the <code>targetID</code> attribute.
- * <pre>
- * &lt;extension point="org.eclipse.ui.popupMenus"&gt;
- *   &lt;viewerContribution
- *     targetID="example.rulerContextMenuId"
- *     id="example.RulerPopupActions"&gt;
- *       &lt;action
- *         label="Enable Breakpoint"
- *         class="org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
- *         menubarPath="additions"
- *         id="example.rulerContextMenu.toggleBreakpointAction"&gt;
- *       &lt;/action&gt;
- *   &lt;/viewerContribution&gt;
- * </pre>
- * </p>
- * <p>
- * Clients may refer to this class as an action delegate in plug-in XML. This class
- * is not intended to be subclassed.
- * </p>
- * @since 3.2
- *
- */
-public class RulerEnableDisableBreakpointActionDelegate extends AbstractRulerActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.source.IVerticalRulerInfo)
-	 */
-	protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
-		return new RulerEnableDisableBreakpointAction(editor, rulerInfo);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerToggleBreakpointActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerToggleBreakpointActionDelegate.java
deleted file mode 100644
index b38d459..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RulerToggleBreakpointActionDelegate.java
+++ /dev/null
@@ -1,123 +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.debug.ui.actions;
-
-import org.eclipse.swt.widgets.Event;
-
-import org.eclipse.jface.action.IAction;
-
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Toggles a breakpoint when ruler is double-clicked. This action delegate can be 
- * contributed to an editor with the <code>editorActions</code> extension point.
- * This action is as a factory that creates another action that performs the
- * actual breakpoint toggling. The created action acts on the editor's
- * <code>IToggleBreakpointsTagret</code> to toggle breakpoints.
- * <p>
- * Following is example plug-in XML used to contribute this action to an editor.
- * Note that the label attribute of this action is not displayed in the editor.
- * Instead, the label of the created action is displayed. 
- * <pre>
- * &lt;extension point="org.eclipse.ui.editorActions"&gt;
- *    &lt;editorContribution
- *          targetID="example.editor"
- *          id="example.rulerActions"&gt;
- *       &lt;action
- *             label="Not Used"
- *             class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
- *             style="push"
- *             actionID="RulerDoubleClick"
- *             id="example.doubleClickBreakpointAction"/&gt;
- *    &lt;/editorContribution&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p>
- * <p>
- * This action can also be contributed to a vertical ruler context menu via the
- * <code>popupMenus</code> extension point, by referencing the ruler's context
- * menu identifier in the <code>targetID</code> attribute.
- * <pre>
- * &lt;extension point="org.eclipse.ui.popupMenus"&gt;
- *   &lt;viewerContribution
- *     targetID="example.rulerContextMenuId"
- *     id="example.RulerPopupActions"&gt;
- *       &lt;action
- *         label="Toggle Breakpoint"
- *         class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
- *         menubarPath="additions"
- *         id="example.rulerContextMenu.toggleBreakpointAction"&gt;
- *       &lt;/action&gt;
- *   &lt;/viewerContribution&gt;
- * </pre>
- * </p>
- * <p>
- * Clients may refer to this class as an action delegate in plug-in XML. This class
- * is not intended to be subclassed.
- * </p>
- * @since 3.1
- */
-public class RulerToggleBreakpointActionDelegate extends AbstractRulerActionDelegate implements IActionDelegate2 {
-	
-	private IEditorPart fEditor = null;
-	private ToggleBreakpointAction fDelegate = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.source.IVerticalRulerInfo)
-	 */
-	protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
-		fDelegate = new ToggleBreakpointAction(editor, null, rulerInfo);
-		return fDelegate;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
-	 */
-	public void setActiveEditor(IAction callerAction, IEditorPart targetEditor) {
-		if (fEditor != null) {
-			if (fDelegate != null) {
-				fDelegate.dispose();
-				fDelegate = null;
-			}
-		}
-		fEditor = targetEditor;
-		super.setActiveEditor(callerAction, targetEditor);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		if (fDelegate != null) {
-			fDelegate.dispose();
-		}
-		fDelegate = null;
-		fEditor = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunAction.java
deleted file mode 100644
index 9ef2847..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.actions;
-
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.actions.ExecutionAction;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Action to launch the last launch configuration that was successfully
- * launched, in run mode. If no configurations have been launched, the launch
- * configuration dialog is opened.
- * </p>
- * <p>
- * This class is not intended to be subclassed. This class may
- * be instantiated.
- * </p>
- * @since 2.0
- */
-public final class RunAction extends ExecutionAction {
-	
-	public RunAction() {
-		super(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
-	}
-
-	/**
-	 * @see ExecutionAction#getMode()
-	 */
-	protected String getMode() {
-		return ILaunchManager.RUN_MODE;
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunToLineActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunToLineActionDelegate.java
deleted file mode 100644
index 1aad2a7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunToLineActionDelegate.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Mikhail Khodjaiants (QNX) - https://bugs.eclipse.org/bugs/show_bug.cgi?id=83464
- *******************************************************************************/
-package org.eclipse.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.debug.ui.contexts.IDebugContextManager;
-import org.eclipse.debug.ui.contexts.IDebugContextService;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * A run to line action that can be contributed to a an editor or view. The action
- * will perform the "run to line" operation for parts that provide
- * an appropriate <code>IRunToLineTarget</code> adapter.
- * <p>
- * Clients may reference/contribute this class as an action delegate
- * in plug-in XML. This class is not intended to be subclassed.
- * </p>
- * <p>
- * Since 3.1, this action also implements {@link org.eclipse.ui.IViewActionDelegate}.
- * </p>
- * @since 3.0
- */
-public class RunToLineActionDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate {
-	
-	private IWorkbenchPart fActivePart = null;
-	private IRunToLineTarget fPartTarget = null;
-	private IAction fAction = null;
-	private DebugContextListener fContextListener = new DebugContextListener();
-	private ISuspendResume fTargetElement = null;
-	
-	class DebugContextListener implements IDebugContextListener {
-
-		protected void contextActivated(ISelection selection) {
-			fTargetElement = null;
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection) selection;
-				if (ss.size() == 1) {
-					Object object = ss.getFirstElement();
-					if (object instanceof ISuspendResume) {
-						fTargetElement = (ISuspendResume) object;
-					}
-				}
-			}
-			update();
-		}
-
-		public void debugContextChanged(DebugContextEvent event) {
-			contextActivated(event.getContext());
-		}
-		
-	}		
-	
-	/*(non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		DebugUITools.getDebugContextManager().getContextService(fActivePart.getSite().getWorkbenchWindow()).removeDebugContextListener(fContextListener);
-		fActivePart = null;
-		fPartTarget = null;
-		
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (fPartTarget != null && fTargetElement != null) {
-			try {
-				fPartTarget.runToLine(fActivePart, fActivePart.getSite().getSelectionProvider().getSelection(), fTargetElement);
-			} catch (CoreException e) {
-				DebugUIPlugin.errorDialog(fActivePart.getSite().getWorkbenchWindow().getShell(), ActionMessages.RunToLineAction_0, ActionMessages.RunToLineAction_1, e.getStatus()); // 
-			}
-		}
-	}
-	/* (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) {
-		this.fAction = action;
-		update();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		if (fAction == null) {
-			return;
-		}
-		Runnable r = new Runnable() {
-			public void run() {
-				boolean enabled = false;
-				if (fPartTarget != null && fTargetElement != null) {
-					IWorkbenchPartSite site = fActivePart.getSite();
-					if (site != null) {
-					    ISelectionProvider selectionProvider = site.getSelectionProvider();
-					    if (selectionProvider != null) {
-					        ISelection selection = selectionProvider.getSelection();
-					        enabled = fTargetElement.isSuspended() && fPartTarget.canRunToLine(fActivePart, selection, fTargetElement);
-					    }
-					}
-				}
-				fAction.setEnabled(enabled);				
-			}
-		};
-		DebugUIPlugin.getStandardDisplay().asyncExec(r);
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		this.fAction = action; 
-		if (action != null) {
-			action.setText(ActionMessages.RunToLineActionDelegate_4); 
-			action.setImageDescriptor(DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_RUN_TO_LINE));
-			action.setDisabledImageDescriptor(DebugUITools.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_RUN_TO_LINE));
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
-	 */
-	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		init(action);
-		bindTo(targetEditor);	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		bindTo(view);
-	}
-	
-	/**
-	 * Binds this action to operate on the given part's run to line adapter.
-	 *  
-	 * @param part
-	 */
-	private void bindTo(IWorkbenchPart part) {
-		IDebugContextManager manager = DebugUITools.getDebugContextManager();
-		if (fActivePart != null && !fActivePart.equals(part)) {
-			manager.getContextService(fActivePart.getSite().getWorkbenchWindow()).removeDebugContextListener(fContextListener);
-		}
-		fPartTarget = null;
-		fActivePart = part;
-		if (part != null) {
-			IWorkbenchWindow workbenchWindow = part.getSite().getWorkbenchWindow();
-			IDebugContextService service = manager.getContextService(workbenchWindow);
-			service.addDebugContextListener(fContextListener);
-			fPartTarget  = (IRunToLineTarget) part.getAdapter(IRunToLineTarget.class);
-			if (fPartTarget == null) {
-				IAdapterManager adapterManager = Platform.getAdapterManager();
-				// TODO: we could restrict loading to cases when the debugging context is on
-				if (adapterManager.hasAdapter(part, IRunToLineTarget.class.getName())) {
-					fPartTarget = (IRunToLineTarget) adapterManager.loadAdapter(part, IRunToLineTarget.class.getName());
-				}
-			}
-			ISelection activeContext = service.getActiveContext();
-			fContextListener.contextActivated(activeContext);
-		}
-		update();			
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunToLineHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunToLineHandler.java
deleted file mode 100644
index 4296abb..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/RunToLineHandler.java
+++ /dev/null
@@ -1,150 +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.debug.ui.actions;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-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.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointManagerListener;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Handles a run to line operation. Clients implementing a run to line action
- * can use this handler to carry out a run to line operation implemented with 
- * a breakpoint. Handles the user preference to skip breakpoints while performing
- * a run to line operation, and cancelling the run to line operation if another
- * breakpoint is encountered before the operation is completed. 
- * <p>
- * Clients may instantiate this class. This class is not intended to be subclassed.
- * </p>
- * @since 3.1
- */
-public class RunToLineHandler implements IDebugEventSetListener, IBreakpointManagerListener, IWorkspaceRunnable {
-    
-    private IDebugTarget fTarget;
-    private ISuspendResume fResumee;
-    private IBreakpoint fBreakpoint;
-    private boolean fAutoSkip = false;
-    
-    /**
-     * Constructs a handler to perform a run to line operation.
-     * 
-     * @param target the debug target in which the operation is to be performed
-     * @param suspendResume the element to be resumed to begin the operation
-     * @param breakpoint the run to line breakpoint
-     */
-    public RunToLineHandler(IDebugTarget target, ISuspendResume suspendResume, IBreakpoint breakpoint) {
-        fResumee = suspendResume;
-        fTarget = target;
-        fBreakpoint = breakpoint;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-     */
-    public void handleDebugEvents(DebugEvent[] events) {
-        for (int i = 0; i < events.length; i++) {
-            DebugEvent event= events[i];
-            Object source= event.getSource();
-            if (source instanceof IThread && event.getKind() == DebugEvent.SUSPEND &&
-                    event.getDetail() == DebugEvent.BREAKPOINT) {
-                IThread thread = (IThread) source;
-                IDebugTarget suspendee = (IDebugTarget) thread.getAdapter(IDebugTarget.class);
-                if (fTarget.equals(suspendee)) {
-                    // cleanup if the breakpoint was hit or not
-                    cancel();
-                }
-            } else if (source instanceof IDebugTarget && event.getKind() == DebugEvent.TERMINATE) {
-                if (source.equals(fTarget)) {
-                    // Clean up if the debug target terminates without
-                    // hitting the breakpoint.
-                    cancel();
-                }
-            }
-        }
-        
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.IBreakpointManagerListener#breakpointManagerEnablementChanged(boolean)
-     */
-    public void breakpointManagerEnablementChanged(boolean enabled) {
-        // if the user changes the breakpoint manager enablement, don't restore it
-        fAutoSkip = false;
-    }
-    
-    private IBreakpointManager getBreakpointManager() {
-        return getDebugPlugin().getBreakpointManager();
-    }
-    
-    private DebugPlugin getDebugPlugin() {
-        return DebugPlugin.getDefault();
-    }
-    
-    /**
-     * Cancels the run to line operation.
-     */
-    public void cancel() {
-        IBreakpointManager manager = getBreakpointManager();
-        try {
-            getDebugPlugin().removeDebugEventListener(this);
-            manager.removeBreakpointManagerListener(this);
-            fTarget.breakpointRemoved(fBreakpoint, null);
-        } finally {
-            if (fAutoSkip) {
-                manager.setEnabled(true);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    public void run(IProgressMonitor monitor) throws CoreException {
-        getDebugPlugin().addDebugEventListener(this);
-        IBreakpointManager breakpointManager = getBreakpointManager();
-        fAutoSkip = DebugUITools.getPreferenceStore().getBoolean(IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE) && breakpointManager.isEnabled();
-        if (fAutoSkip) {
-            getBreakpointManager().setEnabled(false);
-            breakpointManager.addBreakpointManagerListener(this);
-        }
-        Job job = new Job(ActionMessages.RunToLineHandler_0) { 
-            protected IStatus run(IProgressMonitor jobMonitor) {
-                if (!jobMonitor.isCanceled()) {
-                    fTarget.breakpointAdded(fBreakpoint);
-                    try {
-                        fResumee.resume();
-                    } catch (DebugException e) {
-                        cancel();
-                        return e.getStatus();
-                    }
-                }
-                return Status.OK_STATUS;
-            }  
-        };
-        job.schedule();
-    }
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleBreakpointAction.java
deleted file mode 100644
index a1aa400..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleBreakpointAction.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Action to toggle a breakpoint in a vertical ruler of a workbench part
- * containing a document. The part must provide an <code>IToggleBreakpointsTarget</code>
- * adapter which may optionally be an instance of an
- * <code>IToggleBreakpointsTargetExtension</code>.
- * <p>
- * Clients may instantiate this class. This class is not intended to be subclassed.
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate
- */
-public class ToggleBreakpointAction extends Action implements IUpdate {
-	
-	private IWorkbenchPart fPart;
-	private IDocument fDocument;
-	private IVerticalRulerInfo fRulerInfo;
-
-	/**
-	 * Constructs a new action to toggle a breakpoint in the given
-	 * part containing the given document and ruler.
-	 * 
-	 * @param part the part in which to toggle the breakpoint - provides
-	 *  an <code>IToggleBreakpointsTarget</code> adapter
-	 * @param document the document breakpoints are being set in or 
-	 * <code>null</code> when the document should be derived from the
-	 * given part
-	 * @param rulerInfo specifies location the user has double-clicked 
-	 */
-	public ToggleBreakpointAction(IWorkbenchPart part, IDocument document, IVerticalRulerInfo rulerInfo) {
-		super(ActionMessages.ToggleBreakpointAction_0); 
-		fPart = part;
-		fDocument = document;
-		fRulerInfo = rulerInfo;
-	}
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		IDocument document= getDocument();
-		if (document == null) {
-			return;
-		}
-		IToggleBreakpointsTarget adapter = (IToggleBreakpointsTarget) fPart.getAdapter(IToggleBreakpointsTarget.class);
-		if (adapter == null) {
-			// attempt to force load adapter
-			IAdapterManager manager = Platform.getAdapterManager();
-			if (manager.hasAdapter(fPart, IToggleBreakpointsTarget.class.getName())) {
-				adapter = (IToggleBreakpointsTarget) manager.loadAdapter(fPart, IToggleBreakpointsTarget.class.getName());
-			}
-		}
-		if (adapter == null) {
-			return;
-		}
-		int line = fRulerInfo.getLineOfLastMouseButtonActivity();
-		
-		// Test if line is valid 
-		if (line == -1)
-			return;
-
-		/*
-		 * XXX: remove once the following bug is fixed:
-		 * 		https://bugs.eclipse.org/bugs/show_bug.cgi?id=99234
-		 */ 
-		if (line >= document.getNumberOfLines())
-			return;
-		
-		try {
-			IRegion region = document.getLineInformation(line);
-			ITextSelection selection = new TextSelection(document, region.getOffset(), 0);
-			if (adapter instanceof IToggleBreakpointsTargetExtension) {
-				IToggleBreakpointsTargetExtension extension = (IToggleBreakpointsTargetExtension) adapter;
-				if (extension.canToggleBreakpoints(fPart, selection)) {
-					extension.toggleBreakpoints(fPart, selection);
-					return;
-				}
-			}
-			if (adapter.canToggleLineBreakpoints(fPart, selection)) {
-				adapter.toggleLineBreakpoints(fPart, selection);
-			} else if (adapter.canToggleWatchpoints(fPart, selection)) {
-				adapter.toggleWatchpoints(fPart, selection);
-			} else if (adapter.canToggleMethodBreakpoints(fPart, selection)) {
-				adapter.toggleMethodBreakpoints(fPart, selection);
-			}
-		} catch (BadLocationException e) {
-			reportException(e);
-		} catch (CoreException e) {
-			reportException(e);
-		}
-	}
-	
-	/**
-	 * Report an error to the user.
-	 * 
-	 * @param e underlying exception
-	 */
-	private void reportException(Exception e) {
-		DebugUIPlugin.errorDialog(fPart.getSite().getShell(), ActionMessages.ToggleBreakpointAction_1, ActionMessages.ToggleBreakpointAction_2, e); // 
-	}
-	
-	/**
-	 * Disposes this action. Clients must call this method when
-	 * this action is no longer needed.
-	 */
-	public void dispose() {
-		fDocument = null;
-		fPart = null;
-		fRulerInfo = null;
-	}
-
-	/**
-	 * Returns the document on which this action operates.
-	 * 
-	 * @return the document or <code>null</code> if none
-	 */
-	private IDocument getDocument() {
-		if (fDocument != null)
-			return fDocument;
-		
-		if (fPart instanceof ITextEditor) {
-			ITextEditor editor= (ITextEditor)fPart;
-			IDocumentProvider provider = editor.getDocumentProvider();
-			if (provider != null)
-				return provider.getDocument(editor.getEditorInput());
-		}
-		
-		IDocument doc = (IDocument) fPart.getAdapter(IDocument.class);
-		if (doc != null) {
-			return doc;
-		}
-		
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		IDocument document= getDocument();
-		if (document != null) {
-			IToggleBreakpointsTarget adapter = (IToggleBreakpointsTarget) fPart.getAdapter(IToggleBreakpointsTarget.class);
-			if (adapter == null) {
-				// attempt to force load adapter
-				IAdapterManager manager = Platform.getAdapterManager();
-				if (manager.hasAdapter(fPart, IToggleBreakpointsTarget.class.getName())) {
-					adapter = (IToggleBreakpointsTarget) manager.loadAdapter(fPart, IToggleBreakpointsTarget.class.getName());
-				}
-			}
-			if (adapter != null) {
-				int line = fRulerInfo.getLineOfLastMouseButtonActivity();
-				/*
-				 * XXX: remove once the following bug is fixed:
-				 * 		https://bugs.eclipse.org/bugs/show_bug.cgi?id=99234
-				 */ 
-				if (line > -1 & line < document.getNumberOfLines()) {
-					try {
-						IRegion region = document.getLineInformation(line);
-						ITextSelection selection = new TextSelection(document, region.getOffset(), 0);
-						if (adapter instanceof IToggleBreakpointsTargetExtension) {
-							IToggleBreakpointsTargetExtension extension = (IToggleBreakpointsTargetExtension) adapter;
-							if (extension.canToggleBreakpoints(fPart, selection)) {
-								setEnabled(true);
-								return;
-							}
-						}
-						if (adapter.canToggleLineBreakpoints(fPart, selection) |
-							adapter.canToggleWatchpoints(fPart, selection) |
-							adapter.canToggleMethodBreakpoints(fPart, selection)) {
-								setEnabled(true);
-								return;
-						}
-					} catch (BadLocationException e) {
-						reportException(e);
-					}
-				}
-			}
-		}
-		setEnabled(false);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleMethodBreakpointActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleMethodBreakpointActionDelegate.java
deleted file mode 100644
index 59c9c9b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleMethodBreakpointActionDelegate.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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.actions.breakpoints.ToggleBreakpointObjectActionDelegate;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * A toggle method breakpoint action that can be contributed an object
- * contribution. The action will toggle method breakpoints on objects
- * that provide an <code>IToggleBreakpointsTarget</code> adapter.
- * <p>
- * Clients may reference/contribute this class as an object contribution
- * action delegate in plug-in XML. This class is not intended to be
- * subclassed.
- * </p>
- * @since 3.0
- */
-public class ToggleMethodBreakpointActionDelegate extends ToggleBreakpointObjectActionDelegate {
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.ToggleBreakpointObjectActionDelegate#performAction(org.eclipse.debug.internal.ui.actions.IToggleBreakpointsTarget, org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	protected void performAction(IToggleBreakpointsTarget target, IWorkbenchPart part, ISelection selection) throws CoreException {
-		target.toggleMethodBreakpoints(part, selection);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleWatchpointActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleWatchpointActionDelegate.java
deleted file mode 100644
index 0c765f5..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/ToggleWatchpointActionDelegate.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.debug.ui.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.actions.breakpoints.ToggleBreakpointObjectActionDelegate;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * A toggle watchpoint action that can be contributed an object
- * contribution. The action will toggle watchpoints on objects
- * that provide an <code>IToggleBreakpointsTarget</code> adapter.
- * <p>
- * Clients may reference/contribute this class as an object contribution
- * action delegate in plug-in XML. This class is not intended to be
- * subclassed.
- * </p>
- * @since 3.0
- */
-public class ToggleWatchpointActionDelegate extends ToggleBreakpointObjectActionDelegate {
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.ToggleBreakpointObjectActionDelegate#performAction(org.eclipse.debug.internal.ui.actions.IToggleBreakpointsTarget, org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	protected void performAction(IToggleBreakpointsTarget target, IWorkbenchPart part, ISelection selection) throws CoreException {
-		target.toggleWatchpoints(part, selection);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/package.html b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/package.html
deleted file mode 100644
index ea275ff..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/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">
-<title>Debug UI Actions</title>
-</head>
-
-<body link="#0000FF" vlink="#800080">
-
-<p align="left">Provides a set of actions related to running and debugging applications.</p>
-
-<h2 align="left">Package Specification</h2>
-
-<p>This package provides a set of actions related to running and debugging applications.</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/ConsoleColorProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/ConsoleColorProvider.java
deleted file mode 100644
index 27ca96d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/ConsoleColorProvider.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.debug.ui.console;
-
-
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * Default console color provider for a process. Colors output to standard
- * out, in, and error, as specified by user preferences.
- * <p>
- * Clients implementing a console color provider should subclass this class.
- * </p>
- * @since 2.1
- */
-public class ConsoleColorProvider implements IConsoleColorProvider {
-
-	private IProcess fProcess;
-	private IConsole fConsole;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#connect(org.eclipse.debug.core.model.IProcess, org.eclipse.debug.ui.console.IConsole)
-	 */
-	public void connect(IProcess process, IConsole console) {
-		fProcess = process;
-		fConsole = console;
-		IStreamsProxy streamsProxy = fProcess.getStreamsProxy();
-		if (streamsProxy != null) { 
-			fConsole.connect(streamsProxy);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#disconnect()
-	 */
-	public void disconnect() {
-		fConsole = null;
-		fProcess = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#isReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return fProcess == null || fProcess.isTerminated();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleColorProvider#getColor(java.lang.String)
-	 */
-	public Color getColor(String streamIdentifer) {
-		if (IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM.equals(streamIdentifer)) {
-			return DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR);
-		}
-		if (IDebugUIConstants.ID_STANDARD_ERROR_STREAM.equals(streamIdentifer)) {
-			return DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR);
-		}		
-		if (IDebugUIConstants.ID_STANDARD_INPUT_STREAM.equals(streamIdentifer)) {
-			return DebugUIPlugin.getPreferenceColor(IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR);
-		}		
-		return null;
-	}
-
-	/**
-	 * Returns the process this color provider is providing color for, or
-	 * <code>null</code> if none.
-	 * 
-	 * @return the process this color provider is providing color for, or
-	 * <code>null</code> if none
-	 */
-	protected IProcess getProcess() {
-		return fProcess;
-	}
-	
-	/**
-	 * Returns the console this color provider is connected to, or
-	 * <code>null</code> if none.
-	 * 
-	 * @return IConsole the console this color provider is connected to, or
-	 * <code>null</code> if none
-	 */
-	protected IConsole getConsole() {
-		return fConsole;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
deleted file mode 100644
index c81124c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
+++ /dev/null
@@ -1,159 +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.debug.ui.console;
-
-
-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.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * A hyperlink that opens a file in a text editor and selects a range of text.
- * This hyperlink action will un-zoom the workbench as needed to show the editor
- * for the associated link.
- * <p>
- * This class is not intended to be subclassed; clients may instantiate this
- * class.
- * </p>
- * @since 2.1
- */
-public class FileLink implements IConsoleHyperlink {
-
-	private IFile fFile;
-	private int fFileOffset;
-	private int fFileLength;
-	private int fFileLineNumber;
-	private String fEditorId;
-	
-	/**
-	 * Constructs a hyperlink to the specified file.
-	 * 
-	 * @param file the file to open when activated
-	 * @param editorId the identifier of the editor to open the file in, or
-	 * <code>null</code> if the default editor should be used
-	 * @param fileOffset the offset in the file to select when activated, or -1
-	 * @param fileLength the length of text to select in the file when activated
-	 * or -1
-	 * @param fileLineNumber the line number to select in the file when
-	 * activated, or -1
-	 */
-	public FileLink(IFile file, String editorId, int fileOffset, int fileLength, int fileLineNumber) {
-		fFile = file;
-		fFileOffset = fileOffset;
-		fFileLength = fileLength;
-		fFileLineNumber = fileLineNumber;
-		fEditorId = editorId;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleHyperlink#linkActivated()
-	 */
-	public void linkActivated() {
-		IWorkbenchWindow window = DebugUIPlugin.getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				try {
-					IEditorPart editorPart = page.openEditor(new FileEditorInput(fFile), getEditorId() , true);
-					if (fFileLineNumber > 0) {
-						ITextEditor textEditor = null;
-						if (editorPart instanceof ITextEditor) {
-							textEditor = (ITextEditor) editorPart;
-						} else {
-							textEditor = (ITextEditor) editorPart.getAdapter(ITextEditor.class);
-						}
-						if (textEditor != null) {
-							IEditorInput input = editorPart.getEditorInput();
-							if (fFileOffset < 0) {
-								IDocumentProvider provider = textEditor.getDocumentProvider();
-								try {
-									provider.connect(input);
-								} catch (CoreException e) {
-									// unable to link
-									DebugUIPlugin.log(e);
-									return;
-								}
-								IDocument document = provider.getDocument(input);
-								try {
-	                                IRegion region= document.getLineInformation(fFileLineNumber - 1);
-									fFileOffset = region.getOffset();
-									fFileLength = region.getLength();
-								} catch (BadLocationException e) {
-									// unable to link
-									DebugUIPlugin.log(e);
-								}
-								provider.disconnect(input);
-							}
-							if (fFileOffset >= 0 && fFileLength >=0) {
-								textEditor.selectAndReveal(fFileOffset, fFileLength);
-							}
-						}
-					}
-				} catch (PartInitException e) {
-					DebugUIPlugin.log(e);
-				}	
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleHyperlink#linkEntered()
-	 */
-	public void linkEntered() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsoleHyperlink#linkExited()
-	 */
-	public void linkExited() {
-	}
-	
-	private String getEditorId() {
-		if (fEditorId == null) {
-			IWorkbench workbench= DebugUIPlugin.getDefault().getWorkbench();
-			// If there is a registered editor for the file use it.
-			IEditorDescriptor desc = workbench.getEditorRegistry().getDefaultEditor(fFile.getName(), getFileContentType());
-			if (desc == null) {
-				//default editor
-				desc= workbench.getEditorRegistry().findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-			}
-			fEditorId= desc.getId();
-		}
-		return fEditorId;
-	}
-
-    private IContentType getFileContentType() {
-        try {
-            IContentDescription description= fFile.getContentDescription();
-            if (description != null) {
-                return description.getContentType();
-            }
-        } catch (CoreException e) {
-        }
-        return null;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.java
deleted file mode 100644
index daf2649..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.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.debug.ui.console;
-
-
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.ui.console.IHyperlink;
-import org.eclipse.ui.console.IOConsoleOutputStream;
-import org.eclipse.ui.console.IPatternMatchListener;
-
-/**
- * A console that displays output and writes input to a process. Implementors of
- * <code>IConsoleColorProvider</code> should connect streams to a console
- * document when connected to.
- * <p>
- * Clients are <b>not</b> intended to implement this interface.
- * </p>
- * @see org.eclipse.debug.ui.console.IConsoleColorProvider
- * @since 2.1
- */
-public interface IConsole {
-
-	/**
-	 * Connects this console to the given streams proxy. This associates the
-	 * standard in, out, and error streams with the console. Keyboard input will
-	 * be written to the given proxy.
-	 * 
-	 * @param streamsProxy
-	 */
-	public void connect(IStreamsProxy streamsProxy);
-	
-	/**
-	 * Connects this console to the given stream monitor, uniquely identified by
-	 * the given identifier. This allows for more than the standard (in, out,
-	 * error) streams to be connected to the console.
-	 * 
-	 * @param streamMonitor
-	 * @param streamIdentifer
-	 */
-	public void connect(IStreamMonitor streamMonitor, String streamIdentifer);
-	
-	/**
-	 * Adds the given hyperlink to this console. The link will be notified when
-	 * entered, exited, and activated.
-	 * <p>
-	 * If the link's region (offset/length) is within the console's document
-	 * current bounds, it is added immediately. Otherwise, the link is added
-	 * when the console's document grows to contain the link's region.
-	 * </p>
-	 * @param link the hyperlink to add 
-	 * @param offset the character offset within the console document where the
-	 * text associated with the hyperlink begins
-	 * @param length the length of the associated hyperlink text
-	 * @deprecated replaced with addLink(IHyperlink link, int offset, int length)
-	 */
-	public void addLink(IConsoleHyperlink link, int offset, int length);
-
-	/**
-	 * Adds the given hyperlink to this console. The link will be notified when
-	 * entered, exited, and activated.
-	 * <p>
-	 * If the link's region (offset/length) is within the console's document
-	 * current bounds, it is added immediately. Otherwise, the link is added
-	 * when the console's document grows to contain the link's region.
-	 * </p>
-	 * @param link the hyperlink to add 
-	 * @param offset the character offset within the console document where the
-	 * text associated with the hyperlink begins
-	 * @param length the length of the associated hyperlink text
-	 * @since 3.1
-	 */
-	public void addLink(IHyperlink link, int offset, int length);
-	
-	/**
-	 * Returns the region of text associated with the given hyperlink, or
-	 * <code>null</code> if the given hyperlink is not contained in this
-	 * console.
-	 * 
-	 * @param link a console hyperlink
-	 * @return region of text associated with the hyperlink, or <code>null</code>
-	 * @deprecated replaced with getRegion(IHyperlink link) instead
-	 */
-	public IRegion getRegion(IConsoleHyperlink link);
-
-	/**
-	 * Returns the region of text associated with the given hyperlink, or
-	 * <code>null</code> if the given hyperlink is not contained in this
-	 * console.
-	 * 
-	 * @param link a console hyperlink
-	 * @return region of text associated with the hyperlink, or <code>null</code>
-	 * @since 3.1
-	 */
-	public IRegion getRegion(IHyperlink link);
-	
-	/**
-	 * Returns the document associated with this console.
-	 * 
-	 * @return document
-	 */
-	public IDocument getDocument(); 
-	
-	/**
-	 * Returns the process associated with this console.
-	 * 
-	 * @return the process associated with this console
-	 */
-	public IProcess getProcess();
-	
-	/**
-	 * Adds the given pattern match listener to this console. The listener will
-     * be connected and receive match notifications.
-	 * @param matchListener the listener to add
-	 * @since 3.1
-	 */
-	public void addPatternMatchListener(IPatternMatchListener matchListener);
-	
-    /**
-     * Removes the given pattern match listener from this console. The listener will be
-     * disconnected and will no longer receive match notifications. 
-     * @param matchListener the pattern match listener to remove.
-     * @since 3.1
-     */
-	public void removePatternMatchListener(IPatternMatchListener matchListener);
-	
-	/**
-	 * Returns the stream associated with the specified stream identifier.
-     * @param streamIdentifier Uniquely identifies the required stream 
-     * @return The stream or <code>null</code> if none found with matching streamIdentifier
-     * @since 3.1
-     */
-	public IOConsoleOutputStream getStream(String streamIdentifier);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleColorProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleColorProvider.java
deleted file mode 100644
index aa81dd7..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleColorProvider.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.debug.ui.console;
-
-
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * Provides coloring for a console document. When a process is added to a
- * registered launch the debug plug-in creates a console document for the
- * process. By default, a document is created which is connected to the standard
- * input, output, and error streams associated with the process. A client may
- * override the default coloring by specifying a custom content provider for a
- * process type. A process type is defined via the process attribute
- * <code>IProcess. ATTR_PROCESS_TYPE</code>.
- * <p>
- * A console color provider extension is defined in <code>plugin.xml</code>.
- * Following is an example definition of a console color
- * provider extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.consoleColorProviders"&gt;
- *   &lt;consoleColorProvider 
- *      id="com.example.ExampleConsoleColorProvider"
- *      class="com.example.ExampleConsoleColorProviderClass"
- *      processType="ExampleProcessType"&gt;
- *   &lt;/consoleColorProvider&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this color provider.</li>
- * <li><code>class</code> specifies a fully qualified name of a Java class
- *  that implements <code>IConsoleColorProvider</code>.</li>
- * <li><code>processType</code> specifies the identifier of the process type
- * this content provider is associated with (which corresponds to the
- * <code>ATTR_PROCESS_TYPE</code> attribute on a process).</li>
- * </ul>
- * </p> 
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 2.1
- */
-
-public interface IConsoleColorProvider {
-
-	/**
-	 * Returns whether the console associated with this color provider's
-	 * process can currently accept keyboard input. This attribute is dynamic
-	 * and may change over the lifetime of a process/document.
-	 * 
-	 * @return whether the console associated with this color provider's
-	 * process can currently accept keyboard input
-	 */
-	public boolean isReadOnly();
-	
-	/**
-	 * Returns the color to draw output associated with the given stream.
-	 * 
-	 * @param streamIdentifer the identifier of the stream
-	 * @return Color
-	 */
-	public Color getColor(String streamIdentifer);
-	
-	/**
-	 * Connects this color provider to the given process and console.
-	 * This color provider should connect its streams to the given console
-	 * document.
-	 * 
-	 * @param process the process to connect this color provider to
-	 * @param console the console  to connect this color provider to
-	 */
-	public void connect(IProcess process, IConsole console);
-	
-	/**
-	 * Disconnects this color provider.
-	 */
-	public void disconnect();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.java
deleted file mode 100644
index b735fac..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.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.debug.ui.console;
-
-import org.eclipse.ui.console.IHyperlink;
-
-
-/**
- * A hyperlink in the console. Link behavior is implementation dependent.
- * <p>
- * Clients may implement this interface.
- * </p>
- * <p>
- * Since 3.1, this interface now extends {@link org.eclipse.ui.console.IHyperlink}.
- * </p>
- * @since 2.1
- * @deprecated replaced by org.eclipse.ui.console.IHyperlink
- */
-public interface IConsoleHyperlink extends IHyperlink {
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleLineTracker.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleLineTracker.java
deleted file mode 100644
index a518818..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleLineTracker.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.console;
-
-
-import org.eclipse.jface.text.IRegion;
-
-/**
- * Notified of lines appended to the console. A line tracker is defined in
- * <code>plugin.xml</code>. A line tracker is associated with a type of
- * process. Following is an example definition of a console line tracker
- * extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.consoleLineTrackers"&gt;
- *   &lt;consoleLineTracker 
- *      id="com.example.ExampleConsoleLineTracker"
- *      class="com.example.ExampleConsoleLineTrackerClass"
- *      processType="ExampleProcessType"&gt;
- *   &lt;/consoleLineTracker&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for this line tracker.</li>
- * <li><code>class</code> specifies a fully qualified name of a Java class
- *  that implements <code>IConsoleLineTracker</code>.</li>
- * <li><code>processType</code> specifies the identifier of the process type
- * this line tracker is associated with (which corresponds to the
- * <code>ATTR_PROCESS_TYPE</code> attribute on a process).</li>
- * </ul>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 2.1
- */
-public interface IConsoleLineTracker {
-	
-	/**
-	 * Notification that a console document has been created for which this
-	 * listener is registered. 
-	 *  
-	 * @param console console that has been created
-	 */
-	public void init(IConsole console);
-
-	/**
-	 * Notification that a line of text has been appended to the console. The
-	 * given region describes the offset and length of the line appended to the
-	 * console, excluding the line delimiter.
-	 * 
-	 * @param line region describing the offset and length of line appended to
-	 * the console, excluding the line delimiter
-	 */
-	public void lineAppended(IRegion line);
-	
-	/**
-	 * Disposes this console line tracker. 
-	 */
-	public void dispose();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleLineTrackerExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleLineTrackerExtension.java
deleted file mode 100644
index e8c61ad..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleLineTrackerExtension.java
+++ /dev/null
@@ -1,29 +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.debug.ui.console;
-
-/**
- * An extension to the console line tracker interface that console line
- * trackers may implement to be notified when output from the console is complete.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IConsoleLineTrackerExtension extends IConsoleLineTracker {
-	
-	/**
-	 * Notification that all output streams connected to the console have been
-	 * closed. No more lines will be appended after this method is called.
-	 */
-	public void consoleClosed();
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/package.html b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/package.html
deleted file mode 100644
index 1e27d95..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/package.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<title>Debug Console</title>
-</head>
-
-<body link="#0000FF" vlink="#800080">
-
-<p align="left">Provides a set of interfaces and classes for rendering and annotating text in the debug console.</p>
-
-<h2 align="left">Package Specification</h2>
-
-<p>This package provides a set interfaces and classses for coloring streams of 
-  text, parsing output, and creating hyperlinks in the debug console.</p>
-<h3>Coloring Console Output</h3>
-<p>A process may have standard input, output, and error streams associated with, 
-  as defined by <b>org.eclipse.debug.core.model.IProcess</b> 
-  and <b>org.eclipse.debug.core.model.IStreamsProxy</b>. 
-  When a process is registered with the debug plug-in, a document is created to 
-  display the output of that process, and to provide input to the process via 
-  the keyboard. A console document is displayed in the Console View. By default, 
-  the output, error, and input streams are rendered in colors specified by user 
-  preferences.</p>
-<p>A client can specialize coloring for a process's streams by defining an <b>IConsoleColorProvider</b> 
-  extension (using the <b>org.eclipse.debug.ui.consoleColorProviders</b> 
-  extension point). A console color provider is defined for a <i>type</i> of process. 
-  A process type is defined by the creator of a process, and is specified on an 
-  <b>IProcess</b> via the <b>ATTR_PROCESS_TYPE</b> 
-  attribute. When a process is registered with the debug plug-in, a console color 
-  provider associated with the process type is instantiated, and connected to 
-  the process (<b>IProcess</b>) and a 
-  console (<b>IConsole</b>). The console 
-  color provider then connects its streams to the console (<b>IConsole</b>), 
-  via the console methods <b>connect(IStreamsProxy)</b> 
-  and <b>connect(IStreamMonitor, String)</b>. 
-  The color provider will then be consulted to provide a color when the console 
-  needs to render output from a stream.</p>
-<h3>Parsing Console Output</h3>
-<p>A client can be notified of output appended to a process's console document, 
-  by defining an <b>IConsoleLineTracker</b> 
-  extension (using the <b>org.eclipse.debug.ui.consoleLineTrackers</b> 
-  extension point). A console line tracker is defined for a <i>type</i> of process. 
-  When a process is registered with the debug plug-in, a console document is created 
-  for that process, and output is appended to that document. As output is written 
-  to the document, each console line tracker extension defined for that process 
-  type is notified of output, line by line. This support is most commonly used 
-  to annotate output with hyperlinks.</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/AbstractDebugContextProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/AbstractDebugContextProvider.java
deleted file mode 100644
index ec983e3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/AbstractDebugContextProvider.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.contexts;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Abstract implementation of a debug context provider.
- * <p>
- * Clients implementing context providers should subclass this class.
- * </p>
- * @since 3.3
- */
-public abstract class AbstractDebugContextProvider implements IDebugContextProvider {
-	
-	/**
-	 * Event listeners
-	 */
-	private ListenerList fListeners = new ListenerList();
-	
-	/**
-	 * Part or <code>null</code>
-	 */
-	private IWorkbenchPart fPart;
-	
-	/**
-	 * Constructs a context provider for the specified part, possibly <code>null</code>.
-	 * 
-	 * @param part workbench part or <code>null</code>
-	 */
-	public AbstractDebugContextProvider(IWorkbenchPart part) {
-		fPart = part;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextProvider#addDebugContextEventListener(org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextEventListener)
-	 */
-	public void addDebugContextListener(IDebugContextListener listener) {
-		fListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextProvider#getPart()
-	 */
-	public IWorkbenchPart getPart() {
-		return fPart;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextProvider#removeDebugContextEventListener(org.eclipse.debug.internal.ui.contexts.provisional.IDebugContextEventListener)
-	 */
-	public void removeDebugContextListener(IDebugContextListener listener) {
-		fListeners.remove(listener);
-	}
-
-	/**
-	 * Fires the given context event to all registered listeners.
-	 * 
-	 * @param event debug context event
-	 */
-	protected void fire(final DebugContextEvent event) {
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final IDebugContextListener listener = (IDebugContextListener) listeners[i];
-            SafeRunner.run(new ISafeRunnable() {
-				public void run() throws Exception {
-					listener.debugContextChanged(event);
-				}
-				public void handleException(Throwable exception) {
-					DebugUIPlugin.log(exception);
-				}
-			});
-			
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/DebugContextEvent.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/DebugContextEvent.java
deleted file mode 100644
index 23846b1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/DebugContextEvent.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.debug.ui.contexts;
-
-import java.util.EventObject;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * A debug context event. Debug context events are generated by debug context
- * providers. A debug context is represented by a selection and flags
- * (bit mask) describing how the context has changed.
- * <p>
- * Clients may instantiate this class; not intended to be subclassed.
- * </p>
- * @see IDebugContextListener
- * @see IDebugContextProvider
- * @since 3.3
- */
-public class DebugContextEvent extends EventObject {
-
-	/**
-	 * The context
-	 */
-	private ISelection fContext;
-	
-	/**
-	 * Change flags.
-	 */
-	private int fFlags;
-	
-	/**
-	 * Change constant (bit mask) indicating a context has been activated.
-	 */
-	public static final int ACTIVATED = 0x01;
-	
-	/**
-	 * Change constant (bit mask) indicating the state of a context has changed.
-	 * State changes are only broadcast for previously activated contexts.
-	 */
-	public static final int STATE = 0x10;	
-
-	/**
-     * Generated serial version UID for this class.
-     */
-	private static final long serialVersionUID = 3395172504615255524L;
-
-	/**
-	 * Constructs a new debug context event.
-	 * 
-	 * @param source source of the event - a debug context provider
-	 * @param context the relevant context
-	 * @param flags bit mask indicating how the context has changed - see change constants
-	 * 	defined in this class
-	 */
-	public DebugContextEvent(IDebugContextProvider source, ISelection context, int flags) {
-		super(source);
-		fContext = context;
-		fFlags = flags;
-	}
-	
-	/**
-	 * Returns the debug context associated with this event.
-	 * 
-	 * @return debug context, possible an empty selection
-	 */
-	public ISelection getContext() {
-		return fContext;
-	}
-	
-	/**
-	 * Returns flags which describe in more detail how a context has changed.
-	 * See change constants defined in this class.
-	 * 
-	 * @return event flags
-	 */
-	public int getFlags() {
-		return fFlags;
-	}
-	
-	/**
-	 * Returns the context provider that initiated this event.
-	 * 
-	 * @return context provider
-	 */
-	public IDebugContextProvider getDebugContextProvider() {
-		return (IDebugContextProvider) getSource();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextListener.java
deleted file mode 100644
index c55cfc8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextListener.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.debug.ui.contexts;
-
-
-/**
- * A debug context listener is notified of debug context events.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see DebugContextEvent
- * @see IDebugContextManager
- * @see IDebugContextService
- * @see IDebugContextProvider
- * @since 3.3
- */
-public interface IDebugContextListener {
-	
-	/**
-	 * Notification the debug context has changed as specified by the given event.
-	 * 
-	 * @param event debug context event
-	 */
-	public void debugContextChanged(DebugContextEvent event);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextManager.java
deleted file mode 100644
index dbf6edc..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextManager.java
+++ /dev/null
@@ -1,56 +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.debug.ui.contexts;
-
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Manages debug context services. There is a debug context service
- * for each workbench window. Clients interested in context change
- * notification for all windows can register with the manager. Clients
- * interested in context change notification for a specific window
- * can register with the context service specific to that window.
- * <p>
- * Clients register debug context providers with a context service - i.e.
- * for a specific window.
- * </p>
- * <p>
- * Not intended to be implemented by clients.
- * </p> 
- * @see IDebugContextProvider
- * @see IDebugContextListener
- * @see IDebugContextService
- * @since 3.3
- */
-public interface IDebugContextManager {		
-	
-	/**
-	 * Registers the given listener for debug context notification in all windows.
-	 * 
-	 * @param listener debug context listener
-	 */	
-	public void addDebugContextListener(IDebugContextListener listener);
-	
-	/**
-	 * Unregisters the given listener for context notification in all windows.
-	 * 
-	 * @param listener debug context listener
-	 */	
-	public void removeDebugContextListener(IDebugContextListener listener);
-	
-	/**
-	 * Returns the debug context service for the specified window.
-	 * 
-	 * @param window workbench window
-	 * @return debug context service
-	 */
-	public IDebugContextService getContextService(IWorkbenchWindow window);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextProvider.java
deleted file mode 100644
index f8a22f6..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextProvider.java
+++ /dev/null
@@ -1,72 +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.debug.ui.contexts;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Interface common to all objects that provide a debug context. A context provider
- * is registered with a debug context service associated with a specific window.  
- * <p>
- * A context provider can provide context information for a specific workbench part.
- * There can only be one context provider registered per part with a context
- * service. When there is more than one context provider per window, the context provider
- * associated with the most recently active part provides the context for that window.
- * </p>
- * <p>
- * A context provider does not have to be associated with a part. In this case the provider
- * specifies <code>null</code> for its part, and provides context information for the window.
- * There can only be one context provider without an associated part registered per context
- * service (i.e. per window). A context provider that provides context without an associated 
- * part is only active (i.e. used to provide context information) when there are no other
- * context providers with associated parts registered with that service. 
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see IDebugContextManager
- * @see IDebugContextService
- * @see IDebugContextListener
- * @since 3.3
- */
-public interface IDebugContextProvider {
-	
-	/**
-	 * Returns the part associated with this context provider or <code>null</code>
-	 * if none.
-	 * 
-	 * @return part associated with this context provider or <code>null</code>
-	 */
-	public IWorkbenchPart getPart();
-	
-    /**
-     * Registers the given listener for debug context events.
-     * 
-     * @param listener event listener
-     */
-	public void addDebugContextListener(IDebugContextListener listener);
-    
-    /**
-     * Unregisters the given listener for debug context events.
-     * 
-     * @param listener event listener
-     */
-	public void removeDebugContextListener(IDebugContextListener listener);
-	
-    /**
-     * Returns the currently active context, possibly empty or <code>null</code>.
-     * 
-     * @return active context, possibly empty or <code>null</code>.
-     */
-	public ISelection getActiveContext();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextService.java
deleted file mode 100644
index 9486569..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/IDebugContextService.java
+++ /dev/null
@@ -1,128 +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.debug.ui.contexts;
-
-import org.eclipse.jface.viewers.ISelection;
-
-
-/** 
- * Debug context service for a window. Clients may register for debug context
- * notification with this service. A context service is obtained from the
- * debug context manager.
- * <p>
- * Not intended to be implemented by clients.
- * </p>
- * @see IDebugContextManager
- * @since 3.3
- */
-public interface IDebugContextService {
-	
-	/**
-	 * Registers for the given listener for debug context change notification
-	 * in this service's window.
-	 * 
-	 * @param listener debug context listener
-	 */
-	public void addDebugContextListener(IDebugContextListener listener);
-	/**
-	 * Unregisters for the given listener for debug context change notification
-	 * in this service's window.
-	 * 
-	 * @param listener debug context listener
-	 */	
-	public void removeDebugContextListener(IDebugContextListener listener);
-	
-	/**
-	 * Registers for the given debug context listener for context notification
-	 * from the specified part in this service's window.
-	 * 
-	 * @param listener debug context listener
-	 * @param partId part identifier
-	 */
-	public void addDebugContextListener(IDebugContextListener listener, String partId);
-	
-	/**
-	 * Unregisters the given debug context listener for context change notification
-	 * from the specified part in this service's window.
-	 * 
-	 * @param listener debug context listener
-	 * @param partId part identifier
-	 */
-	public void removeDebugContextListener(IDebugContextListener listener, String partId);
-		
-	/**
-	 * Returns the active context in this service's window
-	 * or <code>null</code>.
-	 * 
-	 * @return active context or <code>null</code>
-	 */
-	public ISelection getActiveContext();
-	
-	/**
-	 * Returns the active context in the specified part of this service's window
-	 * or <code>null</code> if none.
-	 * 
-	 * @param partId part identifier
-	 * @return active context or <code>null</code>
-	 */
-	public ISelection getActiveContext(String partId);
-	
-	/**
-	 * Registers the given debug context listener for post context change notification
-	 * in this service's window. Post listeners are notified of context changes after all
-	 * non-post listeners are notified.  
-	 * 
-	 * @param listener debug context listener
-	 */
-	public void addPostDebugContextListener(IDebugContextListener listener);
-	
-	/**
-	 * Unregisters the given debug context listener for post context change notification
-	 * in this service's window.
-	 * 
-	 * @param listener debug context listener.
-	 */	
-	public void removePostDebugContextListener(IDebugContextListener listener);
-	
-	/**
-	 * Registers the given debug context listener for post context change notification
-	 * in the specified part of this service's window. Post listeners are notified of
-	 * context changes after all non-post listeners are notified. 
-	 * 
-	 * @param listener debug context listener
-	 * @param partId part identifier
-	 */
-	public void addPostDebugContextListener(IDebugContextListener listener, String partId);
-	
-	/**
-	 * Unregisters the given debug context listener for post context change notification
-	 * in the specified part of this service's window.
-	 * 
-	 * @param listener debug context listener
-	 * @param partId part identifier
-	 */
-	public void removePostDebugContextListener(IDebugContextListener listener, String partId);
-	
-	/**
-	 * Registers the given debug context provider with this service.
-	 * 
-	 * @param provider debug context provider
-	 */
-	public void addDebugContextProvider(IDebugContextProvider provider);
-	
-	/**
-	 * Unregisters the given debug context provider from this service.
-	 * 
-	 * @param provider debug context provider
-	 */
-	public void removeDebugContextProvider(IDebugContextProvider provider);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/ISuspendTrigger.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/ISuspendTrigger.java
deleted file mode 100644
index 02477bf..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/ISuspendTrigger.java
+++ /dev/null
@@ -1,58 +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.debug.ui.contexts;
-
-/**
- * A suspend trigger notifies listeners when a launch suspends at a context
- * where debugging should begin. For example, when a breakpoint is encountered.
- * <p>
- * The debug platform retrieves a suspend trigger from each registered launch
- * and listens to suspend notifications in order to initiate debug sessions - i.e.
- * switch to the desired perspective, activate the debug view, etc., based on user
- * preferences. The debug platform asks each registered launch for its suspend
- * trigger adapter or registers with the launch itself if it implements
- * <code>ISuspendTrigger</code>.
- * </p>  
- * <p>
- * It is important that the same instance of a suspend trigger adapter is
- * returned each time it is asked for the same object, such that listeners
- * can be added and removed from the same instance. When a listener is removed
- * and no more listeners are registered, this trigger can be disposed or replaced
- * with a new adapter the next time one is requested. 
- * </p>
- * <p>
- * Clients may implement this interface. The debug platform provides a suspend trigger
- * adapter for implementations of <code>ILaunch</code>. The implementation provided by 
- * the platform is based on a standard debug model that fires debug events. Clients
- * wishing to provide their own implementation must also provide their own implementation
- * of <code>ILaunch</code> (or subclass of <code>Launch</code>), in order to register
- * their suspend trigger adapter.
- * </p>
- * @see ISuspendTriggerListener
- * @since 3.3
- */
-public interface ISuspendTrigger {
-	
-    /**
-     * Registers the given listener for suspend notifications.
-     * 
-     * @param listener suspend listener
-     */
-	public void addSuspendTriggerListener(ISuspendTriggerListener listener);
-    
-    /**
-     * Unregisters the given listener for suspend notifications.
-     * 
-     * @param listener suspend listener
-     */
-	public void removeSuspendTriggerListener(ISuspendTriggerListener listener);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/ISuspendTriggerListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/ISuspendTriggerListener.java
deleted file mode 100644
index ebedd31..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/ISuspendTriggerListener.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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.contexts;
-
-import org.eclipse.debug.core.ILaunch;
-
-/**
- * Listeners are notified when a launch has suspended at a context
- * where debugging should begin. For example, in a stack frame where
- * a breakpoint has been encountered.
- * <p>
- * Clients are not intended to implement this interface. Generally, clients
- * implement <code>ISuspendTrigger</code> and the debug platform registers
- * as a suspend trigger listener.
- * </p>
- * @see ISuspendTrigger
- * @since 3.3
- */
-public interface ISuspendTriggerListener {
-	
-	/**
-	 * Notification the given launch has suspended at the
-	 * specified context.
-	 * 
-	 * @param launch
-	 * @param context
-	 */
-	public void suspended(ILaunch launch, Object context);
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/package.html b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/package.html
deleted file mode 100644
index a0cecec..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/contexts/package.html
+++ /dev/null
@@ -1,50 +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>Debug Contexts</title>
-</head>
-
-<body link="#0000FF" vlink="#800080">
-
-<p align="left">Provides a set of interfaces and classes for debug context management.</p>
-
-<h2 align="left">Package Specification</h2>
-
-<p>This package provides a set interfaces and classes to manage debug contexts.</p>
-<p>A debug context represents an active state of a program being debugged. The 
-  active debug context drives the enabled state of debug actions (step, terminate, 
-  etc.), source lookup, visible variables, watch expression values, etc. The debug 
-  platform allows clients to register for context change notification in order 
-  to respond to changes in the active debug state, as well as register context 
-  providers that drive the active debug state. The debug platform has context 
-  listeners and providers itself. For example, the debug platform's stepping actions 
-  register for context change notification to update enabled state and the Debug 
-  view registers as a context provider.</p>
-<p>There can be any number of debug contexts within a workbench window, but at 
-  any one time there is only one active debug context within a part and one active 
-  context within a workbench window. The debug platform provides a debug context 
-  service per window (<code>IDebugContextService</code>) that allows clients to 
-  register context providers for that window, and register for change notification 
-  within the window or a specific part in the window. If there is only one context 
-  provider in a window, it provides the context for the entire window as well 
-  as its part. If there is more than one context provider for a window, the context 
-  provider associated with the most recently active part provides the context 
-  for that window. It is possible to register a context provider that has no associated 
-  part. Only one such context provider can be registered with each service (window). 
-  A context provider that has no associated part provides context for its window 
-  only if there are no other context providers registered for that window.</p>
-<p>A debug context is represented by a selection (<code>ISelection</code>). This 
-  allows for single or multi-element selections as well as text selections to 
-  provide context. Listeners are notified of context changes with debug context 
-  events (<code>DebugContextEvent</code>) . An event specifies the context that 
-  has changed and a bit mask describing how the context has changed. The platform 
-  defines two types of changes - activation and state change. An activated state 
-  indicates a new context - for example a thread suspending at a breakpoint or 
-  after a step. An activation triggers variables to refresh, source lookup, etc. 
-  A state change indicates that a previously activated state has changed. For 
-  example, a stack frame or thread that was activated has completed an implicit 
-  evaluation. A state change triggers action enabled states to update.</p>
-</body>
-</html>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractMemoryRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractMemoryRendering.java
deleted file mode 100644
index 59d3f57..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractMemoryRendering.java
+++ /dev/null
@@ -1,402 +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.debug.ui.memory;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.internal.ui.views.memory.PropertyChangeNotifier;
-import org.eclipse.debug.ui.DebugUITools;
-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.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Abstract implementation of a memory rendering.
- * <p>
- * To contribute an action to a rendering, an <code>objectContribution</code> can
- * be used on a rendering implementation class itself using a 
- * <code>popupMenus</code> extension. Additionally, the context menu created
- * by <code>createPopupMenu()</code> is registered with an identifier of this
- * rendering's container identifier. Actions may also be contributed to the
- * container's context menu specifically by using a  <code>viewerContribution</code>
- * on a <code>popupMenus</code> extension that has a <code>targetID</code> referring
- * to this rendering container's identifier. 
- * </p>
- * <p>
- * Clients implementing memory renderings must subclass this class.
- * </p>
- * @since 3.1
- */
-public abstract class AbstractMemoryRendering extends PlatformObject implements IMemoryRendering{
-
-	private IMemoryBlock fMemoryBlock;
-	private IMemoryRenderingContainer fContainer;
-	private ListenerList fPropertyListeners;
-	private boolean fVisible = true;
-	private MenuManager fPopupMenuMgr;
-	private String fRenderingId;
-	
-	private class ConnectionJob extends Job
-	{
-		Runnable fRunnable;
-		ConnectionJob(Runnable runnable)
-		{
-			super("Connect/Disconnect MemoryBlock"); //$NON-NLS-1$
-			fRunnable = runnable;
-			setSystem(true);
-		}
-
-		protected IStatus run(IProgressMonitor monitor) {
-			fRunnable.run();
-			return Status.OK_STATUS;
-		}
-	}
-	
-	/**
-	 * Client may provide a label decorator adapter from its memory block
-	 * to decorate the label of a rendering.
-	 * @since 3.2 
-	 */
-	private ILabelDecorator fLabelDecorator;
-	private IMenuListener fMenuListener;
-	
-	/**
-	 * Constructs a new rendering of the given type.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 */
-	public AbstractMemoryRendering(String renderingId)
-	{
-		fRenderingId = renderingId;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#init(org.eclipse.debug.ui.memory.IMemoryRenderingSite, org.eclipse.debug.core.model.IMemoryBlock)
-	 */
-	public void init(IMemoryRenderingContainer container, IMemoryBlock block) {
-		fContainer = container;
-		fMemoryBlock = block;
-		
-		fLabelDecorator = (ILabelDecorator)fMemoryBlock.getAdapter(ILabelDecorator.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#dispose()
-	 */
-	public void dispose()
-	{
-		// disconnect from memory block when rendering is disposed
-		if (fMemoryBlock instanceof IMemoryBlockExtension)
-		{
-			Runnable runnable = new Runnable(){
-				public void run() {
-						((IMemoryBlockExtension)fMemoryBlock).disconnect(this);		
-				}};
-			new ConnectionJob(runnable).schedule();
-		}
-		
-		if (fPopupMenuMgr != null)
-		{
-			fPopupMenuMgr.removeMenuListener(fMenuListener);
-			fPopupMenuMgr.removeAll();
-			fPopupMenuMgr.dispose();
-			fPopupMenuMgr = null;
-		}
-		
-		if (fPropertyListeners != null)
-			fPropertyListeners = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#activated()
-	 */
-	public void activated() {
-		if (fContainer.getMemoryRenderingSite().getSynchronizationService() != null)
-			fContainer.getMemoryRenderingSite().getSynchronizationService().setSynchronizationProvider(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#deactivated()
-	 */
-	public void deactivated() {
-		// do nothing when deactivated
-		// we do not want to set the sync provider from rendering site
-		// to null because Linux GTK unexpectedly fires deactivated event.
-		// If we reset the sync provider upon a deactivated event, it screws
-		// up synchronization on Linux GTK.
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#becomesVisible()
-	 */
-	public void becomesVisible() {
-		fVisible = true;
-		
-		if (fMemoryBlock instanceof IMemoryBlockExtension)
-		{
-			Runnable runnable = new Runnable(){
-				public void run() {
-					((IMemoryBlockExtension)fMemoryBlock).connect(this);		
-				}};
-			new ConnectionJob(runnable).schedule();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#becomesHidden()
-	 */
-	public void becomesHidden() {
-		fVisible = false;
-		if (fMemoryBlock instanceof IMemoryBlockExtension)
-		{
-			Runnable runnable = new Runnable(){
-				public void run() {
-						((IMemoryBlockExtension)fMemoryBlock).disconnect(this);		
-				}};
-			new ConnectionJob(runnable).schedule();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#getMemoryBlock()
-	 */
-	public IMemoryBlock getMemoryBlock() {
-		return fMemoryBlock;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#getRenderingId()
-	 */
-	public String getRenderingId()
-	{
-		return fRenderingId;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-				
-		if (fPropertyListeners == null)
-			fPropertyListeners = new ListenerList();
-		
-		fPropertyListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		
-		if (fPropertyListeners == null)
-			return;
-		fPropertyListeners.remove(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#getImage()
-	 */
-	public Image getImage() {
-		return decorateImage(null);
-	}
-	
-	/**
-	 * Decorates and returns this rendering's image.
-	 * 
-	 * @param image base image
-	 * @return decorated image
-	 * @since 3.2
-	 */	
-	protected Image decorateImage(Image image) {
-		if (fLabelDecorator != null)
-			return fLabelDecorator.decorateImage(image, this);
-		return image;		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#getLabel()
-	 */
-	public  String getLabel()
-	{
-		if (fMemoryBlock == null)
-			return ""; //$NON-NLS-1$
-		
-		StringBuffer label = new StringBuffer(""); //$NON-NLS-1$
-		
-		if (fMemoryBlock instanceof IMemoryBlockExtension)
-		{
-			String expression = ((IMemoryBlockExtension)fMemoryBlock).getExpression();
-			
-			if (expression == null)
-				expression = ""; //$NON-NLS-1$
-			
-			label.append(expression);
-			
-			if (expression.startsWith("&")) //$NON-NLS-1$
-				label.insert(0, "&"); //$NON-NLS-1$		
-			
-			// show full address if the rendering is visible
-			// hide address if the rendering is invisible
-			try {
-				if (fVisible && ((IMemoryBlockExtension)fMemoryBlock).getBigBaseAddress() != null)
-				{	
-					label.append(" : 0x"); //$NON-NLS-1$
-					label.append(((IMemoryBlockExtension)fMemoryBlock).getBigBaseAddress().toString(16).toUpperCase());
-				}
-			} catch (DebugException e) {
-				// do nothing... the label will not show memory block's address
-			}
-		}
-		else
-		{
-			long address = fMemoryBlock.getStartAddress();
-			label.append(Long.toHexString(address).toUpperCase());
-		}
-		
-		IMemoryRenderingType type = DebugUITools.getMemoryRenderingManager().getRenderingType(getRenderingId());
-		
-		if (type != null)
-		{
-			String preName = type.getLabel();
-			
-			if (preName != null)
-			{
-				label.append(" <"); //$NON-NLS-1$
-				label.append(preName);
-				label.append(">");  //$NON-NLS-1$
-			}
-		}
-		
-		return decorateLabel(label.toString());
-	}
-	
-	/**
-	 * Decorates and returns this rendering's label.
-	 * 
-	 * @param label base label
-	 * @return decorated label
-	 * @since 3.2
-	 */
-	protected String decorateLabel(String label) {
-		if (fLabelDecorator != null)
-			return fLabelDecorator.decorateText(label.toString(), this);
-		return label.toString();		
-	}
-	
-	/**
-	 * Helper method for creating a pop up menu in the rendering for a control.
-	 * Call this method when a context menu is required for a control
-	 * in a rendering.
-	 * <p>
-	 * To contribute an action to a rendering, an <code>objectContribution</code> can
-	 * be used on a rendering implementation class itself using a 
-	 * <code>popupMenus</code> extension. Additionally, the context menu created
-	 * by this method is registered with an identifier of this rendering's container.
-	 * Actions may also be contributed to the context menu specifically by using a 
-	 * <code>viewerContribution</code> on a <code>popupMenus</code> extension
-	 * that has a <code>targetID</code> referring to this rendering container's identifier. 
-	 * </p>
-	 * <p>
-	 * Clients are expected to become a menu listener for their pop  up 
-	 * menu if they require to fill the context menu for the rendering.
-	 * </p>
-	 * @param control - control to create the pop up menu for
-	 */
-	protected void createPopupMenu(Control control)
-	{
-		if (fPopupMenuMgr == null)
-		{
-			fPopupMenuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-			fPopupMenuMgr.setRemoveAllWhenShown(true);
-			IMemoryRenderingSite site = fContainer.getMemoryRenderingSite();
-			String menuId = fContainer.getId();
-						
-			ISelectionProvider selProvider = site.getSite().getSelectionProvider();
-			
-			fMenuListener = new IMenuListener() {
-							public void menuAboutToShow(IMenuManager manager) {
-								manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-							}};
-			fPopupMenuMgr.addMenuListener(fMenuListener);
-			
-			site.getSite().registerContextMenu(menuId, fPopupMenuMgr, selProvider);
-		}
-		
-		Menu popupMenu = fPopupMenuMgr.createContextMenu(control);
-		control.setMenu(popupMenu);
-	}
-	
-	/**
-	 * Returns the pop up menu manager for this rendering, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the pop up menu manager for this rendering, or <code>null</code>
-	 */
-	protected MenuManager getPopupMenuManager()
-	{
-		return fPopupMenuMgr;
-	}
-	
-	/**
-	 * Fires the given event to all registered listeners.
-	 * 
-	 * @param event the event to fire
-	 */
-	protected void firePropertyChangedEvent(PropertyChangeEvent event)
-	{
-		if (fPropertyListeners == null)
-			return;
-		
-		Object[] listeners = fPropertyListeners.getListeners();
-		
-		for (int i=0; i<listeners.length; i++)
-		{	
-			PropertyChangeNotifier notifier = new PropertyChangeNotifier((IPropertyChangeListener)listeners[i], event);
-			SafeRunner.run(notifier);
-		}
-	}
-	
-	/**
-	 * Returns the container hosting this memory rendering.
-	 * 
-	 * @return the container hosting this memory rendering
-	 */
-	public IMemoryRenderingContainer getMemoryRenderingContainer()
-	{
-		return fContainer;
-	}
-
-	/**
-	 * Returns whether this rendering is currently visible.
-	 * 
-	 * @return whether this rendering is currently visible
-	 */
-	public boolean isVisible() {
-		return fVisible;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractMemoryRenderingBindingsProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractMemoryRenderingBindingsProvider.java
deleted file mode 100644
index 7c1c506..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractMemoryRenderingBindingsProvider.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.debug.ui.memory;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * Common function for a dynamic memory rendering bindings provider.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider
- * @since 3.1
- */
-public abstract class AbstractMemoryRenderingBindingsProvider implements IMemoryRenderingBindingsProvider {
-    	
-	// list of binding listeners
-	private ListenerList fListeners;
-        
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#addListener(org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener)
-	 */
-	public void addListener(IMemoryRenderingBindingsListener listener) {
-		if (fListeners == null) {
-			fListeners = new ListenerList();
-		}
-		fListeners.add(listener);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider#removeListener(org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener)
-	 */
-	public void removeListener(IMemoryRenderingBindingsListener listener) {
-		if (fListeners != null) {
-			fListeners.remove(listener);
-		}
-	}
-	
-	/**
-	 * Notifies all registered listeners that bindings have changed.
-	 */
-	protected void fireBindingsChanged() {
-		if (fListeners == null) {
-			return;
-		}
-		
-		Object[] listeners = fListeners.getListeners();
-		
-		for (int i=0; i<listeners.length; i++) {
-			if (listeners[i] instanceof IMemoryRenderingBindingsListener) {
-				final IMemoryRenderingBindingsListener listener = (IMemoryRenderingBindingsListener)listeners[i];
-				ISafeRunnable runnable = new ISafeRunnable () {
-					public void handleException(Throwable exception) {
-						DebugUIPlugin.log(exception);
-					}
-					public void run() throws Exception {
-						listener.memoryRenderingBindingsChanged();
-					}};
-				SafeRunner.run(runnable);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTableRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTableRendering.java
deleted file mode 100644
index 87f3057..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTableRendering.java
+++ /dev/null
@@ -1,3816 +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.debug.ui.memory;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IMemoryBlockExtension;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIMessages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.memory.IMemoryBlockConnection;
-import org.eclipse.debug.internal.ui.memory.IPersistableDebugElement;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
-import org.eclipse.debug.internal.ui.views.memory.renderings.AbstractBaseTableRendering;
-import org.eclipse.debug.internal.ui.views.memory.renderings.CopyTableRenderingToClipboardAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.FormatTableRenderingAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.FormatTableRenderingDialog;
-import org.eclipse.debug.internal.ui.views.memory.renderings.GoToAddressAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.PrintTableRenderingAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.ReformatAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.ResetToBaseAddressAction;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingCellModifier;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingContentInput;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingContentProvider;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingLabelProvider;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingLabelProviderEx;
-import org.eclipse.debug.internal.ui.views.memory.renderings.TableRenderingLine;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.custom.TableCursor;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackAdapter;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.part.PageBook;
-
-/**
- * Abstract implementation of a table rendering.
- * <p>
- * Clients should subclass from this class if they wish to provide a
- * table rendering.
- * </p>
- * <p>
- *
- * The label of the rendering is constructed by retrieving the expression from
- * <code>IMemoryBlockExtension</code>.  For IMemoryBlock, the label is constructed
- * using the memory block's start address.
- * 
- * This rendering manages the change states of its memory bytes if the memory
- * block does not opt to manage the change states.  For IMemoryBlockExtension, if
- * the memory block returns false when #supportsChangeManagement() is called, this
- * rendering will calculate the change state for each byte when its content is updated.
- * Clients may manages the change states of its memory block by returning true when
- * #supportsChangeManagement() is called.  This will cause this rendering to stop
- * calculating the change states of the memory block.  Instead it would rely on the
- * attributes returned in the MemoryByte array to determine if a byte has changed.
- * For IMemoryBlock, this rendering will manage the change states its content.   
- * 
- *  When firing change event, be aware of the following:
- *  - whenever a change event is fired, the content provider for Memory View
- *    view checks to see if memory has actually changed.  
- *  - If memory has actually changed, a refresh will commence.  Changes to the memory block
- *    will be computed and will be shown with the delta icons.
- *  - If memory has not changed, content will not be refreshed.  However, previous delta information 
- * 	  will be erased.  The screen will be refreshed to show that no memory has been changed.  (All
- *    delta icons will be removed.)
- *    
- * Please note that these APIs will be called multiple times by the Memory View.
- * To improve performance, debug adapters need to cache the content of its memory block and only
- * retrieve updated data when necessary.
- * </p>
-
- * @since 3.1
- */
-public abstract class AbstractTableRendering extends AbstractBaseTableRendering implements IPropertyChangeListener, IResettableMemoryRendering{	
-
-	/**
-	 *  Property identifier for the selected address in a table rendering
-	 *  This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_SELECTED_ADDRESS = "selectedAddress"; //$NON-NLS-1$
-	
-	/**
-	 * Property identifier for the column size in a table rendering
-	 * This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_COL_SIZE = "columnSize"; //$NON-NLS-1$
-	
-	/**
-	 * Property identifier for the top row address in a table rendering. 
-	 * This property is used for synchronization between renderings.
-	 */
-	public static final String PROPERTY_TOP_ADDRESS = "topAddress"; //$NON-NLS-1$
-	
-	/**
-	 * Property identifier for the row size in a table rendering
-	 * This property is used for synchronization between renderings.
-	 * @since 3.2
-	 */
-	public static final String PROPERTY_ROW_SIZE = "rowSize"; //$NON-NLS-1$
-	
-	private static final int BUFFER_THRESHOLD = 1;			// threshold value
-	private static final int BUFFER_START = 0;				// flag to indicate asking for threshold at buffer start
-	private static final int BUFFER_END = 1;				// flat to indicate asking for threshold at buffer end
-	
-	private PageBook fPageBook;
-	private TableViewer fTableViewer;
-	private TextViewer fTextViewer;
-	
-	private int fBytePerLine;								// number of bytes per line: 16
-	private int fColumnSize;								// number of bytes per column:  1,2,4,8
-	private int fAddressableSize;	
-	
-	private boolean fIsShowingErrorPage;
-	
-	private TableRenderingContentProvider fContentProvider;
-	private BigInteger fSelectedAddress;
-	private TableRenderingContentInput fContentInput;
-	private TableRenderingCellModifier fCellModifier;
-	private boolean fIsCreated;
-	private CellEditor[] fEditors;
-	private String fLabel;
-	private TableCursor fTableCursor;
-	private boolean fIsDisposed;
-	private TraverseListener fCursorTraverseListener;
-	private KeyAdapter fCursorKeyAdapter;
-	private BigInteger fTopRowAddress;
-	
-	private CopyTableRenderingToClipboardAction fCopyToClipboardAction;
-	private GoToAddressAction fGoToAddressAction;
-	private ResetToBaseAddressAction fResetMemoryBlockAction;
-	private PrintTableRenderingAction fPrintViewTabAction;
-	private ReformatAction fReformatAction;
-	private ToggleAddressColumnAction fToggleAddressColumnAction;
-	private EventHandleLock fEvtHandleLock = new EventHandleLock();
-	private TableEditor fCursorEditor;
-	private FocusAdapter fEditorFocusListener;
-	private MouseAdapter fCursorMouseListener;
-	private KeyAdapter fEditorKeyListener;
-	private SelectionAdapter fCursorSelectionListener;
-	private IWorkbenchAdapter fWorkbenchAdapter;
-	private IMemoryBlockConnection fConnection;
-	
-	private boolean fIsShowAddressColumn = true;
-	private SelectionAdapter fScrollbarSelectionListener;
-
-	private PropertyDialogAction fPropertiesAction;
-	
-	private int fPageSize;
-	private NextPageAction fNextAction;
-	private PrevPageAction fPrevAction;
-
-	private Shell fToolTipShell;
-	private FormatTableRenderingAction fFormatRenderingAction;
-
-	private IMenuListener fMenuListener;
-	
-	private int fPreBuffer;
-	private int fPostBuffer;
-	
-	private class EventHandleLock
-	{
-		Object fOwner;
-		
-		public boolean acquireLock(Object client)
-		{
-			if (fOwner == null)
-			{
-				fOwner = client;
-				return true;
-			}
-			return false;
-		}
-		
-		public boolean releaseLock(Object client)
-		{
-			if (fOwner == client)
-			{
-				fOwner = null;
-				return true;
-			}
-			return false;
-		}
-		
-		public boolean isLocked()
-		{
-			return (fOwner != null);
-		}
-	}	
-	
-	
-	private class ToggleAddressColumnAction extends Action {
-
-		public ToggleAddressColumnAction() {
-			super();
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID
-					+ ".ShowAddressColumnAction_context"); //$NON-NLS-1$
-			updateActionLabel();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			fIsShowAddressColumn = !fIsShowAddressColumn;
-			resizeColumnsToPreferredSize();
-			updateActionLabel();
-		}
-
-		/**
-		 * 
-		 */
-		private void updateActionLabel() {
-			if (fIsShowAddressColumn) {
-				setText(DebugUIMessages.ShowAddressColumnAction_0); 
-			} else {
-				setText(DebugUIMessages.ShowAddressColumnAction_1); 
-			}
-		}
-	}
-	
-	
-	private class NextPageAction extends Action
-	{
-		private NextPageAction()
-		{
-			super();
-			setText(DebugUIMessages.AbstractTableRendering_4);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".NextPageAction_context"); //$NON-NLS-1$ 
-		}
-
-		public void run() {
-			BigInteger address = fContentInput.getLoadAddress();
-			address = address.add(BigInteger.valueOf(getPageSizeInUnits()));
-			handlePageStartAddressChanged(address);
-		}
-	}
-	
-	private class PrevPageAction extends Action
-	{
-		private PrevPageAction()
-		{
-			super();
-			setText(DebugUIMessages.AbstractTableRendering_6);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugUIConstants.PLUGIN_ID + ".PrevPageAction_context"); //$NON-NLS-1$
-		}
-
-		public void run() {
-			BigInteger address = fContentInput.getLoadAddress();
-			address = address.subtract(BigInteger.valueOf(getPageSizeInUnits()));
-			handlePageStartAddressChanged(address);
-		}
-	}
-	
-	/**
-	 * Constructs a new table rendering of the specified type.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 */
-	public AbstractTableRendering(String renderingId) {
-		super(renderingId);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		// if memory view table font has changed
-		if (event.getProperty().equals(IInternalDebugUIConstants.FONT_NAME))
-		{
-			if (!fIsDisposed)
-			{			
-				Font memoryViewFont = JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME);
-				setFont(memoryViewFont);		
-			}
-			return;
-		}
-		
-		if (event.getProperty().equals(IDebugUIConstants.PREF_PADDED_STR) ||
-			event.getProperty().equals(IDebugUIConstants.PREF_MEMORY_HISTORY_KNOWN_COLOR) ||
-			event.getProperty().equals(IDebugUIConstants.PREF_MEMORY_HISTORY_UNKNOWN_COLOR))
-		{
-			if (!fIsDisposed)
-			{
-				fTableViewer.refresh();
-				fTableCursor.redraw();
-			}
-			return;
-		}
-		
-		Object evtSrc = event.getSource();
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE) ||
-			event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE) ||
-			event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE)) {
-			// always update page size, only refresh if the table is visible
-			getPageSizeFromPreference();
-		}
-		
-		// do not handle event if the rendering is displaying an error
-		if (isDisplayingError())
-			return;
-		
-		// do not handle property change event if the rendering is not visible
-		if (!isVisible())
-			return;
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM)) {
-			handleDyanicLoadChanged();
-			return;
-		}
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE)) {
-			if (!isDynamicLoad())
-			{
-				// only refresh if in non-autoload mode
-				refresh();
-			}
-			return;
-		}
-		
-		if (event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE) ||
-			event.getProperty().equals(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE)) {
-			if (isDynamicLoad())
-			{
-				// only refresh if in non-autoload mode
-				refresh();
-			}
-			return;
-		}
-		
-		if (evtSrc == this)
-			return;
-		
-		if (!(evtSrc instanceof IMemoryRendering))
-			return;
-		
-		IMemoryRendering rendering = (IMemoryRendering)evtSrc;
-		IMemoryBlock memoryBlock = rendering.getMemoryBlock();
-		
-		// do not handle event from renderings displaying other memory blocks
-		if (memoryBlock != getMemoryBlock())
-			return;
-	
-		String propertyName = event.getProperty();
-		Object value = event.getNewValue();
-		
-		if (propertyName.equals(AbstractTableRendering.PROPERTY_SELECTED_ADDRESS) && value instanceof BigInteger)
-		{
-			selectedAddressChanged((BigInteger)value);
-		}
-		else if (propertyName.equals(AbstractTableRendering.PROPERTY_COL_SIZE) && value instanceof Integer)
-		{
-			columnSizeChanged(((Integer)value).intValue());
-		}
-		else if (propertyName.equals(AbstractTableRendering.PROPERTY_ROW_SIZE) && value instanceof Integer)
-		{
-			rowSizeChanged(((Integer)value).intValue());
-		}
-		else if (propertyName.equals(AbstractTableRendering.PROPERTY_TOP_ADDRESS) && value instanceof BigInteger)
-		{
-			if (needMoreLines())
-			{
-				if (isDynamicLoad())
-					reloadTable(getTopVisibleAddress(), false);
-			}
-			topVisibleAddressChanged((BigInteger)value, false);
-		}
-		else if (propertyName.equals(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS) && value instanceof BigInteger)
-		{
-			handlePageStartAddressChanged((BigInteger)value);
-		}
-	}
-
-	private void handleDyanicLoadChanged() {
-		
-		// if currently in dynamic load mode, update page
-		// start address
-		updateSyncPageStartAddress();
-		
-		updateDynamicLoadProperty();
-		if (isDynamicLoad())
-		{
-			refresh();
-		}
-		else
-		{
-			BigInteger pageStart = (BigInteger)getSynchronizedProperty(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS);
-			if (pageStart == null)
-				pageStart = fTopRowAddress;
-			handlePageStartAddressChanged(pageStart);
-		}
-	}
-
-	private void updateDynamicLoadProperty() {
-		
-		boolean value = DebugUIPlugin
-				.getDefault()
-				.getPreferenceStore()
-				.getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-		
-		if (value != isDynamicLoad())
-		{
-			fContentProvider.setDynamicLoad(value);
-		
-			if (!fIsDisposed) {
-				if (isDynamicLoad()) {
-					fContentInput.setPostBuffer(20);
-					fContentInput.setPreBuffer(20);
-					fContentInput.setNumLines(getNumberOfVisibleLines());
-	
-				} else {
-					fContentInput.setPostBuffer(0);
-					fContentInput.setPreBuffer(0);
-					fContentInput.setNumLines(fPageSize);
-				}	
-			}
-		}
-	}
-
-	/**
-	 * Handle top visible address change event from synchronizer
-	 * @param address
-	 */
-	private void topVisibleAddressChanged(final BigInteger address, boolean force)
-	{
-		// do not handle event if rendering is not visible
-		// continue to handle event if caller decides to force the rendering
-		// to move to the top visible address even when the rendering
-		// is not visible
-		if (!isVisible() && !force)
-			return;
-		
-		// do not handle event if the base address of the memory
-		// block has changed, wait for debug event to update to
-		// new location
-		if (isBaseAddressChanged())
-			return;
-	
-		if (!address.equals(fTopRowAddress))
-		{
-			fTopRowAddress = address;
-			updateSyncTopAddress();
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-			
-				handleTopAddressChangedforExtended(address);
-			}
-			else
-			{
-				handleTopAddressChangedForSimple(address);
-			}
-		}
-	}
-
-	/**
-	 * @param address
-	 */
-	private void handleTopAddressChangedForSimple(final BigInteger address) {
-		// IMemoryBlock support
-		int index = findAddressIndex(address);
-		Table table = fTableViewer.getTable();
-		if (index >= 0)
-		{
-			setTopIndex(table,  index);
-		}
-		
-		if (isAddressVisible(fSelectedAddress))
-			fTableCursor.setVisible(true);
-		else
-			fTableCursor.setVisible(false);
-		
-	}
-
-	/**
-	 * @param address
-	 */
-	private void handleTopAddressChangedforExtended(final BigInteger address) {
-		
-		Object evtLockClient = new Object();
-		try 
-		{
-		if (!fEvtHandleLock.acquireLock(evtLockClient))
-			return;
-		
-		if (!isAddressOutOfRange(address))
-		{
-			Table table = fTableViewer.getTable();
-			int index = findAddressIndex(address);
-			int startThreshold = getBufferThreshold(BUFFER_START);
-			int endThrreshold = getBufferThreshold(BUFFER_END);
-			if (index >= startThreshold && table.getItemCount() - (index+getNumberOfVisibleLines()) >= endThrreshold)
-			{
-				// update cursor position
-				setTopIndex(table, index);
-			}
-			else
-			{
-				int numInBuffer = table.getItemCount();
-				if (index < getBufferThreshold(BUFFER_START))
-				{
-					if(isAtTopLimit())
-					{
-						setTopIndex(table, index);
-					}
-					else
-					{
-						if (isDynamicLoad() && getBufferThreshold(BUFFER_START) > 0)
-							reloadTable(address, false);
-						else
-							setTopIndex(table, index);
-					}
-				}
-				else if ((numInBuffer-(index+getNumberOfVisibleLines())) <= getBufferThreshold(BUFFER_END))
-				{
-					if (!isAtBottomLimit() && isDynamicLoad() && getBufferThreshold(BUFFER_END) > 0)
-						reloadTable(address, false);
-					else
-						setTopIndex(table, index);
-				}
-			}
-		}
-		else
-		{	
-			// approaching limit, reload table
-			reloadTable(address, false);
-		}
-		
-		if (isAddressVisible(fSelectedAddress))
-			fTableCursor.setVisible(true);
-		else
-			fTableCursor.setVisible(false);
-		}
-		finally
-		{
-			fEvtHandleLock.releaseLock(evtLockClient);
-		}
-	}	
-	
-	/**
-	 * @param value
-	 */
-	private void selectedAddressChanged(BigInteger value) {
-		
-		// do not handle event if the base address of the memory
-		// block has changed, wait for debug event to update to
-		// new location
-		if (isBaseAddressChanged())
-			return;
-		
-		try {
-			// do not handle event if the event is out of range and the 
-			// rendering is in non-dynamic-load mode, otherwise, will
-			// cause rendering to continue to scroll when it shouldn't
-			if (isDynamicLoad())
-				goToAddress(value);
-			else if (!isAddressOutOfRange(value))
-				goToAddress(value);
-		} catch (DebugException e) {
-			// do nothing
-		}
-	}
-	
-	private void handlePageStartAddressChanged(BigInteger address)
-	{
-		// do not handle if in dynamic mode
-		if (isDynamicLoad())
-			return;
-		
-		if (fContentInput == null)
-			return;
-		
-		if (!(getMemoryBlock() instanceof IMemoryBlockExtension))
-			return;
-		
-		// do not handle event if the base address of the memory
-		// block has changed, wait for debug event to update to
-		// new location
-		if (isBaseAddressChanged())
-			return;
-		
-		if(fContentProvider.getBufferTopAddress().equals(address))
-			return;
-	
-		BigInteger start = fContentInput.getStartAddress();
-		BigInteger end = fContentInput.getEndAddress();
-		
-		// smaller than start address, load at start address
-		if (address.compareTo(start) < 0)
-		{
-			if (isAtTopLimit())
-				return;
-			
-			address = start;
-		}
-		
-		// bigger than end address, no need to load, already at top
-		if (address.compareTo(end) > 0)
-		{
-			if (isAtBottomLimit())
-				return;
-			
-			address = end.subtract(BigInteger.valueOf(getPageSizeInUnits()));
-		}
-		
-		fContentInput.setLoadAddress(address);
-		refresh();
-		updateSyncPageStartAddress();
-		setTopIndex(fTableViewer.getTable(), 0);
-		fTopRowAddress = address;
-		updateSyncTopAddress();
-		
-		BigInteger selectedAddress = (BigInteger)getSynchronizedProperty(AbstractTableRendering.PROPERTY_SELECTED_ADDRESS);
-		if (selectedAddress != null)
-		{
-			fSelectedAddress = selectedAddress;
-			if (!isAddressOutOfRange(fSelectedAddress))
-			{
-				setCursorAtAddress(fSelectedAddress);
-				fTableCursor.setVisible(true);
-			}
-			else
-			{
-				fTableCursor.setVisible(false);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		
-		fPageBook = new PageBook(parent, SWT.NONE);
-		createErrorPage(fPageBook);
-		createTableViewer(fPageBook);
-		
-		fTableViewer.getTable().redraw();
-		createToolTip();
-		
-		return fPageBook;
-	}
-
-	/**
-	 * Create the table viewer and other support controls
-	 * for this rendering.
-	 * 
-	 * @param parent parent composite
-	 */
-	private void createTableViewer(Composite parent) {
-		
-		fTableViewer= new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.HIDE_SELECTION | SWT.BORDER);
-		
-		TableRenderingLabelProvider labelProvider;
-		if (hasCustomizedDecorations())
-			labelProvider = new TableRenderingLabelProviderEx(this);
-		else
-			labelProvider = new TableRenderingLabelProvider(this);
-		
-		fTableViewer.setLabelProvider(labelProvider);
-		
-		fContentProvider = new TableRenderingContentProvider();
-		fContentProvider.setDynamicLoad(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM));
-		
-		fTableViewer.setContentProvider(fContentProvider);		
-		fContentProvider.setViewer(fTableViewer);
-		
-		ScrollBar scroll = ((Table)fTableViewer.getControl()).getVerticalBar();
-		scroll.setMinimum(-100);
-		scroll.setMaximum(200);		
-
-		fTableViewer.getTable().setHeaderVisible(true);
-		fTableViewer.getTable().setLinesVisible(true);
-		
-
-		// set up addressable size and figure out number of bytes required per line
-		fAddressableSize = -1;
-		try {
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-				fAddressableSize = ((IMemoryBlockExtension)getMemoryBlock()).getAddressableSize();
-		} catch (DebugException e1) {
-			// log error and default to 1
-			fAddressableSize = 1;
-			displayError(e1);
-			return;
-			
-		}
-		if (getAddressableSize() < 1)
-			fAddressableSize = 1;
-		
-// set up initial format
-		setupInitialFormat();
-		
-// set up selected address		
-		setupSelectedAddress();
-		
-		// figure out top visible address
-		BigInteger topVisibleAddress = getInitialTopVisibleAddress();
-		
-		getPageSizeFromPreference();
-		
-		
-		if (isDynamicLoad())
-		{
-			int numLines = getNumberOfVisibleLines();
-			if (numLines <= 0)
-			{
-				// add listener to reload when we know the number of lines to load
-				fTableViewer.getTable().addPaintListener(new PaintListener() {
-					public void paintControl(PaintEvent e) {
-						fTableViewer.getTable().removePaintListener(this);
-						fContentInput.setNumLines(getNumberOfVisibleLines());
-						reloadTable(fContentInput.getLoadAddress(), false);
-						resizeColumnsToPreferredSize();
-						setCursorAtAddress(fSelectedAddress);
-						fTableCursor.setVisible(true);
-					}});
-			}
-			fContentInput = new TableRenderingContentInput(this, fPreBuffer, fPostBuffer,  topVisibleAddress, numLines, false, null);
-		}
-		else
-		{
-			BigInteger addressToLoad = topVisibleAddress;
-			
-			// check synchronization service to see if we need to sync with another rendering
-			Object obj = getSynchronizedProperty(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS);
-			if (obj != null && obj instanceof BigInteger)
-			{
-				addressToLoad = (BigInteger)obj;
-			}
-			fContentInput = new TableRenderingContentInput(this, 0, 0, addressToLoad, fPageSize, false, null);
-		}
-		
-		fTableViewer.setInput(fContentInput);
-		
-		// set up cell modifier
-		fCellModifier = new TableRenderingCellModifier(this);
-		fTableViewer.setCellModifier(fCellModifier);
-		
-		// SET UP FONT		
-		// set to a non-proportional font
-		fTableViewer.getTable().setFont(JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME));
-		if (!(getMemoryBlock() instanceof IMemoryBlockExtension))
-		{		
-			// If not extended memory block, do not create any buffer
-			// no scrolling
-			fContentInput.setPreBuffer(0);
-			fContentInput.setPostBuffer(0);
-		}
-		
-		// set up table cursor
-		createCursor(fTableViewer.getTable(), fSelectedAddress);
-		fTableViewer.getTable().addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				handleTableMouseEvent(e);
-			}});
-		
-		// create pop up menu for the rendering
-		createActions();
-		createPopupMenu(fTableViewer.getControl());
-		createPopupMenu(fTableCursor);
-		
-		fMenuListener = new IMenuListener() {
-					public void menuAboutToShow(IMenuManager manager) {
-						fillContextMenu(manager);
-						manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-					}};
-		getPopupMenuManager().addMenuListener(fMenuListener);
-		
-		// now the rendering is successfully created
-		fIsCreated = true;
-
-		//synchronize
-		addRenderingToSyncService();
-		synchronize();
-		
-		fTopRowAddress = getTopVisibleAddress();
-		// Need to resize column after content is filled in
-		// Pack function does not work unless content is not filled in
-		// since the table is not able to compute the preferred size.
-		resizeColumnsToPreferredSize();
-		try {
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				if(((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress() == null)
-				{
-					DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.AbstractTableRendering_1, null)); 
-					displayError(e);				
-				}
-			}
-		} catch (DebugException e1) {
-			displayError(e1);	
-		}
-
-		// add font change listener and update font when the font has been changed
-		JFaceResources.getFontRegistry().addListener(this);
-		fScrollbarSelectionListener = new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent event) {
-				handleScrollBarSelection();
-				
-			}};
-		scroll.addSelectionListener(fScrollbarSelectionListener);
-		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-	}
-	
-	private boolean validateInitialFormat()
-	{
-		int rowSize = getDefaultRowSize();
-		int columnSize = getDefaultColumnSize();
-		
-		if (rowSize < columnSize || rowSize % columnSize != 0 || rowSize == 0 || columnSize == 0)
-		{
-			return false;
-		}
-		return true;
-	}
-
-	private BigInteger getInitialTopVisibleAddress() {
-		BigInteger topVisibleAddress = (BigInteger) getSynchronizedProperty(AbstractTableRendering.PROPERTY_TOP_ADDRESS);
-		if (topVisibleAddress == null)
-		{
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-				try {
-					topVisibleAddress = ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress();
-				} catch (DebugException e1) {
-					topVisibleAddress = new BigInteger("0"); //$NON-NLS-1$
-				}
-			}
-			else
-			{
-				topVisibleAddress = BigInteger.valueOf(getMemoryBlock().getStartAddress());
-			}
-		}
-		return topVisibleAddress;
-	}
-
-	private void setupSelectedAddress() {
-		// figure out selected address 
-		BigInteger selectedAddress = (BigInteger) getSynchronizedProperty(AbstractTableRendering.PROPERTY_SELECTED_ADDRESS);
-		if (selectedAddress == null)
-		{
-			if (getMemoryBlock() instanceof IMemoryBlockExtension) {
-				try {
-					selectedAddress = ((IMemoryBlockExtension) getMemoryBlock())
-							.getBigBaseAddress();
-				} catch (DebugException e1) {
-					selectedAddress = new BigInteger("0"); //$NON-NLS-1$
-				}
-				if (selectedAddress == null) {
-					selectedAddress = new BigInteger("0"); //$NON-NLS-1$
-				}
-
-			} else {
-				long address = getMemoryBlock().getStartAddress();
-				selectedAddress = BigInteger.valueOf(address);
-			}
-		}
-		setSelectedAddress(selectedAddress);
-	}
-
-	private void setupInitialFormat() {
-		
-		boolean validated = validateInitialFormat();
-		
-		if (!validated)
-		{
-			// pop up dialog to ask user for default values
-			StringBuffer msgBuffer = new StringBuffer(DebugUIMessages.AbstractTableRendering_20);
-			msgBuffer.append(" "); //$NON-NLS-1$
-			msgBuffer.append(this.getLabel());
-			msgBuffer.append("\n\n"); //$NON-NLS-1$
-			msgBuffer.append(DebugUIMessages.AbstractTableRendering_16);
-			msgBuffer.append("\n"); //$NON-NLS-1$
-			msgBuffer.append(DebugUIMessages.AbstractTableRendering_18);
-			msgBuffer.append("\n\n"); //$NON-NLS-1$
-			
-			int bytePerLine = fBytePerLine;
-			int columnSize = fColumnSize;
-			
-			// initialize this value to populate the dialog properly
-			fBytePerLine = getDefaultRowSize() / getAddressableSize();
-			fColumnSize = getDefaultColumnSize() / getAddressableSize();
-
-			FormatTableRenderingDialog dialog = new FormatTableRenderingDialog(this, DebugUIPlugin.getShell());
-			dialog.openError(msgBuffer.toString());
-			
-			// restore to original value before formatting
-			fBytePerLine = bytePerLine;
-			fColumnSize = columnSize;
-			
-			bytePerLine = dialog.getRowSize() * getAddressableSize();
-			columnSize = dialog.getColumnSize() * getAddressableSize();
-			
-			format(bytePerLine, columnSize);
-		}
-		else
-		{
-			// Row size is stored as number of addressable units in preference store
-			int bytePerLine = getDefaultRowSize();
-			// column size is now stored as number of addressable units
-			int columnSize = getDefaultColumnSize();
-			
-			// format memory block with specified "bytesPerLine" and "columnSize"	
-			boolean ok = format(bytePerLine, columnSize);
-			
-			if (!ok)
-			{
-				// this is to ensure that the rest of the rendering can be created
-				// and we can recover from a format error
-				format(bytePerLine, bytePerLine);
-			}
-		}
-	}
-
-	private int getDefaultColumnSize() {
-		
-		// default to global preference store
-		IPreferenceStore prefStore = DebugUITools.getPreferenceStore();
-		int columnSize = prefStore.getInt(IDebugPreferenceConstants.PREF_COLUMN_SIZE);
-		// actual column size is number of addressable units * size of the addressable unit
-		columnSize = columnSize * getAddressableSize();
-		
-		// check synchronized column size
-		Integer colSize = (Integer)getSynchronizedProperty(AbstractTableRendering.PROPERTY_COL_SIZE);
-		if (colSize != null)
-		{
-			// column size is stored as actual number of bytes in synchronizer
-			int syncColSize = colSize.intValue(); 
-			if (syncColSize > 0)
-			{
-				columnSize = syncColSize;
-			}	
-		}
-		else
-		{
-			IPersistableDebugElement elmt = (IPersistableDebugElement)getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			int defaultColSize = -1;
-			
-			if (elmt != null)
-			{
-				if (elmt.supportsProperty(this, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL))
-					defaultColSize = getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL);
-			}
-			
-			if (defaultColSize <= 0)
-			{
-				// if not provided, get default by model
-				defaultColSize = getDefaultColumnSizeByModel(getMemoryBlock().getModelIdentifier());
-			}
-			
-			if (defaultColSize > 0)
-				columnSize = defaultColSize * getAddressableSize();
-		}
-		return columnSize;
-	}
-
-	private int getDefaultRowSize() {
-		
-		int rowSize = DebugUITools.getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_ROW_SIZE);
-		int bytePerLine = rowSize * getAddressableSize();
-		
-		// check synchronized row size
-		Integer size = (Integer)getSynchronizedProperty(AbstractTableRendering.PROPERTY_ROW_SIZE);
-		if (size != null)
-		{
-			// row size is stored as actual number of bytes in synchronizer
-			int syncRowSize = size.intValue(); 
-			if (syncRowSize > 0)
-			{
-				bytePerLine = syncRowSize;
-			}	
-		}
-		else
-		{
-			int defaultRowSize = -1;
-			IPersistableDebugElement elmt = (IPersistableDebugElement)getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-			if (elmt != null)
-			{
-				if (elmt.supportsProperty(this, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL))
-				{
-					defaultRowSize = getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL);
-					return defaultRowSize * getAddressableSize();
-				}
-			}
-			
-			if (defaultRowSize <= 0)
-				// no synchronized property, ask preference store by id
-				defaultRowSize = getDefaultRowSizeByModel(getMemoryBlock().getModelIdentifier());
-			
-			if (defaultRowSize > 0)
-				bytePerLine = defaultRowSize * getAddressableSize();
-		}
-		return bytePerLine;
-	}
-
-	private int getDefaultFromPersistableElement(String propertyId) {
-		int defaultValue = -1;
-		IPersistableDebugElement elmt = (IPersistableDebugElement)getMemoryBlock().getAdapter(IPersistableDebugElement.class);
-		if (elmt != null)
-		{
-			try {
-				Object valueMB = elmt.getProperty(this, propertyId);
-				if (valueMB != null && !(valueMB instanceof Integer))
-				{
-					IStatus status = DebugUIPlugin.newErrorStatus("Model returned invalid type on " + propertyId, null); //$NON-NLS-1$
-					DebugUIPlugin.log(status);
-				}
-				
-				if (valueMB != null)
-				{
-					Integer value = (Integer)valueMB;
-					defaultValue = value.intValue();
-				}
-			} catch (CoreException e) {
-				DebugUIPlugin.log(e);
-			}
-		}
-		return defaultValue;
-	}
-	
-	private void getPageSizeFromPreference()
-	{
-		fPageSize = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE);
-		fPreBuffer = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE);
-		fPostBuffer = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE);
-	}
-	
-	private void createCursor(Table table, BigInteger address)
-	{
-		fTableCursor = new TableCursor(table, SWT.NONE);
-		Display display = fTableCursor.getDisplay();
-		
-		// set up cursor color
-		fTableCursor.setBackground(display.getSystemColor(SWT.COLOR_LIST_SELECTION));
-		fTableCursor.setForeground(display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT));
-		
-		fTableCursor.setFont(JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME));
-		fTableCursor.setVisible(true);
-		
-		fCursorKeyAdapter = new KeyAdapter() {
-			public void keyPressed(KeyEvent e)
-			 {
-			 	handleCursorKeyPressed(e);
-			 }	
-		};
-		fTableCursor.addKeyListener(fCursorKeyAdapter);
-		
-		fCursorTraverseListener = new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				handleCursorTraverseEvt(e);
-			}};
-					
-		fTableCursor.addTraverseListener(fCursorTraverseListener);
-		
-		fCursorMouseListener = new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				handleCursorMouseEvent(e);
-			}};
-		fTableCursor.addMouseListener(fCursorMouseListener);
-		
-		// cursor may be disposed before disposed is called
-		// remove listeners whenever the cursor is disposed
-		fTableCursor.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (fTableCursor == null)
-					return;
-				fTableCursor.removeTraverseListener(fCursorTraverseListener);
-				fTableCursor.removeKeyListener(fCursorKeyAdapter);
-				fTableCursor.removeMouseListener(fCursorMouseListener);
-				fTableCursor.removeSelectionListener(fCursorSelectionListener);
-			}});
-		
-		fCursorSelectionListener = new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						
-						if (!fEvtHandleLock.acquireLock(this))
-							return;
-	
-						handleCursorMoved();
-						
-						fEvtHandleLock.releaseLock(this);
-
-					}
-				};
-		fTableCursor.addSelectionListener(fCursorSelectionListener);
-		
-		
-		setCursorAtAddress(address);
-		
-		fCursorEditor = new TableEditor (fTableViewer.getTable());	
-	}
-	
-	private void handleCursorTraverseEvt(TraverseEvent e){
-		
-		if (fTableCursor.getRow() == null)
-			return;
-		
-		Table table = (Table)fTableCursor.getParent();
-		int row = table.indexOf(fTableCursor.getRow());
-		int col = fTableCursor.getColumn();
-		if (col == getNumCol() && e.keyCode == SWT.ARROW_RIGHT)
-		{
-			if (row + 1>= table.getItemCount())
-			{
-				return;
-			}
-			
-			row = row +1;
-			col = 0;
-			fTableCursor.setSelection(row, col);
-		}
-		if (col <= 1 && e.keyCode == SWT.ARROW_LEFT)
-		{
-			if (row-1 < 0)
-			{
-				return;
-			}
-			
-			row = row - 1;
-			col = getNumCol()+1;
-			fTableCursor.setSelection(row, col);
-		}			
-		
-		Object evtLockClient = new Object();
-		if (!fEvtHandleLock.acquireLock(evtLockClient))
-			return;
-		
-		handleCursorMoved();
-		
-		fEvtHandleLock.releaseLock(evtLockClient);
-
-	}
-	
-	/**
-	 * Update selected address.
-	 * Load more memory if required.
-	 */
-	private void handleCursorMoved()
-	{	
-		if (fIsDisposed)
-			return;
-		
-		BigInteger selectedAddress = getSelectedAddressFromCursor(fTableCursor);
-		
-		// when the cursor is moved, the selected address is changed
-		if (selectedAddress != null && !selectedAddress.equals(fSelectedAddress))
-		{
-			setSelectedAddress(selectedAddress);
-			updateSyncSelectedAddress();
-		}
-		
-		// now check to see if the cursor is approaching buffer limit
-		TableItem item = fTableCursor.getRow();
-		if (item == null)
-			return;
-		
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			int row = fTableViewer.getTable().indexOf(item);
-			
-			if (row < getBufferThreshold(BUFFER_START))
-			{
-				if (!isAtTopLimit() && getBufferThreshold(BUFFER_START) > 0)
-				{
-					if (isDynamicLoad())
-					{
-						refresh();
-						setCursorAtAddress(fSelectedAddress);
-					}
-				}
-			}
-			else if (row >= fTableViewer.getTable().getItemCount() - getBufferThreshold(BUFFER_END))
-			{
-				if (!isAtBottomLimit() && getBufferThreshold(BUFFER_END) > 0)
-				{
-					if (isDynamicLoad())
-					{
-						refresh();
-						setCursorAtAddress(fSelectedAddress);
-					}
-				}
-			}
-		}
-		
-		// if the cursor has moved, the top index of the table may change
-		// just update the synchronization service
-		BigInteger address = getTopVisibleAddress();
-		if (!address.equals(fTopRowAddress))
-		{
-			fTopRowAddress = address;
-			updateSyncTopAddress();
-		}
-	}
-	
-	private void handleCursorKeyPressed(KeyEvent event)
-	{
-		// allow edit if user hits return
-		if (event.character == '\r' && event.getSource() instanceof TableCursor)
-		{
-			activateCellEditor(null);
-			return;
-		}		
-		
-		if (MemoryViewUtil.isValidEditEvent(event.keyCode))
-		{	
-			// activate edit as soon as user types something at the cursor
-			if (event.getSource() instanceof TableCursor)
-			{
-				String initialValue = String.valueOf(event.character);
-				activateCellEditor(initialValue);
-				return;
-			}
-		}
-	}
-	
-	/**
-	 * Calculate selected address based on cursor's current position
-	 * @param cursor
-	 * @return the selected address
-	 */
-	private BigInteger getSelectedAddressFromCursor(TableCursor cursor)
-	{
-		TableItem row = cursor.getRow();
-		int col = cursor.getColumn();
-		
-		return getAddressFromTableItem(row, col);
-	}
-
-	private BigInteger getAddressFromTableItem(TableItem row, int col) {
-		if (row == null)
-			return null;
-		
-		// get row address
-		String temp = ((TableRenderingLine)row.getData()).getAddress();
-		BigInteger rowAddress = new BigInteger(temp, 16);
-		
-		int offset;
-		if (col > 0)
-		{	
-			// 	get address offset
-			int addressableUnit = getAddressableUnitPerColumn();
-			offset = (col-1) * addressableUnit;
-		}
-		else
-		{
-			offset = 0;
-		}
-		
-		return rowAddress.add(BigInteger.valueOf(offset));
-	}
-	
-	
-	/**
-	 * Sets the cursor at the specified address
-	 * @param address
-	 * @return true if successful, false otherwise
-	 */
-	private boolean setCursorAtAddress(BigInteger address)
-	{
-		if (fContentProvider.getBufferTopAddress() == null)
-			return false;
-		
-		// selected address is out of range, simply return false
-		if (address.compareTo(fContentProvider.getBufferTopAddress()) < 0)
-			return false;
-		
-		// calculate selected row address
-		int addressableUnit = getAddressableUnitPerLine();
-		int numOfRows = address.subtract(fContentProvider.getBufferTopAddress()).intValue()/addressableUnit;
-		BigInteger rowAddress = fContentProvider.getBufferTopAddress().add(BigInteger.valueOf(numOfRows * addressableUnit));
-
-		// try to find the row of the selected address
-		int row = findAddressIndex(address);
-			
-		if (row == -1)
-		{
-			return false;
-		}
-		
-		// calculate offset to the row address
-		BigInteger offset = address.subtract(rowAddress);
-		
-		// locate column
-		int colAddressableUnit = getAddressableUnitPerColumn();
-		int col = ((offset.intValue()/colAddressableUnit)+1);
-		
-		if (col == 0)
-			col = 1;
-		
-		fTableCursor.setSelection(row, col);
-		
-		return true;		
-	}
-	
-	
-	/**
-	 * Format view tab based on the bytes per line and column.
-	 * 
-	 * @param bytesPerLine - number of bytes per line, possible values: (1 / 2 / 4 / 8 / 16) * addressableSize
-	 * @param columnSize - number of bytes per column, possible values: (1 / 2 / 4 / 8 / 16) * addressableSize
-	 * @return true if format is successful, false, otherwise
-	 */
-	public boolean format(int bytesPerLine, int columnSize)
-	{	
-		
-		// selected address gets changed as the cursor is moved
-		// during the reformat.
-		// Back up the address and restore it later.
-		BigInteger selectedAddress = fSelectedAddress;
-		
-		// bytes per cell must be divisible to bytesPerLine
-		if (bytesPerLine % columnSize != 0)
-		{
-			return false;
-		}
-		
-		if (bytesPerLine < columnSize)
-		{
-			return false;
-		}
-		
-		// do not format if the view tab is already in that format
-		if(fBytePerLine == bytesPerLine && fColumnSize == columnSize){
-			return false;
-		}
-		
-		fBytePerLine = bytesPerLine;
-		fColumnSize = columnSize;
-		
-		Object evtLockClient = new Object();
-		if (!fEvtHandleLock.acquireLock(evtLockClient))
-			return false;
-		
-		// if the tab is already created and is being reformatted
-		if (fIsCreated)
-		{	
-			if (fTableViewer == null)
-				return false;
-			
-			if (fTableViewer.getTable() == null)
-				return false;
-			
-			// clean up old columns
-			TableColumn[] oldColumns = fTableViewer.getTable().getColumns();
-			
-			for (int i=0; i<oldColumns.length; i++)
-			{
-				oldColumns[i].dispose();
-			}
-			
-			// clean up old cell editors
-			CellEditor[] oldCellEditors = fTableViewer.getCellEditors();
-			
-			for (int i=0; i<oldCellEditors.length; i++)
-			{
-				oldCellEditors[i].dispose();
-			}
-		}
-		
-		TableColumn column0 = new TableColumn(fTableViewer.getTable(),SWT.LEFT,0);
-		column0.setText(DebugUIMessages.AbstractTableRendering_2); 
-		
-		// create new byte columns
-		TableColumn [] byteColumns = new TableColumn[bytesPerLine/columnSize];		
-		
-		String[] columnLabels = new String[0];
-		IMemoryBlockTablePresentation presentation = getTablePresentationAdapter();
-		if (presentation != null)
-		{
-			columnLabels = presentation.getColumnLabels(getMemoryBlock(), bytesPerLine, getNumCol());
-		}
-		
-		// check that column labels are not null
-		if (columnLabels == null)
-			columnLabels = new String[0];
-		
-		for (int i=0;i<byteColumns.length; i++)
-		{
-			TableColumn column = new TableColumn(fTableViewer.getTable(), SWT.LEFT, i+1);
-			
-			// if the number of column labels returned is correct
-			// use supplied column labels
-			if (columnLabels.length == byteColumns.length)
-			{
-				column.setText(columnLabels[i]);
-			}
-			else
-			{
-				// otherwise, use default
-				int addressableUnit = columnSize/getAddressableSize();
-				if (getAddressableUnitPerColumn() >= 4)
-				{
-					column.setText(Integer.toHexString(i*addressableUnit).toUpperCase() + 
-						" - " + Integer.toHexString(i*addressableUnit+addressableUnit-1).toUpperCase()); //$NON-NLS-1$
-				}
-				else
-				{
-					column.setText(Integer.toHexString(i*addressableUnit).toUpperCase());
-				}
-			}
-		}
-		
-		//Empty column for cursor navigation
-		TableColumn emptyCol = new TableColumn(fTableViewer.getTable(),SWT.LEFT,byteColumns.length+1);
-		emptyCol.setText(" "); //$NON-NLS-1$
-		emptyCol.setWidth(1);
-		emptyCol.setResizable(false);
-
-		// +2 to include properties for address and navigation column
-		String[] columnProperties = new String[byteColumns.length+2];
-		columnProperties[0] = TableRenderingLine.P_ADDRESS;
-		
-		int addressableUnit = columnSize / getAddressableSize();
-
-		// use column beginning offset to the row address as properties
-		for (int i=1; i<columnProperties.length-1; i++)
-		{
-			// column properties are stored as number of addressable units from the
-			// the line address
-			columnProperties[i] = Integer.toHexString((i-1)*addressableUnit);
-		}
-		
-		// Empty column for cursor navigation
-		columnProperties[columnProperties.length-1] = " "; //$NON-NLS-1$
-		
-		fTableViewer.setColumnProperties(columnProperties);		
-		
-		
-		Table table = fTableViewer.getTable();
-		fEditors = new CellEditor[table.getColumnCount()];
-		for (int i=0; i<fEditors.length; i++)
-		{
-			fEditors[i] = new TextCellEditor(table);
-		}
-		
-		// create and set cell editors
-		fTableViewer.setCellEditors(fEditors);	
-		
-		if (fIsCreated)
-		{
-			fTableViewer.refresh();
-		}		
-		
-		resizeColumnsToPreferredSize();
-		updateSyncRowSize();
-		updateSyncColSize();
-		
-		if (fIsCreated)
-		{
-			// for Linux GTK, this must happen after table viewer is refreshed
-			int i = findAddressIndex(fTopRowAddress);
-			
-			if (i >= 0)
-				setTopIndex(fTableViewer.getTable(), i);
-			
-			if (isAddressVisible(selectedAddress))
-				// after refresh, make sure the cursor is at the correct position
-				setCursorAtAddress(selectedAddress);			
-		}
-		
-		fEvtHandleLock.releaseLock(evtLockClient);
-		
-		return true;
-	}
-	
-	/**
-	 * Create the error page for this rendering.
-	 * The error page is used to report any error resulted from
-	 * getting memory from a memory block.
-	 * @param parent
-	 */
-	private void createErrorPage(Composite parent)
-	{
-		if (fTextViewer == null)
-		{
-			fTextViewer = new TextViewer(parent, SWT.WRAP);	
-			fTextViewer.setDocument(new Document());
-			StyledText styleText = fTextViewer.getTextWidget();
-			styleText.setEditable(false);
-			styleText.setEnabled(false);
-		}
-	}
-	
-	/**
-	 * Displays the content of the table viewer.
-	 */
-	public void displayTable()
-	{
-		fIsShowingErrorPage = false;
-		fPageBook.showPage(fTableViewer.getControl());
-	}
-	
-	/**
-	 * Displays an error message for the given exception.
-	 * 
-	 * @param e exception to display 
-	 */
-	public void displayError(DebugException e)
-	{
-		StyledText styleText = null;
-		fIsShowingErrorPage = true;
-
-		styleText = fTextViewer.getTextWidget();
-		
-		if (styleText != null)
-			styleText.setText(DebugUIMessages.AbstractTableRendering_3 + e.getMessage());
-		fPageBook.showPage(fTextViewer.getControl());
-		
-		// clear content cache if we need to display error
-		fContentProvider.clearContentCache();
-	}
-	
-	/**
-	 * Returns whether the error page is displayed.
-	 * 
-	 * @return whether the error page is displayed
-	 */
-	public boolean isDisplayingError()
-	{	
-		return fIsShowingErrorPage;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#getControl()
-	 */
-	public Control getControl() {
-		return fPageBook;
-	}
-	
-	/**
-	 * Returns the addressable size of this rendering's memory block in bytes.
-	 * 
-	 * @return the addressable size of this rendering's memory block in bytes
-	 */
-	public int getAddressableSize() {
-		return fAddressableSize;
-	}
-	
-	private Object getSynchronizedProperty(String propertyId)
-	{
-		IMemoryRenderingSynchronizationService syncService = getMemoryRenderingContainer().getMemoryRenderingSite().getSynchronizationService();
-		
-		if (syncService == null)
-			return null;
-		
-		return syncService.getProperty(getMemoryBlock(), propertyId);	
-	}
-	
-	/**
-	 * This method estimates the number of visible lines in the rendering
-	 * table.  
-	 * @return estimated number of visible lines in the table
-	 */
-	private int getNumberOfVisibleLines()
-	{
-		if(fTableViewer == null)
-			return -1;
-		
-		Table table = fTableViewer.getTable();
-		int height = fTableViewer.getTable().getSize().y;
-		
-		// when table is not yet created, height is zero
-		if (height == 0)
-		{
-			// make use of the table viewer to estimate table size
-			height = fTableViewer.getTable().getParent().getSize().y;
-		}
-		
-		int numberOfLines = doGetNumberOfVisibleLines(table, height);
-		
-		if (numberOfLines <= 0)
-		{
-			return 0;
-		}
-	
-		return numberOfLines;		
-	}
-
-	/**
-	 * @param table
-	 * @param height
-	 * @return
-	 */
-	private int doGetNumberOfVisibleLines(Table table, int height) {
-		// height of border
-		int border = fTableViewer.getTable().getHeaderHeight();
-		
-		// height of scroll bar
-		int scroll = fTableViewer.getTable().getHorizontalBar().getSize().y;
-
-		// height of table is table's area minus border and scroll bar height		
-		height = height-border-scroll;
-
-		// calculate number of visible lines
-		int lineHeight = getMinTableItemHeight(table);
-		
-		int numberOfLines = height/lineHeight;
-		return numberOfLines;
-	}
-	
-	private static void  setTopIndex(Table table, int index)
-	{
-		table.setTopIndex(index);
-	}
-
-	private void addRenderingToSyncService()
-	{	
-		IMemoryRenderingSynchronizationService syncService = getMemoryRenderingContainer().getMemoryRenderingSite().getSynchronizationService();
-		
-		if (syncService == null)
-			return;
-		
-		syncService.addPropertyChangeListener(this, null);
-	
-		// we could be in a format error even though the error is not yet displayed
-		// do not update sync property in this case
-		if (!isDisplayingError())
-		{
-			if (syncService.getSynchronizationProvider() == null)
-				syncService.setSynchronizationProvider(this);
-			
-			// check if there is already synchronization info available
-			Object selectedAddress =getSynchronizedProperty( AbstractTableRendering.PROPERTY_SELECTED_ADDRESS);
-			Object rowSize = getSynchronizedProperty(AbstractTableRendering.PROPERTY_ROW_SIZE);
-			Object colSize =getSynchronizedProperty( AbstractTableRendering.PROPERTY_COL_SIZE);
-			Object topAddress =getSynchronizedProperty( AbstractTableRendering.PROPERTY_TOP_ADDRESS);
-			
-			if (!isDynamicLoad())
-			{
-				Object pageStartAddress = getSynchronizedProperty(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS);
-				if (pageStartAddress == null)
-					updateSyncPageStartAddress();
-			}
-			
-			// if info is available, some other view tab has already been
-			// created
-			// do not overwrite info in the synchronizer if that's the case
-			if (selectedAddress == null) {
-				updateSyncSelectedAddress();
-			}
-			
-			if (rowSize == null)
-			{
-				updateSyncRowSize();
-			}
-
-			if (colSize == null) {
-				updateSyncColSize();
-			}
-			if (topAddress == null) {
-				updateSyncTopAddress();
-			}
-		}
-	}
-	
-	/**
-	 * Get properties from synchronizer and synchronize settings
-	 */
-	private void synchronize()
-	{			
-		if (!isDynamicLoad())
-		{
-			BigInteger pageStart = (BigInteger)getSynchronizedProperty(IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS);
-			if (pageStart != null && fContentInput != null && fContentInput.getLoadAddress() != null)
-			{
-				if (!fContentInput.getLoadAddress().equals(pageStart))
-					handlePageStartAddressChanged(pageStart);
-			}
-			else if (pageStart != null)
-			{
-				handlePageStartAddressChanged(pageStart);
-			}
-		}
-		
-		Integer rowSize = (Integer) getSynchronizedProperty(AbstractTableRendering.PROPERTY_ROW_SIZE);
-		Integer columnSize = (Integer) getSynchronizedProperty(AbstractTableRendering.PROPERTY_COL_SIZE);
-		BigInteger selectedAddress = (BigInteger)getSynchronizedProperty(AbstractTableRendering.PROPERTY_SELECTED_ADDRESS);
-		BigInteger topAddress = (BigInteger)getSynchronizedProperty(AbstractTableRendering.PROPERTY_TOP_ADDRESS);
-		
-		if (rowSize != null)
-		{
-			int rSize = rowSize.intValue();
-			if (rSize > 0 && rSize != fBytePerLine) {
-				rowSizeChanged(rSize);
-			}
-		}
-		
-		if (columnSize != null) {
-			int colSize = columnSize.intValue();
-			if (colSize > 0 && colSize != fColumnSize) {
-				columnSizeChanged(colSize);
-			}
-		}
-		if (topAddress != null) {
-			if (!topAddress.equals(getTopVisibleAddress())) {
-				if (selectedAddress != null) {
-					if (!fSelectedAddress.equals(selectedAddress)) {
-						selectedAddressChanged(selectedAddress);
-					}
-				}
-				topVisibleAddressChanged(topAddress, false);
-			}
-		}
-		if (selectedAddress != null) {
-			if (selectedAddress.compareTo(fSelectedAddress) != 0) {
-				selectedAddressChanged(selectedAddress);
-			}
-		}
-	}
-	
-	/**
-	 * Resize column to the preferred size.
-	 */
-	public void resizeColumnsToPreferredSize() {
-		// pack columns
-		Table table = fTableViewer.getTable();
-		TableColumn[] columns = table.getColumns();
-		
-		for (int i=0 ;i<columns.length-1; i++)
-		{	
-			columns[i].pack();
-		}
-		
-		if (!fIsShowAddressColumn)
-		{
-			columns[0].setWidth(0);
-		}
-	}
-	
-	/**
-	 * update selected address in synchronizer if update is true.
-	 */
-	private void updateSyncSelectedAddress() {
-		
-		if (!fIsCreated)
-			return;
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractTableRendering.PROPERTY_SELECTED_ADDRESS, null, fSelectedAddress);
-		firePropertyChangedEvent(event);
-	}
-
-	/**
-	 * update column size in synchronizer
-	 */
-	private void updateSyncColSize() {
-		
-		if (!fIsCreated)
-			return;
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractTableRendering.PROPERTY_COL_SIZE, null, new Integer(fColumnSize));
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * update column size in synchronizer
-	 */
-	private void updateSyncRowSize() {
-		
-		if (!fIsCreated)
-			return;
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractTableRendering.PROPERTY_ROW_SIZE, null, new Integer(fBytePerLine));
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * update top visible address in synchronizer
-	 */
-	private void updateSyncTopAddress() {
-		
-		if (!fIsCreated)
-			return;
-
-		PropertyChangeEvent event = new PropertyChangeEvent(this, AbstractTableRendering.PROPERTY_TOP_ADDRESS, null, fTopRowAddress);
-		firePropertyChangedEvent(event);
-	}
-	
-	private void updateSyncPageStartAddress() {
-	
-		if (!fIsCreated)
-			return;
-		
-		if (isBaseAddressChanged())
-			return;
-		
-		BigInteger pageStart;
-		if (isDynamicLoad())
-		{
-			// if dynamic loading, the page address should be the top
-			// row address
-			pageStart = fTopRowAddress;
-		}
-		else
-		{
-			// otherwise, the address is the buffer's start address
-			pageStart = fContentProvider.getBufferTopAddress();
-		}
-		
-		PropertyChangeEvent event = new PropertyChangeEvent(this, IInternalDebugUIConstants.PROPERTY_PAGE_START_ADDRESS, null, pageStart);
-		firePropertyChangedEvent(event);
-	}
-	
-	/**
-	 * Fills the context menu for this rendering
-	 * 
-	 * @param menu menu to fill
-	 */
-	protected void fillContextMenu(IMenuManager menu) {
-	
-		menu.add(new Separator("topMenu")); //$NON-NLS-1$
-		menu.add(fResetMemoryBlockAction);
-		menu.add(fGoToAddressAction);
-	
-		menu.add(new Separator());
-		
-		menu.add(fFormatRenderingAction);
-
-		if (!isDynamicLoad() && getMemoryBlock() instanceof IMemoryBlockExtension)
-		{		
-			menu.add(new Separator());
-			menu.add(fPrevAction);
-			menu.add(fNextAction);
-		}
-		
-		menu.add(new Separator());
-		menu.add(fReformatAction);
-		menu.add(fToggleAddressColumnAction);
-		menu.add(new Separator());
-		menu.add(fCopyToClipboardAction);
-		menu.add(fPrintViewTabAction);
-		if (fPropertiesAction != null)
-		{
-			menu.add(new Separator());
-			menu.add(fPropertiesAction);
-		}
-		
-	}
-	
-	/**
-	 * Returns the number of addressable units per row.
-	 *  
-	 * @return number of addressable units per row
-	 */
-	public int getAddressableUnitPerLine() {
-		return fBytePerLine / getAddressableSize();
-	}
-	
-	/**
-	 * Returns the number of addressable units per column.
-	 * 
-	 * @return number of addressable units per column
-	 */
-	public int getAddressableUnitPerColumn() {
-		return fColumnSize / getAddressableSize();
-	}
-	
-	/**
-	 * Returns the number of bytes displayed in a single column cell.
-	 * 
-	 * @return the number of bytes displayed in a single column cell
-	 */
-	public int getBytesPerColumn()
-	{
-		return fColumnSize;
-	}
-
-	/**
-	 * Returns the number of bytes displayed in a row.
-	 * 
-	 * @return the number of bytes displayed in a row
-	 */
-	public int getBytesPerLine()
-	{		
-		return fBytePerLine;
-	}
-	
-	/**
-	 * Updates labels of this rendering.
-	 */
-	public void updateLabels()
-	{
-		// update tab labels
-		updateRenderingLabel(true);
-		
-		if (fTableViewer != null)
-		{
-			// update column labels
-			setColumnHeadings();
-			fTableViewer.refresh();
-		}
-	}
-	
-
-	/* Returns the label of this rendering.
-	 * 
-	 * @return label of this rendering
-	 */
-	public String getLabel() {
-		if (fLabel == null)
-			fLabel = buildLabel(true);
-		
-		return fLabel;
-	}
-
-	
-	/**
-	 * Updates the label of this rendering, optionally displaying the
-	 * base address of this rendering's memory block.
-	 * 
-	 * @param showAddress whether to display the base address of this
-	 *  rendering's memory block in this rendering's label
-	 */
-	protected void updateRenderingLabel(boolean showAddress)
-	{	
-		fLabel = buildLabel(showAddress);
-		firePropertyChangedEvent(new PropertyChangeEvent(this, IBasicPropertyConstants.P_TEXT, null, fLabel));
-	}
-
-	private String buildLabel(boolean showAddress) {
-		String label = ""; //$NON-NLS-1$
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			label = ((IMemoryBlockExtension)getMemoryBlock()).getExpression();
-			
-			if (label.startsWith("&")) //$NON-NLS-1$
-				label = "&" + label; //$NON-NLS-1$
-			
-			if (label == null)
-			{
-				label = DebugUIMessages.AbstractTableRendering_8; 
-			}
-			
-			try {
-				if (showAddress && ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress() != null)
-				{	
-					label += " : 0x"; //$NON-NLS-1$
-					label += ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress().toString(16).toUpperCase();
-				}
-			} catch (DebugException e) {
-				// do nothing, the label will not show the address
-			}
-		}
-		else
-		{
-			long address = getMemoryBlock().getStartAddress();
-			label = Long.toHexString(address).toUpperCase();
-		}
-		
-		String preName = DebugUITools.getMemoryRenderingManager().getRenderingType(getRenderingId()).getLabel();
-		
-		if (preName != null)
-			label += " <" + preName + ">"; //$NON-NLS-1$ //$NON-NLS-2$
-		
-		return decorateLabel(label);
-	}
-	
-	private void setColumnHeadings()
-	{
-		String[] columnLabels = new String[0];
-		
-		IMemoryBlockTablePresentation presentation = getTablePresentationAdapter();
-		if (presentation != null)
-		{
-			columnLabels = presentation.getColumnLabels(getMemoryBlock(), fBytePerLine, getNumCol());
-		}
-		
-		// check that column labels returned are not null
-		if (columnLabels == null)
-			columnLabels = new String[0];
-		
-		int numByteColumns = fBytePerLine/fColumnSize;
-		
-		TableColumn[] columns = fTableViewer.getTable().getColumns();
-		
-		int j=0;
-		for (int i=1; i<columns.length-1; i++)
-		{	
-			// if the number of column labels returned is correct
-			// use supplied column labels
-			if (columnLabels.length == numByteColumns)
-			{
-				columns[i].setText(columnLabels[j]);
-				j++;
-			}
-			else
-			{
-				// otherwise, use default
-				if (fColumnSize >= 4)
-				{
-					columns[i].setText(Integer.toHexString(j*fColumnSize).toUpperCase() + 
-							" - " + Integer.toHexString(j*fColumnSize+fColumnSize-1).toUpperCase()); //$NON-NLS-1$
-				}
-				else
-				{
-					columns[i].setText(Integer.toHexString(j*fColumnSize).toUpperCase());
-				}
-				j++;
-			}
-		}
-	}
-	
-	/**
-	 * Refresh the table viewer with the current top visible address.
-	 * Update labels in the memory rendering.
-	 */
-	public void refresh()
-	{	
-		// refresh at start address of this memory block
-		// address may change if expression is evaluated to a different value
-		IMemoryBlock mem = getMemoryBlock();
-		BigInteger address;
-		
-		if (mem instanceof IMemoryBlockExtension)
-		{
-			try {
-				address = ((IMemoryBlockExtension)mem).getBigBaseAddress();
-				if (address == null)
-				{	
-					DebugException e = new DebugException(DebugUIPlugin.newErrorStatus(DebugUIMessages.AbstractTableRendering_10, null)); 
-					displayError(e);
-					return;
-				}
-				updateRenderingLabel(true);
-				// base address has changed
-				if (address.compareTo(fContentProvider.getContentBaseAddress()) != 0)
-				{
-					// get to new address
-					setSelectedAddress(address);
-					updateSyncSelectedAddress();
-					
-					reloadTable(address, true);
-					
-					if (!isDynamicLoad())
-					{
-						updateSyncPageStartAddress();
-						setTopIndex(fTableViewer.getTable(), 0);
-					}
-					
-					fTopRowAddress = getTopVisibleAddress();
-					updateSyncTopAddress();
-					
-					fContentInput.updateContentBaseAddress();
-				}
-				else
-				{
-					// reload at top of table
-					if (isDynamicLoad())
-						address = getTopVisibleAddress();
-					else
-						address = fContentInput.getLoadAddress();
-					reloadTable(address, true);
-				}
-			} catch (DebugException e) {
-				displayError(e);
-				return;
-			}				
-		}
-		else
-		{
-			address = BigInteger.valueOf(mem.getStartAddress());
-			reloadTable(address, true);
-		}
-	}
-	
-	synchronized private void reloadTable(BigInteger topAddress, boolean updateDelta){
-		
-		if (fTableViewer == null)
-			return;
-		
-		try
-		{
-			Table table = (Table)fTableViewer.getControl();	
-			
-			TableRenderingContentInput input;
-			if (isDynamicLoad())
-				input = new TableRenderingContentInput(this, fPreBuffer, fPostBuffer, topAddress, getNumberOfVisibleLines(), updateDelta, null);
-			else
-				input = new TableRenderingContentInput(this, fContentInput.getPreBuffer(), fContentInput.getPostBuffer(), topAddress, fPageSize, updateDelta, null);
-			
-			fContentInput = input;
-			fTableViewer.setInput(fContentInput);
-	
-			if (isDynamicLoad())
-			{
-				if (getMemoryBlock() instanceof IMemoryBlockExtension)
-				{
-					int topIdx = findAddressIndex(topAddress);
-					
-					if (topIdx != -1)
-					{
-						setTopIndex(table, topIdx);
-					}
-				}
-				
-				// cursor needs to be refreshed after reload
-				if (isAddressVisible(fSelectedAddress))
-					setCursorAtAddress(fSelectedAddress);
-			}
-			else
-			{
-				if (!isAddressOutOfRange(fSelectedAddress))
-				{
-					setCursorAtAddress(fSelectedAddress);
-					fTableCursor.setVisible(true);
-				}
-				else
-				{
-					fTableCursor.setVisible(false);
-				}
-			}
-		}
-		finally
-		{
-		}
-	}
-	
-	private BigInteger getTopVisibleAddress() {
-		
-		if (fTableViewer == null)
-			return BigInteger.valueOf(0);
-
-		Table table = fTableViewer.getTable();
-		int topIndex = getTopVisibleIndex(table);
-
-		if (topIndex < 1) { topIndex = 0; }
-
-		if (table.getItemCount() > topIndex) 
-		{
-			TableRenderingLine topItem = (TableRenderingLine)table.getItem(topIndex).getData();
-			
-			String calculatedAddress = null;
-			if (topItem == null)
-			{
-				calculatedAddress = table.getItem(topIndex).getText();
-			}
-			else
-			{
-				calculatedAddress = topItem.getAddress();				
-			}
-			
-			BigInteger bigInt = new BigInteger(calculatedAddress, 16);
-			return bigInt;
-		}
-		return BigInteger.valueOf(0);
-	}
-	
-	private int findAddressIndex(BigInteger address)
-	{
-		TableItem items[] = fTableViewer.getTable().getItems();
-	
-		for (int i=0; i<items.length; i++){
-			
-			// Again, when the table resizes, the table may have a null item
-			// at then end.  This is to handle that.
-			if (items[i] != null)
-			{	
-				TableRenderingLine line = (TableRenderingLine)items[i].getData();
-				BigInteger lineAddress = new BigInteger(line.getAddress(), 16);
-				int addressableUnit = getAddressableUnitPerLine();
-				BigInteger endLineAddress = lineAddress.add(BigInteger.valueOf(addressableUnit));
-				
-				if (lineAddress.compareTo(address) <= 0 && endLineAddress.compareTo(address) > 0)
-				{	
-					return i;
-				}
-			}
-		}
-		
-		return -1;
-	}
-	
-	private static int getTopVisibleIndex(Table table)
-	{
-		int index = table.getTopIndex();
-		
-		TableItem item;
-		try {
-			item = table.getItem(index);
-		} catch (IllegalArgumentException e) {
-			return 0;
-		}
-		int cnt = table.getItemCount();
-		
-		while (item.getBounds(0).y < 0)
-		{
-			index++;
-			if (index >= cnt)
-			{
-				index--;
-				break;
-			}
-			item = table.getItem(index);
-		}
-		
-		return index;
-	}
-	
-	/**
-	 * Returns this rendering's table viewer.
-	 */
-	public TableViewer getTableViewer()
-	{
-		return fTableViewer;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#dispose()
-	 */
-	public void dispose() {
-		try {	
-			// prevent rendering from being disposed again
-			if (fIsDisposed)
-				return;
-			
-			fIsDisposed = true;
-			
-			if (fContentProvider != null)
-				fContentProvider.dispose();
-			
-			ScrollBar scroll = ((Table)fTableViewer.getControl()).getVerticalBar();
-			if (scroll != null && !scroll.isDisposed())
-				scroll.removeSelectionListener(fScrollbarSelectionListener);
-			
-			if (!fTableCursor.isDisposed())
-			{
-				fTableCursor.removeTraverseListener(fCursorTraverseListener);
-				fTableCursor.removeKeyListener(fCursorKeyAdapter);
-				fTableCursor.removeMouseListener(fCursorMouseListener);
-			}
-			
-			fCursorEditor.dispose();
-			
-			fTextViewer = null;
-			fTableViewer = null;
-			fTableCursor = null;
-			
-			// clean up cell editors
-			for (int i=0; i<fEditors.length; i++)
-			{
-				fEditors[i].dispose();
-			}
-			
-			// remove font change listener when the view tab is disposed
-			JFaceResources.getFontRegistry().removeListener(this);
-			
-			// remove the view tab from the synchronizer
-			IMemoryRenderingSynchronizationService syncService = getMemoryRenderingContainer().getMemoryRenderingSite().getSynchronizationService();
-			if (syncService != null)
-				syncService.removePropertyChangeListener(this);
-			
-			DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-			
-			fToolTipShell.dispose();
-			
-			if (getPopupMenuManager() != null)
-			{
-				getPopupMenuManager().removeMenuListener(fMenuListener);
-			}
-			
-			super.dispose();
-
-		} catch (Exception e) {}
-	}
-	
-	private int getNumCol() {
-		
-		int bytesPerLine = getBytesPerLine();
-		int columnSize = getBytesPerColumn();
-		
-		return bytesPerLine/columnSize;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IMemoryViewTab#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	private void setFont(Font font)
-	{	
-		int oldIdx = getTopVisibleIndex(fTableViewer.getTable());
-		
-		// BUG in table, if font is changed when table is not starting
-		// from the top, causes table grid-line to be misaligned.
-		setTopIndex(fTableViewer.getTable(),  0);
-		
-		// set font
-		fTableViewer.getTable().setFont(font);
-		fTableCursor.setFont(font);
-		
-		setTopIndex(fTableViewer.getTable(),  oldIdx);
-		
-		resizeColumnsToPreferredSize();
-		
-		// update table cursor and force redraw
-		setCursorAtAddress(fSelectedAddress);
-	}
-	
-	
-	/**
-	 * Moves the cursor to the specified address.
-	 * Will load more memory if the address is not currently visible.
-	 * 
-	 * @param address address to position cursor at
-	 * @throws DebugException if an exception occurs
-	 */
-	public void goToAddress(BigInteger address) throws DebugException {
-		Object evtLockClient = new Object();
-		try
-		{	
-			if (!fEvtHandleLock.acquireLock(evtLockClient))
-				return;
-
-			// if address is within the range, highlight			
-			if (!isAddressOutOfRange(address))
-			{
-				setSelectedAddress(address);
-				updateSyncSelectedAddress();
-				setCursorAtAddress(fSelectedAddress);
-				
-				// force the cursor to be shown
-				if (!isAddressVisible(fSelectedAddress))
-				{	
-					int i = findAddressIndex(fSelectedAddress);
-					fTableViewer.getTable().showItem(fTableViewer.getTable().getItem(i));
-				}
-			}
-			else
-			{
-				// if not extended memory block
-				// do not allow user to go to an address that's out of range
-				if (!(getMemoryBlock() instanceof IMemoryBlockExtension))
-				{
-					Status stat = new Status(
-					 IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(),
-					 DebugException.NOT_SUPPORTED, DebugUIMessages.AbstractTableRendering_11, null  
-					);
-					DebugException e = new DebugException(stat);
-					throw e;
-				}
-
-				BigInteger startAdd = fContentInput.getStartAddress();
-				BigInteger endAdd = fContentInput.getEndAddress();
-				
-				if (address.compareTo(startAdd) < 0 ||
-					address.compareTo(endAdd) > 0)
-				{
-					Status stat = new Status(
-					 IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(),
-					 DebugException.NOT_SUPPORTED, DebugUIMessages.AbstractTableRendering_11, null  
-					);
-					DebugException e = new DebugException(stat);
-					throw e;
-				}
-				
-				setSelectedAddress(address);
-				updateSyncSelectedAddress();
-				
-				reloadTable(address, false);
-				
-				if (!isDynamicLoad())
-				{						
-					updateSyncPageStartAddress();
-				}
-				
-				// if the table is reloaded, the top address is changed in this case
-				fTopRowAddress = address;
-				updateSyncTopAddress();
-				
-				// set the cursor at the selected address after reload
-				setCursorAtAddress(address);
-			}
-			fTableCursor.setVisible(true);
-		}
-		catch (DebugException e)
-		{
-			throw e;
-		}
-		finally
-		{
-			fEvtHandleLock.releaseLock(evtLockClient);
-		}
-	}
-	
-	/**
-	 * Check if address provided is out of buffered range
-	 * @param address
-	 * @return if address is out of buffered range
-	 */
-	private boolean isAddressOutOfRange(BigInteger address)
-	{
-		return fContentProvider.isAddressOutOfRange(address);
-	}
-	
-	/**
-	 * Check if address is visible
-	 * @param address
-	 * @return if the given address is visible
-	 */
-	private boolean isAddressVisible(BigInteger address)
-	{
-		// if view tab is not yet created 
-		// cursor should always be visible
-		if (!fIsCreated)
-			return true;
-		
-		BigInteger topVisible = getTopVisibleAddress();
-		int addressableUnit = getAddressableUnitPerLine();
-		BigInteger lastVisible = getTopVisibleAddress().add(BigInteger.valueOf((getNumberOfVisibleLines() * addressableUnit) + addressableUnit));
-		
-		if (topVisible.compareTo(address) <= 0 && lastVisible.compareTo(address) > 0)
-		{
-			return true;
-		}
-		return false;
-	}
-	
-	/**
-	 * Create actions for this rendering
-	 */
-	protected void createActions() {
-		fCopyToClipboardAction = new CopyTableRenderingToClipboardAction(this, fTableViewer);
-		fGoToAddressAction = new GoToAddressAction(this);
-		fResetMemoryBlockAction = new ResetToBaseAddressAction(this);
-		fPrintViewTabAction = new PrintTableRenderingAction(this, fTableViewer);
-		
-		fFormatRenderingAction = new FormatTableRenderingAction(this);		
-		fReformatAction = new ReformatAction(this);
-		fToggleAddressColumnAction = new ToggleAddressColumnAction();
-		
-		IMemoryRenderingSite site = getMemoryRenderingContainer().getMemoryRenderingSite();
-		if (site.getSite().getSelectionProvider() != null)
-		{
-			fPropertiesAction = new PropertyDialogAction(site.getSite(),site.getSite().getSelectionProvider()); 
-		}
-		
-		fNextAction = new NextPageAction();
-		fPrevAction = new PrevPageAction();
-	}
-	
-	/**
-	 * Handle scrolling and reload table if necessary
-	 * @param event
-	 */
-	private synchronized void handleScrollBarSelection()
-	{
-		Object evtLockClient = new Object();
-		try
-		{			
-			if (fIsDisposed)
-				return;
-			
-			BigInteger address = getTopVisibleAddress();
-	
-			if (!fTopRowAddress.equals(address))
-			{
-				fTopRowAddress = address;
-				updateSyncTopAddress();
-			}
-			
-			if (!fEvtHandleLock.acquireLock(evtLockClient))
-				return;
-			
-			if (getMemoryBlock() instanceof IMemoryBlockExtension)
-			{
-
-				if (isDynamicLoad())
-				{
-					if (!isAddressOutOfRange(address))
-					{
-						Table table = fTableViewer.getTable();
-						int numInBuffer = table.getItemCount();
-						int index = findAddressIndex(address);
-						if (index < getBufferThreshold(BUFFER_START))
-						{
-							if (isAtTopLimit())
-							{
-								setTopIndex(table, index);
-							}
-							else if (getBufferThreshold(BUFFER_START) > 0)
-							{
-								reloadTable(address, false);
-							}
-						}
-						else if (getBufferThreshold(BUFFER_END) != 0 &&
-							(numInBuffer-(index+getNumberOfVisibleLines())) <= getBufferThreshold(BUFFER_END))
-						{
-							if (!isAtBottomLimit() && getBufferThreshold(BUFFER_END) > 0)
-								reloadTable(address, false);
-						}
-					}
-					else
-					{	
-						// approaching limit, reload table
-						reloadTable(address, false);
-					}
-				}
-				
-				if (isAddressVisible(fSelectedAddress))
-					fTableCursor.setVisible(true);
-				else
-					fTableCursor.setVisible(false);
-			}
-		}
-		finally
-		{
-			fEvtHandleLock.releaseLock(evtLockClient);
-		}
-	}
-	
-	
-	private boolean isAtTopLimit()
-	{	
-		BigInteger startAddress = fContentInput.getStartAddress();
-		startAddress = MemoryViewUtil.alignToBoundary(startAddress, getAddressableUnitPerLine() );
-		
-		BigInteger startBufferAddress = fContentProvider.getBufferTopAddress();
-		startBufferAddress = MemoryViewUtil.alignToBoundary(startBufferAddress, getAddressableUnitPerLine());
-		
-		if (startAddress.compareTo(startBufferAddress) == 0)
-			return true;
-		
-		return false;
-	}
-	
-	private boolean isAtBottomLimit()
-	{
-		BigInteger endAddress = fContentInput.getEndAddress();
-		endAddress = MemoryViewUtil.alignToBoundary(endAddress, getAddressableUnitPerLine());
-		
-		BigInteger endBufferAddress = fContentProvider.getBufferEndAddress();
-		endBufferAddress = MemoryViewUtil.alignToBoundary(endBufferAddress, getAddressableUnitPerLine());
-		
-		if (endAddress.compareTo(endBufferAddress) == 0)
-			return true;
-		
-		return false;		
-	}
-	
-	private boolean needMoreLines()
-	{
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-		{		
-			Table table = fTableViewer.getTable();
-			TableItem firstItem = table.getItem(0);
-			TableItem lastItem = table.getItem(table.getItemCount()-1);
-			
-			if (firstItem == null || lastItem == null)
-				return true;
-			
-			TableRenderingLine first = (TableRenderingLine)firstItem.getData();
-			TableRenderingLine last = (TableRenderingLine) lastItem.getData();
-			
-			if (first == null ||last == null)
-			{
-				// For some reason, the table does not return the correct number
-				// of table items in table.getItemCount(), causing last to be null.
-				// This check is to ensure that we don't get a null pointer exception.
-				return true;
-			}
-			
-			BigInteger startAddress = new BigInteger(first.getAddress(), 16);
-			BigInteger lastAddress = new BigInteger(last.getAddress(), 16);
-			int addressableUnit = getAddressableUnitPerLine();
-			lastAddress = lastAddress.add(BigInteger.valueOf(addressableUnit));
-			
-			BigInteger topVisibleAddress = getTopVisibleAddress();
-			long numVisibleLines = getNumberOfVisibleLines();
-			long numOfBytes = numVisibleLines * addressableUnit;
-			
-			BigInteger lastVisibleAddrss = topVisibleAddress.add(BigInteger.valueOf(numOfBytes));
-			
-			// if there are only 3 lines left at the top, refresh
-			BigInteger numTopLine = topVisibleAddress.subtract(startAddress).divide(BigInteger.valueOf(addressableUnit));
-			if (numTopLine.compareTo(BigInteger.valueOf(getBufferThreshold(BUFFER_START))) <= 0 && (startAddress.compareTo(BigInteger.valueOf(0)) != 0))
-			{
-				if (!isAtTopLimit() && getBufferThreshold(BUFFER_START) > 0)
-					return true;
-			}
-			
-			// if there are only 3 lines left at the bottom, refresh
-			BigInteger numBottomLine = lastAddress.subtract(lastVisibleAddrss).divide(BigInteger.valueOf(addressableUnit));
-			if (numBottomLine.compareTo(BigInteger.valueOf(getBufferThreshold(BUFFER_END))) <= 0)
-			{
-				if (!isAtBottomLimit() && getBufferThreshold(BUFFER_END) > 0)
-					return true;
-			}
-			
-			return false;
-		}
-		
-		return false;
-	}
-
-	private void handleTableMouseEvent(MouseEvent e) {
-		// figure out new cursor position based on here the mouse is pointing
-		TableItem[] tableItems = fTableViewer.getTable().getItems();
-		TableItem selectedRow = null;
-		int colNum = -1;
-		int numCol = fTableViewer.getColumnProperties().length;
-		
-		for (int j=0; j<tableItems.length; j++)
-		{
-			TableItem item = tableItems[j];
-			for (int i=0; i<numCol; i++)
-			{
-				Rectangle bound = item.getBounds(i);
-				if (bound.contains(e.x, e.y))
-				{
-					colNum = i;
-					selectedRow = item;
-					break;
-				}
-			}
-		}
-		
-		// if column position cannot be determined, return
-		if (colNum < 1)
-			return;
-		
-		// handle user mouse click onto table
-		// move cursor to new position
-		if (selectedRow != null)
-		{
-			int row = fTableViewer.getTable().indexOf(selectedRow);
-			fTableCursor.setVisible(true);
-			fTableCursor.setSelection(row, colNum);
-			
-			// manually call this since we don't get an event when
-			// the table cursor changes selection.
-			handleCursorMoved();
-			
-			fTableCursor.setFocus();
-		}			
-	}
-	
-	/**
-	 * Handle column size changed event from synchronizer
-	 * @param newColumnSize
-	 */
-	private void columnSizeChanged(final int newColumnSize) {
-		// ignore event if view tab is disabled
-		if (!isVisible())
-			return;
-
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				format(getBytesPerLine(), newColumnSize);
-			}
-		});
-	}
-	
-	/**
-	 * @param newRowSize - new row size in number of bytes
-	 */
-	private void rowSizeChanged(final int newRowSize)
-	{
-		// ignore event if view tab is disabled
-		if (!isVisible())
-			return;
-		
-		int bytesPerLine = newRowSize;
-		int col = getBytesPerColumn();
-		if (bytesPerLine < getBytesPerColumn())
-			col = bytesPerLine;
-
-		final int columnSize = col;
-		final int rowSize = bytesPerLine;
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				format(rowSize, columnSize);
-			}
-		});		
-	}
-	
-	private void handleCursorMouseEvent(MouseEvent e){
-		if (e.button == 1)
-		{
-			int col = fTableCursor.getColumn();
-			if (col > 0 && col <= (getNumCol()))
-				activateCellEditor(null);
-		}			
-	}
-	
-	/**
-	 * Activate cell editor and pre-fill it with initial value.
-	 * If initialValue is null, use cell content as initial value
-	 * @param initialValue
-	 */
-	private void activateCellEditor(String initialValue) {
-		
-		int col = fTableCursor.getColumn();
-		int row = findAddressIndex(fSelectedAddress);
-		
-		if (row < 0)
-			return;
-		// do not allow user to edit address column
-		if (col == 0 || col > getNumCol())
-		{
-			return;
-		}
-		
-		ICellModifier cellModifier = null;
-		
-		if (fTableViewer == null)
-		{
-			return;
-		}
-		cellModifier = fTableViewer.getCellModifier();
-		
-		TableItem tableItem = fTableViewer.getTable().getItem(row);
-		
-		Object element = tableItem.getData();
-		Object property = fTableViewer.getColumnProperties()[col];
-		Object value = cellModifier.getValue(element, (String)property);
-		
-		// The cell modifier canModify function always returns false if the edit action 
-		// is not invoked from here.  This is to prevent data to be modified when
-		// the table cursor loses focus from a cell.  By default, data will
-		// be changed in a table when the cell loses focus.  This is to workaround
-		// this default behavior and only change data when the cell editor
-		// is activated.
-		((TableRenderingCellModifier)cellModifier).setEditActionInvoked(true);
-		boolean canEdit = cellModifier.canModify(element, (String)property);
-		((TableRenderingCellModifier)cellModifier).setEditActionInvoked(false);
-		
-		if (!canEdit)
-			return;
-		
-		// activate based on current cursor position
-		TextCellEditor selectedEditor = (TextCellEditor)fTableViewer.getCellEditors()[col];
-
-		
-		if (fTableViewer != null && selectedEditor != null)
-		{
-			// The control that will be the editor must be a child of the Table
-			Text text = (Text)selectedEditor.getControl();
-			
-			String cellValue  = null;
-			
-			if (initialValue != null)
-			{
-				cellValue = initialValue;	
-			}
-			else	
-			{
-				cellValue = ((String)value);
-			}
-			
-			text.setText(cellValue);
-	
-			fCursorEditor.horizontalAlignment = SWT.LEFT;
-			fCursorEditor.grabHorizontal = true;
-	
-			// Open the text editor in selected column of the selected row.
-			fCursorEditor.setEditor (text, tableItem, col);
-	
-			// Assign focus to the text control
-			selectedEditor.setFocus();
-			
-			if (initialValue != null)
-			{
-				text.clearSelection();
-			}
-			
-			text.setFont(JFaceResources.getFont(IInternalDebugUIConstants.FONT_NAME));
-
-			// add listeners for the text control
-			addListeners(text);
-			
-			// move cursor below text control
-			fTableCursor.moveBelow(text);
-		}
-	}
-	
-	/**
-	 * @param text
-	 */
-	private void addListeners(Text text) {
-		fEditorFocusListener = new FocusAdapter() {
-			public void focusLost(FocusEvent e)
-			{
-				handleTableEditorFocusLost(e);
-			}
-		};
-		text.addFocusListener(fEditorFocusListener);
-		
-		fEditorKeyListener = new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				handleKeyEventInEditor(e);
-			}
-		};
-
-		text.addKeyListener(fEditorKeyListener);
-	}
-	
-	/**
-	 * @param text
-	 */
-	private void removeListeners(Text text) {
-		
-		text.removeFocusListener(fEditorFocusListener);
-		text.removeKeyListener(fEditorKeyListener);
-	}
-	
-	private void handleTableEditorFocusLost(FocusEvent event)
-	{
-		final FocusEvent e = event;
-
-		Display.getDefault().syncExec(new Runnable() {
-
-			public void run()
-			{
-				try
-				{
-					int row = findAddressIndex(fSelectedAddress);
-					int col = fTableCursor.getColumn();
-					
-					Text text = (Text)e.getSource();
-					removeListeners(text);
-
-					// get new value
-					String newValue = text.getText();
-					
-					// modify memory at fRow and fCol
-					modifyValue(row, col, newValue);
-							
-					// show cursor after modification is completed
-					setCursorAtAddress(fSelectedAddress);
-					fTableCursor.moveAbove(text);
-					fTableCursor.setVisible(false);
-					fTableCursor.setVisible(true);
-				}
-				catch (NumberFormatException e1)
-				{
-					MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, 
-						DebugUIMessages.MemoryViewCellModifier_data_is_invalid, null);
-				}		
-			}
-		});		
-	}
-	
-	/**
-	 * @param event
-	 */
-	private void handleKeyEventInEditor(KeyEvent event) {
-		final KeyEvent e = event;
-		Display.getDefault().asyncExec(new Runnable()
-		{
-			public void run()
-			{
-				Text text = (Text)e.getSource();
-				int row = findAddressIndex(fSelectedAddress);
-				int col = fTableCursor.getColumn();
-				
-				try
-				{
-					switch (e.keyCode)
-					{
-						case SWT.ARROW_UP :
-							
-							// move text editor box up one row		
-							if (row-1 < 0)
-								return;
-						
-							// modify value for current cell
-							modifyValue(row, col, text.getText());
-													
-							row--;
-
-							//	update cursor location and selection in table	
-							fTableCursor.setSelection(row, col);
-							handleCursorMoved();
-							
-							// remove listeners when focus is lost
-							removeListeners(text);
-							activateCellEditor(null);
-							break;
-						case SWT.ARROW_DOWN :
-							
-							// move text editor box down one row
-							
-							if (row+1 >= fTableViewer.getTable().getItemCount())
-								return;
-							
-							// modify value for current cell
-							modifyValue(row, col, text.getText());
-						
-							row++;
-							
-							//	update cursor location and selection in table								
-							fTableCursor.setSelection(row, col);
-							handleCursorMoved();
-												
-							// remove traverse listener when focus is lost
-							removeListeners(text);
-							activateCellEditor(null);		
-							break;
-						case 0:
-							
-						// if user has entered the max number of characters allowed in a cell, move to next cell
-						// Extra changes will be used as initial value for the next cell
-							int numCharsPerByte = getNumCharsPerByte();
-							if (numCharsPerByte > 0)
-							{
-								if (text.getText().length() > getBytesPerColumn()*numCharsPerByte)
-								{
-									String newValue = text.getText();
-									text.setText(newValue.substring(0, getBytesPerColumn()*numCharsPerByte));
-									
-									modifyValue(row, col, text.getText());
-									
-									// if cursor is at the end of a line, move to next line
-									if (col >= getNumCol())
-									{
-										col = 1;
-										row++;
-									}
-									else
-									{
-										// move to next column
-										row++;
-									}
-									
-									// update cursor position and selected address
-									fTableCursor.setSelection(row, col);
-									handleCursorMoved();
-									
-									removeListeners(text);
-						
-									// activate text editor at next cell
-									activateCellEditor(newValue.substring(getBytesPerColumn()*numCharsPerByte));
-								}
-							}
-							break;	
-						case SWT.ESC:
-
-							// if user has pressed escape, do not commit the changes
-							// that's why "modifyValue" is not called
-							fTableCursor.setSelection(row, col);
-							handleCursorMoved();
-					
-							removeListeners(text);
-							
-							// cursor needs to have focus to remove focus from cell editor
-							fTableCursor.setFocus();
-							break;	
-						default :
-							numCharsPerByte = getNumCharsPerByte();
-							if (numCharsPerByte > 0)
-							{								
-								if (text.getText().length()> getBytesPerColumn()* numCharsPerByte)
-								{
-									String newValue = text.getText();
-									text.setText(newValue.substring(0,getBytesPerColumn()* numCharsPerByte));
-									modifyValue(row, col, text.getText());
-									// if cursor is at the end of a line, move to next line
-									if (col >= getNumCol())
-									{
-										col = 1;
-										row++;
-									}
-									else
-									{
-										col++;
-									}
-									
-									fTableCursor.setSelection(row, col);
-									handleCursorMoved();
-									
-									removeListeners(text);
-									
-									activateCellEditor(newValue.substring(getBytesPerColumn()*numCharsPerByte));
-								}
-							}
-						break;
-					}
-				}
-				catch (NumberFormatException e1)
-				{
-					MemoryViewUtil.openError(DebugUIMessages.MemoryViewCellModifier_failure_title, 
-						DebugUIMessages.MemoryViewCellModifier_data_is_invalid, null);
-					
-					fTableCursor.setSelection(row, col);
-					handleCursorMoved();
-			
-					removeListeners(text);
-				}
-			}
-		});
-	}
-
-	
-	/**
-	 * Modify value and send new value to debug adapter
-	 * @param row
-	 * @param col
-	 * @param newValue
-	 * @throws NumberFormatException
-	 */
-	private void modifyValue(int row, int col, String newValue) throws NumberFormatException
-	{
-		if (newValue.length() == 0)
-		{	
-			// do not do anything if user has not entered anything
-			return;
-		}
-		
-		TableItem tableItem = fTableViewer.getTable().getItem(row);
-
-		Object property = fTableViewer.getColumnProperties()[col];
-		fTableViewer.getCellModifier().modify(tableItem, (String)property, newValue);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#becomesHidden()
-	 */
-	public void becomesHidden() {
-		
-		if (isVisible() == false)
-		{
-			// super should always be called
-			super.becomesHidden();
-			return;
-		}
-
-		super.becomesHidden();
-		
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-		{	
-			updateRenderingLabel(false);
-		}
-			
-		// once the view tab is disabled, all deltas information becomes invalid.
-		// reset changed information and recompute if data has really changed when
-		// user revisits the same tab.	
-		fContentProvider.resetDeltas();
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IMemoryRendering#becomesVisible()
-	 */
-	public void becomesVisible() {
-		
-		// do not do anything if already visible
-		if (isVisible() == true)
-		{
-			// super should always be called
-			super.becomesVisible();
-			return;
-		}
-		
-		super.becomesVisible();
-		
-		boolean value = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
-		if (value != isDynamicLoad())
-			// this call will cause a reload
-			handleDyanicLoadChanged();
-		else
-			refresh();
-		
-		synchronize();
-		updateRenderingLabel(true);
-	}
-	
-	/**
-	 * Resets this memory rendering.
-	 * The cursor will be moved to the base address of the memory block.
-	 * The table will be positioned to have the base address
-	 * at the top.
-	 * 
-	 * @deprecated use <code>resetRendering</code> to reset this rendering.
-	 */
-	public void reset()
-	{
-		try {
-			resetToBaseAddress();
-		} catch (DebugException e) {
-			MemoryViewUtil.openError(DebugUIMessages.AbstractTableRendering_12, DebugUIMessages.AbstractTableRendering_13, e); //
-		}
-	}
-	
-	/**
-	 * Reset this rendering to the base address.  
-	 * The cursor will be moved to the base address of the memory block.
-	 * The table will be positioned to have the base address
-	 * at the top.
-	 * @throws DebugException
-	 */
-	private void resetToBaseAddress() throws DebugException
-	{
-		BigInteger baseAddress;
-
-		if (getMemoryBlock() instanceof IMemoryBlockExtension)
-		{
-			baseAddress = ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress();
-		}
-		else
-		{
-			baseAddress = BigInteger.valueOf(getMemoryBlock().getStartAddress());
-		}
-
-		goToAddress(baseAddress);
-		topVisibleAddressChanged(baseAddress, true);
-	}
-	
-	/**
-	 * Returns the currently selected address in this rendering.
-	 * 
-	 * @return the currently selected address in this rendering
-	 */
-	public BigInteger getSelectedAddress() {
-		return fSelectedAddress;
-	}
-
-	/**
-	 * Returns the currently selected content in this rendering as a String.
-	 * 
-	 * @return the currently selected content in this rendering
-	 */
-	public String getSelectedAsString() {
-
-		if (isAddressOutOfRange(fSelectedAddress))
-			return ""; //$NON-NLS-1$
-		
-		int col = fTableCursor.getColumn();
-		TableItem rowItem = fTableCursor.getRow();
-		int row = fTableViewer.getTable().indexOf(rowItem);
-		
-		if (col == 0)
-		{
-			return rowItem.getText(0);
-		}
-		
-		// check precondition
-		if (col > getBytesPerLine()/getBytesPerColumn())
-		{
-			return ""; //$NON-NLS-1$
-		}
-				
-		TableItem tableItem = getTableViewer().getTable().getItem(row);
-		
-		return tableItem.getText(col);	
-	}
-	
-	/**
-	 * Returns the currently selected content in this rendering as MemoryByte.
-	 * 
-	 * @return the currently selected content in array of MemoryByte.  
-	 * Returns an empty array if the selected address is out of buffered range.
-	 */
-	public MemoryByte[] getSelectedAsBytes()
-	{
-		if (isAddressOutOfRange(fSelectedAddress))
-			return new MemoryByte[0];
-		
-		int col = fTableCursor.getColumn();
-		TableItem rowItem = fTableCursor.getRow();
-		
-		// check precondition
-		if (col == 0 || col > getBytesPerLine()/getBytesPerColumn())
-		{
-			return new MemoryByte[0];
-		}
-		
-		Object data = rowItem.getData();
-		if (data == null || !(data instanceof TableRenderingLine))
-			return new MemoryByte[0];
-		
-		TableRenderingLine line = (TableRenderingLine)data;
-		int offset = (col-1)*(getAddressableUnitPerColumn()*getAddressableSize());
-		int end = offset + (getAddressableUnitPerColumn()*getAddressableSize());
-		
-		// make a copy of the bytes to ensure that data cannot be changed
-		// by caller
-		MemoryByte[] bytes = line.getBytes(offset, end);
-		MemoryByte[] retBytes = new MemoryByte[bytes.length];
-		
-		System.arraycopy(bytes, 0, retBytes, 0, bytes.length);
-		
-		return retBytes;
-	}
-	
-	/**
-	 * Returns the number of characters a byte will convert to
-	 * or -1 if unknown.
-	 * 
-	 * @return the number of characters a byte will convert to
-	 *  or -1 if unknown
-	 */
-	public int getNumCharsPerByte()
-	{
-		return -1;
-	}
-	
-	private int getMinTableItemHeight(Table table){
-		
-		// Hack to get around Linux GTK problem.
-		// On Linux GTK, table items have variable item height as
-		// carriage returns are actually shown in a cell.  Some rows will be
-		// taller than others.  When calculating number of visible lines, we
-		// need to find the smallest table item height.  Otherwise, the rendering
-		// underestimates the number of visible lines.  As a result the rendering
-		// will not be able to get more memory as needed.
-		if (MemoryViewUtil.isLinuxGTK())
-		{
-			// check each of the items and find the minimum
-			TableItem[] items = table.getItems();
-			int minHeight = table.getItemHeight();
-			for (int i=0; i<items.length; i++)
-			{
-				minHeight = Math.min(items[i].getBounds(0).height, minHeight);
-			}
-			
-			return minHeight;
-				
-		}
-		return table.getItemHeight();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		
-		if (adapter == IColorProvider.class)
-			return getColorProviderAdapter();
-		
-		if (adapter == ILabelProvider.class)
-			return getLabelProviderAdapter();
-		
-		if (adapter == IFontProvider.class)
-			return getFontProviderAdapter();
-		
-		if (adapter == IMemoryBlockTablePresentation.class)
-			return getTablePresentationAdapter();
-		
-		if (adapter == IWorkbenchAdapter.class)
-		{
-			// needed workbench adapter to fill the title of property page
-			if (fWorkbenchAdapter == null) {
-				fWorkbenchAdapter = new IWorkbenchAdapter() {
-					public Object[] getChildren(Object o) {
-						return new Object[0];
-					}
-	
-					public ImageDescriptor getImageDescriptor(Object object) {
-						return null;
-					}
-	
-					public String getLabel(Object o) {
-						return AbstractTableRendering.this.getLabel();
-					}
-	
-					public Object getParent(Object o) {
-						return null;
-					}
-				};
-			}
-			return fWorkbenchAdapter;
-		}
-		
-		if (adapter == IMemoryBlockConnection.class) {
-			if (fConnection == null) {
-				fConnection = new IMemoryBlockConnection() {
-					public void update() {
-						try {
-							fContentProvider.takeContentSnapshot();
-							if (getMemoryBlock() instanceof IMemoryBlockExtension)
-							{
-								BigInteger address = ((IMemoryBlockExtension)getMemoryBlock()).getBigBaseAddress();
-								if (address.compareTo(fContentProvider.getContentBaseAddress()) != 0)
-								{
-									// get to new address
-									setSelectedAddress(address);
-									updateSyncSelectedAddress();
-									fTopRowAddress = address;
-									fContentInput.updateContentBaseAddress();
-									fContentInput.setLoadAddress(address);
-								}
-								fContentProvider.loadContentForExtendedMemoryBlock();
-							}
-							else
-								fContentProvider.loadContentForSimpleMemoryBlock();
-	
-							// update UI asynchronously
-							Display display = DebugUIPlugin.getDefault().getWorkbench().getDisplay();
-							display.asyncExec(new Runnable() {
-								public void run() {
-									updateLabels();
-									
-									if (getMemoryBlock() instanceof IMemoryBlockExtension) {
-										int topIdx = findAddressIndex(fTopRowAddress);
-										if (topIdx != -1) {
-											setTopIndex(fTableViewer.getTable(),topIdx);
-										}
-									}
-									
-									// cursor needs to be refreshed after reload
-									if (isAddressVisible(fSelectedAddress))
-									{
-										setCursorAtAddress(fSelectedAddress);
-										fTableCursor.setVisible(true);
-										fTableCursor.redraw();
-									}
-									else
-									{
-										fTableCursor.setVisible(false);
-									}
-									
-									if (!isDynamicLoad())
-										updateSyncPageStartAddress();
-									
-									updateSyncTopAddress();
-								}
-							});
-						} catch (DebugException e) {
-							displayError(e);
-						}
-					}
-				};
-			}
-			return fConnection;
-		}	
-		
-		return super.getAdapter(adapter);
-	}
-	
-	private boolean hasCustomizedDecorations()
-	{
-		if (getFontProviderAdapter() == null &&
-			getColorProviderAdapter() == null &&
-			getLabelProviderAdapter() == null)
-			return false;
-		return true;
-	}
-	
-	private boolean isBaseAddressChanged()
-	{
-		try {
-			IMemoryBlock mb = getMemoryBlock();
-			if (mb instanceof IMemoryBlockExtension)
-			{
-				BigInteger baseAddress = ((IMemoryBlockExtension)mb).getBigBaseAddress();
-				if (baseAddress != null)
-				{
-					if (!baseAddress.equals(fContentInput.getContentBaseAddress()))
-						return true;
-				}
-			}
-		} catch (DebugException e1) {
-			return false;
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns the color provider for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a color provider is obtained by asking this rendering's
-	 * memory block for its {@link IColorProvider} adapter. When the color
-	 * provider is queried for color information, it is provided with a
-	 * {@link MemoryRenderingElement} as an argument. 
-	 * </p>
-	 * @return the color provider for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected IColorProvider getColorProviderAdapter()
-	{
-		return (IColorProvider)getMemoryBlock().getAdapter(IColorProvider.class);
-	}
-	
-	/**
-	 * Returns the label provider for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a label provider is obtained by asking this rendering's
-	 * memory block for its {@link ILabelProvider} adapter. When the label
-	 * provider is queried for label information, it is provided with a
-	 * {@link MemoryRenderingElement} as an argument. 
-	 * </p>
-	 * @return the label provider for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected ILabelProvider getLabelProviderAdapter()
-	{
-		return (ILabelProvider)getMemoryBlock().getAdapter(ILabelProvider.class);
-	}
-	
-	/**
-	 * Returns the font provider for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a font provider is obtained by asking this rendering's
-	 * memory block for its {@link IFontProvider} adapter. When the font
-	 * provider is queried for font information, it is provided with a
-	 * {@link MemoryRenderingElement} as an argument. 
-	 * </p>
-	 * @return the font provider for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected IFontProvider getFontProviderAdapter()
-	{
-		return (IFontProvider)getMemoryBlock().getAdapter(IFontProvider.class);
-	}
-	
-	/**
-	 * Returns the table presentation for this rendering's memory block or
-	 * <code>null</code> if none.
-	 * <p>
-	 * By default a table presentation is obtained by asking this rendering's
-	 * memory block for its {@link IMemoryBlockTablePresentation} adapter.
-	 * </p>
-	 * @return the table presentation for this rendering's memory block,
-	 *  or <code>null</code>
-	 */
-	protected IMemoryBlockTablePresentation getTablePresentationAdapter()
-	{
-		return (IMemoryBlockTablePresentation)getMemoryBlock().getAdapter(IMemoryBlockTablePresentation.class);
-	}
-	
-	private boolean isDynamicLoad()
-	{
-		return fContentProvider.isDynamicLoad();
-	}
-	
-	private int getPageSizeInUnits()
-	{
-		return fPageSize * getAddressableUnitPerLine();
-	}
-	
-	private void setSelectedAddress(BigInteger address)
-	{
-		fSelectedAddress = address;
-	}
-		
-	/**
-	 * Setup the viewer so it supports hovers to show the offset of each field
-	 */
-	private void createToolTip() {
-		
-		fToolTipShell = new Shell(DebugUIPlugin.getShell(), SWT.ON_TOP | SWT.RESIZE );
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginWidth = 2;
-		gridLayout.marginHeight = 0;
-		fToolTipShell.setLayout(gridLayout);
-		fToolTipShell.setBackground(fTableViewer.getTable().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		
-		final Control toolTipControl = createToolTipControl(fToolTipShell);
-		
-		if (toolTipControl == null)
-		{
-			// if client decide not to use tooltip support
-			fToolTipShell.dispose();
-			return;
-		}
-		
-		MouseTrackAdapter listener = new MouseTrackAdapter(){
-			
-			private TableItem fTooltipItem = null;
-			private int fCol = -1;
-			
-			public void mouseExit(MouseEvent e){
-				
-				if (!fToolTipShell.isDisposed())
-					fToolTipShell.setVisible(false);
-				fTooltipItem = null;
-			}
-			
-			public void mouseHover(MouseEvent e){
-				
-				Point hoverPoint = new Point(e.x, e.y);
-				Control control = null;
-				
-				if (e.widget instanceof Control)
-					control = (Control)e.widget;
-				
-				if (control == null)
-					return;
-				
-				hoverPoint = control.toDisplay(hoverPoint);
-				TableItem item = getItem(hoverPoint);
-				int column = getColumn(hoverPoint);
-				
-				//Only if there is a change in hover
-				if(this.fTooltipItem != item || fCol != column){
-					
-					//Keep Track of the latest hover
-					fTooltipItem = item;
-					fCol = column;
-					
-					if(item != null){
-						toolTipAboutToShow(toolTipControl, fTooltipItem, column);
-						
-						//Setting location of the tooltip
-						Rectangle shellBounds = fToolTipShell.getBounds();
-						shellBounds.x = hoverPoint.x;
-						shellBounds.y = hoverPoint.y + item.getBounds(0).height;
-						
-						fToolTipShell.setBounds(shellBounds);
-						fToolTipShell.pack();
-						
-						fToolTipShell.setVisible(true);
-					}
-					else {
-						fToolTipShell.setVisible(false);
-					}
-				}
-			}
-		};
-		
-		fTableViewer.getTable().addMouseTrackListener(listener);
-		fTableCursor.addMouseTrackListener(listener);
-	}
-	
-	/**
-	 * Bug with table widget,BUG 113015, the widget is not able to return the correct
-	 * table item if SWT.FULL_SELECTION is not on when the table is created.
-	 * Created the following function to work around the problem.
-	 * We can remove this method when the bug is fixed.
-	 * @param point
-	 * @return the table item where the point is located, return null if the item cannot be located.
-	 */
-	private TableItem getItem(Point point)
-	{
-		TableItem[] items = fTableViewer.getTable().getItems();
-		for (int i=0; i<items.length; i++)
-		{
-			Point start = new Point(items[i].getBounds(0).x, items[i].getBounds(0).y);
-			start = fTableViewer.getTable().toDisplay(start);
-			Point end = new Point(start.x + items[i].getBounds(0).width, start.y + items[i].getBounds(0).height);
-			
-			if (start.y < point.y && point.y < end.y)
-				return items[i];
-		}
-		return null;
-	}
-	
-	/**
-	 * Method for figuring out which column the point is located.
-	 * @param point
-	 * @return the column index where the point is located, return -1 if column is not found.
-	 */
-	private int getColumn(Point point) {
-		int colCnt = fTableViewer.getTable().getColumnCount();
-		if(fTableViewer.getTable().getItemCount() > 0) {
-			TableItem item = fTableViewer.getTable().getItem(0);
-			Point start, end;
-			for (int i=0; i<colCnt; i++) {
-				start = new Point(item.getBounds(i).x, item.getBounds(i).y);
-				start = fTableViewer.getTable().toDisplay(start);
-				end = new Point(start.x + item.getBounds(i).width, start.y + item.getBounds(i).height);
-				if (start.x < point.x && end.x > point.x) {
-					return i;
-				}
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Creates the control used to display tool tips for cells in this table. By default
-	 * a label is used to display the address of the cell. Clients may override this
-	 * method to create custom tooltip controls.
-	 * <p>
-	 * Also see the methods <code>getToolTipText(...)</code> and 
-	 * <code>toolTipAboutToShow(...)</code>.
-	 * </p>
-	 * @param composite parent for the tooltip control
-	 * @return the tooltip control to be displayed
-	 * @since 3.2
-	 */
-	protected Control createToolTipControl(Composite composite) {
-		Control fToolTipLabel = new Label(composite, SWT.NONE);
-		fToolTipLabel.setForeground(fTableViewer.getTable().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-		fToolTipLabel.setBackground(fTableViewer.getTable().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		fToolTipLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL |
-				GridData.VERTICAL_ALIGN_CENTER));
-		return fToolTipLabel;
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.IResettableMemoryRendering#resetRendering()
-	 */
-	public void resetRendering() throws DebugException {
-		resetToBaseAddress();
-	}
-
-	/**
-	 * Called when the tool tip is about to show in this rendering.
-	 * Clients who overrides <code>createTooltipControl</code> may need to
-	 * also override this method to ensure that the tooltip shows up properly
-	 * in their customized control.
-	 * <p>
-	 * By default a text tooltip is displayed, and the contents for the tooltip
-	 * are generated by the <code>getToolTipText(...)</code> method.
-	 * </p>
-	 * @param toolTipControl - the control for displaying the tooltip
-	 * @param item - the table item where the mouse is pointing.
-	 * @param col - the column at which the mouse is pointing.
-	 * @since 3.2
-	 */
-	protected void toolTipAboutToShow(Control toolTipControl, TableItem item,
-			int col) {
-		if (toolTipControl instanceof Label) {
-			BigInteger address = getAddressFromTableItem(item, col);
-			if (address != null) {
-				Object data = item.getData();
-				if (data instanceof TableRenderingLine) {
-					TableRenderingLine line = (TableRenderingLine) data;
-
-					if (col > 0) {
-						int start = (col - 1) * getBytesPerColumn();
-						int end = start + getBytesPerColumn();
-						MemoryByte[] bytes = line.getBytes(start, end);
-
-						String str = getToolTipText(address, bytes);
-
-						if (str != null)
-							((Label) toolTipControl).setText(str);
-					} else {
-						String str = getToolTipText(address,
-								new MemoryByte[] {});
-
-						if (str != null)
-							((Label) toolTipControl).setText(str);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Returns the text to display in a tool tip at the specified address
-	 * for the specified bytes. By default the address of the bytes is displayed.
-	 * Subclasses may override.
-	 * 
-	 * @param address address of cell that tool tip is displayed for 
-	 * @param bytes the bytes in the cell
-	 * @return the tooltip text for the memory bytes located at the specified
-	 *         address
-	 * @since 3.2
-	 */
-	protected String getToolTipText(BigInteger address, MemoryByte[] bytes)
-	{
-		StringBuffer buf = new StringBuffer("0x"); //$NON-NLS-1$
-		buf.append(address.toString(16).toUpperCase());
-		
-		return buf.toString();
-	}
-	
-	
-	private String getRowPrefId(String modelId) {
-		String rowPrefId = IDebugPreferenceConstants.PREF_ROW_SIZE + ":" + modelId; //$NON-NLS-1$
-		return rowPrefId;
-	}
-
-	private String getColumnPrefId(String modelId) {
-		String colPrefId = IDebugPreferenceConstants.PREF_COLUMN_SIZE + ":" + modelId; //$NON-NLS-1$
-		return colPrefId;
-	}
-	
-	/**
-	 * @param modelId
-	 * @return default number of addressable units per line for the model
-	 */
-	private int getDefaultRowSizeByModel(String modelId)
-	{
-		int row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-		if (row == 0)
-		{
-			DebugUITools.getPreferenceStore().setValue(getRowPrefId(modelId), IDebugPreferenceConstants.PREF_ROW_SIZE_DEFAULT);
-		}
-		
-		row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId));
-		return row;
-		
-	}
-	
-	/**
-	 * @param modelId
-	 * @return default number of addressable units per column for the model
-	 */
-	private int getDefaultColumnSizeByModel(String modelId)
-	{
-		int col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-		if (col == 0)
-		{
-			DebugUITools.getPreferenceStore().setValue(getColumnPrefId(modelId), IDebugPreferenceConstants.PREF_COLUMN_SIZE_DEFAULT);
-		}
-		
-		col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId));
-		return col;
-	}
-	
-	private int getBufferThreshold(int startOrEnd)
-	{
-		if (startOrEnd == BUFFER_START)
-		{
-			if (BUFFER_THRESHOLD > fPreBuffer)
-				return fPreBuffer;
-			return BUFFER_THRESHOLD;
-		}
-		
-		if (BUFFER_THRESHOLD > fPostBuffer)
-			return fPostBuffer;
-		
-		return BUFFER_THRESHOLD;
-	}
-
-	
-	/**
-	 * Returns text for the given memory bytes at the specified address for the specified
-	 * rendering type. This is called by the label provider for.
-	 * Subclasses must override.
-	 * 
-	 * @param renderingTypeId rendering type identifier
-	 * @param address address where the bytes belong to
-	 * @param data the bytes
-	 * @return a string to represent the memory. Cannot not return <code>null</code>.
-	 * 	Returns a string to pad the cell if the memory cannot be converted
-	 *  successfully.
-	 */
-	abstract public String getString(String renderingTypeId, BigInteger address, MemoryByte[] data);
-	
-	/**
-	 * Returns bytes for the given text corresponding to bytes at the given
-	 * address for the specified rendering type. This is called by the cell modifier
-	 * when modifying bytes in a memory block.
-	 * Subclasses must convert the string value to an array of bytes.  The bytes will
-	 * be passed to the debug adapter for memory block modification.
-	 * Returns <code>null</code> if the bytes cannot be formatted properly.
-	 * 
-	 * @param renderingTypeId rendering type identifier
-	 * @param address address the bytes begin at
-	 * @param currentValues current values of the data in bytes format
-	 * @param newValue the string to be converted to bytes
-	 * @return the bytes converted from a string
-	 */
-	abstract public byte[] getBytes(String renderingTypeId, BigInteger address, MemoryByte[] currentValues, String newValue);
-
-
-}	
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTextRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTextRendering.java
deleted file mode 100644
index 06a4417..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/AbstractTextRendering.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.memory;
-
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.IDebugUIConstants;
-
-/**
- * Abstract implementation of a rendering that translates memory into 
- * text, displayed in a table.
- * <p>
- * Clients should subclass from this class if they wish to provide a table
- * text rendering with a specific code page.
- * </p>
- * @since 3.1
- */
-abstract public class AbstractTextRendering extends AbstractTableRendering { 	
-	
-	private String fCodePage;
-
-	/**
-	 * Constructs a text rendering of the specified type.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 */
-	public AbstractTextRendering(String renderingId)
-	{
-		super(renderingId);
-	}
-	
-	/**
-	 * Constructs a text rendering of the specified type on the given
-	 * code page.
-	 * 
-	 * @param renderingId memory rendering type identifier
-	 * @param codePage the name of a supported
-     *  {@link java.nio.charset.Charset </code>charset<code>}, for
-     *  example <code>CP1252</code>
-	 */
-	public AbstractTextRendering(String renderingId, String codePage)
-	{
-		super(renderingId);
-		fCodePage = codePage;
-	}
-	
-	/**
-	 * Sets the code page for this rendering.  This does not cause
-	 * the rendering to be updated with the new code page.  Clients need
-	 * to update the rendering manually when the code page is changed.
-	 * 
-	 * @param codePage the name of a supported
-	 * {@link java.nio.charset.Charset </code>charset<code>}, for
-     *  example <code>CP1252</code>
-	 */
-	public void setCodePage(String codePage)
-	{
-		fCodePage = codePage;
-	}
-	
-	/**
-	 * Returns the current code page used by this rendering.  Returns null
-	 * if not set.
-	 * @return  Returns the current code page used by this rendering.  Returns null
-	 * if not set.
-	 */
-	public String getCodePage()
-	{
-		return fCodePage;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.AbstractTableRendering#getString(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[])
-	 */
-	public String getString(String dataType, BigInteger address,  MemoryByte[] data) {
-		try {
-			String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
-			if(fCodePage == null)
-				return ""; //$NON-NLS-1$
-			
-			boolean[] invalid = new boolean[data.length];
-			boolean hasInvalid = false;
-			byte byteArray[] = new byte[data.length];
-			for (int i=0; i<data.length; i++)
-			{
-				if (!data[i].isReadable())
-				{
-					invalid[i] = true;
-					hasInvalid = true;
-				}
-				byteArray[i] = data[i].getValue();
-			}
-			
-			if (hasInvalid)
-			{
-				StringBuffer strBuf = new StringBuffer();
-				for (int i=0; i<data.length; i++)
-				{
-					if (invalid[i])
-						strBuf.append(paddedStr);
-					else
-						strBuf.append(new String(new byte[]{byteArray[i]}, fCodePage));
-				}
-				return strBuf.toString();
-			}
-
-			return new String(byteArray, fCodePage);
-
-		} catch (UnsupportedEncodingException e) {
-			return "-- error --"; //$NON-NLS-1$
-		}
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.memory.AbstractTableRendering#getBytes(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String)
-	 */
-	public byte[] getBytes(String dataType, BigInteger address, MemoryByte[] currentValues, String data) {
-		try {
-			
-			if (fCodePage == null)
-				return new byte[0];
-			
-			byte[] bytes =  data.getBytes(fCodePage);
-			return bytes;
-			
-		} catch (UnsupportedEncodingException e) {
-			return new byte[0];
-		}
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryBlockTablePresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryBlockTablePresentation.java
deleted file mode 100644
index ff86003..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryBlockTablePresentation.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.debug.ui.memory;
-
-import java.math.BigInteger;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-
-
-/**
- * Allows debug models to customize the rendering of addresses for its memory blocks
- * in table and text based renderings provided by the debug platform.
- * <p>
- * To contribute a memory block table presentation, implement your debug model
- * presentation as documented in <code>org.eclipse.debug.ui.IDebugModelPresentation</code>.
- * In addition, implement this interface in your debug model presentation.  Your model
- * presentation will be called when <code>org.eclipse.debug.ui.memory.AbstractTableRendering</code>
- * constructs its column and row labels. 
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryBlockTablePresentation extends IDebugModelPresentation
-{
-	
-	/**
-     * Returns a collection of labels to head columns in a <code>AbstractTableRendering</code>
-     * rendering, or <code>null</code> if default labels should be used.
-     *  
-	 * @param blk memory block
-	 * @param bytesPerLine the number if bytes to be displayed
-	 * @param numColumns the number of columns the bytes are divided into 
-	 * @return a collection of labels to head columns in a <code>AbstractTableRendering</code>
-     * rendering, or <code>null</code> if default labels should be used
-	 */
-	public String[] getColumnLabels(IMemoryBlock blk, int bytesPerLine, int numColumns);
-	
-	
-	/**
-     * Renders and returns a label for a row starting at the given address within the given
-     * memory block, or <code>null</code> if default rendering should be used.
-     * 
-	 * @param blk memory block
-	 * @param address an address in the memory block
-	 * @return a label for a row starting at the given address within the given
-     * memory block, or <code>null</code> if default rendering should be used
-	 */
-	public String getRowLabel(IMemoryBlock blk, BigInteger address);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRendering.java
deleted file mode 100644
index e1a769f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRendering.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.debug.ui.memory;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * An arbitrary rendering of a memory block. A memory rendering is contributed
- * via the <code>memoryRenderings</code> extension point.
- * <p>
- * Following is an example definition of a memory renderings extension.
- * <pre>
- * &lt;extension point="org.eclipse.debug.ui.memoryRenderings"&gt;
- *   &lt;memoryRenderingType
- *      id="com.example.asciiRendering"
- *      name="ASCII"
- *      class="com.example.RenderingFactory"&gt;
- *   &lt;/memoryRenderingType&gt;
- * &lt;/extension&gt;
- * </pre>
- * The attributes are specified as follows:
- * <ul>
- * <li><code>id</code> specifies a unique identifier for a type of memory rendering</li>
- * <li><code>name</code> specifies a human readable label for a rendering type</li>
- * <li><code>class</code> specifies the fully qualified name of the Java class
- *   that implements <code>IMemoryRenderingTypeDelegate</code>. Renderings are created
- *   via this factory.</li>
- * </ul>
- * </p>
- * <p>
- * A rendering provides an image and label. To support dynamic labels and images, property
- * change notification is used with the following property constants defined in
- * <code>IBasicPropertyConstants</code>:
- * <ul>
- * <li><code>P_TEXT</code> - indicates a label change</li>
- * <li><code>P_IMAGE</code> - indicates a image change</li>
- * </ul>
- * </p>
- * <p>
- * Renderings needing to synchronize with other renderings are intended to use
- * property change notifications via its synchronization service. For example, when a
- * rendering becomes visible, it can register for property change events with its rendering
- * site's synchronization service, and when it becomes hidden it can unregister. When a
- * rendering is activated, it should set itself as the synchrnoization provider in its
- * rendering site and fire property change events to communicate information to
- * interested listeners.
- * </p> 
- * <p>
- * Clients contributing a memory rendering type are intended to implement this interface
- * and <code>IMemoryRenderingTypeDelegate</code>. The factory will be used to create instances
- * of <code>IMemoryRendering</code>.
- * </p>
- * @since 3.1
- */
-public interface IMemoryRendering extends IAdaptable{
-    
-    /**
-     * Initializes this rendering to be hosted in the given container, displaying
-     * the given memory block. This method is called before this rendering's control
-     * has been created.
-     * 
-     * @param container container hosting this rendering
-     * @param block the memory block to render
-     */
-    public void init(IMemoryRenderingContainer container, IMemoryBlock block);
-    
-    /**
-     * Creates the top level control for this rendering under the given parent composite.
-     * This method is called after this rendering's <code>init</code> method has been
-     * called.
-     * <p>
-     * Implementors are responsible for ensuring that
-     * the created control can be accessed via <code>getControl</code>
-     * </p>
-     * @param parent the parent composite
-     */
-    public Control createControl(Composite parent);
-
-    /**
-     * Returns the top level control for this rendering.
-     * <p>
-     * May return <code>null</code> if the control
-     * has not been created yet.
-     * </p>
-     * @return the top level control or <code>null</code>
-     */
-    public Control getControl();
-    
-    /**
-     * Disposes this rendering.
-     */
-    public void dispose();
-    
-    /**
-     * Notification this rendering has become the active rendering. Only one
-     * rendering can be active at once. Generally, the active rendering is
-     * visible and has focus.
-     */
-    public void activated();
-    
-    /**
-     * Notification this rendering is no longer the active rendering.
-     */
-    public void deactivated();
-    
-    /**
-     * Notification this rendering has become visible in its container.
-     * Note that a rendering does not have to be active to be visible.
-     */
-    public void becomesVisible();
-    
-    /**
-     * Notification this rendering has become hidden in its container.
-     */
-    public void becomesHidden();
-    
-    /**
-     * Returns the memory block displayed by this rendering.
-     * 
-     * @return the memory block displayed by this rendering
-     */
-    public IMemoryBlock getMemoryBlock();
-    
-    /**
-     * Returns the identifier associated with this rendering's type.
-     *  
-     * @return the identifier associated with this rendering's type
-     * @see IMemoryRenderingType
-     */
-    public String getRenderingId();
-    
-    /**
-     * Adds a listener for property changes to this rendering.
-     * Has no effect if an identical listener is already registered.
-     * 
-     * @param listener a property change listener
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Removes the given property change listener from this rendering.
-     * Has no effect if the identical listener is not registered.
-     *
-     * @param listener a property change listener
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Returns an image for this rendering. Clients should not dispose
-     * this image. This rendering will dispose the image if required when
-     * this rendering is disposed.
-     * 
-     * @return an image for this rendering
-     */
-    public Image getImage();
-    
-    /**
-     * Returns a label for this rendering.
-     * 
-     * @return a label for this rendering
-     */
-    public String getLabel();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingBindingsListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingBindingsListener.java
deleted file mode 100644
index 6e5ab8c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingBindingsListener.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.debug.ui.memory;
-
-/** 
- * A rendering bindings listener is notified of changes in the renderings provided by
- * a rendering bindings provider. When bindings change, a memory block may be bound
- * to a different set of renderings.
- * <p>
- * Clients who wish to detect changes to a dynamic bindings provider should
- * implement this interface and register as a listener with the
- * {@link org.eclipse.debug.ui.memory.IMemoryRenderingManager}.
- * </p>
- * @since 3.1
- * @see IMemoryRenderingBindingsProvider#addListener
- * @see IMemoryRenderingBindingsProvider#removeListener
- */
-public interface IMemoryRenderingBindingsListener {
-	
-	/**
-	 * Notification that the bindings provided by a rendering bindings
-	 * provider have changed.
-	 */
-	void memoryRenderingBindingsChanged();
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingBindingsProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingBindingsProvider.java
deleted file mode 100644
index 68455f3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingBindingsProvider.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.debug.ui.memory;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-
-
-/**
- * A rendering bindings provider provides rendering type bindings for a memory block.
- * <p>
- * By default, bindings for a memory block are provided by the memory rendering
- * manager. However, a client can provide dynamic renderings for a memory block
- * by contributing a dynamic rendering binding in the <code>renderingBindings</code>
- * element of a <code>memoryRenderings</code> extension.
- * </p>
- * <p>
- * Clients contributing dynamic rendering bindings are intended to implement this
- * interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryRenderingBindingsProvider {
-	
-	/**
-     * Returns all rendering types bound to the given memory block.
-     * This includes default and primary rendering types.
-     * 
-     * @param block memory block
-	 * @return all rendering types bound to the given memory block
-	 */
-	public IMemoryRenderingType[] getRenderingTypes(IMemoryBlock block);
-    
-    /**
-     * Returns default rendering types bound to the given memory block, 
-     * possibly empty.
-     * 
-     * @param block memory block
-     * @return default rendering types bound to the given memory block, 
-     * possibly empty
-     */
-    public IMemoryRenderingType[] getDefaultRenderingTypes(IMemoryBlock block);
-    
-    /**
-     * Returns the primary rendering type bound to the given memory block,
-     * or <code>null</code> if none.
-     * 
-     * @param block memory block
-     * @return the primary rendering type bound to the given memory block,
-     * or <code>null</code> if none
-     */
-    public IMemoryRenderingType getPrimaryRenderingType(IMemoryBlock block);
-		
-    /**
-     * Adds a listener to this binding provider.  The listener will be notified
-     * when rendering bindings change.
-     * <p>
-     * Has no affect if an identical listener is already registered.
-     * </p>
-     * @param listener listener to add
-     */
-	public void addListener(IMemoryRenderingBindingsListener listener);
-	
-    /**
-     * Removes a listener from this binding provider.  
-     * <p>
-     * Has no affect if an identical listener is not already registered.
-     * </p>
-     * @param listener listener to remove
-     */
-	public void removeListener(IMemoryRenderingBindingsListener listener);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingContainer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingContainer.java
deleted file mode 100644
index 9b5717d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingContainer.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.debug.ui.memory;
-
-
-
-/**
- * A memory rendering container is a container within a memory rendering site
- * for hosting a memory renderings.
- * <p>
- * Clients hosting memory renderings may implement this interface.
- * </p>  
- * @since 3.1
- */
-public interface IMemoryRenderingContainer {
-	/**
-	 * Returns the rendering site hosting this container.
-	 * 
-	 * @return the rendering site hosting this container
-	 */
-	public IMemoryRenderingSite getMemoryRenderingSite();
-	
-	/**
-	 * Returns the identifier of this container. Identifiers
-	 * are unique within a container.
-	 * 
-	 * @return the identifier of this container
-	 */
-	public String getId();
-	
-	/**
-	 * Adds the given rendering to this container. A rendering must be
-	 * initialized before it is added to a container. This causes
-	 * the rendering's control to be created.
-	 * 
-	 * @param rendering the rendering to add
-	 */
-	public void addMemoryRendering(IMemoryRendering rendering);
-	
-	/**
-	 * Removes the given rendering from this container. This 
-	 * causes the rendering to be disposed.
-	 * 
-	 * @param rendering the rendering to remove
-	 */
-	public void removeMemoryRendering(IMemoryRendering rendering);
-	
-	/**
-	 * Returns all renderings currently hosted by this container.
-	 *  
-	 * @return all renderings currently hosted by this container
-	 */
-	public IMemoryRendering[] getRenderings();
-	
-	/**
-	 * Returns the active rendering in this container, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the active rendering in this container, or <code>null</code>
-	 * if none
-	 */
-	public IMemoryRendering getActiveRendering();
-	
-	/**
-	 * Returns the label for this container.
-	 * 
-	 * @return the label for this container
-	 */
-	public String getLabel();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingManager.java
deleted file mode 100644
index a02e9ee..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingManager.java
+++ /dev/null
@@ -1,49 +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.debug.ui.memory;
-
-
-
-/**
- * Manager for memory renderings. Provides facilities for creating
- * renderings and retrieving memory rendering bindings.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryRenderingManager extends IMemoryRenderingBindingsProvider {
- 
-    
-    /**
-     * Returns all contributed memory rendering types.
-     * 
-     * @return all contributed memory rendering types
-     */
-    public IMemoryRenderingType[] getRenderingTypes();
-    
-    /**
-     * Returns the memory rendering type with the given identifier, or
-     * <code>null</code> if none.  The memory rendering manager will
-     * search through rendering types that are contributed via explicit
-     * rendering bindings.  (i.e. rendering types contributed via the
-     * memoryRenderings extension point). This method will not return 
-     * rendering types that are contributed by a memory binding provider.
-     * 
-     * @param id memory rendering type identifier
-     * @return the memory rendering type with the given identifier, or
-     * <code>null</code> if none
-     */
-    public IMemoryRenderingType getRenderingType(String id);
-    
-}
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingSite.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingSite.java
deleted file mode 100644
index 027cf51..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingSite.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.debug.ui.memory;
-
-import org.eclipse.ui.IWorkbenchPartSite;
-
-/**
- * A workbench site that hosts memory renderings and provides
- * synchronization services for memory renderings.
- * <p>
- * A rendering site has an optional synchronization provider at any one time. If a
- * rendering provides synchronization information it should set itself as the synchronization
- * provider for its memory rendering site when it is activated. 
- * </p>
- * <p>
- * Clients hosting memory rendering may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryRenderingSite {
-
-    /**
-     * Returns the workbench part site hosting memory renderings for this rendering site.
-     * 
-     * @return the view site hosting memory renderings for this rendering site
-     */
-    public IWorkbenchPartSite getSite();
-        
-    /**
-     * Returns the syncrhonization service for this rendering site
-     * or <code>null</code> if none.
-     * 
-     * @return the syncrhonization service for this rendering site or <code>null</code>
-     */
-    public IMemoryRenderingSynchronizationService getSynchronizationService();
-    
-    /**
-     * Returns all the memory rendering containers within this rendering site.
-     * 
-     * @return all the memory rendering containers within this rendering site
-     */
-    public IMemoryRenderingContainer[] getMemoryRenderingContainers();
-    
-    /**
-     * Returns the rendering container with the given id or <code>null</code>
-     * if none.
-     *
-     * @param id identifier of the container being requested
-     * @return the rendering container with the given id or <code>null</code>
-     * if none
-     */
-    public IMemoryRenderingContainer getContainer(String id);
-    
-    
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingSynchronizationService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingSynchronizationService.java
deleted file mode 100644
index 9a3de43..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingSynchronizationService.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.debug.ui.memory;
-
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-
-/**
- * Provides facilities related to the synchronization of memory renderings.
- * <p>
- * Clients hosting renderings may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryRenderingSynchronizationService {
-    
-    /**
-     * Adds a listener for property changes notification for the specified properties.
-     * Specifying <code>null</code> indicates that the listener is interested in all 
-     * properties. If an identical listener is already registered, the properties
-     * it is registered to listen for are updated.
-     *
-     * @param listener a property change listener
-     * @param properties properties the listener is interested in, or <code>null</code>
-     *  to indicate all properties.
-     */    
-    public void addPropertyChangeListener(IPropertyChangeListener listener, String[] properties);
-    
-    /**
-     * Removes the given listener for property change notification.
-     * Has no effect if the identical listener is not registered.
-     *
-     * @param listener a property change listener
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener);
-    
-    /**
-     * Returns the current value of the specified property for the given memory block, or
-     * <code>null</code> if none.
-     * 
-     * @param block memory block for which a property is requested
-     * @param property the name of the property
-     * @return the property value or <code>null</code>
-     */
-    public Object getProperty(IMemoryBlock block, String property);
-	
-    /**
-     * Sets the rendering currently providing sychronization information for
-     * this synchronization service, or <code>null</code> if none.
-     * 
-     * @param rendering active rendering providing synchronization information or
-     *  <code>null</code>
-     */
-    public void setSynchronizationProvider(IMemoryRendering rendering);
-    
-    /**
-     * Returns the rendering currently providing synchronization information for
-     * this synchronization service, or <code>null</code if none.
-     * 
-     * @return rendering providing synchronization information or <code>null</code>
-     */
-    public IMemoryRendering getSynchronizationProvider(); 
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingType.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingType.java
deleted file mode 100644
index 3fff87e..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingType.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.debug.ui.memory;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Represents a type of memory rendering contributed via the <code>memoryRenderings</code>
- * extension point.
- * <p>
- * Clients contributing a rendering usually
- * implement {@link org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate}
- * and {@link org.eclipse.debug.ui.memory.IMemoryRendering}. Clients providing
- * dynamic rendering bindings via an 
- * {@link org.eclipse.debug.ui.memory.IMemoryRenderingBindingsProvider}
- * may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IMemoryRenderingType {
-    
-    /**
-     * Returns a label for this type of memory rendering.
-     * 
-     * @return a label for this type of memory rendering
-     */
-    public String getLabel();
-    
-    /**
-     * Returns the unique identifier for this rendering type.
-     * 
-     * @return the unique identifier for this rendering type
-     */
-    public String getId();
-    
-    /**
-     * Creates and returns a new rendering of this type or <code>null</code>
-     * if none.
-     * 
-     * @return a new rendering of this type
-     * @exception CoreException if an exception occurs creating
-     *  the rendering
-     */
-    public IMemoryRendering createRendering() throws CoreException;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingTypeDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingTypeDelegate.java
deleted file mode 100644
index 9429124..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IMemoryRenderingTypeDelegate.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.debug.ui.memory;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A factory that creates memory renderings.
- * <p>
- * Clients contributing a memory rendering type are intended to implement this
- * interface. This factory will be used to create renderings. 
- * </p>
- * @since 3.1
- * @see org.eclipse.debug.ui.memory.IMemoryRendering
- */
-public interface IMemoryRenderingTypeDelegate {
-    
-    /**
-     * Creates and returns a rendering of the specified type, or <code>null</code>
-     * if none.
-     * 
-     * @param id unique identifier of a memory rendering type
-     * @return a new rendering of the given type or <code>null</code>
-     * @exception CoreException if unable to create the rendering
-     */
-    public IMemoryRendering createRendering(String id) throws CoreException;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IRepositionableMemoryRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IRepositionableMemoryRendering.java
deleted file mode 100644
index ff755ed..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IRepositionableMemoryRendering.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.debug.ui.memory;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.MemoryByte;
-
-/**
- * A memory rendering that can be repositioned.  Reposition behavior is rendering
- * specific.  Typically, reposition means that the rendering should move its 
- * cursor/current selection to the given address. However, clients may define 
- * its reposition behavior that is suitable for the rendering.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.3
- *
- */
-public interface IRepositionableMemoryRendering extends IMemoryRendering{
-	
-	/**
-	 * Returns the currently selected address of this rendering or <code>null</code> if none
-	 * @return the currently selected address of this rendering or <code>null</code> if none
-	 */
-	public BigInteger getSelectedAddress();
-	
-	/**
-	 * Returns the currently selected content as <code>MemoryByte</code> array.  
-	 * Returns an empty array if there is no selection.
-	 * @return the currently selected as <code>MemoryByte</code> array or empty if there is
-	 * no selection.
-	 */
-	public MemoryByte[] getSelectedAsBytes();
-
-	/**
-	 * Position the rendering to the given address.
-	 * 
-	 * @param address the address to go to
-	 * @throws DebugException when there is a problem repositioning the rendering to the 
-	 * address
-	 */
-	public void goToAddress(BigInteger address) throws DebugException ;
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IResettableMemoryRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IResettableMemoryRendering.java
deleted file mode 100644
index 100f742..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/IResettableMemoryRendering.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.debug.ui.memory;
-
-import org.eclipse.debug.core.DebugException;
-
-/**
- * A memory rendering that can be reset.  Reset behavior is rendering
- * specific.  Typically, reset means that the rendering would position
- * itself back to the base address of its memory block.  However, clients 
- * may define its reset behavior that is suitable for its rendering.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- *
- */
-public interface IResettableMemoryRendering extends IMemoryRendering {
-	
-	/**
-	 * Reset this memory rendering.
-	 * 
-	 * @throws DebugException when there is a problem resetting this memory rendering.
-	 */
-	public void resetRendering() throws DebugException;
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/MemoryRenderingElement.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/MemoryRenderingElement.java
deleted file mode 100644
index 7629ec1..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/MemoryRenderingElement.java
+++ /dev/null
@@ -1,77 +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.debug.ui.memory;
-
-import java.math.BigInteger;
-
-import org.eclipse.debug.core.model.MemoryByte;
-
-/**
- * A memory rendering element represents a set of memory bytes being
- * rendered in a memory rendering. Instances of this class are passed
- * to a rendering's label provider, color provider, and font provider
- * to be rendered.
- * <p>
- * Clients may instantiate this class. Clients may subclass this class to add
- * other members / settings as required by a rendering.
- * </p>
- * @since 3.1
- */
-public class MemoryRenderingElement {
-	private IMemoryRendering fRendering;
-	private BigInteger fAddress;
-	private MemoryByte[] fBytes;
-	
-	/**
-	 * Constructs a new memory rendering element for the given rendering
-	 * and specified bytes.
-	 * 
-	 * @param rendering the rendering containing the memory block being rendered
-	 * @param address the address at which the rendering is taking place
-	 * @param bytes the memory bytes being rendered
-	 */
-	public MemoryRenderingElement(IMemoryRendering rendering, BigInteger address, MemoryByte[] bytes)
-	{
-		fRendering = rendering;
-		fAddress = address;
-		fBytes = bytes;
-	}
-	
-	/**
-	 * Returns the memory rendering in which bytes are being rendered.
-	 * 
-	 * @return the memory rendering in which bytes are being rendered
-	 */
-	public IMemoryRendering getRendering()
-	{
-		return fRendering;
-	}
-	
-	/**
-	 * Returns the address at which bytes are being rendered.
-	 * 
-	 * @return the address at which bytes are being rendered
-	 */
-	public BigInteger getAddress() {
-		return fAddress;
-	}
-	
-
-	/**
-	 * Returns the memory bytes being rendered.
-	 * 
-	 * @return the memory bytes being rendered
-	 */
-	public MemoryByte[] getBytes() {
-		return fBytes;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/package.html b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/package.html
deleted file mode 100644
index 773c117..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/memory/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">
-<title>Eclipse Debug Platform</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides classes and interfaces to render memory blocks in the memory view.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package provides classes and interfaces to support rendering memory blocks 
-  in the memory view.</p>
-<blockquote>&nbsp;</blockquote>
-</body>
-</html>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/package.html b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/package.html
deleted file mode 100644
index 6950f14..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/package.html
+++ /dev/null
@@ -1,72 +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>Eclipse Debug Tools</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides a generic debugger user interface that clients may customize via standard
-workbench extension points.</p>
-
-<h2>Package Specification</h2>
-
-<p>The Eclipse platform debug UI plug-in provides a set of classes and interfaces to
-support a language independent debugger user interface. A generic debug perspective is provided with a common
-set of views. Clients contribute actions to the debug views via the
-standard workbench extension points.</p>
-
-<h4>The Debug View</h4>
-
-<p>The debug view presents a tree of launched programs in debug and non-debug (run) mode.
-The view provides support for standard interactions such as terminating, stepping, suspending, and resuming
-threads, debug targets, and processes. The debug view is linked to an editor view, variable view, and
-console. The editor view is used to display source code for stack frames. A selection in
-the debug view causes the line of code being executed to be highlighted in the editor
-view. The variable view shows the visible variables in the selected stack frame, and the
-console view handles I/O for the debuggable process.</p>
-
-<h4>The Variables View</h4>
-
-<p>The variables view presents a tree of variables for the currently selected stack frame.
-A "details" area may be hidden/shown which provides a detailed description of 
-the selected variable. For example, the Java debugger displays the result of
-invoking 'toString()' on the selected variable in this area.</p>
-
-<h4>The Breakpoints View</h4>
-
-<p>The breakpoints view presents a list of all breakpoints currently defined in the
-workspace. It supports enabling/disabling and breakpoint removal.</p>
-
-<h4>The Expression View</h4>
-
-<p>The expression view presents a tree of expressions and their corresponding values.</p>
-
-<h4>Debug Model Presentation</h4>
-
-<p>The debug UI plug-in defines an extension (<b>org.eclipse.debug.ui.debugModelPresentations</b>)
-point to allow implementations of debug models to provide custom rendering and
-presentation of its debug elements. Extensions are registered for a specific debug
-model. It is intended that an implementation of a debug model will also provide an
-implementation of a debug model presentation. The presentation provides: 
-
-<ul>
-  <li>an image for a debug element or breakpoint</li>
-  <li>a label for a debug element or breakpoint</li>
-  <li>an editor input and editor id used to display a debug element, breakpoint, or source element</li>
-  <li>a detailed description of a variable value, used to display
-   in the "details" section of the variables view</li>
-</ul>
-
-<h4>Launch Configuration Dialog</h4>
-
-<p>The debug UI plug-in provides a lanuch configuration dialog for
-creating and editing launch configurations. Clients may contribute
-tabs to the launch configuration dialog via the launchConfigurationTabGroup
-extension point.</p>
-
-
-</body>
-</html>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/AbstractSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/AbstractSourceContainerBrowser.java
deleted file mode 100644
index 6a7a19f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/AbstractSourceContainerBrowser.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.debug.ui.sourcelookup;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Common implementation for source container browsers.
- * <p>
- * Clients implementing <code>ISourceContainerBrowser</code> should
- * subclass this class.
- * </p>
- * @since 3.0
- */
-public class AbstractSourceContainerBrowser implements ISourceContainerBrowser {
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#addSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director) {
-		return new ISourceContainer[0];
-	}
-	/* (non-Javadoc)
-	 * 
-	 * Generally, a source container browser can add source containers. Subclasses
-	 * should override as required.
-	 * 
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#canAddSourceContainers(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
-	 */
-	public boolean canAddSourceContainers(ISourceLookupDirector director) {
-		return true;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#editSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
-	 */
-	public ISourceContainer[] editSourceContainers(Shell shell, ISourceLookupDirector director, ISourceContainer[] containers) {
-		return new ISourceContainer[0];
-	}
-	/* (non-Javadoc)
-	 * 
-	 * Not all source containers can be edited. Subclasses should override
-	 * as required.
-	 * 
-	 * @see org.eclipse.debug.internal.ui.sourcelookup.ISourceContainerBrowser#canEditSourceContainers(org.eclipse.debug.core.sourcelookup.ISourceLookupDirector, org.eclipse.debug.core.sourcelookup.ISourceContainer[])
-	 */
-	public boolean canEditSourceContainers(ISourceLookupDirector director, ISourceContainer[] containers) {
-		return false;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/CommonSourceNotFoundEditor.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/CommonSourceNotFoundEditor.java
deleted file mode 100644
index 5eb24d2..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/CommonSourceNotFoundEditor.java
+++ /dev/null
@@ -1,313 +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.debug.ui.sourcelookup;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchesListener2;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.ISourceLocator;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupManager;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.JFaceColors;
-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.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.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IReusableEditor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * Default editor displayed when source is not found. Displays a button to modify
- * the source lookup path.
- * <p>
- * This editor's id is <code>IDebugUIConstants.ID_COMMON_SOURCE_NOT_FOUND_EDITOR</code>
- * (value <code>org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor</code>).
- * </p>
- * <p>
- * This class may be instantiated and subclassed.
- * </p>
- * @see AbstractSourceLookupDirector
- * @see CommonSourceNotFoundEditorInput
- * @since 3.2
- */
-public class CommonSourceNotFoundEditor extends EditorPart implements IReusableEditor  {
-	
-	/**
-	 * Text widgets used for this editor
-	 */
-	private Text fText;	
-	
-	/**
-	 * Launch listener to handle launch events, or <code>null</code> if none
-	 */
-	private ILaunchesListener2 fLaunchesListener;
-	
-	/* (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);
-		initialize();
-	}
-	
-	/* (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) {
-		GridLayout topLayout = new GridLayout();
-		GridData data = new GridData();	
-		topLayout.numColumns = 1;
-		topLayout.verticalSpacing = 10;
-		parent.setLayout(topLayout);
-		parent.setLayoutData(data);		
-		parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
-		
-		fText = new Text(parent,SWT.READ_ONLY|SWT.WRAP);
-        data = new GridData(GridData.FILL_HORIZONTAL);
-        data.grabExcessHorizontalSpace = true;
-        fText.setLayoutData(data);
-		fText.setForeground(JFaceColors.getErrorText(fText.getDisplay()));	
-		fText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));	
-		if (getEditorInput() != null) {
-			setInput(getEditorInput());
-		}
-		
-		createButtons(parent);		
-		
-		Dialog.applyDialogFont(parent);
-		
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugHelpContextIds.NO_SOURCE_EDITOR);
-	}
-
-	/**
-	 * Create buttons to be displayed in this editor
-	 * 
-	 * @param parent composite to create the buttons in.
-	 */
-	protected void createButtons(Composite parent) {
-		GridData data;
-		Button button = new Button(parent, SWT.PUSH);
-		data = new GridData();
-		data.grabExcessHorizontalSpace = false;
-		data.grabExcessVerticalSpace = false;
-		button.setLayoutData(data);
-		button.setText(SourceLookupUIMessages.addSourceLocation_addButton2); 
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				editSourceLookupPath();
-			}
-		});
-	}
-	
-	/**
-	 * Edits the source lookup path associated with the active debug context.
-	 * After the path is edited, source lookup is performed again and this
-	 * editor is closed.
-	 */
-	protected void editSourceLookupPath(){
-		ISourceLocator locator = null;		
-		ILaunch launch = null;		
-		IAdaptable selection = DebugUITools.getDebugContext();
-		if(selection == null) {
-			new MessageDialog(getSite().getShell(), 
-					SourceLookupUIMessages.CommonSourceNotFoundEditor_0,	
-					null, 
-					SourceLookupUIMessages.CommonSourceNotFoundEditor_1,
-					MessageDialog.INFORMATION,
-					new String[] {IDialogConstants.OK_LABEL}, 0).open();
-			return;
-		}
-		if (selection.getAdapter(ILaunch.class) != null ) {
-			launch = (ILaunch) selection.getAdapter(ILaunch.class);
-			locator = launch.getSourceLocator();			
-		} 
-		else if (selection.getAdapter(IDebugElement.class) != null ) {
-			launch = ((IDebugElement)selection.getAdapter(IDebugElement.class)).getLaunch();
-			locator = launch.getSourceLocator();					
-		}
-		else {
-			return;  //should not occur
-		}
-		if (locator == null || !(locator instanceof AbstractSourceLookupDirector)) {
-			return; 
-		}
-		final SourceLookupDialog dialog = new SourceLookupDialog(DebugUIPlugin.getShell(),(AbstractSourceLookupDirector) locator);		
-		if(dialog.open() == Window.OK) {
-			IWorkbenchPage page = getEditorSite().getPage();
-			SourceLookupManager.getDefault().displaySource(getArtifact(), page, true);
-			closeEditor();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		if (fText != null) {
-			fText.setFocus();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	public void setInput(IEditorInput input) {
-		super.setInput(input);
-		setPartName(input.getName());
-		if (fText != null) {			
-			fText.setText(getText());
-		}
-		firePropertyChange(PROP_INPUT);
-	}
-	
-	/**
-	 * Return the text to be displayed in this editor. The text is reset each time
-	 * the editor input is set.
-	 * 
-	 * @return the text to be displayed in this editor
-	 */
-	protected String getText() {
-		return getEditorInput().getToolTipText() + "\n"; //$NON-NLS-1$
-	}
-	
-	/**
-	 * Closes this editor.
-	 */
-	protected void closeEditor()
-	{
-		final IEditorPart editor = this;
-		DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
-			public void run() {
-				IWorkbenchWindow activeWorkbenchWindow = DebugUIPlugin.getActiveWorkbenchWindow();
-				if (activeWorkbenchWindow != null) {
-					IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
-					if (activePage != null) {
-						activePage.closeEditor(editor, false);
-					}
-				}
-			}
-		});
-	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		if (fLaunchesListener != null)
-			DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(fLaunchesListener);
-		super.dispose();
-	}
-	
-	/**
-	 * Returns the artifact this editor was opened for (i.e. the artifact that source
-	 * was not found for), or <code>null</code>
-	 * 
-	 * @return artifact with associated source or <code>null</code>
-	 */
-	protected Object getArtifact() {
-		IEditorInput editorInput = getEditorInput();
-		if (editorInput instanceof CommonSourceNotFoundEditorInput) {
-			CommonSourceNotFoundEditorInput input = (CommonSourceNotFoundEditorInput) editorInput;
-			return input.getArtifact();
-		}
-		return null;
-	}
-	
-	/**
-	 * Initialize this editor.
-	 * Called after <code>init(IEditorSite, IEditorInput)</code>. By default, a launch
-	 * listener is added to close this editor when the associated launch terminates.
-	 * Subclasses may override.
-	 */
-	protected void initialize()
-	{
-		fLaunchesListener = new ILaunchesListener2() {
-			public void launchesTerminated(ILaunch[] launches) {
-				Object artifact = getArtifact();
-				if (artifact instanceof IDebugElement) {
-					IDebugElement element = (IDebugElement)artifact;
-					for (int i = 0; i < launches.length; i++) {
-						ILaunch launch = launches[i];
-						if (launch.equals(element.getLaunch())) {
-							closeEditor();
-							return;
-						}
-					}
-				}
-			}
-
-			public void launchesRemoved(ILaunch[] launches) {
-				launchesTerminated(launches);
-			}
-
-			public void launchesAdded(ILaunch[] launches) {
-			}
-
-			public void launchesChanged(ILaunch[] launches) {
-			}}; 
-			
-		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(fLaunchesListener);
-	}
-}
-
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/CommonSourceNotFoundEditorInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/CommonSourceNotFoundEditorInput.java
deleted file mode 100644
index 886d5a0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/CommonSourceNotFoundEditorInput.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.debug.ui.sourcelookup;
-
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * Editor input for the <code>CommonSourceNotFoundEditor</code>. The editor
- * input can be created on an artifact that has a source association.
- * <p>
- * This class may be instantiated and subclassed.
- * </p>
- * @see CommonSourceNotFoundEditor
- * @since 3.2
- */
-public class CommonSourceNotFoundEditorInput extends PlatformObject implements IEditorInput {
-	
-	/**
-	 * input element label (cached on creation)
-	 */
-	private String fLabel;
-	/**
-	 * the artifact that the editor is being opened for
-	 */
-	private Object fArtifact;
-	
-	/**
-	 * Constructs an editor input for the given artifact associated with source.
-	 *
-	 * @param artifact artifact associated with source
-	 */
-	public CommonSourceNotFoundEditorInput(Object artifact) {
-		fArtifact = artifact;
-		if (artifact != null) {
-			IDebugModelPresentation pres = DebugUITools.newDebugModelPresentation();
-			fLabel = pres.getText(artifact);
-			pres.dispose();
-		}
-		if (fLabel == null) {
-			fLabel = "";  //$NON-NLS-1$
-		}
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return DebugUITools.getDefaultImageDescriptor(fArtifact);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		return fLabel;		
-	}
-	
-	/* (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 MessageFormat.format(SourceLookupUIMessages.addSourceLocation_editorMessage, new String[] { fLabel }); 
-	}
-		
-	/**
-	 * Returns the artifact that source was not found for.
-	 * 
-	 * @return artifact that source was not found for
-	 */
-	public Object getArtifact(){
-		return fArtifact;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceContainerBrowser.java
deleted file mode 100644
index 71688b0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceContainerBrowser.java
+++ /dev/null
@@ -1,82 +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.debug.ui.sourcelookup;
-
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Creates and edits source containers for a source lookup director.
- * Contributed via a source container presentation extension for
- * a specific type of source container.
- * <p>
- * Following is an example source container presentation definition
- * that contributes a source container browser via the
- * <code>browserClass</code> attribute.
- * <pre>
- * &lt;extension point=&quot;org.eclipse.debug.ui.sourceContainerPresentations&quot;&gt;
- *    &lt;sourceContainerPresentation
- *          browserClass=&quot;org.eclipse.debug.internal.ui.sourcelookup.browsers.ProjectSourceContainerBrowser&quot;
- *          containerTypeID=&quot;org.eclipse.debug.core.containerType.project&quot;
- *          icon=&quot;icons/full/obj16/prj_obj.gif&quot;
- *          id=&quot;org.eclipse.debug.ui.containerPresentation.project&quot;&gt;
- *    &lt;/sourceContainerPresentation&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p>
- * @since 3.0
- */
-public interface ISourceContainerBrowser {
-	/**
-	 * Creates and returns new source containers to add to the given
-	 * source lookup director.
-	 * 
-	 * @param shell the shell to use to parent any dialogs
-	 * @param director the director the new containers will be added to
-	 * @return the new source containers to add
-	 */
-	public ISourceContainer[] addSourceContainers(Shell shell, ISourceLookupDirector director);
-	
-	/**
-	 * Returns whether this browser can add any source containers to the
-	 * given source lookup director.
-	 * 
-	 * @param director source lookup director to potentially add source
-	 *  containers to
-	 * @return whether this browser can add any source containers to the
-	 * given source lookup director
-	 */
-	public boolean canAddSourceContainers(ISourceLookupDirector director);
-	
-	/**
-	 * Edits and returns source containers to replace the given source
-	 * containers.
-	 * 
-	 * @param shell the shell to use to parent any dialogs
-	 * @param director the director the new containers will be added to
-	 * @param containers the source containers to be edited
-	 * @return the replacement source containers
-	 */
-	public ISourceContainer[] editSourceContainers(Shell shell, ISourceLookupDirector director, ISourceContainer[] containers);
-	
-	/**
-	 * Returns whether this browser can edit the given source containers.
-	 * 
-	 * @param director source lookup director to potentially edit source
-	 *  containers for
-	 * @param containers the containers to edit
-	 * @return whether this browser can edit the given source containers
-	 */
-	public boolean canEditSourceContainers(ISourceLookupDirector director, ISourceContainer[] containers);	
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceDisplay.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceDisplay.java
deleted file mode 100644
index 1cc942d..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceDisplay.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.debug.ui.sourcelookup;
-
-import org.eclipse.ui.IWorkbenchPage;
-
-/**
- * Displays source for a debug model element. The debug platform displays
- * source whenever a debug context containing a single element is
- * activated (a structured selection with one element). The debug platform
- * displays source by asking an element for its <code>ISourceDisplay</code>
- * adapter or using the element directly if it implements <code>ISourceDisplay</code>.
- * <p>
- * The debug platform provides a source display adapter for instances
- * of <code>IStackFrame</code>. The standard adapter uses the source locator associated
- * with the stack frame's launch to lookup source. Clients may provide their own
- * source display adapters as required. 
- * </p> 
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.core.runtime.IAdaptable
- * @since 3.3
- */
-public interface ISourceDisplay {
-	
-	/**
-	 * Displays source for the given element in the specified page.
-	 * 
-	 * @param element debug model element to display source for
-	 * @param page the page in which to display source
-	 * @param forceSourceLookup whether source lookup should be performed,
-	 *  ignoring any previously cached results for the same element
-	 */
-	public void displaySource(Object element, IWorkbenchPage page, boolean forceSourceLookup);
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceLookupResult.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceLookupResult.java
deleted file mode 100644
index b485638..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/ISourceLookupResult.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.ui.sourcelookup;
-
-import org.eclipse.ui.IEditorInput;
-
-/**
- * The result of performing source lookup on a debug artifact.
- * The result contains the resolved source element and description
- * of an editor (editor id, and editor input) in which to display
- * the result.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @see org.eclipse.debug.ui.DebugUITools#lookupSource(Object, ISourceLocator)
- * @see org.eclipse.debug.ui.DebugUITools#displaySource(ISourceLookupResult, IWorkbenchPage)  
- * @since 3.1
- */
-public interface ISourceLookupResult {
-
-    /**
-     * Returns the artifact for which source lookup was performed,
-     * such as a stack frame.
-     * 
-     * @return the artifact for which source lookup was performed
-     */
-    public Object getArtifact();
-    
-    /**
-     * Returns the source element resolved during source lookup,
-     * or <code>null</code> if a source element was not resolved.
-     * 
-     * @return resolved source element or <code>null</code> if unknown
-     */
-    public Object getSourceElement();
-        
-    /**
-     * Returns the identifier of an editor used to display this result,
-     * or <code>null</code> if unknown.
-     * 
-     * @return the identifier of an editor used to display this result,
-     * or <code>null</code> if unknown
-     */
-    public String getEditorId();
-    
-    /**
-     * Returns the editor input used to display result,
-     * or <code>null</code> if unknown.
-     * 
-     * @return the editor input used to display result,
-     * or <code>null</code> if unknown
-     */
-    public IEditorInput getEditorInput();
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/SourceLookupDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/SourceLookupDialog.java
deleted file mode 100644
index bdda0aa..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/SourceLookupDialog.java
+++ /dev/null
@@ -1,145 +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.debug.ui.sourcelookup;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupPanel;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-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.PlatformUI;
-
-/**
- * A dialog for editing the source lookup path of a
- * source lookup director.
- * <p>
- * This class may be instantiated; it is not intended to be
- * subclassed.
- * </p>
- * @since 3.0
- */
-public class SourceLookupDialog extends TitleAreaDialog {
-	
-	private SourceLookupPanel fPanel;
-	private ISourceLookupDirector fDirector;
-	
-	/**
-	 * Constructs a dialog to edit the source lookup path managed by the
-	 * given source lookup director. Persists the resulting source lookup
-	 * path on the launch configuration associated with the given source
-	 * lookup director.
-	 * 
-	 * @param shell shell to parent the dialog
-	 * @param director source lookup director managing the source lookup
-	 *  path to be edited
-	 */
-	public SourceLookupDialog(Shell shell, ISourceLookupDirector director) {
-		super(shell);	
-        setShellStyle(getShellStyle() | SWT.RESIZE);
-		fDirector = director;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// create a composite with standard margins and spacing
-		setTitle(SourceLookupUIMessages.manageSourceDialog_description); 
-		setTitleImage(DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_EDIT_SRC_LOC_WIZ));
-		Composite composite = new Composite(parent, SWT.NONE);
-		
-		GridLayout layout = new GridLayout();
-		layout.marginHeight =
-			convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth =
-			convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing =
-			convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing =
-			convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.FILL_BOTH);			
-		composite.setLayoutData(data);
-		composite.setFont(parent.getFont());
-		fPanel = new SourceLookupPanel();
-		fPanel.createControl(composite);
-		fPanel.initializeFrom(fDirector);
-		Dialog.applyDialogFont(composite);
-		ILaunchConfiguration config = fDirector.getLaunchConfiguration();
-		if(config != null && config.isReadOnly()) {
-			setErrorMessage(SourceLookupUIMessages.SourceLookupDialog_0+config.getName()+SourceLookupUIMessages.SourceLookupDialog_1);
-		}
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,  IDebugHelpContextIds.EDIT_SOURCELOOKUP_DIALOG);
-		
-		return composite;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		ILaunchConfiguration config = fDirector.getLaunchConfiguration();
-		ILaunchConfigurationWorkingCopy copy = null;
-		if(config != null) {
-			try {
-				copy = config.getWorkingCopy();
-				fPanel.performApply(copy);
-				copy.doSave();
-			} 
-			catch (CoreException e) {DebugUIPlugin.log(e);}
-		}
-		super.okPressed();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */	
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		shell.setText(SourceLookupUIMessages.manageSourceDialog_title); 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-		fPanel.dispose();
-		return super.close();
-	}
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
-     * @since 3.2
-     */
-    protected IDialogSettings getDialogBoundsSettings() {
-    	 IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
-         IDialogSettings section = settings.getSection(getClass().getName());
-         if (section == null) {
-             section = settings.addNewSection(getClass().getName());
-         } 
-         return section;
-    }
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/SourceLookupTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/SourceLookupTab.java
deleted file mode 100644
index c2c8ba8..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/SourceLookupTab.java
+++ /dev/null
@@ -1,142 +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.debug.ui.sourcelookup;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupPanel;
-import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jface.dialogs.Dialog;
-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.ui.PlatformUI;
-
-/**
- * A launch configuration tab that displays and edits the source
- * lookup path for a launch configuration. This tab works with the
- * debug platform source lookup facilities - a source lookup director
- * with associated participants and source containers.
- * <p>
- * This tab may be instantiated. This class is not intended to be subclassed.
- * </p>
- * @since 3.0	 
- */
-
-public class SourceLookupTab extends AbstractLaunchConfigurationTab {
-	//the panel displaying the containers
-	private SourceLookupPanel fSourceLookupPanel;
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite comp = new Composite(parent, SWT.NONE);
-		setControl(comp);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.SOURCELOOKUP_TAB);
-		GridLayout topLayout = new GridLayout();
-		topLayout.marginWidth = 0;
-		topLayout.marginHeight = 0;
-		topLayout.numColumns = 1;
-		comp.setLayout(topLayout);
-		comp.setFont(parent.getFont());
-		
-		fSourceLookupPanel = new SourceLookupPanel();
-		fSourceLookupPanel.setLaunchConfigurationDialog(
-				getLaunchConfigurationDialog());
-		fSourceLookupPanel.createControl(comp);
-		GridData gd = (GridData) fSourceLookupPanel.getControl().getLayoutData();
-		gd.heightHint = 200;
-		gd.widthHint = 250;
-		Dialog.applyDialogFont(comp);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		fSourceLookupPanel.initializeFrom(configuration);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		fSourceLookupPanel.performApply(configuration);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return SourceLookupUIMessages.sourceTab_tabTitle; 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return DebugPluginImages.getImage(IInternalDebugUIConstants.IMG_SRC_LOOKUP_TAB);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
-		fSourceLookupPanel.activated(workingCopy);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
-	 */
-	public void dispose() {
-		if (fSourceLookupPanel != null) {
-			if (fSourceLookupPanel.getDirector() != null) {
-				fSourceLookupPanel.getDirector().dispose();
-			}
-			fSourceLookupPanel.dispose();
-		}
-		fSourceLookupPanel = null;		
-		super.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getErrorMessage()
-	 */
-	public String getErrorMessage() {
-		if (fSourceLookupPanel != null) {
-			return fSourceLookupPanel.getErrorMessage();
-		}
-		return super.getErrorMessage();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getMessage()
-	 */
-	public String getMessage() {
-		if (fSourceLookupPanel != null) {
-			return fSourceLookupPanel.getMessage();
-		}
-		return super.getMessage();
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/WorkingSetSourceContainer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/WorkingSetSourceContainer.java
deleted file mode 100644
index f0bd93b..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/WorkingSetSourceContainer.java
+++ /dev/null
@@ -1,108 +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.debug.ui.sourcelookup;
-
-import java.util.ArrayList;
-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.IAdaptable;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.ui.IWorkingSet;
-
-/**
- * A working set in the workspace.  Source is searched for in the projects (referenced
- * projects) and folders (sub-folders) that are part of the working set.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @since 3.0
- */
-public class WorkingSetSourceContainer extends CompositeSourceContainer{
-	
-	private IWorkingSet fWorkingSet;
-	/**
-	 * Unique identifier for the working set source container type
-	 * (value <code>org.eclipse.debug.ui.containerType.workingSet</code>.)
-	 */
-	public static final String TYPE_ID = DebugUIPlugin.getUniqueIdentifier()+".containerType.workingSet"; //$NON-NLS-1$
-		
-	/**
-	 * Creates a source container for the working set.
-	 * @param workingSet the working set represented by this container
-	 */
-	public WorkingSetSourceContainer(IWorkingSet workingSet) {
-		fWorkingSet = workingSet;		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
-	 */
-	public String getName() {
-		return fWorkingSet.getName();
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj != null && obj instanceof WorkingSetSourceContainer) {			
-			return ((WorkingSetSourceContainer)obj).fWorkingSet.equals(fWorkingSet);			
-		}				
-		return false;
-	}		
-
-	public int hashCode() {
-		return fWorkingSet.hashCode();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getType()
-	 */
-	public ISourceContainerType getType() {
-		return getSourceContainerType(TYPE_ID);
-	}
-			
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer#createSourceContainers()
-	 */
-	protected ISourceContainer[] createSourceContainers() throws CoreException {
-		IAdaptable[] elements = fWorkingSet.getElements();
-		
-		if(elements == null)
-			return new ISourceContainer[0];
-		
-		ArrayList locationList = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			IResource resource = (IResource) elements[i].getAdapter(IResource.class);
-			
-			if (resource != null) {
-				switch (resource.getType()) {
-				case IResource.FOLDER:							
-					locationList.add(new FolderSourceContainer((IFolder)resource, true));											
-					break;
-				case IResource.PROJECT:
-					locationList.add(new ProjectSourceContainer((IProject)resource, true));			
-					break;
-					//if the element corresponds to an IFile, do nothing
-				}
-			}
-		}
-		return (ISourceContainer[])locationList.toArray(new ISourceContainer[locationList.size()]);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/package.html b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/package.html
deleted file mode 100644
index abf2aab..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/sourcelookup/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">
-<title>Eclipse Debug Platform</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Provides a user interface for debug platform source lookup facilities.</p>
-
-<h2>Package Specification</h2>
-
-<p>This package provides classes implementing a user interface for source lookup 
-  facilities based on the source lookup director architecture defined in <code>org.eclipse.debug.core.sourcelookup</code>. 
-  A source lookup tab and dialog are provided that allow the user to modify a 
-  source lookup path.</p>
-<blockquote>&nbsp;</blockquote>
-</body>
-</html>
diff --git a/org.eclipse.ui.console/.classpath b/org.eclipse.ui.console/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/org.eclipse.ui.console/.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/org.eclipse.ui.console/.cvsignore b/org.eclipse.ui.console/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.ui.console/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.ui.console/.project b/org.eclipse.ui.console/.project
deleted file mode 100644
index aa92a70..0000000
--- a/org.eclipse.ui.console/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.console</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/org.eclipse.ui.console/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ui.console/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index f1360b9..0000000
--- a/org.eclipse.ui.console/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,72 +0,0 @@
-#Tue Jan 16 10:30:28 CST 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=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.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-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=ignore
-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=ignore
-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=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-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=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-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=disabled
-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.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,HIGH,HIGH
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,EXPERIMENTAL,CONTEXTLAUNCHING
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/org.eclipse.ui.console/.settings/org.eclipse.pde.prefs b/org.eclipse.ui.console/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index be21c5d..0000000
--- a/org.eclipse.ui.console/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,17 +0,0 @@
-#Tue Jan 30 11:39:21 CST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.missing-packages=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=0
-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/org.eclipse.ui.console/META-INF/MANIFEST.MF b/org.eclipse.ui.console/META-INF/MANIFEST.MF
deleted file mode 100644
index 620e53d..0000000
--- a/org.eclipse.ui.console/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ui.console; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-Activator: org.eclipse.ui.console.ConsolePlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.console,
- org.eclipse.ui.console.actions,
- org.eclipse.ui.internal.console;x-internal:=true
-Require-Bundle: org.eclipse.ui;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.expressions;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.variables;bundle-version="[3.2.0,4.0.0)"
-Eclipse-LazyStart: true
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/org.eclipse.ui.console/about.html b/org.eclipse.ui.console/about.html
deleted file mode 100644
index 4602330..0000000
--- a/org.eclipse.ui.console/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/org.eclipse.ui.console/build.properties b/org.eclipse.ui.console/build.properties
deleted file mode 100644
index 2a484ec..0000000
--- a/org.eclipse.ui.console/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/,\
-               plugin.xml,\
-               plugin.properties,\
-               .,\
-               about.html,\
-               META-INF/
-
-source.. src/
-src.includes = about.html,\
-               schema/
diff --git a/org.eclipse.ui.console/component.xml b/org.eclipse.ui.console/component.xml
deleted file mode 100644
index de1f8d5..0000000
--- a/org.eclipse.ui.console/component.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/component"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://eclipse.org/component ../component.xsd "
-   name="Eclipse Platform Console">
- <plugin id="org.eclipse.ui.console" />
-
- <package name="org.eclipse.ui.console">
- 	<type name="AbstractConsole" />
- 	<type name="ConsolePlugin" instantiate="false" subclass="false" />
- 	<type name="IConsole" />
- 	<type name="IConsoleConstants" implement="false" />
- 	<type name="IConsoleDocumentPartitioner" />
- 	<type name="IConsoleFactory" />
- 	<type name="IConsoleListener" />
- 	<type name="IConsoleManager" implement="false" />
- 	<type name="IConsolePageParticipant" />
- 	<type name="IConsoleView" implement="false" />
- 	<type name="IHyperlink" />
- 	<type name="IHyperlink2" />
- 	<type name="IOConsole" />
- 	<type name="IOConsoleInputStream" subclass="false" instantiate="false" />
- 	<type name="IOConsoleOutputStream" subclass="false" instantiate="false" />
- 	<type name="IPatternMatchListener" />
- 	<type name="IPatternMatchListenerDelegate" />
- 	<type name="MessageConsole" subclass="false" />
- 	<type name="MessageConsoleStream" subclass="false" instantiate="false" />
- 	<type name="PatternMatchEvent" subclass="false" />
- 	<type name="TextConsole" />
- 	<type name="TextConsolePage" />
- 	<type name="TextConsoleViewer" />
- </package>
- <package name="org.eclipse.ui.console.actions">
- 	<type name="ClearOutputAction" subclass="false" />
- 	<type name="CloseConsoleAction" subclass="false" />
- 	<type name="TextViewerAction" />
- 	<type name="TextViewerGotoLineAction" subclass="false" />
- </package>
- 
- <component-depends unrestricted="true"/>
-
-</component>
\ No newline at end of file
diff --git a/org.eclipse.ui.console/icons/full/clcl16/clear_co.gif b/org.eclipse.ui.console/icons/full/clcl16/clear_co.gif
deleted file mode 100644
index af30a42..0000000
--- a/org.eclipse.ui.console/icons/full/clcl16/clear_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/clcl16/lock_co.gif b/org.eclipse.ui.console/icons/full/clcl16/lock_co.gif
deleted file mode 100644
index 68fd6cf..0000000
--- a/org.eclipse.ui.console/icons/full/clcl16/lock_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/clcl16/pin.gif b/org.eclipse.ui.console/icons/full/clcl16/pin.gif
deleted file mode 100644
index ec50b70..0000000
--- a/org.eclipse.ui.console/icons/full/clcl16/pin.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/cview16/console_view.gif b/org.eclipse.ui.console/icons/full/cview16/console_view.gif
deleted file mode 100644
index a598f60..0000000
--- a/org.eclipse.ui.console/icons/full/cview16/console_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/dlcl16/clear_co.gif b/org.eclipse.ui.console/icons/full/dlcl16/clear_co.gif
deleted file mode 100644
index 6775edf..0000000
--- a/org.eclipse.ui.console/icons/full/dlcl16/clear_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/dlcl16/lock_co.gif b/org.eclipse.ui.console/icons/full/dlcl16/lock_co.gif
deleted file mode 100644
index b776478..0000000
--- a/org.eclipse.ui.console/icons/full/dlcl16/lock_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/dlcl16/pin.gif b/org.eclipse.ui.console/icons/full/dlcl16/pin.gif
deleted file mode 100644
index 61615d5..0000000
--- a/org.eclipse.ui.console/icons/full/dlcl16/pin.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/dlcl16/rem_co.gif b/org.eclipse.ui.console/icons/full/dlcl16/rem_co.gif
deleted file mode 100644
index 559e462..0000000
--- a/org.eclipse.ui.console/icons/full/dlcl16/rem_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/elcl16/clear_co.gif b/org.eclipse.ui.console/icons/full/elcl16/clear_co.gif
deleted file mode 100644
index af30a42..0000000
--- a/org.eclipse.ui.console/icons/full/elcl16/clear_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/elcl16/lock_co.gif b/org.eclipse.ui.console/icons/full/elcl16/lock_co.gif
deleted file mode 100644
index 68fd6cf..0000000
--- a/org.eclipse.ui.console/icons/full/elcl16/lock_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/elcl16/new_con.gif b/org.eclipse.ui.console/icons/full/elcl16/new_con.gif
deleted file mode 100644
index 7aea894..0000000
--- a/org.eclipse.ui.console/icons/full/elcl16/new_con.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/elcl16/pin.gif b/org.eclipse.ui.console/icons/full/elcl16/pin.gif
deleted file mode 100644
index ec50b70..0000000
--- a/org.eclipse.ui.console/icons/full/elcl16/pin.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/elcl16/rem_co.gif b/org.eclipse.ui.console/icons/full/elcl16/rem_co.gif
deleted file mode 100644
index 2cd9c54..0000000
--- a/org.eclipse.ui.console/icons/full/elcl16/rem_co.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/icons/full/eview16/console_view.gif b/org.eclipse.ui.console/icons/full/eview16/console_view.gif
deleted file mode 100644
index a598f60..0000000
--- a/org.eclipse.ui.console/icons/full/eview16/console_view.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.ui.console/plugin.properties b/org.eclipse.ui.console/plugin.properties
deleted file mode 100644
index 1301fab..0000000
--- a/org.eclipse.ui.console/plugin.properties
+++ /dev/null
@@ -1,24 +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=Console
-providerName=Eclipse.org
-ConsoleView.name=Console
-
-ViewCommand.consoleView.name=Console
-ViewCommand.consoleView.description=Show the Console view
-
-ConsolePatternMatchListenerName= Console Pattern Match Listeners
-ConsolePageParticipantName= Console Page Participants
-
-ConsoleFactoryName= Console Factories
-
-consoleViewConsoleFactory.name=New Console View
diff --git a/org.eclipse.ui.console/plugin.xml b/org.eclipse.ui.console/plugin.xml
deleted file mode 100644
index 4fd2ab8..0000000
--- a/org.eclipse.ui.console/plugin.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension-point id="consolePatternMatchListeners" name="%ConsolePatternMatchListenerName" schema="schema/consolePatternMatchListeners.exsd"/>
-   <extension-point id="consolePageParticipants" name="%ConsolePageParticipantName" schema="schema/consolePageParticipants.exsd"/>
-   <extension-point id="consoleFactories" name="%ConsoleFactoryName" schema="schema/consoleFactories.exsd"/>
-
-
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            allowMultiple="true"
-            class="org.eclipse.ui.internal.console.ConsoleView"
-            icon="$nl$/icons/full/cview16/console_view.gif"
-            category="org.eclipse.ui"
-            name="%ConsoleView.name"
-            id="org.eclipse.ui.console.ConsoleView">
-      </view>
-   </extension>
-<!-- commands and their bindings
-NOTE: 
-M1 = CTRL/COMMAND 
-M2 = SHIFT 
-M3 = ALT 
-M4 = Platform-specific fourth key
--->   
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            name="%ViewCommand.consoleView.name"
-            description="%ViewCommand.consoleView.description"
-            categoryId="org.eclipse.ui.category.views"
-            id="org.eclipse.ui.console.ConsoleView">
-      </command>
-   </extension>
-    <extension point="org.eclipse.ui.bindings">
-     <key 
-  	    	sequence="M3+M2+Q C"
-            contextId="org.eclipse.ui.globalScope"
-            commandId="org.eclipse.ui.console.ConsoleView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-  	</extension>
-    <extension
-          point="org.eclipse.core.expressions.propertyTesters">
-       <propertyTester
-             namespace="org.eclipse.ui.console"
-             type="org.eclipse.ui.console.IConsole"
-             class="org.eclipse.ui.internal.console.ConsoleTypePropertyTester"
-             properties="consoleTypeTest"
-             id="org.eclipse.ui.console.ConsoleTypePropertyTester"/>
-    </extension>
-    <extension
-          point="org.eclipse.ui.console.consoleFactories">
-       <consoleFactory
-             label="%consoleViewConsoleFactory.name"
-             class="org.eclipse.ui.internal.console.ConsoleViewConsoleFactory"/>
-    </extension>
-
-</plugin>
diff --git a/org.eclipse.ui.console/schema/consoleFactories.exsd b/org.eclipse.ui.console/schema/consoleFactories.exsd
deleted file mode 100644
index 210882f..0000000
--- a/org.eclipse.ui.console/schema/consoleFactories.exsd
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.console">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.console" id="consoleFactories" name="Console Factories"/>
-      </appInfo>
-      <documentation>
-         A console factory creates or activates a console, and appears as an action in the console view.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="consoleFactory"/>
-         </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="consoleFactory">
-      <complexType>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  action label to appear in menu
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  optional plug-in relative path to an icon to appear with the action
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class implementing &lt;code&gt;org.eclipse.ui.console.IConsoleFactory&lt;/code&gt; that will be called when the associated action is invoked
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.console.IConsoleFactory"/>
-               </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 console factory extension point: 
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.ui.console.consoleFactories&quot;&gt;
-  &lt;consoleFactory 
-     label=&quot;Command Console&quot;
-     class=&quot;com.example.CommandConsoleFactory&quot;
-     icon=&quot;icons/cmd_console.gif&quot;&gt;
-  &lt;/consoleFactory&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-This extension will cause an entry to appear in the console view&apos;s &lt;b&gt;Open Console&lt;/b&gt; drop-down menu labelled &lt;b&gt;Command Console&lt;/b&gt; with the specified icon. When the action is invoked by a user, the method &lt;b&gt;openConsole()&lt;/b&gt; on the class &lt;b&gt;com.example.CommandConsoleFactory&lt;/b&gt; will be called. The factory can the decide to create a new console or activate an existing console.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.ui.console.IConsoleFactory&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The console plug-in provides a console factory to open a new console view.
-      </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/org.eclipse.ui.console/schema/consolePageParticipants.exsd b/org.eclipse.ui.console/schema/consolePageParticipants.exsd
deleted file mode 100644
index 06b40c1..0000000
--- a/org.eclipse.ui.console/schema/consolePageParticipants.exsd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.console">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.console" id="consolePageParticipants" name="Console Page Participants"/>
-      </appInfo>
-      <documentation>
-         This extension point provides a mechanism for contributing a console page participant.  A console page participant is notified of page lifecycle events such as creation, activation, deactivation and disposal. A page participant can also provide adapters for a page.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="consolePageParticipant"/>
-         </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="consolePageParticipant">
-      <complexType>
-         <sequence>
-            <element ref="enablement"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this Console Page Participant
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully qualified name of a Java class that implements &lt;code&gt;IConsolePageParticipant&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.console.IConsolePageParticipant"/>
-               </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 console page participant extension point: 
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.console.consolePageParticipants&quot;&gt;
-      &lt;consolePageParticipant
-            class=&quot;com.example.ExamplePageParticipant&quot;
-            id=&quot;com.example.ExamplePageParticipant&quot;&gt;
-         &lt;enablement&gt;
-            &lt;instanceof value=&quot;com.example.ExampleConsole&quot;/&gt;
-         &lt;/enablement&gt;
-      &lt;/consolePageParticipant&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-In the above example, the contributed console page participant will be used for all consoles of type &quot;com.example.ExampleConsole.&quot;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.ui.console.IConsolePageParticipant&lt;/b&gt;.
-      </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/org.eclipse.ui.console/schema/consolePatternMatchListeners.exsd b/org.eclipse.ui.console/schema/consolePatternMatchListeners.exsd
deleted file mode 100644
index 5cb81e0..0000000
--- a/org.eclipse.ui.console/schema/consolePatternMatchListeners.exsd
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.console">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.console" id="consolePatternMatchListeners" name="Console Pattern Match Listeners"/>
-      </appInfo>
-      <documentation>
-         Provides regular expression matching for text consoles. Pattern match listeners can be contributed to specific consoles by using an enablement expression. Listeners are notified as matches are found.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="consolePatternMatchListener" 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="consolePatternMatchListener">
-      <complexType>
-         <sequence>
-            <element ref="enablement"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a unique identifier for this console pattern match listener
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies a fully qualified name of a Java class that implements &lt;code&gt;IPatternMatchListenerDelegate&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.console.IPatternMatchListenerDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="regex" type="string" use="required">
-            <annotation>
-               <documentation>
-                  specifies the regular expression to be matched. Since 3.2, this attribute supports string variable substitution.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="flags" type="string">
-            <annotation>
-               <documentation>
-                  specifies flags to be used when matching the pattern. Acceptable flags are defined in &lt;code&gt;java.util.regex.Pattern&lt;/code&gt; and should be specified as Strings (eg &quot;Pattern.MULTILINE&quot; or &quot;MULTILINE&quot;)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="qualifier" type="string">
-            <annotation>
-               <documentation>
-                  a simple regular expression used to identify a line that may contain this pattern match listener&apos;s complete regular expression &lt;code&gt;regex&lt;/code&gt;. When a line is found containing this expression, a search is performed from the beginning of the line for this pattern matcher&apos;s complete &lt;code&gt;regex&lt;/code&gt;. Use of this attribute is optional but can greatly improve performance as lines not containing this expression are disqualified from the search. Since 3.2, this attribute supports string variable substitution.
-               </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 console pattern match listener extension point: 
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.console.consolePatternMatchListener&quot;&gt;
-      &lt;consolePatternMatchListener
-            class=&quot;com.example.ExampleConsolePatternMatcher&quot;
-            id=&quot;com.example.ExampleConsolePatternMatcher&quot;
-            regex=&quot;.*foo.*&quot;&gt;
-         &lt;enablement&gt;
-            &lt;test property=&quot;org.eclipse.ui.console.consoleTypeTest&quot; value=&quot;exampleConsole&quot;/&gt;
-         &lt;/enablement&gt;
-      &lt;/consolePatternMatchListener&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-In the above example, the contributed console pattern matcher will be used for consoles with a type of &quot;exampleConsole.&quot;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.ui.console.IPatternMatchListenerDelegate&lt;/b&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The console plug-in provides a console type property tester for enablement expressions that tests the value of &lt;code&gt;IConsole.getType()&lt;/code&gt;. The property tester&apos;s identifier is &lt;code&gt;org.eclipse.ui.console.consoleTypeTest&lt;/code&gt;.
-      </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/org.eclipse.ui.console/scripts/exportplugin.xml b/org.eclipse.ui.console/scripts/exportplugin.xml
deleted file mode 100644
index af246f1..0000000
--- a/org.eclipse.ui.console/scripts/exportplugin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Export a jar of .class files for the org.eclipse.ui.console Eclipse plugin
-     along with other important plugin files to the "plugin-export" subdirectory
-     of the target Eclipse installation -->
-<project name="Export ui.console" default="export" basedir="..">
-
-	<!-- Set the timestamp and important properties -->
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="dest"  value="${destdir}/org.eclipse.ui.console_3.0.0" />
-	</target>
-
-	<!-- Create the jar of .class files, and copy other important files to export dir -->
-	<target name="export" depends="init">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<jar 
-			jarfile="${dest}/console.jar"
-			basedir="bin"
-		/>
-		<!-- Create the source zip -->
-		<zip zipfile="${dest}/consolesrc.zip">
-			<fileset dir="src"/>
-		</zip>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy file=".classpath" todir="${dest}"/>
-		<copy file=".options" todir="${dest}"/>
-		<copy todir="${dest}/icons">
-			<fileset dir="icons" />
-		</copy>
-	</target>
-	
-</project>
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/AbstractConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/AbstractConsole.java
deleted file mode 100644
index 99fb784..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/AbstractConsole.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.console;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.ui.internal.console.ConsoleMessages;
-
-/**
- * Common function for consoles.
- * <p>
- * Clients implementing consoles should subclass this class.
- * </p>
- * @since 3.0
- */
-public abstract class AbstractConsole implements IConsole {
-	
-	// property listeners
-	private ListenerList fListeners;
-	
-	/**
-	 * Console name
-	 */
-	private String fName = null;
-	
-	/**
-	 * Console image descriptor
-	 */
-	private ImageDescriptor fImageDescriptor = null;
-	
-	/**
-	 * Console type identifier
-	 */
-	private String fType = null;
-	
-	/**
-	 * Used to notify this console of lifecycle methods <code>init()</code>
-	 * and <code>dispose()</code>.
-	 */
-	class Lifecycle implements IConsoleListener {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.console.IConsoleListener#consolesAdded(org.eclipse.ui.console.IConsole[])
-		 */
-		public void consolesAdded(IConsole[] consoles) {
-			for (int i = 0; i < consoles.length; i++) {
-				IConsole console = consoles[i];
-				if (console == AbstractConsole.this) {
-					initialize();
-				}
-			}
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.console.IConsoleListener#consolesRemoved(org.eclipse.ui.console.IConsole[])
-		 */
-		public void consolesRemoved(IConsole[] consoles) {
-			for (int i = 0; i < consoles.length; i++) {
-				IConsole console = consoles[i];
-				if (console == AbstractConsole.this) {
-					ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(this);
-					destroy();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Notifies listeners of property changes, handling any exceptions
-	 */
-	class PropertyNotifier implements ISafeRunnable {
-		
-		private IPropertyChangeListener fListener;
-		private PropertyChangeEvent fEvent;
-		
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.INTERNAL_ERROR, ConsoleMessages.AbstractConsole_0, exception); 
-			ConsolePlugin.log(status);
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			fListener.propertyChange(fEvent);
-		}
-
-		/**
-		 * Notifies listeners of the property change
-		 * 
-		 * @param event the event that describes the property that has changed
-		 */
-		public void notify(PropertyChangeEvent event) {
-			if (fListeners == null) {
-				return;
-			}
-			fEvent = event;
-			Object[] copiedListeners= fListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IPropertyChangeListener)copiedListeners[i];
-                SafeRunner.run(this);
-			}	
-			fListener = null;			
-		}
-	}	
-	
-	/**
-	 * Constructs a new console with the given name and image.
-	 * 
-	 * @param name console name, cannot be <code>null</code>
-	 * @param imageDescriptor image descriptor, or <code>null</code> if none
-	 * @param autoLifecycle whether this console's lifecycle methods should be called
-	 *  automatically when it is added (<code>initialize()</code>) and removed
-	 *  (<code>destroy()</code>) from the console manager. When <code>false</code>,
-	 *  clients are responsible for calling the lifecycle methods.
-	 * @since 3.1
-	 */
-	public AbstractConsole(String name, ImageDescriptor imageDescriptor, boolean autoLifecycle) {
-	    this(name, null, imageDescriptor, autoLifecycle);
-	}
-	
-	/**
-	 * Constructs a new console with the given name, type, image and lifecycle.
-	 * 
-	 * @param name console name, cannot be <code>null</code>
-	 * @param type console type identifier or <code>null</code>
-	 * @param imageDescriptor image descriptor, or <code>null</code> if none
-	 * @param autoLifecycle whether this console's lifecycle methods should be called
-	 *  automatically when it is added (<code>initialize()</code>) and removed
-	 *  (<code>destroy()</code>) from the console manager. When <code>false</code>,
-	 *  clients are responsible for calling the lifecycle methods.
-	 * @since 3.1
-	 */
-	public AbstractConsole(String name, String type, ImageDescriptor imageDescriptor, boolean autoLifecycle) {
-		setName(name);
-		setType(type);
-		setImageDescriptor(imageDescriptor);
-		if (autoLifecycle) {
-		    ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(new Lifecycle());
-		}
-	}	
-	
-	/**
-	 * Constructs a new console with the given name and image. The console's lifecycle
-	 * methods <code>init()</code> and <code>dispose()</code> will be called when the
-	 * console is added and removed from the console manager.
-	 * 
-	 * @param name console name, cannot be <code>null</code>
-	 * @param imageDescriptor image descriptor, or <code>null</code> if none
-	 */
-	public AbstractConsole(String name, ImageDescriptor imageDescriptor) {
-		this(name, imageDescriptor, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsole#getName()
-	 */
-	public String getName() {
-		return fName;
-	}
-
-	/**
-	 * Sets the name of this console to the specified value and notifies
-	 * property listeners of the change.
-	 * 
-	 * @param name the new name
-	 */
-	protected void setName(String name) {
-        if (!name.equals(fName)) {
-            String old = fName;
-            fName = name;
-            firePropertyChange(this, IBasicPropertyConstants.P_TEXT, old, name);
-        }
-    }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsole#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return fImageDescriptor;
-	}
-	
-	/**
-	 * Sets the image descriptor for this console to the specified value and notifies
-	 * property listeners of the change.
-	 * 
-	 * @param imageDescriptor the new image descriptor
-	 */
-	protected void setImageDescriptor(ImageDescriptor imageDescriptor) {
-		ImageDescriptor old = fImageDescriptor;
-		fImageDescriptor =imageDescriptor;
-		firePropertyChange(this, IBasicPropertyConstants.P_IMAGE, old, imageDescriptor);
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsole#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-		if (fListeners == null) {
-			fListeners = new ListenerList();
-		}
-		fListeners.add(listener);		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsole#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		if (fListeners != null) {
-			fListeners.remove(listener);
-		}
-	}
-
-	/**
-	 * Notify all listeners that the given property has changed.
-	 * 
-	 * @param source the object on which a property has changed 
-	 * @param property identifier of the property that has changed
-	 * @param oldValue the old value of the property, or <code>null</code>
-	 * @param newValue the new value of the property, or <code>null</code>
-	 */
-	public void firePropertyChange(Object source, String property, Object oldValue, Object newValue) {
-		if (fListeners == null) {
-			return;
-		}
-		PropertyNotifier notifier = new PropertyNotifier();
-		notifier.notify(new PropertyChangeEvent(source, property, oldValue, newValue));
-	}
-	
-	/**
-	 * Initializes this console. This method should only be called by clients managing a
-	 * console's lifecycle, otherwise this method will be called automatically when this console
-	 * is added to the console manager. The method is called once to initialize this console,
-	 * marking the beginning of its lifecycle.
-	 * 
-	 * @since 3.1
-	 */
-	public final void initialize() {
-	    init();
-	}
-	
-	/**
-	 * Called when this console is added to the console manager. Default
-	 * implementation does nothing. Subclasses may override.
-	 * <p>
-	 * Since 3.1, this method is only called automatically if this console was
-	 * created with an automatic lifecycle.
-	 * </p>
-	 */
-	protected void init() {
-	}
-	
-	/**
-	 * Disposes this console. This method should only be called by clients managing a
-	 * console's lifecycle, otherwise this method will be called automatically when this
-	 * console is removed from the console manager. The method is called once to dispose
-	 * this console, after which this console will no longer be used. 
-	 * 
-	 * @since 3.1
-	 */
-	public final void destroy() {
-	    dispose();
-	}
-	
-	/**
-	 * Called when this console is removed from the console manager. Default
-	 * implementation does nothing. Subclasses may override.
-	 * <p>
-	 * Since 3.1, this methods is only called automatically if this console was
-	 * created with an automatic lifecycle.
-	 * </p>
-	 */
-	protected void dispose() {
-	}
-	
-	/**
-	 * Shows this console in all console views. This console will be become visible
-	 * if another console is currently pinned. 
-	 * 
-	 * @since 3.1
-	 */
-    public void activate() {
-        ConsolePlugin.getDefault().getConsoleManager().showConsoleView(this);
-    }
-    
-    /**
-     * Sets this console's type identifier.
-     * 
-     * @param typeIdentifier the type identifier for this console 
-     * @since 3.1
-     */
-    protected void setType(String typeIdentifier) {
-        fType = typeIdentifier;
-    }
-    
-    /**
-     * @see org.eclipse.ui.console.IConsole#getType()
-     * @since 3.1
-     */
-    public String getType() {
-        return fType;
-    }
-    
-    /**
-     * Returns the help context identifier for this console, or <code>null</code>
-     * if none. When a non-<code>null</code> value is returned the associated help
-     * will be installed for this console.
-     * 
-     * @return help context id or <code>null</code>
-     * @since 3.2
-     */
-    public String getHelpContextId() {
-    	return null;
-    }
-    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/ConsolePlugin.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/ConsolePlugin.java
deleted file mode 100644
index 924ee1b..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/ConsolePlugin.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.console;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.console.ConsoleManager;
-import org.eclipse.ui.internal.console.ConsolePluginImages;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The console plug-in class.
- * 
- * @since 3.0
- */
-
-public class ConsolePlugin extends AbstractUIPlugin {
-	
-	/**
-	 * Singleton console manager
-	 */
-	private IConsoleManager fConsoleManager = null;
-
-	/**
-	 * The singleton console plug-in instance
-	 */
-	private static ConsolePlugin fgPlugin= null;
-	
-	/**
-	 * Unique identifier constant (value <code>"org.eclipse.ui.console"</code>)
-	 * for the UI Console plug-in.
-	 */
-	private static final String PI_UI_CONSOLE = "org.eclipse.ui.console"; //$NON-NLS-1$
-		
-	/**
-	 * Returns the singleton instance of the console plug-in.
-	 */
-	public static ConsolePlugin getDefault() {
-		return fgPlugin;
-	}
-
-	public ConsolePlugin() {
-		super();
-		fgPlugin = this;
-	}
-	
-	/**
-	 * Convenience method which returns the unique identifier of this plug-in.
-	 */
-	public static String getUniqueIdentifier() {
-		return PI_UI_CONSOLE;
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		if (t instanceof CoreException) {
-			log(((CoreException)t).getStatus());
-		} else {
-			log(newErrorStatus("Error logged from Console plug-in: ", t)); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, getUniqueIdentifier(), IConsoleConstants.INTERNAL_ERROR, message, exception);
-	}
-	
-	/**
-	 * Returns the console manager. The manager will be created lazily on 
-	 * the first access.
-	 * 
-	 * @return IConsoleManager
-	 */
-	public IConsoleManager getConsoleManager() {
-		if (fConsoleManager == null) {
-			fConsoleManager = new ConsoleManager();
-		}
-		return fConsoleManager;
-	}
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if
-	 * the thread calling this method has an associated display. If so, this
-	 * display is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display= Display.getCurrent();
-		if (display == null) {
-			display= Display.getDefault();
-		}
-		return display;		
-	}
-	
-	/**
-	 * Utility method with conventions
-	 */
-	public static void errorDialog(Shell shell, String title, String message, Throwable t) {
-		IStatus status;
-		if (t instanceof CoreException) {
-			status= ((CoreException)t).getStatus();
-			// if the 'message' resource string and the IStatus' message are the same,
-			// don't show both in the dialog
-			if (status != null && message.equals(status.getMessage())) {
-				message= null;
-			}
-		} else {
-			status= new Status(IStatus.ERROR, getUniqueIdentifier(), IConsoleConstants.INTERNAL_ERROR, "Error within Debug UI: ", t); //$NON-NLS-1$
-			log(status);	
-		}
-		ErrorDialog.openError(shell, title, message, status);
-	}
-    
-    /**
-     * Returns the <code>Image</code> identified by the given key,
-     * or <code>null</code> if it does not exist.
-     * 
-     * @return the <code>Image</code> identified by the given key,
-     * or <code>null</code> if it does not exist
-     * @since 3.1
-     */
-    public static Image getImage(String key) {
-        return ConsolePluginImages.getImage(key);
-    }
-    
-    /**
-     * Returns the <code>ImageDescriptor</code> identified by the given key,
-     * or <code>null</code> if it does not exist.
-     * 
-     * @return the <code>ImageDescriptor</code> identified by the given key,
-     * or <code>null</code> if it does not exist
-     * @since 3.1
-     */
-    public static ImageDescriptor getImageDescriptor(String key) {
-        return ConsolePluginImages.getImageDescriptor(key);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext context) throws Exception {
-    	if (fConsoleManager != null) {
-	        IConsole[] consoles = fConsoleManager.getConsoles();
-	        if (consoles != null) {
-	            fConsoleManager.removeConsoles(consoles);
-	        }
-    	}
-        super.stop(context);
-    }    
-    
-    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsole.java
deleted file mode 100644
index af1b4ce..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsole.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.console;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.ui.part.IPageBookViewPage;
-
-/**
- * A console. A console is commonly used to display messages such as the output
- * streams of a system process. A console can be displayed in one or more console
- * views.
- * <p>
- * The console implementations provided by this plug-in are textual
- * (<code>TextConsole</code>, <code>MessageConsole</code> and <code>IOConsole</code>).
- * However a client can provide alternate presentations since a console implementation
- * is responsible for providing is page for the page book views in which consoles are
- * displayed.
- * </p>
- * <p>
- * This interface is not intended to be implemented directly by clients. 
- * Subclass <code>AbstractConsole</code> instead.
- * </p>
- * @since 3.0
- */
-public interface IConsole {
-		
-	/**
-	 * Returns the name of this console.
-	 * 
-	 * @return the name of this console
-	 */
-	public String getName();
-	
-	/**
-	 * Returns an image descriptor for this console, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return an image descriptor for this console, or <code>null</code>
-	 *  if none
-	 */
-	public ImageDescriptor getImageDescriptor();
-		
-	/**
-	 * Creates and returns a new page for this console. The page is displayed
-	 * for this console in the console given view.
-	 * 
-	 * @param view the view in which the page is to be created
-	 * @return a page book view page representation of this console
-	 */
-	public IPageBookViewPage createPage(IConsoleView view);
-	
-	/**
-	 * Adds a listener for changes to properties of this console.
-	 * Has no effect if an identical listener is already registered.
-	 * <p>
-	 * The changes supported by the console view are as follows:
-	 * <ul>
-	 *   <li><code>IBasicPropertyConstants.P_TEXT</code> - indicates the name
-	 *      of a console has changed</li>
-	 * 	 <li><code>IBasicPropertyConstants.P_IMAGE</code> - indicates the image
-	 *      of a console has changed</li>
-	 * </ul>
-	 * </p>
-	 * <p>
-	 * Consoles may define additional properties as required.
-	 * </p>
-	 *
-	 * @param listener a property change listener
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener);
-	
-	/**
-	 * Removes the given property listener from this console page.
-	 * Has no effect if an identical listener is not already registered.
-	 * 
-	 * @param listener a property listener
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener);	
-	
-	/**
-	 * Returns a unique identifier for this console's type, or <code>null</code>
-	 * if unspecified.
-	 * 
-	 * @return a unique identifier for this console's type, or <code>null</code>
-	 * @since 3.1
-	 */
-	public String getType();
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java
deleted file mode 100644
index 4321582..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleConstants.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.console;
-
-/**
- * Constants relating to the console plug-in.
- * 
- * @since 3.0
- */
-public interface IConsoleConstants {
-	
-	/**
-	 * Console plug-in identifier (value <code>"org.eclipse.ui.console"</code>).
-	 */
-	public static final String PLUGIN_ID = ConsolePlugin.getUniqueIdentifier();
-	
-	/**
-	 * Console view identifier (value <code>"org.eclipse.ui.console.ConsoleView"</code>).
-	 */
-	public static final String ID_CONSOLE_VIEW= "org.eclipse.ui.console.ConsoleView"; //$NON-NLS-1$
-
-	/**
-	 * Type identifier for MessageConsole
-	 * @since 3.1
-	 */
-    public static final String MESSAGE_CONSOLE_TYPE = "org.eclipse.ui.MessageConsole"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the font to use for the Console (value <code>"org.eclipse.ui.console.ConsoleFont"</code>).
-	 * 
-	 * @deprecated When a console is created, its font is set to the default text font as specified
-	 * by <code>JFaceResources.TEXT_FONT</code>. Clients must provide their own infrastructure to
-	 * manage console specific fonts. 
-	 */ 
-	public static final String CONSOLE_FONT= "org.eclipse.ui.console.ConsoleFont"; //$NON-NLS-1$
-	
-	/**
-	 * Menu group identifier for the console view context menu and toolbar, for actions pertaining to
-	 * launching (value <code>"launchGroup"</code>).
-	 */
-	public static final String LAUNCH_GROUP = "launchGroup"; //$NON-NLS-1$
-
-	/**
-	 * Menu group identifier for the console view context menu and toolbar, for actions pertaining to
-	 * console output. (value<code>"outputGroup"</code>).
-	 */
-	public static final String OUTPUT_GROUP = "outputGroup"; //$NON-NLS-1$	
-		
-	/** 
-	 * Console view image identifier.
-	 */
-	public static final String IMG_VIEW_CONSOLE= "IMG_VIEW_CONSOLE"; //$NON-NLS-1$
-	
-	/** 
-	 * Clear action image identifier. 
-	 */
-	public static final String IMG_LCL_CLEAR= "IMG_LCL_CLEAR"; //$NON-NLS-1$
-		
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-
-	/**
-	 * Console pattern match listeners extension point identifier
-	 * (value <code>"consolePatternMatchListeners"</code>).
-	 * 
-	 * @since 3.1 
-	 */
-    public static final String EXTENSION_POINT_CONSOLE_PATTERN_MATCH_LISTENERS = "consolePatternMatchListeners"; //$NON-NLS-1$
-
-    /**
-     * Console page participants extension point identifier
-     * (value <code>"consolePageParticipants"</code>).
-     * 
-     * @since 3.1
-     */
-    public static final String EXTENSION_POINT_CONSOLE_PAGE_PARTICIPANTS = "consolePageParticipants"; //$NON-NLS-1$
-
-    /**
-     * Console factories extension point identifier
-     * (value <code>"consoleFactories"</code>).
-     * 
-     * @since 3.1
-     */
-    public static final String EXTENSION_POINT_CONSOLE_FACTORIES = "consoleFactories"; //$NON-NLS-1$
-    
-	/**
-	 * Property constant indicating a console's font has changed.
-	 *  
-	 * @since 3.1
-	 */
-	public static final String P_FONT = ConsolePlugin.getUniqueIdentifier() + ".P_FONT"; //$NON-NLS-1$
-	
-	/**
-	 * Property constant indicating that a font style has changed
-	 * 
-	 * @since 3.1
-	 */
-	public static final String P_FONT_STYLE = ConsolePlugin.getUniqueIdentifier() + ".P_FONT_STYLE"; //$NON-NLS-1$
-	
-	/**
-	 * Property constant indicating the color of a stream has changed.
-	 * 
-	 *  @since 3.1
-	 */
-	public static final String P_STREAM_COLOR = ConsolePlugin.getUniqueIdentifier()  + ".P_STREAM_COLOR";	 //$NON-NLS-1$
-		
-	/**
-	 * Property constant indicating tab size has changed
-	 * 
-	 *  @since 3.1
-	 */
-	public static final String P_TAB_SIZE = ConsolePlugin.getUniqueIdentifier()  + ".P_TAB_SIZE";	 //$NON-NLS-1$
-	
-	/**
-	 * Property constant indicating the width of a fixed width console has changed.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String P_CONSOLE_WIDTH = ConsolePlugin.getUniqueIdentifier() + ".P_CONSOLE_WIDTH"; //$NON-NLS-1$
-	
-	/**
-	 * Property constant indicating that all streams connected to this console have been closed
-	 * and that all queued output has been processed.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String P_CONSOLE_OUTPUT_COMPLETE = ConsolePlugin.getUniqueIdentifier() + ".P_CONSOLE_STREAMS_CLOSED"; //$NON-NLS-1$
-	
-	/**
-	 * Property constant indicating the background color of a console has changed.
-	 * 
-	 *  @since 3.3
-	 */
-	public static final String P_BACKGROUND_COLOR = ConsolePlugin.getUniqueIdentifier()  + ".P_BACKGROUND_COLOR";	 //$NON-NLS-1$	
-
-    /**
-     * The default tab size for text consoles.
-     * 
-     * @since 3.1
-     */
-    public static final int DEFAULT_TAB_SIZE = 8;
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleDocumentPartitioner.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleDocumentPartitioner.java
deleted file mode 100644
index 0da81fe..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleDocumentPartitioner.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.console;
-
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.swt.custom.StyleRange;
-
-/**
- * A document partitioner for a text console.
- * <p>
- * In addition to regular partitioner duties, a console document partitioner
- * dictates which regions in its document are read-only and provides style ranges.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * @see org.eclipse.ui.console.TextConsole
- * @since 3.1
- */
-public interface IConsoleDocumentPartitioner extends IDocumentPartitioner {
-       
-    /**
-     * Returns whether this partitioner's document is read-only at the specified
-     * offset. The user is not allowed to type in read-only locations. 
-     * 
-     * @param offset document offset
-     * @return whether this partitioner's document is read-only at the specified
-     * offset
-     */
-    public boolean isReadOnly(int offset);
-    
-    /**
-     * Returns style ranges for the specified region of this partitioner's document
-     * to use when rendering, or <code>null</code> if none. 
-     * 
-     * @param offset beginning offset for which style ranges are requested
-     * @param length the length of text for which style ranges are requested
-     * @return style ranges for the specified region of this partitioner's document
-     * to use when rendering, or <code>null</code> if none
-     */
-    public StyleRange[] getStyleRanges(int offset, int length);
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleFactory.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleFactory.java
deleted file mode 100644
index 4e27fed..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleFactory.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.console;
-
-/**
- * A console factory extension is responsible for opening a console in the console view.
- * Extensions appear on a menu in the console view, and their <code>openConsole</code>
- * method is called when the action is invoked. Implementations may choose to open a new
- * console or activate an existing console. The extension point used to contribute a
- * console factory is <code>org.eclipse.ui.console.consoleFactories</code>.
- * <p>
- * Following is an example console factory extension.
- * <pre>
- * &lt;extension point="org.eclipse.ui.console.consoleFactories"&gt;
- *   &lt;consoleFactory
- *      label="Command Console"
- *      icon="icons\cmd_console.gif"
- *      class="com.example.CommandConsoleFactory"&gt;
- *   &lt;/consoleFactory&gt;
- * &lt;/extension&gt;
- * </pre>
- * An action appears in the console view's 'Open Console' drop-down menu with the
- * corresponding <code>label</code> and optional <code>icon</code>. When the action
- * is invoked, the specified <code>class</code> is instantiated and called to
- * open a console, via the method <code>openConsole()</code>. 
- * </p>
- * <p>
- * Clients providing console factory extensions are intended to implement
- * this interface.
- * </p>
- * @since 3.1
- */
-public interface IConsoleFactory {
-    /**
-     * Opens a console in the console view. Implementations may create a new
-     * console or activate an existing console.
-     */
-    public void openConsole();
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleListener.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleListener.java
deleted file mode 100644
index 41aedb2..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleListener.java
+++ /dev/null
@@ -1,39 +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.console;
-
-/**
- * A console listener is notified when consoles are added or removed from
- * the console manager.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IConsoleListener {
-	
-	/**
-	 * Notification the given consoles have been added to the console
-	 * manager.
-	 * 
-	 * @param consoles added consoles
-	 */
-	public void consolesAdded(IConsole[] consoles);
-	
-	/**
-	 * Notification the given consoles have been removed from the
-	 * console manager.
-	 * 
-	 * @param consoles removed consoles
-	 */
-	public void consolesRemoved(IConsole[] consoles);
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.java
deleted file mode 100644
index e5f16fd..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleManager.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.ui.console;
-
-/**
- * The console manager manages registered consoles.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0 
- */
-public interface IConsoleManager {
-	
-	/**
-	 * Registers the given listener for console notifications. Has
-	 * no effect if an identical listener is already registered.
-	 * 
-	 * @param listener listener to register
-	 */
-	public void addConsoleListener(IConsoleListener listener);
-	
-	/**
-	 * Unregisters the given listener for console notifications. Has
-	 * no effect if an identical listener is not already registered.
-	 * 
-	 * @param listener listener to unregister
-	 */
-	public void removeConsoleListener(IConsoleListener listener);
-
-	/**
-	 * Adds the given consoles to the console manager. Has no effect for
-	 * equivalent consoles already registered. The consoles will be added
-	 * to any existing console views.
-	 * 
-	 * @param consoles consoles to add
-	 */
-	public void addConsoles(IConsole[] consoles);
-	
-	/**
-	 * Removes the given consoles from the console manager. If the consoles are
-	 * being displayed in any console views, the associated pages will be removed
-	 * and disposed.
-	 * 
-	 * @param consoles consoles to remove
-	 */
-	public void removeConsoles(IConsole[] consoles);
-	
-	/**
-	 * Returns a collection of consoles registered with the console manager.
-	 * 
-	 * @return a collection of consoles registered with the console manager
-	 */
-	public IConsole[] getConsoles();
-	
-	/**
-	 * Opens the console view and displays given the console.
-	 * If the view is already open, it is brought to the front unless
-	 * the view is pinned on a console other than the given console.
-	 * Has no effect if the given console is not currently registered.
-	 * 
-	 * @param console console to display
-	 */
-	public void showConsoleView(IConsole console);
-	
-	/**
-	 * Warns that the content of the given console has changed in
-	 * all console views. Has no effect if the given console is not
-	 * currently registered.
-	 * 
-	 * @param console the console that has changed
-	 */
-	public void warnOfContentChange(IConsole console);
-	
-	/**
-	 * Creates and returns a collection of new pattern match listeners enabled for
-	 * the given console. The pattern match listeners are new instances, intended
-	 * to be used in a new console. No methods on the participants have been
-	 * called. Clients are responsible for connecting to and disconnecting from
-	 * the pattern match listeners.
-     * <p>
-     * Console pattern match listeners are contributed via the
-     * <code>org.eclipse.ui.console.consolePatternMatchListeners</code> extension point.
-     * </p>
-	 * 
-	 * @param console the console for which pattern match listeners are requested
-	 * @return a collection of new pattern match listeners
-     * @see IPatternMatchListener
-	 * @since 3.1
-	 */
-	public IPatternMatchListener[] createPatternMatchListeners(IConsole console);
-    
-    /**
-     * Requests a redraw of any visible console page containing the specified console.
-     * 
-     * @param console the console to be refreshed
-     * @since 3.1
-     */
-    public void refresh(IConsole console);
-	
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsolePageParticipant.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsolePageParticipant.java
deleted file mode 100644
index a2e7514..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsolePageParticipant.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.console;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.part.IPageBookViewPage;
-
-/**
- * A console page participant is notified of page lifecycle events such as
- * creation, activation, deactivation and disposal. A page participant can
- * also provide adapters for a page. Participants are contributed via the
- * <code>org.eclispe.ui.console.consolePageParticipants</code> extension point.
- * <p>
- * Participant behavior is implementation dependent. For example, a page participant
- * could add actions to a console's toolbar by accessing a its page's action bars.  
- * </p>
- * <p>
- * Following is an example extension definition.
- * <pre>
- * &lt;extension point=&quot;org.eclipse.ui.console.consolePageParticipants&quot;&gt;
- *   &lt;consolePageParticipant
- *      id=&quot;com.example.ExamplePageParticipant&quot;
- *      class=&quot;com.example.ExamplePageParticipant&quot;&gt;
- *   &lt;/consolePageParticipant&gt;
- * &lt;/extension&gt;
- * </pre>
- * </p>
- * The example page participant is contributed to all console pages. An optional
- * <code>enablement</code> attribute may be specified to control which consoles
- * a page participant is applicable to.
- * <p>
- * Clients contributing console page participant extensions are intended to 
- * implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IConsolePageParticipant extends IAdaptable {
-    /**
-     * Called during page initialization. Marks the start of this 
-     * page participant's lifecycle.
-     * 
-     * @param page the page corresponding to the given console
-     * @param console the console for which a page has been created
-     */
-    public void init(IPageBookViewPage page, IConsole console);
-    
-    /**
-     * Disposes this page participant. Marks the end of this
-     * page participant's lifecycle.
-     */
-    public void dispose();
-    
-    /**
-     * Notification this participant's page has been activated.
-     */
-    public void activated();
-    
-    /**
-     * Notification this participant's page has been deactivated.
-     */
-    public void deactivated();
-    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleView.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleView.java
deleted file mode 100644
index b76b3c3..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IConsoleView.java
+++ /dev/null
@@ -1,94 +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.console;
-
-import org.eclipse.ui.IViewPart;
-
-/**
- * A view that displays consoles registered with the console manager.
- * <p>
- * Clients are not intended to implement this interface.
- * </p>
- * @since 3.0
- */
-public interface IConsoleView extends IViewPart {
-	
-	/**
-	 * Displays the page for the given console in this console view.
-	 * Has no effect if this console view has a pinned console. 
-	 *  
-	 * @param console console to display, cannot be <code>null</code>
-	 */
-	public void display(IConsole console);
-	
-	/**
-	 * Pins this console view. No other console page will be displayed until
-     * this console view is un-pinned.
-	 *  
-	 * @param pin <code>true</code> to pin the current console to the 
-     * top of the stack, <code>false</code> otherwise
-     * @since 3.1
-	 */
-	public void setPinned(boolean pin);
-	
-    /**
-     * Displays and pins the given console in this console view. No
-     * other console can be displayed until this console view is
-     * un-pinned. Specifying <code>null</code> un-pins this console
-     *  
-     * @param console console to pin, or <code>null</code> to un-pin
-     * @deprecated rather than pinning a specific console, a console view is
-     *  pinned - use <code>setPinned(boolean)</code>
-     */
-    public void pin(IConsole console);
-    
-	/**
-	 * Returns whether this console view is currently pinned to a
-	 * specific console.
-	 * 
-	 * @return whether this console view is currently pinned to a
-	 *  specific console
-	 */
-	public boolean isPinned();
-	
-	/**
-	 * Returns the console currently being displayed, or <code>null</code>
-	 * if none
-	 * 
-	 * @return the console currently being displayed, or <code>null</code>
-	 *  if none
-	 */
-	public IConsole getConsole();
-	
-	/**
-	 * Warns that the content of the given console has changed.
-	 * 
-	 * @param console the console that has changed
-	 */
-	public void warnOfContentChange(IConsole console);	
-    
-    /**
-     * Sets the scroll lock state of the currently active console.
-     * 
-     * @param scrollLock <code>true</code> to turn scroll lock on, otherwise <code>false</code>
-     * @since 3.1
-     */
-    public void setScrollLock(boolean scrollLock);
-    
-    /**
-     * Returns the scroll lock state of the currently active console.
-     * 
-     * @return <code>true</code> if scroll lock is on, <code>false</code> otherwise
-     * @since 3.1
-     */
-    public boolean getScrollLock();
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IHyperlink.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IHyperlink.java
deleted file mode 100644
index 38aa499..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IHyperlink.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.console;
-
-/**
- * A hyperlink in a console. Link behavior is implementation dependent.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.1
- */
-public interface IHyperlink {
-	
-	/**
-	 * Notification that the mouse has entered this link's region.
-	 */
-	public void linkEntered();
-	
-	/**
-	 * Notification that the mouse has exited this link's region
-	 */
-	public void linkExited();
-	
-	/**
-	 * Notification that this link has been activated. Performs
-	 * context specific linking.
-	 */
-	public void linkActivated();
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IHyperlink2.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IHyperlink2.java
deleted file mode 100644
index 3895f15..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IHyperlink2.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.console;
-
-import org.eclipse.swt.widgets.Event;
-
-/**
- * Optional extension to {@link IHyperlink}.
- * <p>
- * Clients implementing {@link IHyperlink} may also implement this interface.
- * When implemented, the method <code>linkActivated(Event)</code> is called instead of
- * <code>linkActivated()</code>.
- * </p>
- * @since 3.2
- */
-public interface IHyperlink2 extends IHyperlink {
-	
-	/**
-	 * Notification that this link has been activated. Performs
-	 * context specific linking.
-	 * 
-	 * @param event the SWT event which triggered this hyperlink
-	 */
-	public void linkActivated(Event event);
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java
deleted file mode 100644
index d7d106e..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsole.java
+++ /dev/null
@@ -1,290 +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.console;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.internal.console.IOConsolePage;
-import org.eclipse.ui.internal.console.IOConsolePartitioner;
-import org.eclipse.ui.part.IPageBookViewPage;
-
-/**
- * A console that displays text from I/O streams. An I/O console can have multiple
- * output streams connected to it and provides one input stream connected to the
- * keyboard.
- * <p>
- * Clients may instantiate and subclass this class.
- * </p>
- * @since 3.1
- */
-public class IOConsole extends TextConsole {
-	/**
-	 * The document partitioner
-	 */
-    private IOConsolePartitioner partitioner;
-    
-    /**
-     * The stream from which user input may be read
-     */
-    private IOConsoleInputStream inputStream;
-        
-    /**
-     * A collection of open streams connected to this console.
-     */
-    private List openStreams;
-
-    /**
-     * The encoding used to for displaying console output.
-     */
-    private String fEncoding = WorkbenchEncoding.getWorkbenchDefaultEncoding();
-
-    
-    /**
-     * Constructs a console with the given name, type, image, and lifecycle, with the
-     * workbench's default encoding.
-     * 
-     * @param name name to display for this console
-     * @param consoleType console type identifier or <code>null</code>
-     * @param imageDescriptor image to display for this console or <code>null</code>
-     * @param autoLifecycle whether lifecycle methods should be called automatically
-     *  when this console is added/removed from the console manager
-     */
-    public IOConsole(String name, String consoleType, ImageDescriptor imageDescriptor, boolean autoLifecycle) {
-        this(name, consoleType, imageDescriptor, null, autoLifecycle);
-    }
-
-    /**
-     * Constructs a console with the given name, type, image, encoding and lifecycle.
-     * 
-     * @param name name to display for this console
-     * @param consoleType console type identifier or <code>null</code>
-     * @param imageDescriptor image to display for this console or <code>null</code>
-     * @param autoLifecycle whether lifecycle methods should be called automatically
-     *  when this console is added/removed from the console manager
-     */
-    public IOConsole(String name, String consoleType, ImageDescriptor imageDescriptor, String encoding, boolean autoLifecycle) {
-        super(name, consoleType, imageDescriptor, autoLifecycle);
-        if (encoding != null) {
-            fEncoding = encoding;
-        }
-        openStreams = new ArrayList();
-        inputStream = new IOConsoleInputStream(this);
-        synchronized (openStreams) {
-        	openStreams.add(inputStream);	
-		}
-        
-        partitioner = new IOConsolePartitioner(inputStream, this);
-        partitioner.connect(getDocument());
-    }
-    
-    /**
-     * Constructs a console with the given name, type, and image with the workbench's
-     * default encoding. Lifecycle methods will be called when this console is
-     * added/removed from the console manager.
-     * 
-     * @param name name to display for this console
-     * @param consoleType console type identifier or <code>null</code>
-     * @param imageDescriptor image to display for this console or <code>null</code>
-     */
-    public IOConsole(String name, String consoleType, ImageDescriptor imageDescriptor) {
-        this(name, consoleType, imageDescriptor, true);
-    }    
-    
-    /**
-     * Constructs a console with the given name and image. Lifecycle methods
-     * will be called when this console is added/removed from the console manager.
-     * This console will have an unspecified (<code>null</code>) type.
-     * 
-     * @param name name to display for this console
-     * @param imageDescriptor image to display for this console or <code>null</code>
-     */
-    public IOConsole(String name, ImageDescriptor imageDescriptor) {
-        this(name, null, imageDescriptor);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsole#createPage(org.eclipse.ui.console.IConsoleView)
-     */
-    public IPageBookViewPage createPage(IConsoleView view) {
-        return new IOConsolePage(this, view);
-    }
-    
-    /**
-     * Creates and returns a new output stream which may be used to write to this console.
-     * A console may be connected to more than one output stream at once. Clients are
-     * responsible for closing any output streams created on this console.
-     * <p>
-     * Clients should avoid writing large amounts of output to this stream in the UI
-     * thread. The console needs to process the output in the UI thread and if the client
-     * hogs the UI thread writing output to the console, the console will not be able
-     * to process the output.
-     * </p>
-     * @return a new output stream connected to this console
-     */
-    public IOConsoleOutputStream newOutputStream() {
-        IOConsoleOutputStream outputStream = new IOConsoleOutputStream(this);
-        outputStream.setEncoding(fEncoding);
-        synchronized(openStreams) {
-            openStreams.add(outputStream);
-        }
-        return outputStream;
-    }
-    
-    /**
-     * Returns the input stream connected to the keyboard.
-     * 
-     * @return the input stream connected to the keyboard.
-     */
-    public IOConsoleInputStream getInputStream() {
-        return inputStream;
-    }
-
-    /**
-     * Returns this console's document partitioner.
-     * 
-     * @return this console's document partitioner
-     */
-    protected IConsoleDocumentPartitioner getPartitioner() {
-        return partitioner;
-    }
-
-	/**
-	 * Returns the maximum number of characters that the console will display at
-	 * once. This is analogous to the size of the text buffer this console
-	 * maintains.
-	 * 
-	 * @return the maximum number of characters that the console will display
-	 */
-	public int getHighWaterMark() {
-	    return partitioner.getHighWaterMark();
-	}
-	
-	/**
-	 * Returns the number of characters that will remain in this console
-	 * when its high water mark is exceeded.
-	 *  
-	 * @return the number of characters that will remain in this console
-	 *  when its high water mark is exceeded
-	 */
-	public int getLowWaterMark() {
-		return partitioner.getLowWaterMark();
-	}
-	
-	/**
-	 * Sets the text buffer size for this console. The high water mark indicates
-	 * the maximum number of characters stored in the buffer. The low water mark
-	 * indicates the number of characters remaining in the buffer when the high
-	 * water mark is exceeded.
-	 * 
-	 * @param low the number of characters remaining in the buffer when the high
-	 *  water mark is exceeded (if -1 the console does not limit output)
-	 * @param high the maximum number of characters this console will cache in
-	 *  its text buffer (if -1 the console does not limit output)
-	 * @exception IllegalArgumentException if low >= high & low != -1
-	 */
-	public void setWaterMarks(int low, int high) {
-        if (low >= 0) {
-    	    if (low >= high) {
-    	        throw new IllegalArgumentException("High water mark must be greater than low water mark"); //$NON-NLS-1$
-    	    }
-        }
-		partitioner.setWaterMarks(low, high);
-	}
-
-    /**
-     * Check if all streams connected to this console are closed. If so,
-     * notify the partitioner that this console is finished. 
-     */
-    private void checkFinished() {
-        if (openStreams.isEmpty()) {
-            partitioner.streamsClosed();
-        }
-    }
-    
-    /**
-     * Notification that an output stream connected to this console has been closed.
-     * 
-     * @param stream stream that closed
-     */
-    void streamClosed(IOConsoleOutputStream stream) {
-    	synchronized (openStreams) {
-            openStreams.remove(stream);
-            checkFinished();
-		}
-    }
-    
-    /**
-     * Notification that the input stream connected to this console has been closed.
-     * 
-     * @param stream stream that closed
-     */
-    void streamClosed(IOConsoleInputStream stream) {
-    	synchronized (openStreams) {
-            openStreams.remove(stream);
-            checkFinished();
-		}
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.TextConsole#clearConsole()
-     */
-    public void clearConsole() {
-        if (partitioner != null) {
-            partitioner.clearBuffer();
-        }
-    }
-    
-    /**
-     * Disposes this console.
-     */
-    protected void dispose() {
-        super.dispose();
-        partitioner.disconnect();
-        //make a copy of the open streams and close them all
-        //a copy is needed as close the streams results in a callback that 
-        //removes the streams from the openStreams collection (bug 152794)
-        Object[] allStreams= openStreams.toArray();
-        for (int i = 0; i < allStreams.length; i++) {
-        	Object stream = allStreams[i];
-        	if (stream instanceof IOConsoleInputStream) {
-        		IOConsoleInputStream is = (IOConsoleInputStream) stream;
-        		try {
-        			is.close();
-        		} catch (IOException e) {
-        		}
-        	} else if (stream instanceof IOConsoleOutputStream) {
-        		IOConsoleOutputStream os = (IOConsoleOutputStream) stream;
-        		try {
-        			os.close();
-        		} catch (IOException e) {
-        		}					
-        	}
-        }
-        inputStream = null;
-    }
-
-    /**
-     * Returns the encoding for this console, or <code>null</code> to indicate
-     * default encoding.
-     * 
-     * @return the encoding set for this console, or <code>null</code> to indicate
-     * 	default encoding
-     * @since 3.3
-     */
-	public String getEncoding() {
-		return fEncoding;
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java
deleted file mode 100644
index 66b0ffe..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java
+++ /dev/null
@@ -1,287 +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.console;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * InputStream used to read input from an IOConsole. 
- * This stream will buffer input that it receives until it has been read.
- * <p>
- * Clients are not intended to instantiate this class directly, instead
- * use <code>IOConsole.getInputStream()</code>. Clients are not intended
- * to subclass this class.
- * </p>
- * @since 3.1
- *
- */
-public class IOConsoleInputStream extends InputStream {
-    /**
-     * Buffer to hold data from console until it is read.
-     */
-    private byte[] input = new byte[100];
-    
-    /**
-     * Location in the buffer that the next byte of data from the
-     * console should be stored.
-     */
-    private int inPointer = 0;
-    
-    /**
-     * Location in the buffer that the next byte of data read from
-     * this stream should come from.
-     */
-    private int outPointer = 0;
-    
-    /**
-     * The number of bytes of real data currently in the buffer. 
-     */
-    private int size = 0;
-    
-    /**
-     * Flag to indicate that EOF has been sent already.
-     */
-    private boolean eofSent = false;
-    
-    /**
-     * Flag to indicate that the stream has been closed.
-     */
-    private boolean closed = false;
-    
-    /**
-     * The console that this stream is connected to.
-     */
-    private IOConsole console;
-    
-    /**
-     * The color used to display input in the console.
-     */
-    private Color color;
-    
-    /**
-     * The font style used to decorate input in the console.
-     */
-    private int fontStyle = SWT.NORMAL;
-
-
-    /**
-     * Constructs a new input stream on the given console.
-     * 
-     * @param console I/O console
-     */
-    IOConsoleInputStream(IOConsole console) {
-        this.console = console;
-    }
-    
-    /*
-     *  (non-Javadoc)
-     * @see java.io.InputStream#read(byte[], int, int)
-     */
-    public synchronized int read(byte[] b, int off, int len) throws IOException {
-        waitForData();
-        if (available() == -1) {
-            return -1;
-        }
-    
-        int toCopy = Math.min(len, size);
-        if(input.length-outPointer > toCopy) {
-            System.arraycopy(input, outPointer, b, off, toCopy);
-            outPointer += toCopy;
-            size -= toCopy;
-        } else {
-            int bytesToEnd = input.length-outPointer;
-            System.arraycopy(input, outPointer, b, off, bytesToEnd);
-            System.arraycopy(input, 0, b, off+bytesToEnd, toCopy-bytesToEnd);
-            outPointer = toCopy-bytesToEnd;
-            size -=toCopy;
-        }
-        return toCopy;
-    }
-    
-    /*
-     *  (non-Javadoc)
-     * @see java.io.InputStream#read(byte[])
-     */
-    public int read(byte[] b) throws IOException {
-        return read(b, 0, b.length);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see java.io.InputStream#read()
-     */
-    public synchronized int read() throws IOException {
-        waitForData();
-        if (available() == -1) { 
-            return -1;
-        }
-        
-        byte b = input[outPointer];
-        outPointer++;
-        if (outPointer == input.length) {
-            outPointer = 0;
-        }
-        size -= 1;
-        return b;
-    }
-    
-    /**
-     * Blocks until data is available to be read.
-     * Ensure that the monitor for this object is obtained before
-     * calling this method.
-     */
-    private void waitForData() {
-        while (size == 0 && !closed) {
-            try {
-                wait();
-            } catch (InterruptedException e) {
-            }
-        }
-    }
-
-    /**
-     * Appends text to this input stream's buffer.
-     * 
-     * @param text the text to append to the buffer.
-     */
-    public synchronized void appendData(String text) {
-    	String encoding = console.getEncoding();
-        byte[] newData;
-        if (encoding!=null)
-			try {
-				newData = text.getBytes(encoding);
-			} catch (UnsupportedEncodingException e) {
-				newData = text.getBytes();	
-			}
-		else
-        	newData = text.getBytes();
-        
-        while(input.length-size < newData.length) {
-            growArray();
-        }
-        
-        if (size == 0) { //inPointer == outPointer
-            System.arraycopy(newData, 0, input, 0, newData.length);
-            inPointer = newData.length;
-            size = newData.length;
-            outPointer = 0;
-        } else if (inPointer < outPointer || input.length - inPointer > newData.length) {
-            System.arraycopy(newData, 0, input, inPointer, newData.length);
-            inPointer += newData.length;
-            size += newData.length;
-        } else {
-            System.arraycopy(newData, 0, input, inPointer, input.length-inPointer);
-            System.arraycopy(newData, input.length-inPointer, input, 0, newData.length-(input.length-inPointer));
-            inPointer = newData.length-(input.length-inPointer);
-            size += newData.length;
-        }
-        
-        if (inPointer == input.length) {
-            inPointer = 0;
-        }
-        notifyAll();
-    }
-    
-    /**
-     * Enlarges the buffer.
-     */
-    private void growArray() {
-        byte[] newInput = new byte[input.length+1024];
-        if (outPointer < inPointer) {
-            System.arraycopy(input, outPointer, newInput, 0, size);
-        } else {
-            System.arraycopy(input, outPointer, newInput, 0, input.length-outPointer);
-            System.arraycopy(input, 0, newInput, input.length-outPointer, inPointer);
-        }
-        outPointer = 0;
-        inPointer = size;
-        input = newInput;
-        newInput = null;
-    }
-
-    /**
-     * Returns this stream's font style.
-     * 
-     * @return the font style used to decorate input in the associated console
-     */
-    public int getFontStyle() {
-        return fontStyle;
-    }
-
-    /**
-     * Sets this stream's font style.
-     * 
-     * @param newFontStyle the font style to be used to decorate input in the associated console
-     */
-    public void setFontStyle(int newFontStyle) {
-        if (newFontStyle != fontStyle) {
-            int old = fontStyle;
-            fontStyle = newFontStyle;
-            console.firePropertyChange(this, IConsoleConstants.P_FONT_STYLE, new Integer(old), new Integer(fontStyle));
-        }
-    }
-    
-    /**
-     * Sets the color to used to decorate input in the associated console.
-     * 
-     * @param newColor the color to used to decorate input in the associated console.
-     */
-    public void setColor(Color newColor) {
-        Color old = color;
-        if (old == null || !old.equals(newColor)) {
-            color = newColor;
-            console.firePropertyChange(this, IConsoleConstants.P_STREAM_COLOR, old, newColor);
-        }
-    }
-    
-    /**
-     * Returns the color used to decorate input in the associated console
-     * 
-     * @return the color used to decorate input in the associated console
-     */
-    public Color getColor() {
-        return color;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.io.InputStream#available()
-     */
-    public int available() throws IOException {
-        if (closed && eofSent) {
-            throw new IOException("Input Stream Closed"); //$NON-NLS-1$
-        } else if (size == 0) {
-            if (!eofSent) {
-                eofSent = true;
-                return -1;
-            } 
-            throw new IOException("Input Stream Closed"); //$NON-NLS-1$
-        }
-        
-        return size;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.io.InputStream#close()
-     */
-    public synchronized void close() throws IOException {
-        if(closed) {
-            throw new IOException("Input Stream Closed"); //$NON-NLS-1$
-        }
-        closed = true;
-        notifyAll();
-        console.streamClosed(this);
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
deleted file mode 100644
index f886fb9..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
+++ /dev/null
@@ -1,268 +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.console;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.internal.console.IOConsolePartitioner;
-
-/**
- * OutputStream used to write to an IOConsole.
- * <p>
- * Clients are not intended to instantiate this class directly, instead
- * use <code>IOConsole.newOutputStream()</code>. Clients are not intended
- * to subclass this class.
- * </p>
- * <p>
- * Clients should avoid writing large amounts of output to this stream in the UI
- * thread. The console needs to process the output in the UI thread and if the client
- * hogs the UI thread writing output to the console, the console will not be able
- * to process the output.
- * </p>
- * @since 3.1
- */
-public class IOConsoleOutputStream extends OutputStream {
-    /**
-     * Flag indicating whether this stream has been closed.
-     */
-    private boolean closed = false;
-
-    /**
-     * The console's document partitioner.
-     */
-    private IOConsolePartitioner partitioner;
-    
-    /**
-     * The console this stream is attached to.
-     */
-    private IOConsole console;
-    
-    /**
-     * Flag indicating that the console should be activated when data
-     * is written to this stream.
-     */
-    private boolean activateOnWrite = false;
-    
-    /**
-     * The color used to decorate data written to this stream.
-     */
-    private Color color;
-    
-    /**
-     * The font style used to decorate data written to this stream.
-     */
-    private int fontStyle;
-
-    private String fEncoding;
-    private String fDefaultEncoding = WorkbenchEncoding.getWorkbenchDefaultEncoding();
-
-    private boolean fNeedsEncoding = false;
-
-    private boolean prependCR;
-    
-    /**
-     * Constructs a new output stream on the given console.
-     * 
-     * @param console I/O console
-     */
-    IOConsoleOutputStream(IOConsole console) {
-        this.console = console;
-        this.partitioner = (IOConsolePartitioner) console.getPartitioner();
-    }
-
-    /**
-     * Returns the font style used to decorate data written to this stream.
-     * 
-     * @return the font style used to decorate data written to this stream
-     */
-    public int getFontStyle() {
-        return fontStyle;
-    }
-    
-    /**
-     * Sets the font style to be used to decorate data written to this stream.
-     * 
-     * @param newFontStyle the font style to be used to decorate data written to this stream
-     */
-    public void setFontStyle(int newFontStyle) {
-        if (newFontStyle != fontStyle) {
-            int old = fontStyle;
-            fontStyle = newFontStyle;
-            console.firePropertyChange(this, IConsoleConstants.P_FONT_STYLE, new Integer(old), new Integer(fontStyle));
-        }
-    }
-    
-    /**
-     * Returns whether the console this stream is writing to will be activated when this stream
-     * is written to.
-     * 
-     * @return whether the console this stream is writing to will be activated when this stream
-     * is written to.
-     */
-    public boolean isActivateOnWrite() {
-        return activateOnWrite;
-    }
-
-    /**
-     * Sets whether to activate the console this stream is writing to when this stream
-     * is written to.
-     * 
-     * @param activateOnWrite whether the console this stream is writing to will be activated when this stream
-     * is written to.
-     */
-    public void setActivateOnWrite(boolean activateOnWrite) {
-        this.activateOnWrite = activateOnWrite;
-    }
-    
-	/**
-	 * Sets the color of this stream. Use <code>null</code> to indicate
-     * the default color.
-	 * 
-	 * @param newColor color of this stream, or <code>null</code>
-	 */
-	public void setColor(Color newColor) {
-		Color old = color;
-		if (old == null || !old.equals(newColor)) {
-		    color = newColor;
-		    console.firePropertyChange(this, IConsoleConstants.P_STREAM_COLOR, old, newColor);
-		}
-	}
-	
-	/**
-	 * Returns the color of this stream, or <code>null</code>
-	 * if default.
-	 * 
-	 * @return the color of this stream, or <code>null</code>
-	 */
-	public Color getColor() {
-	    return color;
-	}
-	
-    /**
-     * Returns true if the stream has been closed
-     * @return true is the stream has been closed, false otherwise.
-     */
-    public synchronized boolean isClosed() {
-        return closed;
-    }
-    
-	/*
-	 *  (non-Javadoc)
-	 * @see java.io.OutputStream#close()
-	 */
-    public synchronized void close() throws IOException {
-        if(closed) {
-            throw new IOException("Output Stream is closed"); //$NON-NLS-1$
-        }
-        if (prependCR) { // force writing of last /r
-            prependCR = false;
-            notifyParitioner("\r"); //$NON-NLS-1$
-        }
-        console.streamClosed(this);
-        closed = true;
-        partitioner = null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see java.io.OutputStream#flush()
-     */
-    public void flush() throws IOException {
-        if(closed) {
-            throw new IOException("Output Stream is closed"); //$NON-NLS-1$
-        }
-    }
-    
-    /*
-     *  (non-Javadoc)
-     * @see java.io.OutputStream#write(byte[], int, int)
-     */
-    public void write(byte[] b, int off, int len) throws IOException {
-        if (fNeedsEncoding) {
-            encodedWrite(new String(b, off, len, fEncoding));
-        } else {
-            encodedWrite(new String(b, off, len));
-        }
-    }
-    /*
-     *  (non-Javadoc)
-     * @see java.io.OutputStream#write(byte[])
-     */
-    public void write(byte[] b) throws IOException {
-        write(b, 0, b.length);
-    }
-    /*
-     *  (non-Javadoc)
-     * @see java.io.OutputStream#write(int)
-     */
-    public void write(int b) throws IOException {
-        write(new byte[] {(byte)b}, 0, 1);
-    }    
-    
-    /**
-     * Writes a string to the attached console.
-     * 
-     * @param str the string to write to the attached console.
-     * @throws IOException if the stream is closed.
-     */
-    public synchronized void write(String str) throws IOException {
-        if (fNeedsEncoding) {
-	        byte[] defaultBytes = str.getBytes();
-	        str = new String(defaultBytes, fEncoding);
-        }
-        encodedWrite(str);
-    }
-    
-    private void encodedWrite(String encodedString) throws IOException {
-        if(closed) {
-            throw new IOException("Output Stream is closed"); //$NON-NLS-1$
-        }
-        if (prependCR){
-            encodedString="\r"+encodedString; //$NON-NLS-1$
-            prependCR=false;
-        }
-        if (encodedString.endsWith("\r")) { //$NON-NLS-1$
-            prependCR = true;
-            encodedString = new String(encodedString.substring(0, encodedString.length()-1));
-        }
-        notifyParitioner(encodedString);
-    }
-
-    private void notifyParitioner(String encodedString) throws IOException {
-        try {
-            partitioner.streamAppended(this, encodedString);
-
-            if (activateOnWrite) {
-            	console.activate();
-            } else {
-            	ConsolePlugin.getDefault().getConsoleManager().warnOfContentChange(console);
-            }
-        } catch (IOException e) {
-            if (!closed) {
-                close();
-            }
-            throw e;
-        }
-    }
-
-    /**
-     * Sets the character encoding used to interpret characters written to this steam. 
-     * 
-     * @param encoding encoding identifier
-     */
-    public void setEncoding(String encoding) {
-        fEncoding = encoding;
-        fNeedsEncoding = (fEncoding!=null) && (!fEncoding.equals(fDefaultEncoding));
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java
deleted file mode 100644
index d3042ea..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListener.java
+++ /dev/null
@@ -1,87 +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.console;
-
-/**
- * A pattern match listener is registered with a <code>TextConsole</code>,
- * and is notified when its pattern has been matched to contents in
- * that console. A pattern match listener can be registered with a console
- * programmatically or via the <code>consolePatternMatchListeners</code> extension
- * point.
- * <p>
- * Following is an example console pattern match listener extension definition.
- * </pre>
- * &lt;extension point="org.eclipse.ui.console.consolePatternMatchListeners"&gt;
- *   &lt;consolePatternMatchListener
- *      id="com.example.ConsolePatternMatcher"
- *      regex=".*foo.*"
- *      class="com.example.ConsolePatternMatcher"&gt;
- *   &lt;/consolePatternMatchListener&gt;
- * &lt;/extension&gt;
- * </pre>
- * Attributes are specified as follows:
- * <ul>
- * <li><code>id</code> - a unique identifier for the pattern match listener</li>
- * <li><code>regex</code> - regular expression to match</li>
- * <li><code>class</code> - fully qualified name of the Java class implementing
- *  <code>org.eclipse.ui.console.IPatternMatchListenerDelegate</code></li>
- * </ul>
- * </p> 
- * <p>
- * Optionally a <code>qualifier</code> attribute may be specified to improve performance
- * of regular expression matching. A qualifier specifies a simple regular expression used to
- * qualify lines for the search. Lines that do not contain the qualifier are not considered.
- * </p>
- * <p>
- * Optionally an <code>enablement</code> expression may be provided to specify
- * which console(s) a pattern matcher should be contributed to.
- * </p>
- * <p>
- * Clients may implement this interface directly if registering a pattern match listener with
- * a text console programmatically. Clients contributing a pattern match listener via an
- * extension implement <code>IPatternMatchListenerDelegate</code> instead.
- * </p>
- * @see org.eclipse.ui.console.TextConsole
- * @since 3.1
- */
-public interface IPatternMatchListener extends IPatternMatchListenerDelegate {
-    /**
-     * Returns the pattern to be used for matching. The pattern is
-     * a string representing a regular expression. 
-     * 
-     * @return the regular expression to be used for matching
-     */
-    public String getPattern();
-    
-    /**
-     * Returns the flags to use when compiling this pattern match listener's
-     * regular expression, as defined by by <code>Pattern.compile(String regex, int flags)</code>
-     * 
-     * @return the flags to use when compiling this pattern match listener's
-     * regular expression
-     * @see java.util.regex.Pattern#compile(java.lang.String, int)
-     */
-    public int getCompilerFlags();
-    
-    /**
-     * Returns a simple regular expression used to identify lines that may
-     * match this pattern matcher's complete pattern, or <code>null</code>.
-     * Use of this attribute can improve performance by disqualifying lines
-     * from the search. When a line is found containing a match for this expression,
-     * the line is searched from the beginning for this pattern matcher's
-     * complete pattern. Lines not containing this pattern are discarded.
-     * 
-     * @return a simple regular expression used to identify lines that may
-     * match this pattern matcher's complete pattern, or <code>null</code>
-     */
-    public String getLineQualifier();
-    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListenerDelegate.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListenerDelegate.java
deleted file mode 100644
index a3e60dd..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IPatternMatchListenerDelegate.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.console;
-
-/**
- * A pattern match listener delegate is notified of regular expression matches
- * in a text console. A delegate is contributed via the
- * <code>consolePatternMatcherListeners</code> extension point.
- * <p>
- * Clients contributing a console pattern match listener extension are intended
- * to implement this interface.
- * </p>
- * @see org.eclipse.ui.console.IPatternMatchListener
- * @see org.eclipse.ui.console.TextConsole
- * @since 3.1
- */
-public interface IPatternMatchListenerDelegate {
-    /**
-     * Notification that pattern matching will begin in the specified console.
-     * A pattern matcher is connected to only one console at a time.
-     * 
-     * @param console the console in which pattern matching will be performed
-     */
-    public void connect(TextConsole console);
-    
-    /**
-     * Notification that pattern matching has been completed in the console
-     * this delegate was last connected to.
-     */
-    public void disconnect();
-    
-    /**
-     * Notification that a match has been found.
-     * 
-     * @param event event describing where the match was found
-     */
-    public void matchFound(PatternMatchEvent event);
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java
deleted file mode 100644
index a429e94..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsole.java
+++ /dev/null
@@ -1,121 +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.console;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.internal.console.IOConsolePage;
-import org.eclipse.ui.part.IPageBookViewPage;
-
-/**
- * A console that displays messages. A message console may have one or
- * more streams connected to it (<code>MessageConsoleStream</code>).
- * Text written to streams is buffered and processed in a Job by the 
- * console's document partitioner.
- * <p>
- * Clients may instantiate this class; not intended to be subclassed.
- * </p>
- * @since 3.0
- */
-public class MessageConsole extends IOConsole {
-	
-	/**
-	 * Property constant indicating the font of this console has changed. 
-	 * 
-	 * @deprecated use {@link IConsoleConstants#P_FONT} 
-	 */
-	public static final String P_FONT = IConsoleConstants.P_FONT;
-	
-	/**
-	 * Property constant indicating the color of a stream has changed. 
-	 * 
-	 * @deprecated use {@link IConsoleConstants#P_STREAM_COLOR} 
-	 */
-	public static final String P_STREAM_COLOR = IConsoleConstants.P_STREAM_COLOR;
-	
-	/**
-	 * Property constant indicating tab size has changed
-	 * 
-	 * @deprecated use {@link IConsoleConstants#P_TAB_SIZE}
-	 */
-	public static final String P_TAB_SIZE = IConsoleConstants.P_TAB_SIZE;
-	
-	/**
-	 * The default tab size
-	 * 
-	 * @deprecated use {@link IConsoleConstants#DEFAULT_TAB_SIZE}
-	 */
-	public static final int DEFAULT_TAB_SIZE = IConsoleConstants.DEFAULT_TAB_SIZE;	
-
-    /**
-     * Constructs a message console with the given name and image.
-     * 
-     * @param name console name
-     * @param imageDescriptor console image descriptor or <code>null</code>
-     */
-	public MessageConsole(String name, ImageDescriptor imageDescriptor) {
-		this(name, imageDescriptor, true);
-	}
-	
-	/**
-	 * Constructs a message console.
-	 * 
-	 * @param name console name
-	 * @param imageDescriptor console image descriptor or <code>null</code>
-	 * @param autoLifecycle whether lifecycle methods should be called automatically
-	 *  when added and removed from the console manager
-	 * @since 3.1
-	 */
-	public MessageConsole(String name, ImageDescriptor imageDescriptor, boolean autoLifecycle) {
-		super(name, IConsoleConstants.MESSAGE_CONSOLE_TYPE, imageDescriptor, autoLifecycle);
-	}	
-		
-	/**
-	 * Returns a new message stream connected to this console.
-	 * <p>
-     * Clients should avoid writing large amounts of output to this stream in the UI
-     * thread. The console needs to process the output in the UI thread and if the client
-     * hogs the UI thread writing output to the console, the console will not be able
-     * to process the output.
-     * </p>
-	 * @return a new message stream connected to this console
-	 */
-	public MessageConsoleStream newMessageStream() {
-		return new MessageConsoleStream(this);
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsole#createPage(org.eclipse.ui.console.IConsoleView)
-     */
-    public IPageBookViewPage createPage(IConsoleView view) {
-        IOConsolePage page = (IOConsolePage) super.createPage(view);
-        page.setReadOnly();
-        return page;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IOConsole#getInputStream()
-     */
-    public IOConsoleInputStream getInputStream() {
-        throw new UnsupportedOperationException("Message Console does not support user input"); //$NON-NLS-1$
-    }
-    
-	
-	/** 
-	 * Appends the given message to this console, from the specified stream.
-	 * 
-	 * @param text message
-	 * @param stream stream the message belongs to
-	 * @deprecated since 3.1, this method should no longer be called, and has no effect.
-	 * Writing to a message console stream updates the document
-	 */
-	protected void appendToDocument(String text, MessageConsoleStream stream) {
-	}    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsoleStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsoleStream.java
deleted file mode 100644
index 97ef02b..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/MessageConsoleStream.java
+++ /dev/null
@@ -1,91 +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.console;
-
-import java.io.IOException;
-
-/**
- * Used to write messages to a message console. A message console may have more
- * than one stream connected to it. Each stream may be displayed in a different
- * color.
- * <p>
- * Clients are not intended to subclass or instantiate this class. Instances
- * are created via a {@link org.eclipse.ui.console.MessageConsole}.
- * </p>
- * <p>
- * Clients should avoid writing large amounts of output to this stream in the UI
- * thread. The console needs to process the output in the UI thread and if the client
- * hogs the UI thread writing output to the console, the console will not be able
- * to process the output.
- * </p>
- * <p>
- * Since 3.1, this class extends {@link org.eclipse.ui.console.IOConsoleOutputStream}.
- * </p>
- * @since 3.0
- */
-public class MessageConsoleStream extends IOConsoleOutputStream {
-    
-    private MessageConsole fMessageConsole;
-    
-	/**
-	 * Constructs a new stream connected to the given console.
-	 * 
-	 * @param console the console to write messages to
-	 */
-	public MessageConsoleStream(MessageConsole console) {
-	    super(console);
-        fMessageConsole = console;
-	}
-	
-	/**
-	 * Appends the specified message to this stream.
-	 * 
-	 * @param message message to append
-	 */
-	public void print(String message) {
-		try {
-            write(message);
-        } catch (IOException e) {
-            ConsolePlugin.log(e);
-        }
-	}
-	
-	
-	/**
-	 * Appends a line separator string to this stream.
-	 */
-	public void println() {
-		try {
-            write("\n"); //$NON-NLS-1$
-        } catch (IOException e) {
-            ConsolePlugin.log(e);
-        }
-	}	
-	
-	/**
-	 * Appends the specified message to this stream, followed by a line
-	 * separator string.
-	 * 
-	 * @param message message to print
-	 */
-	public void println(String message) {
-		print(message + "\n"); //$NON-NLS-1$
-	}	
-    
-    /**
-     * Returns the console this stream is connected to.
-     * 
-     * @return the console this stream is connected to
-     */
-    public MessageConsole getConsole() {
-        return fMessageConsole;
-    }    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/PatternMatchEvent.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/PatternMatchEvent.java
deleted file mode 100644
index 50693c4..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/PatternMatchEvent.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.console;
-
-import java.util.EventObject;
-
-/**
- * An event describing a pattern match in a text console. The source of the event
- * is a <code>TextConsole</code>.
- * <p>
- * Clients may instantiate this class; not intended to be subclassed.
- * </p>
- * @see org.eclipse.ui.console.IPatternMatchListener
- * @see org.eclipse.ui.console.TextConsole
- * @since 3.1
- */
-public class PatternMatchEvent extends EventObject {
-    /*
-     * required by EventObject for ObjectSerialization.
-     */
-    private static final long serialVersionUID = 876890383326854537L;
-    
-    /**
-     * The offset of the match within the console's document. 
-     */
-    private int offset;
-    
-    /**
-     * The length of the matched string
-     */
-    private int length;
-
-    /**
-     * Constructs a new pattern match event.
-     * 
-     * @param console the console in which the match was found
-     * @param matchOffset the offset at which the match was found
-     * @param matchLength the length of the text that matched
-     */
-    public PatternMatchEvent(TextConsole console, int matchOffset, int matchLength) {
-        super(console);
-        offset = matchOffset;
-        length = matchLength;
-    }
-
-    /**
-     * Returns the length of the matched string.
-     * 
-     * @return the length of the matched string
-     */
-    public int getLength() {
-        return length;
-    }
-
-    /**
-     * Returns the offset of the match within the document.
-     * 
-     * @return the offset of the match within the document
-     */
-    public int getOffset() {
-        return offset;
-    }
-    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsole.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsole.java
deleted file mode 100644
index 81561f9..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsole.java
+++ /dev/null
@@ -1,554 +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.console;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.Region;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.ui.internal.console.ConsoleDocument;
-import org.eclipse.ui.internal.console.ConsoleHyperlinkPosition;
-import org.eclipse.ui.internal.console.ConsolePatternMatcher;
-import org.eclipse.ui.part.IPageBookViewPage;
-
-/**
- * An abstract text console that supports regular expression matching and
- * hyperlinks.
- * <p>
- * Pattern match listeners can be registered with a console programmatically
- * or via the <code>org.eclipse.ui.console.consolePatternMatchListeners</code>
- * extension point.
- * </p>
- * <p>
- * Clients may subclass this class. Subclasses must provide a document partitioner.
- * </p>
- * @since 3.1
- */
-public abstract class TextConsole extends AbstractConsole {
-
-    /**
-     * The current width of the console. Used for fixed width consoles.
-     * A value of <=0 means does not have a fixed width.
-     */
-    private int fConsoleWidth;
-    /**
-     * The current tab width
-     */
-    private int fTabWidth;
-    /** 
-	 * The font used by this console
-	 */
-    private Font fFont;    
-    
-    /**
-     * The background color used by this console or <code>null</code> if default
-     */
-    private Color fBackground;
-    
-    /**
-     * The Console's regular expression pattern matcher
-     */
-    private ConsolePatternMatcher fPatternMatcher;
-    
-    /**
-     * The Console's document
-     */
-    private ConsoleDocument fDocument;
-    
-   /**
-    * indication that the console's partitioner is not expecting more input
-    */
-    private boolean fPartitionerFinished = false;
-    
-    /**
-     * Indication that the console's pattern matcher has finished.
-     * (all matches have been found and all listeners notified)
-     */
-    private boolean fMatcherFinished = false;
-    
-    /**
-     * indication that the console output complete property has been fired
-     */
-    private boolean fCompleteFired = false;
-
-    
-    /**
-     * Map of client defined attributes
-     */
-    private HashMap fAttributes = new HashMap();
-    
-    private IConsoleManager fConsoleManager = ConsolePlugin.getDefault().getConsoleManager();
-    
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.AbstractConsole#dispose()
-     */
-    protected void dispose() {
-        super.dispose();
-        fFont = null;
-		synchronized(fAttributes) {
-		    fAttributes.clear();
-		}
-    }
-    /**
-     * Constructs a console with the given name, image descriptor, and lifecycle
-     * 
-     * @param name name to display for this console
-     * @param consoleType console type identifier or <code>null</code>
-     * @param imageDescriptor image to display for this console or <code>null</code>
-     * @param autoLifecycle whether lifecycle methods should be called automatically
-     *  when this console is added/removed from the console manager
-     */
-    public TextConsole(String name, String consoleType, ImageDescriptor imageDescriptor, boolean autoLifecycle) {
-        super(name, consoleType, imageDescriptor, autoLifecycle);
-        fDocument = new ConsoleDocument();
-        fDocument.addPositionCategory(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-        fPatternMatcher = new ConsolePatternMatcher(this);
-        fDocument.addDocumentListener(fPatternMatcher);
-        fTabWidth = IConsoleConstants.DEFAULT_TAB_SIZE;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsole#createPage(org.eclipse.ui.console.IConsoleView)
-     */
-    public IPageBookViewPage createPage(IConsoleView view) {
-        return new TextConsolePage(this, view);
-    }
-    
-	/**
-	 * Returns this console's document.
-     * <p>
-     * Note that a console may or may not support direct manipulation of its document.
-     * For example, an I/O console document and its partitions are produced from the
-     * streams connected to it, and clients are not intended to modify the document's
-     * contents.
-     * </p>
-	 * 
-	 * @return this console's document
-	 */
-    public IDocument getDocument() {
-        return fDocument;
-    }
-    
-    /**
-     * Returns the current width of this console. A value of zero of less 
-     * indicates this console has no fixed width.
-     * 
-     * @return the current width of this console
-     */
-    public int getConsoleWidth() {
-        return fConsoleWidth;
-    }
-    
-    /**
-     * Sets the width of this console in characters. Any value greater than zero
-     * will cause this console to have a fixed width.
-     * 
-     * @param width the width to make this console. Values of 0 or less imply
-     * the console does not have any fixed width.
-     */
-    public void setConsoleWidth(int width) {
-        if (fConsoleWidth != width) {
-            int old = fConsoleWidth;
-            fConsoleWidth = width;
-            
-            firePropertyChange(this, IConsoleConstants.P_CONSOLE_WIDTH, new Integer(old), new Integer(fConsoleWidth));
-        }
-    }
-
-	/**
-	 * Sets the tab width used in this console.
-	 * 
-	 * @param newTabWidth the tab width 
-	 */
-    public void setTabWidth(final int newTabWidth) {
-        if (fTabWidth != newTabWidth) {
-            final int oldTabWidth = fTabWidth;
-            fTabWidth = newTabWidth;
-            ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() {
-                public void run() {
-                    firePropertyChange(TextConsole.this, IConsoleConstants.P_TAB_SIZE, new Integer(oldTabWidth), new Integer(fTabWidth));           
-                }
-            });
-        }
-    }
-    
-	/**
-	 * Returns the tab width used in this console.
-	 * 
-	 * @return tab width used in this console
-	 */
-    public int getTabWidth() {
-        return fTabWidth;
-    }
-    
-    /**
-	 * Returns the font used by this console. Must be called in the UI thread.
-	 * 
-	 * @return font used by this console
-	 */
-    public Font getFont() {
-        if (fFont == null) {
-            fFont = getDefaultFont();
-        }
-        return fFont;
-    }
-    
-    /**
-     * Returns the default text font.
-     * 
-     * @return the default text font
-     */
-    private Font getDefaultFont() {
-        return JFaceResources.getFont(JFaceResources.TEXT_FONT);
-    }
-    
-	/**
-	 * Sets the font used by this console. Specify <code>null</code> to use
-	 * the default text font.
-	 * 
-	 * @param newFont font, or <code>null</code> to indicate the default font
-	 */
-    public void setFont(Font newFont) {
-        // ensure font is initialized
-        getFont();
-        // translate null to default font
-        if (newFont == null) {
-            newFont = getDefaultFont();
-        }
-        // fire property change if required
-        if (!fFont.equals(newFont)) {
-            Font old = fFont;
-            fFont = newFont;
-            firePropertyChange(this, IConsoleConstants.P_FONT, old, fFont);
-        }
-    }
-	
-	/**
-	 * Sets the background color used by this console. Specify <code>null</code> to use
-	 * the default background color.
-	 * 
-	 * @param background background color or <code>null</code> for default
-	 * @since 3.3
-	 * @deprecated use setBackground(Color) instead
-	 */
-    public void setBackgrond(Color background) {
-    	setBackground(background);
-    }  
-    
-	/**
-	 * Sets the background color used by this console. Specify <code>null</code> to use
-	 * the default background color.
-	 * 
-	 * @param background background color or <code>null</code> for default
-	 * @since 3.3
-	 */
-    public void setBackground(Color background) {
-    	if (fBackground == null) {
-    		if (background == null) {
-    			return;
-    		}
-    	} else if (fBackground.equals(background)){
-    		return;
-    	}
-        Color old = fBackground;
-        fBackground = background;
-        firePropertyChange(this, IConsoleConstants.P_BACKGROUND_COLOR, old, fBackground);
-    }    
-    
-    /**
-     * Returns the background color to use for this console or <code>null</code> for the 
-     * default background color.
-     * 
-     * @return background color or <code>null</code> for default
-     * @since 3.3
-     */
-    public Color getBackground() {
-    	return fBackground;
-    }
-    
-    /**
-     * Clears the console.
-     * <p>
-     * Since a console may or may not support direct manipulation
-     * of its document's contents, this method should be called to clear a text console's
-     * document. The default implementation sets this console's document content
-     * to the empty string directly. Subclasses should override as required.
-     * </p>
-     */
-    public void clearConsole() {
-        IDocument document = getDocument();
-        if (document != null) {
-            document.set(""); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Returns the console's document partitioner.
-     * @return The console's document partitioner
-     */
-    protected abstract IConsoleDocumentPartitioner getPartitioner();
-    
-    /**
-     * Returns all hyperlinks in this console.
-     * 
-     * @return all hyperlinks in this console
-     */
-    public IHyperlink[] getHyperlinks() {
-        try {
-            Position[] positions = getDocument().getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-            IHyperlink[] hyperlinks = new IHyperlink[positions.length];
-            for (int i = 0; i < positions.length; i++) {
-                ConsoleHyperlinkPosition position = (ConsoleHyperlinkPosition) positions[i];
-                hyperlinks[i] = position.getHyperLink();
-            }
-            return hyperlinks;
-        } catch (BadPositionCategoryException e) {
-            return new IHyperlink[0];
-        }
-    }
-    
-    /**
-     * Returns the hyperlink at the given offset of <code>null</code> if none.
-     * 
-     * @param offset offset for which a hyperlink is requested
-     * @return the hyperlink at the given offset of <code>null</code> if none
-     */
-    public IHyperlink getHyperlink(int offset) {
-        try {
-        	IDocument document = getDocument();
-        	if (document != null) {
-	            Position[] positions = document.getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-	            Position position = findPosition(offset, positions);
-	            if (position instanceof ConsoleHyperlinkPosition) {
-	                return ((ConsoleHyperlinkPosition) position).getHyperLink();
-	            }
-        	}
-        } catch (BadPositionCategoryException e) {
-        }        
-        return null;
-    }
-
-	/**
-	 * Binary search for the position at a given offset.
-	 *
-	 * @param offset the offset whose position should be found
-	 * @return the position containing the offset, or <code>null</code>
-	 */
-	private Position findPosition(int offset, Position[] positions) {
-		
-		if (positions.length == 0)
-			return null;
-			
-		int left= 0;
-		int right= positions.length -1;
-		int mid= 0;
-		Position position= null;
-		
-		while (left < right) {
-			
-			mid= (left + right) / 2;
-				
-			position= positions[mid];
-			if (offset < position.getOffset()) {
-				if (left == mid)
-					right= left;
-				else
-					right= mid -1;
-			} else if (offset > (position.getOffset() + position.getLength() - 1)) {
-				if (right == mid)
-					left= right;
-				else
-					left= mid  +1;
-			} else {
-				left= right= mid;
-			}
-		}
-		
-		position= positions[left];
-		if (offset >= position.getOffset() && (offset < (position.getOffset() + position.getLength()))) {
-			return position;
-		}
-		return null;
-	}
-
-    /**
-     * Adds the given pattern match listener to this console. The listener will
-     * be connected and receive match notifications. Has no effect if an identical
-     * listener has already been added.
-     * 
-     * @param listener the listener to add
-     */
-    public void addPatternMatchListener(IPatternMatchListener listener) {
-        fPatternMatcher.addPatternMatchListener(listener);
-    }
-    
-    /**
-     * Removes the given pattern match listener from this console. The listener will be
-     * disconnected and will no longer receive match notifications. Has no effect
-     * if the listener was not previously added.
-     * 
-     * @param listener the pattern match listener to remove
-     */
-    public void removePatternMatchListener(IPatternMatchListener listener) {
-        fPatternMatcher.removePatternMatchListener(listener);
-    }    
-    
-    
-    /**
-     * Job scheduling rule that prevent the job from running if the console's PatternMatcher
-     * is active.
-     */
-    private class MatcherSchedulingRule implements ISchedulingRule {
-        public boolean contains(ISchedulingRule rule) {
-            return rule == this;
-        }
-
-        public boolean isConflicting(ISchedulingRule rule) {
-            if (contains(rule)) {
-                return true;
-            }
-            if (rule != this && rule instanceof MatcherSchedulingRule) {
-                return (((MatcherSchedulingRule)rule).getConsole() == TextConsole.this);   
-            }
-            return false;
-        }
-        
-        public TextConsole getConsole() {
-            return TextConsole.this;
-        }
-    }
-    
-    /**
-     * Returns a scheduling rule which can be used to prevent jobs from running
-     * while this console's pattern matcher is active.
-     * <p>
-     * Although this scheduling rule prevents jobs from running at the same time as
-     * pattern matching jobs for this console, it does not enforce any ordering of jobs.
-     * Since 3.2, pattern matching jobs belong to the job family identified by the console
-     * object that matching is occurring on. To ensure a job runs after all scheduled pattern
-     * matching is complete, clients must join on this console's job family.
-     * </p>
-     * @return a scheduling rule which can be used to prevent jobs from running
-     * while this console's pattern matcher is active
-     */
-    public ISchedulingRule getSchedulingRule() {
-        return new MatcherSchedulingRule();
-    }
-    
-    /**
-     * This console's partitioner should call this method when it is not expecting any new data
-     * to be appended to the document. 
-     */
-    public void partitionerFinished() {
-        fPatternMatcher.forceFinalMatching();
-        fPartitionerFinished  = true;
-        checkFinished();
-    }
-    
-    /**
-     * Called by this console's pattern matcher when matching is complete.
-     * <p>
-     * Clients should not call this method.
-     * <p>
-     */
-    public void matcherFinished() {
-        fMatcherFinished = true;
-        fDocument.removeDocumentListener(fPatternMatcher);
-        checkFinished();
-    }
-    
-    /**
-     * Fires the console output complete property change event.
-     */
-    private synchronized void checkFinished() {
-        if (!fCompleteFired && fPartitionerFinished && fMatcherFinished ) {
-            fCompleteFired = true;
-            firePropertyChange(this, IConsoleConstants.P_CONSOLE_OUTPUT_COMPLETE, null, null);
-        }
-    }
-    
-    /**
-     * Adds a hyperlink to this console.
-     * 
-     * @param hyperlink the hyperlink to add
-     * @param offset the offset in the console document at which the hyperlink should be added
-     * @param length the length of the text which should be hyperlinked
-     * @throws BadLocationException if the specified location is not valid.
-     */
-    public void addHyperlink(IHyperlink hyperlink, int offset, int length) throws BadLocationException {
-        IDocument document = getDocument();
-		ConsoleHyperlinkPosition hyperlinkPosition = new ConsoleHyperlinkPosition(hyperlink, offset, length); 
-		try {
-			document.addPosition(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY, hyperlinkPosition);
-            fConsoleManager.refresh(this);
-		} catch (BadPositionCategoryException e) {
-			ConsolePlugin.log(e);
-		} 
-    }
-    
-    /**
-     * Returns the region associated with the given hyperlink.
-     * 
-     * @param link hyperlink
-     * @return the region associated with the hyperlink or null if the hyperlink is not found.
-     */
-    public IRegion getRegion(IHyperlink link) {
-		try {
-		    IDocument doc = getDocument();
-		    if (doc != null) {
-				Position[] positions = doc.getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-				for (int i = 0; i < positions.length; i++) {
-					ConsoleHyperlinkPosition position = (ConsoleHyperlinkPosition)positions[i];
-					if (position.getHyperLink().equals(link)) {
-						return new Region(position.getOffset(), position.getLength());
-					}
-				}
-		    }
-		} catch (BadPositionCategoryException e) {
-		}
-		return null;
-    }
-    
-    /**
-     * Returns the attribute associated with the specified key.
-     * 
-     * @param key attribute key
-     * @return the attribute associated with the specified key
-     */
-    public Object getAttribute(String key) {
-        synchronized (fAttributes) {
-            return fAttributes.get(key);
-        }
-    }
-    
-    /**
-     * Sets an attribute value. Intended for client data.
-     * 
-     * @param key attribute key
-     * @param value attribute value
-     */
-    public void setAttribute(String key, Object value) {
-        synchronized(fAttributes) {
-            fAttributes.put(key, value);
-        }
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java
deleted file mode 100644
index 349572f..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java
+++ /dev/null
@@ -1,401 +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.console;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IAdaptable;
-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.resource.JFaceResources;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IFindReplaceTarget;
-import org.eclipse.jface.text.ITextListener;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.TextEvent;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-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.console.actions.ClearOutputAction;
-import org.eclipse.ui.console.actions.TextViewerAction;
-import org.eclipse.ui.internal.console.ConsoleMessages;
-import org.eclipse.ui.internal.console.ConsoleResourceBundleMessages;
-import org.eclipse.ui.internal.console.FollowHyperlinkAction;
-import org.eclipse.ui.internal.console.IConsoleHelpContextIds;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.texteditor.FindReplaceAction;
-import org.eclipse.ui.texteditor.IUpdate;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * A page for a text console.
- * <p>
- * Clients may contribute actions to the context menu of a text console page
- * using the <code>org.eclipse.ui.popupMenus</code> extension point. The context
- * menu identifier for a text console page is the associated console's type
- * suffixed with <code>.#ContextMenu</code>. When a console does not specify 
- * a type, the context menu id is <code>#ContextMenu</code>.
- * </p>
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.1
- */
-public class TextConsolePage implements IPageBookViewPage, IPropertyChangeListener, IAdaptable {
-    private IPageSite fSite;
-    private TextConsole fConsole;
-    private IConsoleView fConsoleView;
-    private TextConsoleViewer fViewer;
-    private MenuManager fMenuManager;
-    protected Map fGlobalActions = new HashMap();
-    protected ArrayList fSelectionActions = new ArrayList();
-    protected ClearOutputAction fClearOutputAction;
-    
-	// text selection listener, used to update selection dependent actions on selection changes
-	private ISelectionChangedListener selectionChangedListener =  new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			updateSelectionDependentActions();
-		}
-	};
-    
-	// updates the find replace action if the document length is > 0
-	private ITextListener textListener = new ITextListener() {
-	    public void textChanged(TextEvent event) {
-			IUpdate findReplace = (IUpdate)fGlobalActions.get(ActionFactory.FIND.getId());
-			if (findReplace != null) {
-				findReplace.update();
-			}
-		}
-	};
-	
-    /**
-     * Constructs a text console page for the given console in the given view.
-     * 
-     * @param console text console
-     * @param view console view the page is contained in
-     */
-	public TextConsolePage(TextConsole console, IConsoleView view) {
-	    fConsole = console;
-	    fConsoleView = view;
-	}
-	
-    /**
-     * Returns a viewer used to display the contents of this page's console.
-     * 
-     * @param parent container for the viewer
-     * @return a viewer used to display the contents of this page's console
-     */
-	protected TextConsoleViewer createViewer(Composite parent) {
-	    return new TextConsoleViewer(parent, fConsole);
-	}
-    
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.part.IPageBookViewPage#getSite()
-     */
-    public IPageSite getSite() {
-        return fSite;
-    }
-    	
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite)
-     */
-    public void init(IPageSite pageSite) throws PartInitException {
-        fSite = pageSite;
-    }
-
-    /**
-     * Updates selection dependent actions.
-     */
-    protected void updateSelectionDependentActions() {
-		Iterator iterator= fSelectionActions.iterator();
-		while (iterator.hasNext()) {
-			updateAction((String)iterator.next());		
-		}
-	}
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createControl(Composite parent) {
-        fViewer = createViewer(parent);
-		fViewer.setConsoleWidth(fConsole.getConsoleWidth());
-		fViewer.setTabWidth(fConsole.getTabWidth());
-		fConsole.addPropertyChangeListener(this);
-		JFaceResources.getFontRegistry().addListener(this);
-		
-		String id = "#ContextMenu"; //$NON-NLS-1$
-		if (getConsole().getType() != null) {
-		    id = getConsole().getType() + "." + id; //$NON-NLS-1$
-		}
-		fMenuManager= new MenuManager("#ContextMenu", id);  //$NON-NLS-1$
-		fMenuManager.setRemoveAllWhenShown(true);
-		fMenuManager.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager m) {
-				contextMenuAboutToShow(m);
-			}
-		});
-		Menu menu = fMenuManager.createContextMenu(getControl());
-		getControl().setMenu(menu);
-		
-		createActions();
-		configureToolBar(getSite().getActionBars().getToolBarManager());
-		
-		getSite().registerContextMenu(id, fMenuManager, fViewer); 
-		getSite().setSelectionProvider(fViewer);
-		
-		fViewer.getSelectionProvider().addSelectionChangedListener(selectionChangedListener);
-		fViewer.addTextListener(textListener);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.part.IPage#dispose()
-     */
-    public void dispose() {
-        fConsole.removePropertyChangeListener(this);
-        JFaceResources.getFontRegistry().removeListener(this);
-        
-        if (fMenuManager != null) {
-            fMenuManager.dispose();
-        }
-        fClearOutputAction = null;
-        fSelectionActions.clear();
-        fGlobalActions.clear();
-        
-        fViewer.getSelectionProvider().removeSelectionChangedListener(selectionChangedListener);
-        fViewer.removeTextListener(textListener);
-        fViewer = null;
-    }
-
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.part.IPage#getControl()
-     */
-    public Control getControl() {
-        return fViewer != null ? fViewer.getControl() : null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
-     */
-    public void setActionBars(IActionBars actionBars) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.IPage#setFocus()
-     */
-    public void setFocus() {
-        if (fViewer != null) {
-            fViewer.getTextWidget().setFocus();
-        }
-    }
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-    public void propertyChange(PropertyChangeEvent event) {
-        if (fViewer != null) {
-			Object source = event.getSource();
-			String property = event.getProperty();
-			
-			if (source.equals(fConsole) && IConsoleConstants.P_FONT.equals(property)) {
-				fViewer.setFont(fConsole.getFont());	
-			} else if (IConsoleConstants.P_FONT_STYLE.equals(property)) {
-			    fViewer.getTextWidget().redraw();
-			} else if (property.equals(IConsoleConstants.P_STREAM_COLOR)) {
-			    fViewer.getTextWidget().redraw();
-			} else if (source.equals(fConsole) && property.equals(IConsoleConstants.P_TAB_SIZE)) {
-			    Integer tabSize = (Integer)event.getNewValue();
-			    fViewer.setTabWidth(tabSize.intValue());
-			} else if (source.equals(fConsole) && property.equals(IConsoleConstants.P_CONSOLE_WIDTH)) {
-			    fViewer.setConsoleWidth(fConsole.getConsoleWidth()); 
-			} else if (IConsoleConstants.P_BACKGROUND_COLOR.equals(property)) {
-				fViewer.getTextWidget().setBackground(fConsole.getBackground());
-			}
-        }
-	}
-
-    /**
-     * Creates actions.
-     */
-    protected void createActions() {
-        IActionBars actionBars= getSite().getActionBars();
-        TextViewerAction action= new TextViewerAction(fViewer, ITextOperationTarget.SELECT_ALL);
-		action.configureAction(ConsoleMessages.TextConsolePage_SelectAllText, ConsoleMessages.TextConsolePage_SelectAllDescrip, ConsoleMessages.TextConsolePage_SelectAllDescrip);
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.SELECT_ALL);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(action, IConsoleHelpContextIds.CONSOLE_SELECT_ALL_ACTION);
-		setGlobalAction(actionBars, ActionFactory.SELECT_ALL.getId(), action);
-		
-		action= new TextViewerAction(fViewer, ITextOperationTarget.CUT);
-		action.configureAction(ConsoleMessages.TextConsolePage_CutText, ConsoleMessages.TextConsolePage_CutDescrip, ConsoleMessages.TextConsolePage_CutDescrip);  
-		action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.CUT);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(action, IConsoleHelpContextIds.CONSOLE_CUT_ACTION);
-		setGlobalAction(actionBars, ActionFactory.CUT.getId(), action);
-		
-		action= new TextViewerAction(fViewer, ITextOperationTarget.COPY);
-		action.configureAction(ConsoleMessages.TextConsolePage_CopyText, ConsoleMessages.TextConsolePage_CopyDescrip, ConsoleMessages.TextConsolePage_CopyDescrip);
-		action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(action, IConsoleHelpContextIds.CONSOLE_COPY_ACTION);
-		setGlobalAction(actionBars, ActionFactory.COPY.getId(), action);
-		
-		action= new TextViewerAction(fViewer, ITextOperationTarget.PASTE);
-		action.configureAction(ConsoleMessages.TextConsolePage_PasteText, ConsoleMessages.TextConsolePage_PasteDescrip, ConsoleMessages.TextConsolePage_PasteDescrip); 
-		action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(action, IConsoleHelpContextIds.CONSOLE_PASTE_ACTION);
-		setGlobalAction(actionBars, ActionFactory.PASTE.getId(), action);
-		
-		fClearOutputAction = new ClearOutputAction(fConsole);
-        
-        ResourceBundle bundle = ConsoleResourceBundleMessages.getBundle();
-        FindReplaceAction fraction = new FindReplaceAction(bundle, "find_replace_action_", fConsoleView); //$NON-NLS-1$
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(fraction, IConsoleHelpContextIds.CONSOLE_FIND_REPLACE_ACTION);
-		setGlobalAction(actionBars, ActionFactory.FIND.getId(), fraction);
-
-		fSelectionActions.add(ActionFactory.CUT.getId());
-		fSelectionActions.add(ActionFactory.COPY.getId());
-		fSelectionActions.add(ActionFactory.PASTE.getId());
-		fSelectionActions.add(ActionFactory.FIND.getId());
-		
-		actionBars.updateActionBars();
-    }
-    
-    /**
-     * Configures an action for key bindings.
-     * 
-     * @param actionBars action bars for this page
-     * @param actionID action definition id
-     * @param action associated action
-     */
-    protected void setGlobalAction(IActionBars actionBars, String actionID, IAction action) {
-        fGlobalActions.put(actionID, action);  
-        actionBars.setGlobalActionHandler(actionID, action);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class required) {
-		if (IFindReplaceTarget.class.equals(required)) {
-			return fViewer.getFindReplaceTarget();
-		}
-		if (Widget.class.equals(required)) {
-			return fViewer.getTextWidget();
-		}
-		return null;
-    }
-    
-    /**
-	 * Returns the view this page is contained in.
-	 * 
-	 * @return the view this page is contained in
-	 */
-	protected IConsoleView getConsoleView() {
-		return fConsoleView;
-	}
-	
-	/**
-	 * Returns the console this page is displaying.
-	 * 
-	 * @return the console this page is displaying
-	 */
-	protected IConsole getConsole() {
-		return fConsole;
-	}
-	
-    /**
-     * Updates the global action with the given id
-     * 
-     * @param actionId action definition id
-     */
-	protected void updateAction(String actionId) {
-		IAction action= (IAction)fGlobalActions.get(actionId);
-		if (action instanceof IUpdate) {
-			((IUpdate) action).update();
-		}
-	}	
-
-    
-	/**
-	 * Fill the context menu
-	 * 
-	 * @param menuManager menu
-	 */
-	protected void contextMenuAboutToShow(IMenuManager menuManager) {
-		IDocument doc= fViewer.getDocument();
-		if (doc == null) {
-			return;
-		}
-
-		menuManager.add((IAction)fGlobalActions.get(ActionFactory.CUT.getId()));
-		menuManager.add((IAction)fGlobalActions.get(ActionFactory.COPY.getId()));
-		menuManager.add((IAction)fGlobalActions.get(ActionFactory.PASTE.getId()));
-		menuManager.add((IAction)fGlobalActions.get(ActionFactory.SELECT_ALL.getId()));
-		
-		menuManager.add(new Separator("FIND")); //$NON-NLS-1$
-		menuManager.add((IAction)fGlobalActions.get(ActionFactory.FIND.getId()));
-		menuManager.add(new FollowHyperlinkAction(fViewer));
-		menuManager.add(fClearOutputAction);
-		
-		menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	protected void configureToolBar(IToolBarManager mgr) {
-		mgr.appendToGroup(IConsoleConstants.OUTPUT_GROUP, fClearOutputAction);
-	}
-
-
-    /**
-     * Returns the viewer contained in this page.
-     * 
-     * @return the viewer contained in this page
-     */
-    public TextConsoleViewer getViewer() {
-        return fViewer;
-    }
-    
-    /**
-     * Sets the viewer contained in this page.
-     * 
-     * @param viewer text viewer
-     */
-    public void setViewer(TextConsoleViewer viewer) {
-        this.fViewer = viewer;
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsoleViewer.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsoleViewer.java
deleted file mode 100644
index c656202..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsoleViewer.java
+++ /dev/null
@@ -1,693 +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.console;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentAdapter;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.IPositionUpdater;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.LineBackgroundEvent;
-import org.eclipse.swt.custom.LineBackgroundListener;
-import org.eclipse.swt.custom.LineStyleEvent;
-import org.eclipse.swt.custom.LineStyleListener;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.internal.console.ConsoleDocumentAdapter;
-import org.eclipse.ui.internal.console.ConsoleHyperlinkPosition;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Default viewer used to display a <code>TextConsole</code>.
- * <p>
- * Clients may subclass this class.
- * </p>
- * 
- * @since 3.1
- */
-public class TextConsoleViewer extends SourceViewer implements LineStyleListener, LineBackgroundListener, MouseTrackListener, MouseMoveListener, MouseListener {
-    /**
-     * Adapts document to the text widget.
-     */
-    private ConsoleDocumentAdapter documentAdapter;
-
-    private IHyperlink hyperlink;
-
-    private Cursor handCursor;
-
-    private Cursor textCursor;
-
-    private int consoleWidth = -1;
-
-    private TextConsole console;
-
-    private IPropertyChangeListener propertyChangeListener;
-
-    private IDocumentListener documentListener = new IDocumentListener() {
-        public void documentAboutToBeChanged(DocumentEvent event) {
-        }
-
-        public void documentChanged(DocumentEvent event) {
-            updateLinks(event.fOffset);
-        }
-    };
-    // event listener used to send event to hyperlink for IHyperlink2
-    private Listener mouseUpListener = new Listener() {
-		public void handleEvent(Event event) {
-	        if (hyperlink != null) {
-	            String selection = getTextWidget().getSelectionText();
-	            if (selection.length() <= 0) {
-	                if (event.button == 1) {
-	                	if (hyperlink instanceof IHyperlink2) {
-							((IHyperlink2) hyperlink).linkActivated(event);
-						} else {
-							hyperlink.linkActivated();
-						}
-	                }
-	            }
-	        }
-		}
-	};
-
-    WorkbenchJob revealJob = new WorkbenchJob("Reveal End of Document") {//$NON-NLS-1$
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            StyledText textWidget = getTextWidget();
-            if (textWidget != null && !textWidget.isDisposed()) {
-                int lineCount = textWidget.getLineCount();
-                textWidget.setTopIndex(lineCount - 1);
-            }
-            return Status.OK_STATUS;
-        }
-    };
-    
-    private IPositionUpdater positionUpdater = new IPositionUpdater() {
-        public void update(DocumentEvent event) {
-            try {
-                IDocument document = getDocument();
-                if (document != null) {
-                    Position[] positions = document.getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-                    for (int i = 0; i < positions.length; i++) {
-                        Position position = positions[i];
-                        if (position.offset == event.fOffset && position.length<=event.fLength) {
-                            position.delete();
-                        }
-                        if (position.isDeleted) {
-                            document.removePosition(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY, position);
-                        }
-                    }
-                }
-            } catch (BadPositionCategoryException e) {
-            }
-        }
-    };
-
-    /**
-     * Constructs a new viewer in the given parent for the specified console.
-     * 
-     * @param parent
-     *            containing widget
-     * @param console
-     *            text console
-     */
-    public TextConsoleViewer(Composite parent, TextConsole console) {
-        super(parent, null, SWT.V_SCROLL | SWT.H_SCROLL);
-        this.console = console;
-
-        IDocument document = console.getDocument();
-        setDocument(document);
-
-        StyledText styledText = getTextWidget();
-        styledText.setDoubleClickEnabled(true);
-        styledText.addLineStyleListener(this);
-        styledText.addLineBackgroundListener(this);
-        styledText.setEditable(true);
-        setFont(console.getFont());
-        styledText.addMouseTrackListener(this);
-        styledText.addListener(SWT.MouseUp, mouseUpListener);
-
-        ColorRegistry colorRegistry = JFaceResources.getColorRegistry();
-        propertyChangeListener = new HyperlinkColorChangeListener();
-        colorRegistry.addListener(propertyChangeListener);
-
-        revealJob.setSystem(true);
-        document.addDocumentListener(documentListener);
-        document.addPositionUpdater(positionUpdater);
-    }
-
-    /**
-     * Sets the tab width used by this viewer.
-     * 
-     * @param tabWidth
-     *            the tab width used by this viewer
-     */
-    public void setTabWidth(int tabWidth) {
-        StyledText styledText = getTextWidget();
-        int oldWidth = styledText.getTabs();
-        if (tabWidth != oldWidth) {
-            styledText.setTabs(tabWidth);
-        }
-    }
-
-    /**
-     * Sets the font used by this viewer.
-     * 
-     * @param font
-     *            the font used by this viewer
-     */
-    public void setFont(Font font) {
-        StyledText styledText = getTextWidget();
-        Font oldFont = styledText.getFont();
-        if (oldFont == font) {
-            return;
-        }
-        if (font == null || !(font.equals(oldFont))) {
-            styledText.setFont(font);
-        }
-    }
-
-    /**
-     * Positions the cursor at the end of the document.
-     */
-    protected void revealEndOfDocument() {
-        revealJob.schedule(50);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.custom.LineStyleListener#lineGetStyle(org.eclipse.swt.custom.LineStyleEvent)
-     */
-    public void lineGetStyle(LineStyleEvent event) {
-        IDocument document = getDocument();
-        if (document != null && document.getLength() > 0) {
-            ArrayList ranges = new ArrayList();
-            int offset = event.lineOffset;
-            int length = event.lineText.length();
-
-            StyleRange[] partitionerStyles = ((IConsoleDocumentPartitioner) document.getDocumentPartitioner()).getStyleRanges(event.lineOffset, event.lineText.length());
-            if (partitionerStyles != null) {
-                for (int i = 0; i < partitionerStyles.length; i++) {
-                    ranges.add(partitionerStyles[i]);
-                }
-            } else {
-                ranges.add(new StyleRange(offset, length, null, null));
-            }
-
-            try {
-                Position[] positions = getDocument().getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-                Position[] overlap = findPosition(offset, length, positions);
-                Color color = JFaceColors.getHyperlinkText(Display.getCurrent());
-                if (overlap != null) {
-                    for (int i = 0; i < overlap.length; i++) {
-                        Position position = overlap[i];
-                        StyleRange linkRange = new StyleRange(position.offset, position.length, color, null);
-                        linkRange.underline = true;
-                        override(ranges, linkRange);
-                    }
-                }
-            } catch (BadPositionCategoryException e) {
-            }
-
-            if (ranges.size() > 0) {
-                event.styles = (StyleRange[]) ranges.toArray(new StyleRange[ranges.size()]);
-            }
-        }
-    }
-
-    private void override(List ranges, StyleRange newRange) {
-        if (ranges.isEmpty()) {
-            ranges.add(newRange);
-            return;
-        }
-
-        int start = newRange.start;
-        int end = start + newRange.length;
-        for (int i = 0; i < ranges.size(); i++) {
-            StyleRange existingRange = (StyleRange) ranges.get(i);
-            int rEnd = existingRange.start + existingRange.length;
-            if (end <= existingRange.start || start >= rEnd) {
-                continue;
-            }
-
-            if (start < existingRange.start && end > existingRange.start) {
-                start = existingRange.start;
-            }
-
-            if (start >= existingRange.start && end <= rEnd) {
-                existingRange.length = start - existingRange.start;
-                ranges.add(++i, newRange);
-                if (end != rEnd) {
-                    ranges.add(++i, new StyleRange(end, rEnd - end - 1, existingRange.foreground, existingRange.background));
-                }
-                return;
-            } else if (start >= existingRange.start && start < rEnd) {
-                existingRange.length = start - existingRange.start;
-                ranges.add(++i, newRange);
-            } else if (end >= rEnd) {
-                ranges.remove(i);
-            } else {
-                ranges.add(++i, new StyleRange(end + 1, rEnd - end + 1, existingRange.foreground, existingRange.background));
-            }
-        }
-    }
-
-    /**
-     * Binary search for the positions overlapping the given range
-     * 
-     * @param offset
-     *            the offset of the range
-     * @param length
-     *            the length of the range
-     * @param positions
-     *            the positions to search
-     * @return the positions overlapping the given range, or <code>null</code>
-     */
-    private Position[] findPosition(int offset, int length, Position[] positions) {
-
-        if (positions.length == 0)
-            return null;
-
-        int rangeEnd = offset + length;
-        int left = 0;
-        int right = positions.length - 1;
-        int mid = 0;
-        Position position = null;
-
-        while (left < right) {
-
-            mid = (left + right) / 2;
-
-            position = positions[mid];
-            if (rangeEnd < position.getOffset()) {
-                if (left == mid)
-                    right = left;
-                else
-                    right = mid - 1;
-            } else if (offset > (position.getOffset() + position.getLength() - 1)) {
-                if (right == mid)
-                    left = right;
-                else
-                    left = mid + 1;
-            } else {
-                left = right = mid;
-            }
-        }
-
-        List list = new ArrayList();
-        int index = left - 1;
-        if (index >= 0) {
-            position = positions[index];
-            while (index >= 0 && (position.getOffset() + position.getLength()) > offset) {
-                index--;
-                if (index > 0) {
-                    position = positions[index];
-                }
-            }
-        }
-        index++;
-        position = positions[index];
-        while (index < positions.length && (position.getOffset() < rangeEnd)) {
-            list.add(position);
-            index++;
-            if (index < positions.length) {
-                position = positions[index];
-            }
-        }
-
-        if (list.isEmpty()) {
-            return null;
-        }
-        return (Position[]) list.toArray(new Position[list.size()]);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.custom.LineBackgroundListener#lineGetBackground(org.eclipse.swt.custom.LineBackgroundEvent)
-     */
-    public void lineGetBackground(LineBackgroundEvent event) {
-        event.lineBackground = null;
-    }
-
-    /**
-     * Returns the hand cursor.
-     * 
-     * @return the hand cursor
-     */
-    protected Cursor getHandCursor() {
-        if (handCursor == null) {
-            handCursor = new Cursor(ConsolePlugin.getStandardDisplay(), SWT.CURSOR_HAND);
-        }
-        return handCursor;
-    }
-
-    /**
-     * Returns the text cursor.
-     * 
-     * @return the text cursor
-     */
-    protected Cursor getTextCursor() {
-        if (textCursor == null) {
-            textCursor = new Cursor(ConsolePlugin.getStandardDisplay(), SWT.CURSOR_IBEAM);
-        }
-        return textCursor;
-    }
-
-    /**
-     * Notification a hyperlink has been entered.
-     * 
-     * @param link
-     *            the link that was entered
-     */
-    protected void linkEntered(IHyperlink link) {
-        Control control = getTextWidget();
-        if (hyperlink != null) {
-            linkExited(hyperlink);
-        }
-        hyperlink = link;
-        hyperlink.linkEntered();
-        control.setCursor(getHandCursor());
-        control.redraw();
-        control.addMouseListener(this);
-    }
-
-    /**
-     * Notification a link was exited.
-     * 
-     * @param link
-     *            the link that was exited
-     */
-    protected void linkExited(IHyperlink link) {
-        link.linkExited();
-        hyperlink = null;
-        Control control = getTextWidget();
-        control.setCursor(getTextCursor());
-        control.redraw();
-        control.removeMouseListener(this);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseTrackListener#mouseEnter(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseEnter(MouseEvent e) {
-        getTextWidget().addMouseMoveListener(this);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseTrackListener#mouseExit(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseExit(MouseEvent e) {
-        getTextWidget().removeMouseMoveListener(this);
-        if (hyperlink != null) {
-            linkExited(hyperlink);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseTrackListener#mouseHover(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseHover(MouseEvent e) {
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseMove(MouseEvent e) {
-        int offset = -1;
-        try {
-            Point p = new Point(e.x, e.y);
-            offset = getTextWidget().getOffsetAtLocation(p);
-        } catch (IllegalArgumentException ex) {
-            // out of the document range
-        }
-        updateLinks(offset);
-    }
-
-    /**
-     * The cursor has just be moved to the given offset, the mouse has hovered
-     * over the given offset. Update link rendering.
-     * 
-     * @param offset
-     */
-    protected void updateLinks(int offset) {
-        if (offset >= 0) {
-            IHyperlink link = getHyperlink(offset);
-            if (link != null) {
-                if (link.equals(hyperlink)) {
-                    return;
-                }
-                linkEntered(link);
-                return;
-            }
-        }
-        if (hyperlink != null) {
-            linkExited(hyperlink);
-        }
-    }
-
-    /**
-     * Returns the currently active hyperlink or <code>null</code> if none.
-     * 
-     * @return the currently active hyperlink or <code>null</code> if none
-     */
-    public IHyperlink getHyperlink() {
-        return hyperlink;
-    }
-
-    /**
-     * Returns the hyperlink at the specified offset, or <code>null</code> if
-     * none.
-     * 
-     * @param offset
-     *            offset at which a hyperlink has been requested
-     * @return hyperlink at the specified offset, or <code>null</code> if none
-     */
-    public IHyperlink getHyperlink(int offset) {
-        if (offset >= 0 && console != null) {
-            return console.getHyperlink(offset);
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseDoubleClick(MouseEvent e) {
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseDown(MouseEvent e) {
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
-     */
-    public void mouseUp(MouseEvent e) {
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.text.TextViewer#createDocumentAdapter()
-     */
-    protected IDocumentAdapter createDocumentAdapter() {
-        if (documentAdapter == null) {
-            documentAdapter = new ConsoleDocumentAdapter(consoleWidth = -1);
-        }
-        return documentAdapter;
-    }
-
-    /**
-     * Sets the console to have a fixed character width. Use -1 to indicate that
-     * a fixed width should not be used.
-     * 
-     * @param width
-     *            fixed character width of the console, or -1
-     */
-    public void setConsoleWidth(int width) {
-        if (consoleWidth != width) {
-            consoleWidth = width;
-            ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() {
-                public void run() {
-                    if (documentAdapter != null) {
-                        documentAdapter.setWidth(consoleWidth);
-                    }
-                }
-            });
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.text.TextViewer#handleDispose()
-     */
-    protected void handleDispose() {
-        IDocument document = getDocument();
-        if (document != null) {
-            document.removeDocumentListener(documentListener);
-            document.removePositionUpdater(positionUpdater);
-        }
-
-        StyledText styledText = getTextWidget();
-        styledText.removeLineStyleListener(this);
-        styledText.removeLineBackgroundListener(this);
-        styledText.removeMouseTrackListener(this);
-
-        handCursor = null;
-        textCursor = null;
-        hyperlink = null;
-        console = null;
-
-        ColorRegistry colorRegistry = JFaceResources.getColorRegistry();
-        colorRegistry.removeListener(propertyChangeListener);
-        
-        super.handleDispose();
-    }
-
-    class HyperlinkColorChangeListener implements IPropertyChangeListener {
-        public void propertyChange(PropertyChangeEvent event) {
-            if (event.getProperty().equals(JFacePreferences.ACTIVE_HYPERLINK_COLOR) || event.getProperty().equals(JFacePreferences.HYPERLINK_COLOR)) {
-                getTextWidget().redraw();
-            }
-        }
-
-    }
-
-    /*
-     * work around to memory leak in TextViewer$WidgetCommand
-     */
-    protected void updateTextListeners(WidgetCommand cmd) {
-        super.updateTextListeners(cmd);
-        cmd.preservedText = null;
-        cmd.event = null;
-        cmd.text = null;
-    }
-
-    protected void internalRevealRange(int start, int end) {
-        StyledText textWidget = getTextWidget();
-        int startLine = documentAdapter.getLineAtOffset(start);
-        int endLine = documentAdapter.getLineAtOffset(end);
-
-        int top = textWidget.getTopIndex();
-        if (top > -1) {
-            // scroll vertically
-            int lines = getVisibleLinesInViewport();
-            int bottom = top + lines;
-
-            // two lines at the top and the bottom should always be left
-            // if window is smaller than 5 lines, always center position is
-            // chosen
-            int bufferZone = 2;
-            if (startLine >= top + bufferZone && startLine <= bottom - bufferZone && endLine >= top + bufferZone && endLine <= bottom - bufferZone) {
-
-                // do not scroll at all as it is already visible
-            } else {
-                int delta = Math.max(0, lines - (endLine - startLine));
-                textWidget.setTopIndex(startLine - delta / 3);
-                updateViewportListeners(INTERNAL);
-            }
-
-            // scroll horizontally
-            if (endLine < startLine) {
-                endLine += startLine;
-                startLine = endLine - startLine;
-                endLine -= startLine;
-            }
-
-            int startPixel = -1;
-            int endPixel = -1;
-
-            if (endLine > startLine) {
-                // reveal the beginning of the range in the start line
-                IRegion extent = getExtent(start, start);
-                startPixel = extent.getOffset() + textWidget.getHorizontalPixel();
-                endPixel = startPixel;
-            } else {
-                IRegion extent = getExtent(start, end);
-                startPixel = extent.getOffset() + textWidget.getHorizontalPixel();
-                endPixel = startPixel + extent.getLength();
-            }
-
-            int visibleStart = textWidget.getHorizontalPixel();
-            int visibleEnd = visibleStart + textWidget.getClientArea().width;
-
-            // scroll only if not yet visible
-            if (startPixel < visibleStart || visibleEnd < endPixel) {
-                // set buffer zone to 10 pixels
-                bufferZone = 10;
-                int newOffset = visibleStart;
-                int visibleWidth = visibleEnd - visibleStart;
-                int selectionPixelWidth = endPixel - startPixel;
-
-                if (startPixel < visibleStart)
-                    newOffset = startPixel;
-                else if (selectionPixelWidth + bufferZone < visibleWidth)
-                    newOffset = endPixel + bufferZone - visibleWidth;
-                else
-                    newOffset = startPixel;
-
-                float index = ((float) newOffset) / ((float) getAverageCharWidth());
-
-                textWidget.setHorizontalIndex(Math.round(index));
-            }
-
-        }
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/ClearOutputAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/ClearOutputAction.java
deleted file mode 100644
index 6b0d874..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/ClearOutputAction.java
+++ /dev/null
@@ -1,95 +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.console.actions;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.TextConsole;
-import org.eclipse.ui.internal.console.ConsoleMessages;
-import org.eclipse.ui.internal.console.ConsolePluginImages;
-import org.eclipse.ui.internal.console.IConsoleHelpContextIds;
-import org.eclipse.ui.internal.console.IInternalConsoleConstants;
-
-/**
- * Clears the output in a text console.
- * <p>
- * Clients may instantiate this class; this class is not intended to 
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class ClearOutputAction extends Action {
-
-	private ITextViewer fViewer;
-	private TextConsole fIOConsole;
-
-	/**
-	 * Constructs a clear output action.
-	 * 
-	 * @since 3.1
-	 */
-	private ClearOutputAction() {
-		super(ConsoleMessages.ClearOutputAction_title); 
-		setToolTipText(ConsoleMessages.ClearOutputAction_toolTipText); 
-		setHoverImageDescriptor(ConsolePluginImages.getImageDescriptor(IConsoleConstants.IMG_LCL_CLEAR));		
-		setDisabledImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_DLCL_CLEAR));
-		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_CLEAR));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CLEAR_CONSOLE_ACTION);	    
-	}
-	
-	/**
-	 * Constructs a clear output action for an I/O console. Clearing an I/O console
-	 * is performed via API on the <code>IOConsole</code>, rather than clearing
-	 * its document directly.
-	 * 
-	 * @param ioConsole I/O console the action is associated with
-	 * @since 3.1
-	 */
-	public ClearOutputAction(TextConsole ioConsole) {
-		this();
-		fIOConsole = ioConsole;
-	}
-	
-	/**
-	 * Constructs an action to clear the document associated with a text viewer.
-	 * 
-	 * @param viewer viewer whose document this action is associated with 
-	 */
-	public ClearOutputAction(ITextViewer viewer) {
-	    this();
-	    fViewer = viewer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		BusyIndicator.showWhile(ConsolePlugin.getStandardDisplay(), new Runnable() {
-			public void run() {
-			    if (fIOConsole == null) {
-					IDocument document = fViewer.getDocument();
-					if (document != null) {
-						document.set(""); //$NON-NLS-1$
-					}
-					fViewer.setSelectedRange(0, 0);
-			    } else {
-			        fIOConsole.clearConsole();
-			    }
-			}
-		});
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/CloseConsoleAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/CloseConsoleAction.java
deleted file mode 100644
index 3891847..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/CloseConsoleAction.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.console.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.internal.console.ConsoleMessages;
-import org.eclipse.ui.internal.console.ConsolePluginImages;
-import org.eclipse.ui.internal.console.IInternalConsoleConstants;
-
-/**
- * Removes a console from the console manager.
- * <p>
- * Clients may instantiate this class; this class is not intended to 
- * be subclassed.
- * </p>
- * @since 3.1
- */
-public class CloseConsoleAction extends Action {
-    
-    private IConsole fConsole;
-    
-    public CloseConsoleAction(IConsole console) {
-        super(ConsoleMessages.CloseConsoleAction_0, ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_CLOSE)); 
-        setToolTipText(ConsoleMessages.CloseConsoleAction_1); 
-        fConsole = console;
-    }
-
-    public void run() {
-        ConsolePlugin.getDefault().getConsoleManager().removeConsoles(new IConsole[]{fConsole});
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/TextViewerAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/TextViewerAction.java
deleted file mode 100644
index b3809ea..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/TextViewerAction.java
+++ /dev/null
@@ -1,84 +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.console.actions;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Common function for actions that operate on a text viewer.
- * <p>
- * Clients may subclass this class.
- * </p>
- * @since 3.0
- */
-public class TextViewerAction extends Action implements IUpdate {
-
-	private int fOperationCode= -1;
-	private ITextOperationTarget fOperationTarget;
-
-	/**
-	 * Constructs a new action in the given text viewer with
-	 * the specified operation code.
-	 * 
-	 * @param viewer
-	 * @param operationCode
-	 */
-	public TextViewerAction(ITextViewer viewer, int operationCode) {
-		fOperationCode= operationCode;
-		fOperationTarget= viewer.getTextOperationTarget();
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 * 
-	 * Updates the enabled state of the action.
-	 * Fires a property change if the enabled state changes.
-	 * 
-	 * @see org.eclipse.jface.action.Action#firePropertyChange(String, Object, Object)
-	 */
-	public void update() {
-
-		boolean wasEnabled= isEnabled();
-		boolean isEnabled= (fOperationTarget != null && fOperationTarget.canDoOperation(fOperationCode));
-		setEnabled(isEnabled);
-
-		if (wasEnabled != isEnabled) {
-			firePropertyChange(ENABLED, wasEnabled ? Boolean.TRUE : Boolean.FALSE, isEnabled ? Boolean.TRUE : Boolean.FALSE);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (fOperationCode != -1 && fOperationTarget != null) {
-			fOperationTarget.doOperation(fOperationCode);
-		}
-	}
-	
-	/**
-	 * Configures this action with a label, tool tip, and description.
-	 * 
-	 * @param text action label
-	 * @param toolTipText action tool tip
-	 * @param description action description
-	 */
-	public void configureAction(String text, String toolTipText, String description) {
-		setText(text);
-		setToolTipText(toolTipText);
-		setDescription(description);
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/TextViewerGotoLineAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/TextViewerGotoLineAction.java
deleted file mode 100644
index 879e1f4..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/TextViewerGotoLineAction.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.console.actions;
-
-
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.internal.console.ConsoleMessages;
-
-/**
- * Action to position a text viewer to a specific line.
- * <p>
- * Clients may instantiate this class; this class is not intended to 
- * be subclassed.
- * </p>
- * @since 3.0
- */
-public class TextViewerGotoLineAction extends TextViewerAction {
-
-	/**
-	 * Validates whether the text found in the input field of the
-	 * dialog forms a valid line number, i.e. one to which can be 
-	 * jumped.
-	 */
-	class NumberValidator implements IInputValidator {
-
-		public String isValid(String input) {
-			try {
-				int i= Integer.parseInt(input);
-				if (i <= 0 || fLastLine < i)
-					return ConsoleMessages.TextViewerGotoLineAction_Line_number_out_of_range_1; 
-
-			} catch (NumberFormatException x) {
-				return ConsoleMessages.TextViewerGotoLineAction_Not_a_number_2; 
-			}
-
-			return null;
-		}
-	}
-
-	protected int fLastLine;
-	protected ITextViewer fTextViewer;
-	
-	/**
-	 * Constructs a goto line action for the viewer using the provided resource bundle
-	 */
-	public TextViewerGotoLineAction(ITextViewer viewer) {
-		super(viewer, -1);
-		fTextViewer= viewer;
-		setText(ConsoleMessages.TextViewerGotoLineAction_Go_to__Line____Ctrl_L_4); 
-		setToolTipText(ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1); 
-		setDescription(ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1);		 
-	}
-	
-	/**
-	 * @see TextViewerAction#update()
-	 */
-	public void update() {
-	}
-
-	/**
-	 * Jumps to the line.
-	 */
-	protected void gotoLine(int line) {
-
-		IDocument document= fTextViewer.getDocument();
-		try {
-			int start= document.getLineOffset(line);
-			int length= document.getLineLength(line);
-			fTextViewer.getTextWidget().setSelection(start, start + length);
-			fTextViewer.revealRange(start, length);
-		} catch (BadLocationException x) {
-			ConsolePlugin.errorDialog(fTextViewer.getTextWidget().getShell(), ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1, ConsoleMessages.TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2, x); // 
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		try {
-			Point selection= fTextViewer.getTextWidget().getSelection();
-			IDocument document= fTextViewer.getDocument();
-			fLastLine= document.getLineOfOffset(document.getLength()) + 1;
-			int startLine= selection == null ? 1 : fTextViewer.getTextWidget().getLineAtOffset(selection.x) + 1;
-			String title= ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1; 
-			String message= MessageFormat.format(ConsoleMessages.TextViewerGotoLineAction_Enter_line_number__8, new Object[] {new Integer(fLastLine)}); 
-			String value= Integer.toString(startLine);
-			Shell activeShell= fTextViewer.getTextWidget().getShell();
-			InputDialog d= new InputDialog(activeShell, title, message, value, new NumberValidator());
-			if (d.open() == Window.OK) {
-				try {
-					int line= Integer.parseInt(d.getValue());
-					gotoLine(line - 1);
-				} catch (NumberFormatException x) {
-					ConsolePlugin.errorDialog(activeShell, ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1, ConsoleMessages.TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2, x); // 
-				}
-			}
-		} catch (BadLocationException x) {
-			ConsolePlugin.errorDialog(fTextViewer.getTextWidget().getShell(), ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1, ConsoleMessages.TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2, x); // 
-			return;
-		}
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/package.html b/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/package.html
deleted file mode 100644
index cfb538c..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/actions/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">
-<title>Console Actions</title>
-</head>
-
-<body link="#0000FF" vlink="#800080">
-
-<p align="left"> Application programming interfaces for Eclipse console specific
-  actions.</p>
-
-<h2 align="left">Package Specification</h2>
-
-<p>This package provides a set of actions related to the Eclipse console.</p>
-<p>Clients are allowed to instantiate classes from this package. The classes are 
-  not intended to be subclassed.</p>
-</body>
-</html>
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/package.html b/org.eclipse.ui.console/src/org/eclipse/ui/console/package.html
deleted file mode 100644
index f6debb1..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/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>Eclipse Console</title>
-</head>
-
-<body bgcolor="#FFFFFF">
-
-<p>Application programming interfaces for interaction
-with the Eclipse console.</p>
-
-<h2>Package Specification</h2>
-
-<p>The Eclipse platform UI console plug-in provides a set of classes and interfaces to
-facilitate the creation and display of consoles in the <b>ConsoleView</b>. This package
-contains a generic abstract console (<b>AbstractConsole</b>) that provides some basic 
-functionality as well as two complete implementations of consoles that may be subclassed.
- <p> The class <b>TextConsole</b> supports regular expression matching and hyperlinks. 
- Clients must provide their own document partitioner.
- </p>
-<p><b>IOConsole</b> extends <b>TextConsole</b> and provides support for creating consoles based upon
-input and output streams via the use of <b>IOConsoleOutputStream</b> and 
-<b>IOConsoleInputStream</b>. IOConsole is not an abstract class, it may be used as is or
-subclassed.
- </p>
-<p>A console manager (<b>IConsoleManager</b>) manages all active consoles, and 
-  provides notification of consoles which are added and removed. Consoles are 
-  displayed in a page book view. Each console implementation is reponsible for 
-  creating its page (<b>IPageBookView</b>), which provides freedom of presentation 
-  to the console implementation. A single console may be displayed simultaneously 
-  in multiple console views, in different workbench windows.
-</p>
-</body>
-</html>
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDocument.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDocument.java
deleted file mode 100644
index ddf2491..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDocument.java
+++ /dev/null
@@ -1,115 +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.console;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-
-/**
- * A console document. Requires synchronization for multi-threaded access.
- */
-public class ConsoleDocument extends Document {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#get(int, int)
-	 */
-	public synchronized String get(int pos, int length) throws BadLocationException {
-		return super.get(pos, length);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLength()
-	 */
-	public synchronized int getLength() {
-		return super.getLength();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLineDelimiter(int)
-	 */
-	public synchronized String getLineDelimiter(int line) throws BadLocationException {
-		return super.getLineDelimiter(line);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLineInformation(int)
-	 */
-	public synchronized IRegion getLineInformation(int line) throws BadLocationException {
-		return super.getLineInformation(line);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLineInformationOfOffset(int)
-	 */
-	public synchronized IRegion getLineInformationOfOffset(int offset) throws BadLocationException {
-		return super.getLineInformationOfOffset(offset);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLineLength(int)
-	 */
-	public synchronized int getLineLength(int line) throws BadLocationException {
-		return super.getLineLength(line);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLineOffset(int)
-	 */
-	public synchronized int getLineOffset(int line) throws BadLocationException {
-		return super.getLineOffset(line);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getLineOfOffset(int)
-	 */
-	public int getLineOfOffset(int pos) throws BadLocationException {
-		return super.getLineOfOffset(pos);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getNumberOfLines()
-	 */
-	public synchronized int getNumberOfLines() {
-		return super.getNumberOfLines();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#replace(int, int, java.lang.String)
-	 */
-	public synchronized void replace(int pos, int length, String text) throws BadLocationException {
-		super.replace(pos, length, text);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#set(java.lang.String)
-	 */
-    public synchronized void set(String text) {
-        super.set(text);
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.AbstractDocument#completeInitialization()
-	 */
-    protected void completeInitialization() {
-        super.completeInitialization();
-        addPositionUpdater(new HyperlinkUpdater());
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#addPosition(java.lang.String, org.eclipse.jface.text.Position)
-	 */    
-    public synchronized void addPosition(String category, Position position) throws BadLocationException, BadPositionCategoryException {
-        super.addPosition(category, position);
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#removePosition(java.lang.String, org.eclipse.jface.text.Position)
-	 */    
-    public synchronized void removePosition(String category, Position position) throws BadPositionCategoryException {
-        super.removePosition(category, position);
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocument#getPositions(java.lang.String)
-	 */    
-    public synchronized Position[] getPositions(String category) throws BadPositionCategoryException {
-        return super.getPositions(category);
-    }    
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDocumentAdapter.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDocumentAdapter.java
deleted file mode 100644
index e58e518..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDocumentAdapter.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentAdapter;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.swt.custom.TextChangeListener;
-import org.eclipse.swt.custom.TextChangedEvent;
-import org.eclipse.swt.custom.TextChangingEvent;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Adapts a Console's document to the viewer StyledText widget. Allows proper line
- * wrapping of fixed width consoles without having to add line delimiters to the StyledText.
- * 
- * By using this adapter, the offset of any character is the same in both the widget and the
- * document.
- * 
- * @since 3.1
- */
-public class ConsoleDocumentAdapter implements IDocumentAdapter, IDocumentListener {
-    
-    private int consoleWidth = -1;
-    private List textChangeListeners;
-    private IDocument document;
-    
-    int[] offsets = new int[5000];
-    int[] lengths = new int[5000];
-    private int regionCount = 1;
-    private Pattern pattern = Pattern.compile("$", Pattern.MULTILINE); //$NON-NLS-1$
-    
-    
-    public ConsoleDocumentAdapter(int width) {
-        textChangeListeners = new ArrayList();
-        consoleWidth = width;
-    }
-    
-    /*
-     * repairs lines list from the beginning of the line containing the offset of any 
-     * DocumentEvent, to the end of the Document.
-     */
-    private void repairLines(int eventOffset) {
-        if (document == null) {
-            return;
-        }
-        try {
-            int docLine = document.getLineOfOffset(eventOffset);
-            int docLineOffset = document.getLineOffset(docLine);
-            int widgetLine = getLineAtOffset(docLineOffset);
-            
-            for (int i=regionCount-1; i>=widgetLine; i--) {
-                regionCount--;
-            }
-            
-            int numLinesInDoc = document.getNumberOfLines();
-
-            int nextOffset =  document.getLineOffset(docLine);
-            for (int i = docLine; i<numLinesInDoc; i++) {
-                int offset = nextOffset;
-                int length = document.getLineLength(i);
-                nextOffset += length;
-                
-                if (length == 0) {
-                    addRegion(offset, 0);
-                } else {
-                    while (length > 0) {
-                        int trimmedLength = length;
-                        String lineDelimiter = document.getLineDelimiter(i);
-                        int lineDelimiterLength = 0;
-                        if (lineDelimiter != null) {
-                            lineDelimiterLength = lineDelimiter.length(); 
-                            trimmedLength -= lineDelimiterLength;
-                        }
-
-                        if (consoleWidth > 0 && consoleWidth < trimmedLength) {
-                            addRegion(offset, consoleWidth);
-                            offset += consoleWidth;
-                            length -= consoleWidth;
-                        } else {
-                            addRegion(offset, length);
-                            offset += length;
-                            length -= length;
-                        }
-                    }
-                }
-            }
-        } catch (BadLocationException e) {
-        }
-        
-        if (regionCount == 0) {
-            addRegion(0, document.getLength());
-        }
-    }
-    
-    private void addRegion(int offset, int length) {
-        if (regionCount == 0) {
-            offsets[0] = offset;
-            lengths[0] = length;
-        } else {
-            if (regionCount == offsets.length) {
-                growRegionArray(regionCount * 2);
-            }
-            offsets[regionCount] = offset;
-            lengths[regionCount] = length;
-        }
-        regionCount++;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.IDocumentAdapter#setDocument(org.eclipse.jface.text.IDocument)
-     */
-    public void setDocument(IDocument doc) {
-        if (document != null) {
-            document.removeDocumentListener(this);
-        }
-        
-        document = doc;
-        
-        if (document != null) {
-            document.addDocumentListener(this);
-            repairLines(0);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#addTextChangeListener(org.eclipse.swt.custom.TextChangeListener)
-     */
-    public synchronized void addTextChangeListener(TextChangeListener listener) {
-		Assert.isNotNull(listener);
-		if (!textChangeListeners.contains(listener)) {
-			textChangeListeners.add(listener);
-		}
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#removeTextChangeListener(org.eclipse.swt.custom.TextChangeListener)
-     */
-    public synchronized void removeTextChangeListener(TextChangeListener listener) {
-        if(textChangeListeners != null) {
-            Assert.isNotNull(listener);
-            textChangeListeners.remove(listener);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getCharCount()
-     */
-    public int getCharCount() {
-        return document.getLength();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getLine(int)
-     */
-    public String getLine(int lineIndex) {
-        try {
-            StringBuffer line = new StringBuffer(document.get(offsets[lineIndex], lengths[lineIndex]));
-            int index = line.length() - 1;
-            while(index > -1 && (line.charAt(index)=='\n' || line.charAt(index)=='\r')) {
-                index--;
-            }
-            return new String(line.substring(0, index+1));
-        } catch (BadLocationException e) {
-        }
-        return ""; //$NON-NLS-1$    
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getLineAtOffset(int)
-     */
-    public int getLineAtOffset(int offset) {
-        if (offset == 0 || regionCount <= 1) {
-            return 0;
-        }
-        
-        if (offset == document.getLength()) {
-            return regionCount-1;
-        }
-        
-		int left= 0;
-		int right= regionCount-1;
-		int midIndex = 0;
-		
-		while (left <= right) {
-			if(left == right) {
-	    		return right;
-	    	}
-		    midIndex = (left + right) / 2;
-		    
-		    if (offset < offsets[midIndex]) {
-		        right = midIndex;
-		    } else if (offset >= offsets[midIndex] + lengths[midIndex]) {
-		        left = midIndex + 1;
-		    } else {
-		        return midIndex;
-		    }
-		}
-		
-		return midIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getLineCount()
-     */
-    public int getLineCount() {
-        return regionCount;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getLineDelimiter()
-     */
-    public String getLineDelimiter() {
-        return System.getProperty("line.separator"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getOffsetAtLine(int)
-     */
-    public int getOffsetAtLine(int lineIndex) {
-        return offsets[lineIndex];
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#getTextRange(int, int)
-     */
-    public String getTextRange(int start, int length) {
-        try {
-            return document.get(start, length);
-        } catch (BadLocationException e) {
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#replaceTextRange(int, int, java.lang.String)
-     */
-    public void replaceTextRange(int start, int replaceLength, String text) {
-        try {
-            document.replace(start, replaceLength, text);
-        } catch (BadLocationException e) {
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.custom.StyledTextContent#setText(java.lang.String)
-     */
-    public synchronized void setText(String text) {
-        TextChangedEvent changeEvent = new TextChangedEvent(this);
-        for (Iterator iter = textChangeListeners.iterator(); iter.hasNext();) {
-            TextChangeListener element = (TextChangeListener) iter.next();
-            element.textSet(changeEvent);
-        }    
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
-     */
-    public synchronized void documentAboutToBeChanged(DocumentEvent event) {
-        if (document == null) {
-            return;
-        }
-        
-        TextChangingEvent changeEvent = new TextChangingEvent(this);
-        changeEvent.start = event.fOffset;
-        changeEvent.newText = (event.fText == null ? "" : event.fText); //$NON-NLS-1$
-        changeEvent.replaceCharCount = event.fLength;
-        changeEvent.newCharCount = (event.fText == null ? 0 : event.fText.length());
-        
-        int first = getLineAtOffset(event.fOffset);
-        int lOffset = Math.max(event.fOffset + event.fLength - 1, 0);
-		int last = getLineAtOffset(lOffset);
-        changeEvent.replaceLineCount = Math.max(last - first, 0);
-     
-        int newLineCount = countNewLines(event.fText);
-		changeEvent.newLineCount = newLineCount >= 0 ? newLineCount : 0;
-
-        if (changeEvent.newLineCount > offsets.length-regionCount) {
-            growRegionArray(changeEvent.newLineCount);
-        }
-        
-        for (Iterator iter = textChangeListeners.iterator(); iter.hasNext();) {
-            TextChangeListener element = (TextChangeListener) iter.next();
-            element.textChanging(changeEvent);
-        }
-    }
-
-    private void growRegionArray(int minSize) {
-        int size = Math.max(offsets.length*2, minSize*2);
-        int[] newOffsets = new int[size];
-        System.arraycopy(offsets, 0, newOffsets, 0, regionCount);
-        offsets = newOffsets;
-        int[] newLengths = new int[size];
-        System.arraycopy(lengths, 0, newLengths, 0, regionCount);
-        lengths = newLengths;
-    }
-
-    private int countNewLines(String string) {
-		int count = 0;
-		
-		if (string.length() == 0) return 0;
-
-		// work around to
-		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4994840
-		// see bug 84641
-		if (string.endsWith("\r")) { //$NON-NLS-1$
-			int len = string.length();
-			int index = len >= 2 ? len - 2 : 0;
-			string = string.substring(0, index);
-			count++;
-		}
-		
-		int lastIndex = 0;
-		int index = 0;
-		
-		Matcher matcher = pattern.matcher(string);
-		
-		while (matcher.find()) {
-			index = matcher.start();
-			
-			if (index == 0)
-				count++;
-			else if (index!=string.length())
-				count++;
-			
-			if (consoleWidth > 0) {
-				int lineLen = index - lastIndex + 1;
-				if (index == 0) lineLen += lengths[regionCount-1];
-				count += lineLen/consoleWidth;
-			}
-			
-			lastIndex = index;
-		}
-		return count;
-	}
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
-     */
-    public synchronized void documentChanged(DocumentEvent event) {
-        if (document == null) {
-            return;
-        }
-        
-        repairLines(event.fOffset);
-        
-        TextChangedEvent changeEvent = new TextChangedEvent(this);
-
-        for (Iterator iter = textChangeListeners.iterator(); iter.hasNext();) {
-            TextChangeListener element = (TextChangeListener) iter.next();
-            element.textChanged(changeEvent);
-        }
-    }
-
-    /**
-     * sets consoleWidth, repairs line information, then fires event to the viewer text widget.
-     * @param width The console's width
-     */
-    public void setWidth(int width) {
-        if (width != consoleWidth) {
-            consoleWidth = width;
-            repairLines(0);
-            TextChangedEvent changeEvent = new TextChangedEvent(this);
-            for (Iterator iter = textChangeListeners.iterator(); iter.hasNext();) {
-                TextChangeListener element = (TextChangeListener) iter.next();
-                element.textSet(changeEvent);
-            }
-        }
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java
deleted file mode 100644
index 6af6354..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java
+++ /dev/null
@@ -1,159 +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.console;
-
-
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsoleListener;
-import org.eclipse.ui.console.IConsoleView;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Drop down action in the console to select the console to display.
- */
-class ConsoleDropDownAction extends Action implements IMenuCreator, IConsoleListener, IUpdate {
-
-	private IConsoleView fView;
-	private Menu fMenu;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		IConsole[] consoles = ConsolePlugin.getDefault().getConsoleManager().getConsoles();
-		setEnabled(consoles.length > 1);
-	}
-
-	public ConsoleDropDownAction(IConsoleView view) {
-		fView= view;
-		setText(ConsoleMessages.ConsoleDropDownAction_0); 
-		setToolTipText(ConsoleMessages.ConsoleDropDownAction_1); 
-		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IConsoleConstants.IMG_VIEW_CONSOLE));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_DISPLAY_CONSOLE_ACTION);
-		setMenuCreator(this);
-		ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(this);
-		update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		
-		fView= null;
-		ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		if (fMenu != null) {
-			fMenu.dispose();
-		}
-		
-		fMenu= new Menu(parent);
-		IConsole[] consoles= ConsolePlugin.getDefault().getConsoleManager().getConsoles();
-		IConsole current = fView.getConsole();
-		for (int i = 0; i < consoles.length; i++) {
-			IConsole console = consoles[i];
-			Action action = new ShowConsoleAction(fView, console);
-			action.setChecked(console.equals(current));
-			addActionToMenu(fMenu, action, i + 1);
-		}
-		return fMenu;
-	}
-	
-	private void addActionToMenu(Menu parent, Action action, int accelerator) {
-	    if (accelerator < 10) {
-		    StringBuffer label= new StringBuffer();
-			//add the numerical accelerator
-			label.append('&');
-			label.append(accelerator);
-			label.append(' ');
-			label.append(action.getText());
-			action.setText(label.toString());
-		}
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-        ConsoleView consoleView = (ConsoleView) fView;
-        boolean pinned = consoleView.isPinned();
-        if (pinned) {
-            consoleView.setPinned(false);
-        }
-		List stack = consoleView.getConsoleStack();
-		if (stack.size() > 1) {
-			IConsole console = (IConsole) stack.get(1);
-			fView.display(console);
-		}
-        if (pinned) {
-            consoleView.setPinned(true);
-        }
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleListener#consolesAdded(org.eclipse.ui.console.IConsole[])
-	 */
-	public void consolesAdded(IConsole[] consoles) {
-		Display display = ConsolePlugin.getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				update();
-			}
-		});
-	}
-
-	/* (non-Javadoc)
-	 * 
-	 * Dispose the menu when a launch is removed, such that the actions in this
-	 * menu do not hang on to associated resources.
-	 * 
-	 * @see org.eclipse.ui.console.IConsoleListener#consolesRemoved(org.eclipse.ui.console.IConsole[])
-	 */
-	public void consolesRemoved(IConsole[] consoles) {
-		Display display = ConsolePlugin.getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				if (fMenu != null) {
-					fMenu.dispose();
-				}
-				update();
-			}
-		});
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.java
deleted file mode 100644
index 377d3d5..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.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.internal.console;
-
-import java.net.URL;
-
-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.ExpressionTagNames;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-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.IPluginContribution;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleFactory;
-import org.osgi.framework.Bundle;
-
-/**
- * @since 3.1
- */
-public class ConsoleFactoryExtension implements IPluginContribution {
-
-    private IConfigurationElement fConfig;
-    private Expression fEnablementExpression;
-    private String fLabel;
-    private ImageDescriptor fImageDescriptor;
-    private IConsoleFactory fFactory;
-
-    ConsoleFactoryExtension(IConfigurationElement config) {
-        fConfig = config;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPluginContribution#getLocalId()
-     */
-    public String getLocalId() {
-        return fConfig.getAttribute("id"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPluginContribution#getPluginId()
-     */
-    public String getPluginId() {
-        return fConfig.getContributor().getName();
-    }
-
-    public boolean isEnabled() {
-        try {
-            Expression enablementExpression = getEnablementExpression();
-            if (enablementExpression == null) {
-                return true;
-            } 
-            EvaluationContext context = new EvaluationContext(null, this);
-            EvaluationResult evaluationResult = enablementExpression.evaluate(context);
-            return evaluationResult != EvaluationResult.FALSE;
-        } catch (CoreException e) {
-            ConsolePlugin.log(e);
-            return false;
-        }
-    }
-    
-    public Expression getEnablementExpression() throws CoreException {
-		if (fEnablementExpression == null) {
-			IConfigurationElement[] elements = fConfig.getChildren(ExpressionTagNames.ENABLEMENT);
-			IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-
-			if (enablement != null) {
-			    fEnablementExpression = ExpressionConverter.getDefault().perform(enablement);
-			}
-		}
-		return fEnablementExpression;
-    }
-
-    public String getLabel() {
-        if (fLabel == null) {
-            fLabel = fConfig.getAttribute("label"); //$NON-NLS-1$
-        }
-        return fLabel;
-    }
-
-    /**
-     * @return
-     */
-    public ImageDescriptor getImageDescriptor() {
-        if (fImageDescriptor == null) {
-            String path = fConfig.getAttribute("icon"); //$NON-NLS-1$
-            if (path != null) {
-                Bundle bundle = Platform.getBundle(getPluginId());
-                URL url = FileLocator.find(bundle, new Path(path), null);
-                if (url != null) {
-                	fImageDescriptor =  ImageDescriptor.createFromURL(url);
-                }
-            }
-        }
-        return fImageDescriptor;
-    }
-
-    /**
-     * @return
-     * @throws CoreException
-     */
-    public IConsoleFactory createFactory() throws CoreException {
-        if (fFactory == null) {
-            fFactory = (IConsoleFactory) fConfig.createExecutableExtension("class"); //$NON-NLS-1$
-        }
-        return fFactory;
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleHyperlinkPosition.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleHyperlinkPosition.java
deleted file mode 100644
index b98df73..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleHyperlinkPosition.java
+++ /dev/null
@@ -1,51 +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.console;
-
-import org.eclipse.jface.text.Position;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IHyperlink;
-
-/**
- * Describes the postition of a hyperlink within the Console's document.
- * 
- * @since 3.1
- */
-public class ConsoleHyperlinkPosition extends Position {
-    
-	public static final String HYPER_LINK_CATEGORY = ConsolePlugin.getUniqueIdentifier() + ".CONSOLE_HYPERLINK_POSITION"; //$NON-NLS-1$
-	
-	private IHyperlink fLink = null;
-
-	public ConsoleHyperlinkPosition(IHyperlink link, int offset, int length) {
-		super(offset, length);
-		fLink = link;
-	}
-	
-	public IHyperlink getHyperLink() {
-		return fLink;
-	}
-
-	/**
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object arg) {
-		return arg instanceof ConsoleHyperlinkPosition && super.equals(arg) && getHyperLink().equals(((ConsoleHyperlinkPosition)arg).getHyperLink());
-	}
-
-	/**
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return super.hashCode() + getHyperLink().hashCode();
-	}
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java
deleted file mode 100644
index df883e2..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleManager.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.PatternSyntaxException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-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.Platform;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-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.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsoleListener;
-import org.eclipse.ui.console.IConsoleManager;
-import org.eclipse.ui.console.IConsolePageParticipant;
-import org.eclipse.ui.console.IConsoleView;
-import org.eclipse.ui.console.IPatternMatchListener;
-import org.eclipse.ui.console.TextConsole;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * The singleton console manager.
- * 
- * @since 3.0
- */
-public class ConsoleManager implements IConsoleManager {
-	
-	/**
-	 * Console listeners
-	 */
-	private ListenerList fListeners = null;
-	
-	/**
-	 * List of registered consoles
-	 */
-	private List fConsoles = new ArrayList(10); 
-
-	
-	// change notification constants
-	private final static int ADDED = 1;
-	private final static int REMOVED = 2;
-
-    private List fPatternMatchListeners;
-
-    private List fPageParticipants;
-
-    private List fConsoleFactoryExtensions;
-    
-    private List fConsoleViews = new ArrayList();
-    
-    private boolean fWarnQueued = false;
-    
-    private RepaintJob fRepaintJob = new RepaintJob();
-    
-    private class RepaintJob extends WorkbenchJob {
-        private Set list = new HashSet();
-
-        public RepaintJob() {
-            super("schedule redraw() of viewers"); //$NON-NLS-1$
-            setSystem(true);
-        }
-        
-        void addConsole(IConsole console) {
-        	synchronized (list) {
-        		list.add(console);
-			}
-        }
-        
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            synchronized (list) {
-                if (list.isEmpty()) {
-                    return Status.OK_STATUS;
-                }
-                
-                IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench().getWorkbenchWindows();
-                for (int i = 0; i < workbenchWindows.length; i++) {
-                    IWorkbenchWindow window = workbenchWindows[i];
-                    if (window != null) {
-                        IWorkbenchPage page = window.getActivePage();
-                        if (page != null) {
-                            IViewPart part = page.findView(IConsoleConstants.ID_CONSOLE_VIEW);
-                            if (part != null && part instanceof IConsoleView) {
-                                ConsoleView view = (ConsoleView) part;
-                                if (list.contains(view.getConsole())) {
-                                    Control control = view.getCurrentPage().getControl();
-                                    if (!control.isDisposed()) {
-                                        control.redraw();
-                                    }
-                                }
-                            }
-
-                        }
-                    }
-                }
-                list.clear();
-            }
-            return Status.OK_STATUS;
-        }
-    }
-    
-	/**
-	 * Notifies a console listener of additions or removals
-	 */
-	class ConsoleNotifier implements ISafeRunnable {
-		
-		private IConsoleListener fListener;
-		private int fType;
-		private IConsole[] fChanged;
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			IStatus status = new Status(IStatus.ERROR, ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.INTERNAL_ERROR, ConsoleMessages.ConsoleManager_0, exception); 
-			ConsolePlugin.log(status);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			switch (fType) {
-				case ADDED:
-					fListener.consolesAdded(fChanged);
-					break;
-				case REMOVED:
-					fListener.consolesRemoved(fChanged);
-					break;
-			}
-		}
-
-		/**
-		 * Notifies the given listener of the adds/removes
-		 * 
-		 * @param consoles the consoles that changed
-		 * @param update the type of change
-		 */
-		public void notify(IConsole[] consoles, int update) {
-			if (fListeners == null) {
-				return;
-			}
-			fChanged = consoles;
-			fType = update;
-			Object[] copiedListeners= fListeners.getListeners();
-			for (int i= 0; i < copiedListeners.length; i++) {
-				fListener = (IConsoleListener)copiedListeners[i];
-                SafeRunner.run(this);
-			}	
-			fChanged = null;
-			fListener = null;			
-		}
-	}	
-		
-	public void registerConsoleView(ConsoleView view) {
-	    synchronized (fConsoleViews) {
-	        fConsoleViews.add(view);
-	    }
-	}
-    public void unregisterConsoleView(ConsoleView view) {
-        synchronized (fConsoleViews) {
-            fConsoleViews.remove(view);
-        }
-    }
-    
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleManager#addConsoleListener(org.eclipse.ui.console.IConsoleListener)
-	 */
-	public void addConsoleListener(IConsoleListener listener) {
-		if (fListeners == null) {
-			fListeners = new ListenerList();
-		}
-		fListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleManager#removeConsoleListener(org.eclipse.ui.console.IConsoleListener)
-	 */
-	public void removeConsoleListener(IConsoleListener listener) {
-		if (fListeners != null) {
-			fListeners.remove(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleManager#addConsoles(org.eclipse.ui.console.IConsole[])
-	 */
-	public synchronized void addConsoles(IConsole[] consoles) {
-		List added = new ArrayList(consoles.length);
-		for (int i = 0; i < consoles.length; i++) {
-		    IConsole console = consoles[i];
-		    if(console instanceof TextConsole) {
-		        TextConsole ioconsole = (TextConsole)console;
-		        createPatternMatchListeners(ioconsole);
-		    }
-			if (!fConsoles.contains(console)) {
-				fConsoles.add(console);
-				added.add(console);
-			}
-		}
-		if (!added.isEmpty()) {
-			fireUpdate((IConsole[])added.toArray(new IConsole[added.size()]), ADDED);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleManager#removeConsoles(org.eclipse.ui.console.IConsole[])
-	 */
-	public synchronized void removeConsoles(IConsole[] consoles) {
-		List removed = new ArrayList(consoles.length);
-		for (int i = 0; i < consoles.length; i++) {
-			IConsole console = consoles[i];
-			if (fConsoles.remove(console)) {
-				removed.add(console);
-			}
-		}
-		if (!removed.isEmpty()) {
-			fireUpdate((IConsole[])removed.toArray(new IConsole[removed.size()]), REMOVED);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleManager#getConsoles()
-	 */
-	public synchronized IConsole[] getConsoles() {
-		return (IConsole[])fConsoles.toArray(new IConsole[fConsoles.size()]);
-	}
-
-	/**
-	 * Fires notification.
-	 * 
-	 * @param consoles consoles added/removed
-	 * @param type ADD or REMOVE
-	 */
-	private void fireUpdate(IConsole[] consoles, int type) {
-		new ConsoleNotifier().notify(consoles, type);
-	}
-	
-	
-	private class ShowConsoleViewJob extends WorkbenchJob {
-		private IConsole console; 
-		
-		ShowConsoleViewJob() {
-			super("Show Console View"); //$NON-NLS-1$
-			setSystem(true);
-			setPriority(Job.SHORT);
-		}
-		
-		void setConsole(IConsole console) {
-			this.console = console;
-		}
-		
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			boolean consoleFound = false;
-            IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-            if (window != null && console != null) {
-                IWorkbenchPage page= window.getActivePage();
-                if (page != null) {
-                    synchronized (fConsoleViews) {
-                        for (Iterator iter = fConsoleViews.iterator(); iter.hasNext();) {
-                            ConsoleView consoleView = (ConsoleView) iter.next();
-                            if (consoleView.getSite().getPage().equals(page)) {
-	                            boolean consoleVisible = page.isPartVisible(consoleView);
-	                            if (consoleVisible) {
-	                                consoleFound = true;
-	                                boolean bringToTop = shouldBringToTop(console, consoleView);
-	                                if (bringToTop) {
-	                                    page.bringToTop(consoleView);
-	                                }
-	                                consoleView.display(console);
-	                            }
-                            }
-                        }
-                    }
-                    
-                    if (!consoleFound) {
-                        try {
-                            IConsoleView consoleView = (IConsoleView) page.showView(IConsoleConstants.ID_CONSOLE_VIEW, null, IWorkbenchPage.VIEW_CREATE);
-                            boolean bringToTop = shouldBringToTop(console, consoleView);
-                            if (bringToTop) {
-                                page.bringToTop(consoleView);
-                            }
-                            consoleView.display(console);        
-                        } catch (PartInitException pie) {
-                            ConsolePlugin.log(pie);
-                        }
-                    }
-                }
-            }
-            console = null;
-			return Status.OK_STATUS;
-		}		
-	}
-	
-	private ShowConsoleViewJob showJob = new ShowConsoleViewJob();
-	/**
-	 * @see IConsoleManager#showConsoleView(IConsole)
-	 */
-	public void showConsoleView(final IConsole console) {
-		showJob.setConsole(console);
-		showJob.schedule(100);
-	}	
-	
-	/**
-	 * Returns whether the given console view should be brought to the top.
-	 * The view should not be brought to the top if the view is pinned on
-	 * a console other than the given console.
-	 */
-	private boolean shouldBringToTop(IConsole console, IViewPart consoleView) {
-		boolean bringToTop= true;
-		if (consoleView instanceof IConsoleView) {
-			IConsoleView cView= (IConsoleView)consoleView;
-			if (cView.isPinned()) {
-				IConsole pinnedConsole= cView.getConsole();
-				bringToTop = console.equals(pinnedConsole);
-			}
-		}
-		return bringToTop;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleManager#warnOfContentChange(org.eclipse.ui.console.IConsole)
-	 */
-	public void warnOfContentChange(final IConsole console) {
-		if (!fWarnQueued) {
-			fWarnQueued = true;
-			ConsolePlugin.getStandardDisplay().asyncExec(new Runnable(){
-				public void run() {
-					IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-					if (window != null) {
-						IWorkbenchPage page= window.getActivePage();
-						if (page != null) {
-							IConsoleView consoleView= (IConsoleView)page.findView(IConsoleConstants.ID_CONSOLE_VIEW);
-							if (consoleView != null) {
-								consoleView.warnOfContentChange(console);
-							}
-						} 
-					}	
-					fWarnQueued = false;
-				}			
-			});
-		}
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleManager#getPatternMatchListenerDelegates(org.eclipse.ui.console.IConsole)
-     */
-    public IPatternMatchListener[] createPatternMatchListeners(IConsole console) {
-    		if (fPatternMatchListeners == null) {
-    		    fPatternMatchListeners = new ArrayList();
-    			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.EXTENSION_POINT_CONSOLE_PATTERN_MATCH_LISTENERS);
-    			IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-    			for (int i = 0; i < elements.length; i++) {
-    				IConfigurationElement config = elements[i];
-    				PatternMatchListenerExtension extension = new PatternMatchListenerExtension(config);
-    				fPatternMatchListeners.add(extension); 
-    			}
-    		}
-    		ArrayList list = new ArrayList();
-    		for(Iterator i = fPatternMatchListeners.iterator(); i.hasNext(); ) {
-    		    PatternMatchListenerExtension extension = (PatternMatchListenerExtension) i.next();
-                try {
-                    if (extension.getEnablementExpression() == null) {
-                        i.remove();
-                        continue;
-                    }
-    		    
-    		        if (console instanceof TextConsole && extension.isEnabledFor(console)) {
-                        TextConsole textConsole = (TextConsole) console;
-    		            PatternMatchListener patternMatchListener = new PatternMatchListener(extension);
-                        try {
-                            textConsole.addPatternMatchListener(patternMatchListener);
-                            list.add(patternMatchListener);
-                        } catch (PatternSyntaxException e) {
-                            ConsolePlugin.log(e);
-                            i.remove();
-                        }
-    		        }
-    		    } catch (CoreException e) {
-    		        ConsolePlugin.log(e);
-    		    }
-    		}
-        return (PatternMatchListener[])list.toArray(new PatternMatchListener[0]);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleManager#getPageParticipants(org.eclipse.ui.console.IConsole)
-     */
-    public IConsolePageParticipant[] getPageParticipants(IConsole console) {
-        if(fPageParticipants == null) {
-            fPageParticipants = new ArrayList();
-            IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.EXTENSION_POINT_CONSOLE_PAGE_PARTICIPANTS);
-            IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-            for(int i = 0; i < elements.length; i++) {
-                IConfigurationElement config = elements[i];
-                ConsolePageParticipantExtension extension = new ConsolePageParticipantExtension(config);
-                fPageParticipants.add(extension);
-            }
-        }
-        ArrayList list = new ArrayList();
-        for(Iterator i = fPageParticipants.iterator(); i.hasNext(); ) {
-            ConsolePageParticipantExtension extension = (ConsolePageParticipantExtension) i.next();
-            try {
-                if (extension.isEnabledFor(console)) {
-                    list.add(extension.createDelegate());
-                }
-            } catch (CoreException e) {
-                ConsolePlugin.log(e);
-            }
-        }
-        return (IConsolePageParticipant[]) list.toArray(new IConsolePageParticipant[0]);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleManager#getConsoleFactories()
-     */
-    public ConsoleFactoryExtension[] getConsoleFactoryExtensions() {
-        if (fConsoleFactoryExtensions == null) {
-            fConsoleFactoryExtensions = new ArrayList();
-            IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.EXTENSION_POINT_CONSOLE_FACTORIES);
-            IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
-            for (int i = 0; i < configurationElements.length; i++) {
-                fConsoleFactoryExtensions.add(new ConsoleFactoryExtension(configurationElements[i]));
-            }
-        }
-        return (ConsoleFactoryExtension[]) fConsoleFactoryExtensions.toArray(new ConsoleFactoryExtension[0]);
-    }
-    
-    
-    public void refresh(final IConsole console) {
-        fRepaintJob.addConsole(console);
-        fRepaintJob.schedule(50); 
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleMessages.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleMessages.java
deleted file mode 100644
index eaf17b1..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleMessages.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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ConsoleMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.console.ConsoleMessages";//$NON-NLS-1$
-
-	public static String AbstractConsole_0;
-
-	public static String ConsoleDropDownAction_0;
-	public static String ConsoleDropDownAction_1;
-
-	public static String ConsoleManager_0;
-
-	public static String ConsoleView_0;
-
-	public static String PinConsoleAction_0;
-	public static String PinConsoleAction_1;
-
-	public static String ClearOutputAction_title;
-	public static String ClearOutputAction_toolTipText;
-
-	public static String TextViewerGotoLineAction_Enter_line_number__8;
-	public static String TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2;
-	public static String TextViewerGotoLineAction_Go_to__Line____Ctrl_L_4;
-	public static String TextViewerGotoLineAction_Go_To_Line_1;
-	public static String TextViewerGotoLineAction_Line_number_out_of_range_1;
-	public static String TextViewerGotoLineAction_Not_a_number_2;
-
-	public static String ScrollLockAction_0;
-	public static String ScrollLockAction_1;
-	public static String FollowHyperlinkAction_0;
-	public static String FollowHyperlinkAction_1;
-	public static String OpenConsoleAction_0;
-	public static String OpenConsoleAction_1;
-	public static String CloseConsoleAction_0;
-	public static String CloseConsoleAction_1;
-
-    public static String TextConsolePage_SelectAllDescrip;
-    public static String TextConsolePage_SelectAllText;
-    public static String TextConsolePage_CutText;
-    public static String TextConsolePage_CutDescrip;
-    public static String TextConsolePage_CopyText;
-    public static String TextConsolePage_CopyDescrip;
-    public static String TextConsolePage_PasteText;
-    public static String TextConsolePage_PasteDescrip;
-    
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, ConsoleMessages.class);
-	}
-
-    public static String PatternMatchListenerExtension_3;
-
-    public static String PatternMatchListenerExtension_4;
-
-    public static String PatternMatchListenerExtension_5;
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleMessages.properties b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleMessages.properties
deleted file mode 100644
index 3d835a4..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleMessages.properties
+++ /dev/null
@@ -1,53 +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
-###############################################################################
-
-AbstractConsole_0=Exception occurred during console property change notification.
-
-ConsoleDropDownAction_0=Select Console
-ConsoleDropDownAction_1=Display Selected Console
-
-ConsoleManager_0=An exception occurred during console notification
-
-ConsoleView_0=No consoles to display at this time.
-
-PinConsoleAction_0=Pi&n Console
-PinConsoleAction_1=Pin Console
-
-ClearOutputAction_title=Clea&r
-ClearOutputAction_toolTipText=Clear Console
-
-TextViewerGotoLineAction_Enter_line_number__8=Enter line number (1...{0}):
-TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2=Exceptions occurred attempt to go to line
-TextViewerGotoLineAction_Go_to__Line____Ctrl_L_4=Go to &Line...@Ctrl+L
-TextViewerGotoLineAction_Go_To_Line_1=Go to Line
-TextViewerGotoLineAction_Line_number_out_of_range_1=Line number out of range
-TextViewerGotoLineAction_Not_a_number_2=Not a number
-
-ScrollLockAction_0=&Scroll Lock
-ScrollLockAction_1=Scroll Lock
-FollowHyperlinkAction_0=&Open Link
-FollowHyperlinkAction_1=Follow the selected hyperlink
-OpenConsoleAction_0=Open Console
-OpenConsoleAction_1=Open Console
-CloseConsoleAction_0=&Close Console
-CloseConsoleAction_1=Close Console
-
-TextConsolePage_SelectAllDescrip=Select All
-TextConsolePage_SelectAllText=Select &All
-TextConsolePage_CutText=C&ut
-TextConsolePage_CutDescrip=Cut
-TextConsolePage_CopyText=&Copy
-TextConsolePage_CopyDescrip=Copy
-TextConsolePage_PasteText=&Paste
-TextConsolePage_PasteDescrip=Paste
-PatternMatchListenerExtension_3=Console Pattern Match Listener
-PatternMatchListenerExtension_4=contributed by
-PatternMatchListenerExtension_5=is missing required enablement expression and will be removed
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePageParticipantExtension.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePageParticipantExtension.java
deleted file mode 100644
index c329cdb..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePageParticipantExtension.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.internal.console;
-
-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.ExpressionTagNames;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsolePageParticipant;
-
-public class ConsolePageParticipantExtension implements IPluginContribution {
-
-    private IConfigurationElement fConfig;
-    private Expression fEnablementExpression;
-
-    public ConsolePageParticipantExtension(IConfigurationElement config) {
-        fConfig = config;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPluginContribution#getLocalId()
-     */
-    public String getLocalId() {
-        return fConfig.getAttribute("id"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPluginContribution#getPluginId()
-     */
-    public String getPluginId() {
-        return fConfig.getContributor().getName();
-    }
-    
-    public boolean isEnabledFor(IConsole console) throws CoreException {
-        EvaluationContext context = new EvaluationContext(null, console);
-        EvaluationResult evaluationResult = getEnablementExpression().evaluate(context);
-        return evaluationResult == EvaluationResult.TRUE;
-    }
-    
-    public Expression getEnablementExpression() throws CoreException {
-		if (fEnablementExpression == null) {
-			IConfigurationElement[] elements = fConfig.getChildren(ExpressionTagNames.ENABLEMENT);
-			IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-
-			if (enablement != null) {
-			    fEnablementExpression = ExpressionConverter.getDefault().perform(enablement);
-			}
-		}
-		return fEnablementExpression;
-    }
-
-    public IConsolePageParticipant createDelegate() throws CoreException {
-        return (IConsolePageParticipant) fConfig.createExecutableExtension("class"); //$NON-NLS-1$;
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePatternMatcher.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePatternMatcher.java
deleted file mode 100644
index 0a69d5f..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePatternMatcher.java
+++ /dev/null
@@ -1,306 +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.console;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-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.text.BadLocationException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IPatternMatchListener;
-import org.eclipse.ui.console.PatternMatchEvent;
-import org.eclipse.ui.console.TextConsole;
-
-public class ConsolePatternMatcher implements IDocumentListener {
-
-    private MatchJob fMatchJob = new MatchJob();
-
-    /**
-     * Collection of compiled pattern match listeners
-     */
-    private ArrayList fPatterns = new ArrayList();
-
-    private TextConsole fConsole;
-
-    private boolean fFinalMatch;
-
-	private boolean fScheduleFinal;
-
-    public ConsolePatternMatcher(TextConsole console) {
-        fConsole = console;
-    }
-
-    private class MatchJob extends Job {
-        MatchJob() {
-            super("Match Job"); //$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) {
-			IDocument doc = fConsole.getDocument();
-			String text = null;
-			int prevBaseOffset = -1;
-			if (doc != null && !monitor.isCanceled()) {
-				int endOfSearch = doc.getLength();
-				int indexOfLastChar = endOfSearch;
-				if (indexOfLastChar > 0) {
-					indexOfLastChar--;
-				}
-				int lastLineToSearch = 0;
-				int offsetOfLastLineToSearch = 0;
-				try {
-					lastLineToSearch = doc.getLineOfOffset(indexOfLastChar);
-					offsetOfLastLineToSearch = doc.getLineOffset(lastLineToSearch);
-				} catch (BadLocationException e) {
-					// perhaps the buffer was re-set
-					return Status.OK_STATUS;
-				}
-				for (int i = 0; i < fPatterns.size(); i++) {
-					if (monitor.isCanceled()) {
-						break;
-					}
-					CompiledPatternMatchListener notifier = (CompiledPatternMatchListener) fPatterns.get(i);
-					int baseOffset = notifier.end;
-					int lengthToSearch = endOfSearch - baseOffset;
-					if (lengthToSearch > 0) {
-						try {
-							if (prevBaseOffset != baseOffset) {
-								// reuse the text string if possible
-								text = doc.get(baseOffset, lengthToSearch);
-							}
-							Matcher reg = notifier.pattern.matcher(text);
-							Matcher quick = null;
-							if (notifier.qualifier != null) {
-								quick = notifier.qualifier.matcher(text);
-							}
-							int startOfNextSearch = 0;
-							int endOfLastMatch = -1;
-							int lineOfLastMatch = -1;
-							while ((startOfNextSearch < lengthToSearch) && !monitor.isCanceled()) {
-								if (quick != null) {
-									if (quick.find(startOfNextSearch)) {
-										// start searching on the beginning
-										// of the line where the potential
-										// match was found, or after the
-										// last match on the same line
-										int matchLine = doc.getLineOfOffset(baseOffset + quick.start());
-										if (lineOfLastMatch == matchLine) {
-											startOfNextSearch = endOfLastMatch;
-										} else {
-											startOfNextSearch = doc.getLineOffset(matchLine) - baseOffset;
-										}
-									} else {
-										startOfNextSearch = lengthToSearch;
-									}
-								}
-								if (startOfNextSearch < 0) {
-									startOfNextSearch = 0;
-								}
-								if (startOfNextSearch < lengthToSearch) {
-									if (reg.find(startOfNextSearch)) {
-										endOfLastMatch = reg.end();
-										lineOfLastMatch = doc.getLineOfOffset(baseOffset + endOfLastMatch - 1);
-										int regStart = reg.start();
-										IPatternMatchListener listener = notifier.listener;
-										if (listener != null && !monitor.isCanceled()) {
-											listener.matchFound(new PatternMatchEvent(fConsole, baseOffset + regStart, endOfLastMatch - regStart));
-										}
-										startOfNextSearch = endOfLastMatch;
-									} else {
-										startOfNextSearch = lengthToSearch;
-									}
-								}
-							}
-							// update start of next search to the last line
-							// searched
-							// or the end of the last match if it was on the
-							// line that
-							// was last searched
-							if (lastLineToSearch == lineOfLastMatch) {
-								notifier.end = baseOffset + endOfLastMatch;
-							} else {
-								notifier.end = offsetOfLastLineToSearch;
-							}
-						} catch (BadLocationException e) {
-							ConsolePlugin.log(e);
-						}
-					}
-					prevBaseOffset = baseOffset;
-				}
-			}
-
-			if (fFinalMatch) {
-				disconnect();
-				fConsole.matcherFinished();
-			} else if (fScheduleFinal) {
-				fFinalMatch = true;
-				schedule();
-			}
-
-			return Status.OK_STATUS;
-		}
-
-        public boolean belongsTo(Object family) {
-            return family == fConsole;
-        }
-        
-        
-    }
-
-    private class CompiledPatternMatchListener {
-        Pattern pattern;
-
-        Pattern qualifier;
-
-        IPatternMatchListener listener;
-
-        int end = 0;
-
-        CompiledPatternMatchListener(Pattern pattern, Pattern qualifier, IPatternMatchListener matchListener) {
-            this.pattern = pattern;
-            this.listener = matchListener;
-            this.qualifier = qualifier;
-        }
-
-        public void dispose() {
-            listener.disconnect();
-            pattern = null;
-            qualifier = null;
-            listener = null;
-        }
-    }
-
-    /**
-	 * Adds the given pattern match listener to this console. The listener will
-	 * be connected and receive match notifications.
-	 * 
-	 * @param matchListener
-	 *            the pattern match listener to add
-	 */
-    public void addPatternMatchListener(IPatternMatchListener matchListener) {
-        synchronized (fPatterns) {
-            
-            // check for dups
-            for (Iterator iter = fPatterns.iterator(); iter.hasNext();) {
-                CompiledPatternMatchListener element = (CompiledPatternMatchListener) iter.next();
-                if (element.listener == matchListener) {
-                    return;
-                }
-            }
-            
-            if (matchListener == null || matchListener.getPattern() == null) {
-                throw new IllegalArgumentException("Pattern cannot be null"); //$NON-NLS-1$
-            }
-
-            Pattern pattern = Pattern.compile(matchListener.getPattern(), matchListener.getCompilerFlags());
-            String qualifier = matchListener.getLineQualifier();
-            Pattern qPattern = null;
-            if (qualifier != null) {
-                qPattern = Pattern.compile(qualifier, matchListener.getCompilerFlags());
-            }
-            CompiledPatternMatchListener notifier = new CompiledPatternMatchListener(pattern, qPattern, matchListener);
-            fPatterns.add(notifier);
-            matchListener.connect(fConsole);
-            fMatchJob.schedule();
-        }
-    }
-
-    /**
-     * Removes the given pattern match listener from this console. The listener
-     * will be disconnected and will no longer receive match notifications.
-     * 
-     * @param matchListener
-     *            the pattern match listener to remove.
-     */
-    public void removePatternMatchListener(IPatternMatchListener matchListener) {
-        synchronized (fPatterns) {
-            for (Iterator iter = fPatterns.iterator(); iter.hasNext();) {
-                CompiledPatternMatchListener element = (CompiledPatternMatchListener) iter.next();
-                if (element.listener == matchListener) {
-                    iter.remove();
-                    matchListener.disconnect();
-                }
-            }
-        }
-    }
-
-    public void disconnect() {
-        fMatchJob.cancel();
-        synchronized (fPatterns) {
-            Iterator iterator = fPatterns.iterator();
-            while (iterator.hasNext()) {
-                CompiledPatternMatchListener notifier = (CompiledPatternMatchListener) iterator.next();
-                notifier.dispose();
-            }
-            fPatterns.clear();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
-     */
-    public void documentAboutToBeChanged(DocumentEvent event) {
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
-     */
-    public void documentChanged(DocumentEvent event) {
-        if (event.fLength > 0) {
-            synchronized (fPatterns) {
-                if (event.fDocument.getLength() == 0) {
-                    // document has been cleared, reset match listeners
-                    Iterator iter = fPatterns.iterator();
-                    while (iter.hasNext()) {
-                        CompiledPatternMatchListener notifier = (CompiledPatternMatchListener) iter.next();
-                        notifier.end = 0;
-                    }
-                } else {
-                    if (event.fOffset == 0) { 
-                        //document was trimmed
-                        Iterator iter = fPatterns.iterator();
-                        while (iter.hasNext()) {
-                            CompiledPatternMatchListener notifier = (CompiledPatternMatchListener) iter.next();
-                            notifier.end = notifier.end > event.fLength ? notifier.end-event.fLength : 0;
-                        }
-                    }
-                }
-            }
-        }
-        fMatchJob.schedule();
-    }
-
-    
-    public void forceFinalMatching() {
-    	fScheduleFinal = true;
-    	fMatchJob.schedule();
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePluginImages.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePluginImages.java
deleted file mode 100644
index c5abc8c..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsolePluginImages.java
+++ /dev/null
@@ -1,158 +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.console;
-
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleConstants;
-
-/**
- * The images provided by the debug plugin.
- */
-public class ConsolePluginImages {
-
-	/** 
-	 * The image registry containing <code>Image</code>s and the <code>ImageDescriptor</code>s.
-	 */
-	private static ImageRegistry imageRegistry;
-		
-	/* Declare Common paths */
-	private static URL ICON_BASE_URL= null;
-
-	static {
-		String pathSuffix = "icons/full/"; //$NON-NLS-1$
-		ICON_BASE_URL= ConsolePlugin.getDefault().getBundle().getEntry(pathSuffix);
-	}
-
-	// Use IPath and toOSString to build the names to ensure they have the slashes correct
-	private final static String LOCALTOOL= "clcl16/"; //basic colors - size 16x16 //$NON-NLS-1$
-	private final static String DLCL= "dlcl16/"; //disabled - size 16x16 //$NON-NLS-1$
-	private final static String ELCL= "elcl16/"; //enabled - size 16x16 //$NON-NLS-1$
-	private final static String VIEW= "cview16/"; // views //$NON-NLS-1$
-	
-	/**
-	 * Declare all images
-	 */
-	private static void declareImages() {
-		// Actions
-		
-		//local toolbars
-		declareRegistryImage(IConsoleConstants.IMG_LCL_CLEAR, LOCALTOOL + "clear_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_LCL_PIN, LOCALTOOL + "pin.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_LCL_LOCK, LOCALTOOL + "lock_co.gif"); //$NON-NLS-1$
-			
-		// disabled local toolbars
-		declareRegistryImage(IInternalConsoleConstants.IMG_DLCL_CLEAR, DLCL + "clear_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_DLCL_PIN, DLCL + "pin.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_DLCL_LOCK, DLCL + "lock_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_DLCL_CLOSE, DLCL + "rem_co.gif"); //$NON-NLS-1$
-		
-		// enabled local toolbars
-		declareRegistryImage(IInternalConsoleConstants.IMG_ELCL_CLEAR, ELCL + "clear_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_ELCL_PIN, ELCL + "pin.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_ELCL_LOCK, ELCL + "lock_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_ELCL_CLOSE, ELCL + "rem_co.gif"); //$NON-NLS-1$
-		declareRegistryImage(IInternalConsoleConstants.IMG_ELCL_NEW_CON, ELCL + "new_con.gif"); //$NON-NLS-1$
-		
-		// Views
-		declareRegistryImage(IConsoleConstants.IMG_VIEW_CONSOLE, VIEW + "console_view.gif"); //$NON-NLS-1$				
-	}
-
-	/**
-	 * Declare an Image in the registry table.
-	 * @param key 	The key to use when registering the image
-	 * @param path	The path where the image can be found. This path is relative to where
-	 *				this plugin class is found (i.e. typically the packages directory)
-	 */
-	private final static void declareRegistryImage(String key, String path) {
-		ImageDescriptor desc= ImageDescriptor.getMissingImageDescriptor();
-		try {
-			desc= ImageDescriptor.createFromURL(makeIconFileURL(path));
-		} catch (MalformedURLException me) {
-			ConsolePlugin.log(me);
-		}
-		imageRegistry.put(key, desc);
-	}
-	
-	/**
-	 * Returns the ImageRegistry.
-	 */
-	public static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			initializeImageRegistry();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 *	Initialize the image registry by declaring all of the required
-	 *	graphics. This involves creating JFace image descriptors describing
-	 *	how to create/find the image should it be needed.
-	 *	The image is not actually allocated until requested.
-	 *
-	 * 	Prefix conventions
-	 *		Wizard Banners			WIZBAN_
-	 *		Preference Banners		PREF_BAN_
-	 *		Property Page Banners	PROPBAN_
-	 *		Color toolbar			CTOOL_
-	 *		Enable toolbar			ETOOL_
-	 *		Disable toolbar			DTOOL_
-	 *		Local enabled toolbar	ELCL_
-	 *		Local Disable toolbar	DLCL_
-	 *		Object large			OBJL_
-	 *		Object small			OBJS_
-	 *		View 					VIEW_
-	 *		Product images			PROD_
-	 *		Misc images				MISC_
-	 *
-	 *	Where are the images?
-	 *		The images (typically gifs) are found in the same location as this plugin class.
-	 *		This may mean the same package directory as the package holding this class.
-	 *		The images are declared using this.getClass() to ensure they are looked up via
-	 *		this plugin class.
-	 *	@see org.eclipse.jface.resource.ImageRegistry
-	 */
-	public static ImageRegistry initializeImageRegistry() {
-		imageRegistry= new ImageRegistry(ConsolePlugin.getStandardDisplay());
-		declareImages();
-		return imageRegistry;
-	}
-
-	/**
-	 * Returns the <code>Image<code> identified by the given key,
-	 * or <code>null</code> if it does not exist.
-	 */
-	public static Image getImage(String key) {
-		return getImageRegistry().get(key);
-	}
-	
-	/**
-	 * Returns the <code>ImageDescriptor<code> identified by the given key,
-	 * or <code>null</code> if it does not exist.
-	 */
-	public static ImageDescriptor getImageDescriptor(String key) {
-		return getImageRegistry().getDescriptor(key);
-	}
-	
-	private static URL makeIconFileURL(String iconPath) throws MalformedURLException {
-		if (ICON_BASE_URL == null) {
-			throw new MalformedURLException();
-		}
-			
-		return new URL(ICON_BASE_URL, iconPath);
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleResourceBundleMessages.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleResourceBundleMessages.java
deleted file mode 100644
index 33b7d85..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleResourceBundleMessages.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class ConsoleResourceBundleMessages {
-    private static final String BUNDLE_NAME = "org.eclipse.ui.internal.console.ConsoleResourceBundleMessages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private ConsoleResourceBundleMessages() {
-    }
-
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-
-    public static ResourceBundle getBundle() {
-        return RESOURCE_BUNDLE; 
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleResourceBundleMessages.properties b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleResourceBundleMessages.properties
deleted file mode 100644
index 9aeb0ef..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleResourceBundleMessages.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-
-# These strings are used by the Find Replace Action and loaded as a Resource Bundle.
-# See TextConsolePage.createActions()
-
-find_replace_action_label=&Find/Replace...
-find_replace_action_tooltip=Find/Replace
-find_replace_action_image=
-find_replace_action_description=Find/Replace
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleTypePropertyTester.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleTypePropertyTester.java
deleted file mode 100644
index 46dc213..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleTypePropertyTester.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.internal.console;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.ui.console.IConsole;
-
-/**
- * Tests if an IOConsole's type matches the expected value
- * 
- * @since 3.1
- */
-public class ConsoleTypePropertyTester extends PropertyTester {
-
-    /* (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) {
-        IConsole console = (IConsole) receiver;
-        String type = console.getType();
-        return type != null ? type.equals(expectedValue) : false;
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java
deleted file mode 100644
index 0d2a382..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java
+++ /dev/null
@@ -1,715 +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.console;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.AbstractConsole;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsoleListener;
-import org.eclipse.ui.console.IConsoleManager;
-import org.eclipse.ui.console.IConsolePageParticipant;
-import org.eclipse.ui.console.IConsoleView;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-
-/**
- * Page book console view.
- * 
- * @since 3.0
- */
-public class ConsoleView extends PageBookView implements IConsoleView, IConsoleListener, IPropertyChangeListener, IPartListener2 {
-	
-	/**
-	 * Whether this console is pinned.
-	 */
-	private boolean fPinned = false;
-	
-	/**
-	 * Stack of consoles in MRU order
-	 */
-	private List fStack = new ArrayList();
-	
-	/**
-	 * The console being displayed, or <code>null</code> if none
-	 */
-	private IConsole fActiveConsole = null;
-	
-	/**
-	 * Map of consoles to dummy console parts (used to close pages)
-	 */
-	private Map fConsoleToPart;
-	
-	/**
-	 * Map of consoles to array of page participants
-	 */
-	private Map fConsoleToPageParticipants;
-	
-	/**
-	 * Map of parts to consoles
-	 */
-	private Map fPartToConsole;
-	
-	/**
-	 * Whether this view is active
-	 */
-	private boolean fActive = false;
-	
-	// actions
-	private PinConsoleAction fPinAction = null; 
-	private ConsoleDropDownAction fDisplayConsoleAction = null;
-	
-	private OpenConsoleAction fOpenConsoleAction = null;
-
-    private boolean fScrollLock;
-
-	private boolean isAvailable() {
-		return getPageBook() != null && !getPageBook().isDisposed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		Object source = event.getSource();
-		if (source instanceof IConsole && event.getProperty().equals(IBasicPropertyConstants.P_TEXT)) {
-			if (source.equals(getConsole())) {
-				updateTitle();
-			}
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-		super.partClosed(part);
-		fPinAction.update();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.console.IConsoleView#getConsole()
-	 */
-	public IConsole getConsole() {
-		return fActiveConsole;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.PageBookView#showPageRec(org.eclipse.ui.part.PageBookView.PageRec)
-	 */
-	protected void showPageRec(PageRec pageRec) {
-        // don't show the page when pinned, unless this is the first console to be added
-        // or its the default page
-        if (fActiveConsole != null && pageRec.page != getDefaultPage() && fPinned && fConsoleToPart.size() > 1) {
-            IConsole console = (IConsole)fPartToConsole.get(pageRec.part);
-            if (!fStack.contains(console)) {
-                fStack.add(console);
-            }
-            return;
-        }
-        
-        IConsole recConsole = (IConsole)fPartToConsole.get(pageRec.part);
-        if (recConsole!=null && recConsole.equals(fActiveConsole)) {
-            return;
-        }
-        
-	    super.showPageRec(pageRec);
-	    fActiveConsole = recConsole;
-	    IConsole tos = null;
-	    if (!fStack.isEmpty()) {
-	        tos = (IConsole) fStack.get(0);
-	    }
-	    if (tos != null && !tos.equals(fActiveConsole)) {
-	        deactivateParticipants(tos);
-	    }
-	    if (fActiveConsole != null && !fActiveConsole.equals(tos)) {
-	        fStack.remove(fActiveConsole);
-	        fStack.add(0,fActiveConsole);
-	        activateParticipants(fActiveConsole);
-	    }
-	    updateTitle();	
-	    updateHelp();
-	    // update console actions
-	    if (fPinAction != null) {
-	        fPinAction.update();
-	    }
-	    IPage page = getCurrentPage();
-	    if (page instanceof IOConsolePage) {
-	        ((IOConsolePage)page).setAutoScroll(!fScrollLock);
-	    }
-	}
-	
-	/**
-	 * Activates the participants for the given console, if any.
-	 * 
-	 * @param console
-	 */
-	private void activateParticipants(IConsole console) {
-		// activate
-		if (console != null && fActive) {
-			final ListenerList listeners = getParticipants(console);
-			if (listeners != null) {
-				Object[] participants = listeners.getListeners();
-			    for (int i = 0; i < participants.length; i++) {
-			    	final IConsolePageParticipant participant = (IConsolePageParticipant) participants[i];
-			    	SafeRunner.run(new ISafeRunnable() {
-						public void run() throws Exception {
-							participant.activated();
-						}
-						public void handleException(Throwable exception) {
-							ConsolePlugin.log(exception);
-							listeners.remove(participant);
-						}
-					});
-			    }
-			}
-		}
-	}
-
-	/**
-	 * Returns a stack of consoles in the view in MRU order.
-	 * 
-	 * @return a stack of consoles in the view in MRU order
-	 */
-	protected List getConsoleStack() {
-		return fStack;
-	}
-
-	/**
-	 * Updates the view title based on the active console
-	 */
-    protected void updateTitle() {
-        IConsole console = getConsole();
-        if (console == null) {
-            setContentDescription(ConsoleMessages.ConsoleView_0); 
-        } else {
-            String newName = console.getName();
-            String oldName = getContentDescription();
-            if (newName!=null && !(newName.equals(oldName))) {
-                setContentDescription(console.getName()); 
-            }
-        }
-    }
-    
-    protected void updateHelp() {
-    	IConsole console = getConsole();
-    	String helpContextId = null;
-		if (console instanceof AbstractConsole) {
-			AbstractConsole abs = (AbstractConsole) console;
-			helpContextId = abs.getHelpContextId();
-		}
-		if (helpContextId == null) {
-			helpContextId = IConsoleHelpContextIds.CONSOLE_VIEW;
-		}
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getPageBook().getParent(), helpContextId);
-    }
-
-	/* (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) {
-	    IConsole console = (IConsole)fPartToConsole.get(part);
-	    
-		// dispose page participants
-		ListenerList listeners = (ListenerList) fConsoleToPageParticipants.remove(console);
-		if (listeners != null) {
-			Object[] participants = listeners.getListeners();
-			for (int i = 0; i < participants.length; i++) {
-	            final IConsolePageParticipant participant = (IConsolePageParticipant) participants[i];
-	            SafeRunner.run(new ISafeRunnable() {
-					public void run() throws Exception {
-						participant.dispose();
-					}
-					public void handleException(Throwable exception) {
-						ConsolePlugin.log(exception);
-					}
-				});
-	        }
-		}
-
-		IPage page = pageRecord.page;
-		page.dispose();
-		pageRecord.dispose();
-		console.removePropertyChangeListener(this);
-						
-		// empty cross-reference cache
-		fPartToConsole.remove(part);
-		fConsoleToPart.remove(console);
-        if (fPartToConsole.isEmpty()) {
-            fActiveConsole = null;
-        }
-		
-		// update console actions
-		fPinAction.update();		
-	}
-	
-	/**
-	 * Returns the page participants registered for the given console, or <code>null</code>
-	 * 
-	 * @param console
-	 * @return registered page participants or <code>null</code>
-	 */
-	private ListenerList getParticipants(IConsole console) {
-	    return (ListenerList) fConsoleToPageParticipants.get(console);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.PageBookView#doCreatePage(org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected PageRec doCreatePage(IWorkbenchPart dummyPart) {
-		ConsoleWorkbenchPart part = (ConsoleWorkbenchPart)dummyPart;
-		final IConsole console = part.getConsole();
-		final IPageBookViewPage page = console.createPage(this);
-		initPage(page);
-		page.createControl(getPageBook());
-		console.addPropertyChangeListener(this);
-		
-		// initialize page participants
-		IConsolePageParticipant[] consoleParticipants = ((ConsoleManager)getConsoleManager()).getPageParticipants(console);
-		final ListenerList participants = new ListenerList();
-		for (int i = 0; i < consoleParticipants.length; i++) {
-			participants.add(consoleParticipants[i]);
-		}
-		fConsoleToPageParticipants.put(console, participants);
-		Object[] listeners = participants.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-            final IConsolePageParticipant participant = (IConsolePageParticipant) listeners[i];
-            SafeRunner.run(new ISafeRunnable() {
-				public void run() throws Exception {
-					participant.init(page, console);
-				}
-				public void handleException(Throwable exception) {
-					ConsolePlugin.log(exception);
-					participants.remove(participant);
-				}
-			});
-        }
-		
-		PageRec rec = new PageRec(dummyPart, page);
-		return rec;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.PageBookView#isImportant(org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean isImportant(IWorkbenchPart part) {
-		return part instanceof ConsoleWorkbenchPart;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		getViewSite().getPage().removePartListener((IPartListener2)this);
-        ConsoleManager consoleManager = (ConsoleManager) ConsolePlugin.getDefault().getConsoleManager();
-        consoleManager.removeConsoleListener(this);        
-        consoleManager.unregisterConsoleView(this);
-	}
-
-	/**
-	 * Returns the console manager.
-	 * 
-     * @return the console manager
-     */
-    private IConsoleManager getConsoleManager() {
-        return ConsolePlugin.getDefault().getConsoleManager();
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.part.PageBookView#createDefaultPage(org.eclipse.ui.part.PageBook)
-	 */
-	protected IPage createDefaultPage(PageBook book) {
-		MessagePage page = new MessagePage();
-		page.createControl(getPageBook());
-		initPage(page);
-		return page;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleListener#consolesAdded(org.eclipse.ui.console.IConsole[])
-	 */
-	public void consolesAdded(final IConsole[] consoles) {
-		if (isAvailable()) {
-			Runnable r = new Runnable() {
-				public void run() {
-					for (int i = 0; i < consoles.length; i++) {
-						if (isAvailable()) {
-							IConsole console = consoles[i];
-							// ensure it's still registered since this is done asynchronously
-							IConsole[] allConsoles = getConsoleManager().getConsoles();
-							for (int j = 0; j < allConsoles.length; j++) {
-                                IConsole registered = allConsoles[j];
-                                if (registered.equals(console)) {
-        							ConsoleWorkbenchPart part = new ConsoleWorkbenchPart(console, getSite());
-        							fConsoleToPart.put(console, part);
-        							fPartToConsole.put(part, console);
-        							partActivated(part);
-        							break;
-                                }
-                            }
-
-						}
-					}
-				}
-			};
-			asyncExec(r);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleListener#consolesRemoved(org.eclipse.ui.console.IConsole[])
-	 */
-	public void consolesRemoved(final IConsole[] consoles) {
-		if (isAvailable()) {
-			Runnable r = new Runnable() {
-				public void run() {
-					for (int i = 0; i < consoles.length; i++) {
-						if (isAvailable()) {
-							IConsole console = consoles[i];
-							fStack.remove(console);
-							ConsoleWorkbenchPart part = (ConsoleWorkbenchPart)fConsoleToPart.get(console);
-							if (part != null) {
-								partClosed(part);
-							}
-							if (getConsole() == null) {
-								IConsole[] available = getConsoleManager().getConsoles();
-								if (available.length > 0) {
-									display(available[available.length - 1]);
-								}
-							}
-						}
-					}
-				}
-			};
-			asyncExec(r);
-		}
-	}
-
-	/**
-	 * Constructs a console view
-	 */
-	public ConsoleView() {
-		super();
-		fConsoleToPart = new HashMap();
-		fPartToConsole = new HashMap();
-		fConsoleToPageParticipants = new HashMap();
-        
-		ConsoleManager consoleManager = (ConsoleManager) ConsolePlugin.getDefault().getConsoleManager();
-		consoleManager.registerConsoleView(this);
-	}
-	
-	protected void createActions() {
-		fPinAction = new PinConsoleAction(this);
-		fDisplayConsoleAction = new ConsoleDropDownAction(this);
-		ConsoleFactoryExtension[] extensions = ((ConsoleManager)ConsolePlugin.getDefault().getConsoleManager()).getConsoleFactoryExtensions();
-		if (extensions.length > 0) {
-		    fOpenConsoleAction = new OpenConsoleAction();
-		}
-	}
-
-	protected void configureToolBar(IToolBarManager mgr) {
-		mgr.add(new Separator(IConsoleConstants.LAUNCH_GROUP));
-		mgr.add(new Separator(IConsoleConstants.OUTPUT_GROUP));
-		mgr.add(new Separator("fixedGroup")); //$NON-NLS-1$
-		mgr.add(fPinAction);
-		mgr.add(fDisplayConsoleAction);
-		if (fOpenConsoleAction != null) {
-		    mgr.add(fOpenConsoleAction);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleView#display(org.eclipse.ui.console.IConsole)
-	 */
-	public void display(IConsole console) {
-	    if (fPinned && fActiveConsole != null) {
-            return;
-        }
-        if (console.equals(fActiveConsole)) {
-            return;
-        }
-	    ConsoleWorkbenchPart part = (ConsoleWorkbenchPart)fConsoleToPart.get(console);
-	    if (part != null) {
-	        partActivated(part);
-	    }
-	}
-
-	/*/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleView#pin(org.eclipse.ui.console.IConsole)
-	 */
-	public void setPinned(boolean pin) {
-        fPinned = pin;
-	    if (fPinAction != null) {
-			fPinAction.update();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleView#isPinned()
-	 */
-	public boolean isPinned() {
-		return fPinned;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.PageBookView#getBootstrapPart()
-	 */
-	protected IWorkbenchPart getBootstrapPart() {
-		return null;
-	}
-	
-	/**
-	 * Registers the given runnable with the display
-	 * associated with this view's control, if any.
-	 * 
-	 * @see org.eclipse.swt.widgets.Display#asyncExec(java.lang.Runnable)
-	 */
-	public void asyncExec(Runnable r) {
-		if (isAvailable()) {
-			getPageBook().getDisplay().asyncExec(r);
-		}
-	}
-	
-	/**
-	 * Creates this view's underlying viewer and actions.
-	 * Hooks a pop-up menu to the underlying viewer's control,
-	 * as well as a key listener. When the delete key is pressed,
-	 * the <code>REMOVE_ACTION</code> is invoked. Hooks help to
-	 * this view. Subclasses must implement the following methods
-	 * which are called in the following order when a view is
-	 * created:<ul>
-	 * <li><code>createViewer(Composite)</code> - the context
-	 *   menu is hooked to the viewer's control.</li>
-	 * <li><code>createActions()</code></li>
-	 * <li><code>configureToolBar(IToolBarManager)</code></li>
-	 * <li><code>getHelpContextId()</code></li>
-	 * </ul>
-	 * @see IWorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		createActions();
-		IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
-		configureToolBar(tbm);
-		updateForExistingConsoles();
-		getViewSite().getActionBars().updateActionBars();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IConsoleHelpContextIds.CONSOLE_VIEW);
-		getViewSite().getPage().addPartListener((IPartListener2)this);
-	}
-	
-	/**
-	 * Initialize for existing consoles
-	 */
-	private void updateForExistingConsoles() {
-		IConsoleManager manager = getConsoleManager();
-		// create pages for consoles
-		IConsole[] consoles = manager.getConsoles();
-		consolesAdded(consoles);
-		// add as a listener
-		manager.addConsoleListener(this);		
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsoleView#warnOfContentChange(org.eclipse.ui.console.IConsole)
-	 */
-	public void warnOfContentChange(IConsole console) {
-		IWorkbenchPart part = (IWorkbenchPart)fConsoleToPart.get(console);
-		if (part != null) {
-			IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) part.getSite().getAdapter(IWorkbenchSiteProgressService.class);
-			if (service != null) {
-				service.warnOfContentChange();
-			}
-		}
-	}
-	
-    public Object getAdapter(Class key) {
-        Object adpater = super.getAdapter(key);
-        if (adpater == null) {
-            IConsole console = getConsole();
-            if (console != null) {
-                ListenerList listeners = getParticipants(console);
-                // an adapter can be asked for before the console participants are created
-                if (listeners != null) {
-                	Object[] participants = listeners.getListeners();
-                    for (int i = 0; i < participants.length; i++) {
-                        IConsolePageParticipant participant = (IConsolePageParticipant) participants[i];
-                        adpater = participant.getAdapter(key);
-                        if (adpater != null) {
-                            return adpater;
-                        }
-                    }
-                }
-            }
-        }
-        return adpater;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partActivated(IWorkbenchPartReference partRef) {
-		if (isThisPart(partRef)) {
-			fActive = true;
-			activateParticipants(fActiveConsole); 
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partBroughtToTop(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partClosed(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partDeactivated(IWorkbenchPartReference partRef) {
-        if (isThisPart(partRef)) {
-			fActive = false;
-			deactivateParticipants(fActiveConsole);
-        }
-	}
-    
-    protected boolean isThisPart(IWorkbenchPartReference partRef) {
-        if (partRef instanceof IViewReference) {
-            IViewReference viewRef = (IViewReference) partRef;
-            if (viewRef.getId().equals(getViewSite().getId())) {
-                String secId = viewRef.getSecondaryId();
-                String mySec = null;
-                if (getSite() instanceof IViewSite) {
-                    mySec = ((IViewSite)getSite()).getSecondaryId();
-                }
-                if (mySec == null) {
-                    return secId == null;
-                }
-                return mySec.equals(secId);
-            }
-        }
-        return false;
-    }
-
-	/**
-	 * Deactivates participants for the given console, if any.
-	 * 
-	 * @param console console to deactivate
-	 */
-	private void deactivateParticipants(IConsole console) {
-		// deactivate
-	    if (console != null) {
-			final ListenerList listeners = getParticipants(console);
-			if (listeners != null) {
-				Object[] participants = listeners.getListeners();
-			    for (int i = 0; i < participants.length; i++) {
-			    	final IConsolePageParticipant participant = (IConsolePageParticipant) participants[i];
-			    	SafeRunner.run(new ISafeRunnable() {
-						public void run() throws Exception {
-							participant.deactivated();
-						}
-						public void handleException(Throwable exception) {
-							ConsolePlugin.log(exception);
-							listeners.remove(participant);
-						}
-					});
-                }
-			}
-	    }
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partOpened(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partHidden(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partVisible(IWorkbenchPartReference partRef) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partInputChanged(IWorkbenchPartReference partRef) {		
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleView#setScrollLock(boolean)
-     */
-    public void setScrollLock(boolean scrollLock) {
-        fScrollLock = scrollLock;
-
-        IPage page = getCurrentPage();
-        if (page instanceof IOConsolePage) {
-            ((IOConsolePage)page).setAutoScroll(!scrollLock);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleView#getScrollLock()
-     */
-    public boolean getScrollLock() {
-        return fScrollLock;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleView#pin(org.eclipse.ui.console.IConsole)
-     */
-    public void pin(IConsole console) {
-        if (console == null) {
-            setPinned(false);
-        } else {
-            if (isPinned()) {
-                setPinned(false);
-            }
-            display(console);
-            setPinned(true);
-        }
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleViewConsoleFactory.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleViewConsoleFactory.java
deleted file mode 100644
index 8a32fc8..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleViewConsoleFactory.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.console;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsoleFactory;
-
-public class ConsoleViewConsoleFactory implements IConsoleFactory {
-
-    int counter = 1;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.console.IConsoleFactory#openConsole()
-     */
-    public void openConsole() {
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null) {
-            IWorkbenchPage page = window.getActivePage();
-            if (page != null) {
-                try {
-                    String secondaryId = "Console View #" + counter; //$NON-NLS-1$
-                    page.showView(IConsoleConstants.ID_CONSOLE_VIEW, secondaryId, 1);
-                    counter++;
-                } catch (PartInitException e) {
-                    ConsolePlugin.log(e);
-                }
-            }
-        }
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleWorkbenchPart.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleWorkbenchPart.java
deleted file mode 100644
index e3377a4..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleWorkbenchPart.java
+++ /dev/null
@@ -1,125 +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.console;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.console.IConsole;
-
-/**
- * Fake part to use as keys in page book for console pages
- */
-public class ConsoleWorkbenchPart implements IWorkbenchPart {
-
-	private IConsole fConsole = null;
-	private IWorkbenchPartSite fSite = null;
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return (obj instanceof ConsoleWorkbenchPart) &&
-			fConsole.equals(((ConsoleWorkbenchPart)obj).fConsole);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return fConsole.hashCode();
-	}
-
-	/**
-	 * Constructs a part for the given console that binds to the given
-	 * site
-	 */
-	public ConsoleWorkbenchPart(IConsole console, IWorkbenchPartSite site) {
-		fConsole = console;
-		fSite = site;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#addPropertyListener(org.eclipse.ui.IPropertyListener)
-	 */
-	public void addPropertyListener(IPropertyListener 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 fSite;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#getTitle()
-	 */
-	public String getTitle() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#getTitleImage()
-	 */
-	public Image getTitleImage() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#getTitleToolTip()
-	 */
-	public String getTitleToolTip() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#removePropertyListener(org.eclipse.ui.IPropertyListener)
-	 */
-	public void removePropertyListener(IPropertyListener listener) {
-	}
-
-	/* (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;
-	}
-
-	/**
-	 * Returns the console associated with this part.
-	 * 
-	 * @return console associated with this part
-	 */
-	protected IConsole getConsole() {
-		return fConsole;
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/FollowHyperlinkAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/FollowHyperlinkAction.java
deleted file mode 100644
index 492dfd5..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/FollowHyperlinkAction.java
+++ /dev/null
@@ -1,55 +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.console;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IHyperlink;
-import org.eclipse.ui.console.TextConsoleViewer;
-
-/**
- * Follows a hyperlink in the console
- * 
- * @since 3.1
- */
-public class FollowHyperlinkAction extends Action {
-
-	private TextConsoleViewer viewer;
-
-    /**
-	 * Constructs a follow link action
-	 */
-	public FollowHyperlinkAction(TextConsoleViewer consoleViewer) {
-	    super(ConsoleMessages.FollowHyperlinkAction_0); 
-		setToolTipText(ConsoleMessages.FollowHyperlinkAction_1); 
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_OPEN_LINK_ACTION);
-		this.viewer = consoleViewer;
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#isEnabled()
-     */
-    public boolean isEnabled() {
-        return viewer.getHyperlink() != null;
-    }
-	
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-	public void run() {
-		IHyperlink link = viewer.getHyperlink();
-		if (link != null) {
-			link.linkActivated();
-		}
-	}
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/HyperlinkUpdater.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/HyperlinkUpdater.java
deleted file mode 100644
index 3ed6aa7..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/HyperlinkUpdater.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.internal.console;
-
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DefaultPositionUpdater;
-import org.eclipse.ui.internal.console.ConsoleHyperlinkPosition;
-
-/**
- * When any region of a hyperlink is replaced, the hyperlink needs to be deleted.
- * 
- * @since 3.3
- */
-public class HyperlinkUpdater extends DefaultPositionUpdater {
-
-	/**
-	 * @param category
-	 */
-	public HyperlinkUpdater() {
-		super(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
-	}
-	/**
-	 * When any region of a hyperlink is replaced, the hyperlink needs to be deleted.
-	 *
-	 * @return <code>true</code> if position has NOT been deleted
-	 */
-	protected boolean notDeleted() {
-
-		int positionEnd = fPosition.offset + fPosition.length - 1;
-		int editEnd = fOffset + fLength - 1;
-		if ((fOffset <= fPosition.offset && (editEnd > fPosition.offset)) ||
-			(fOffset < positionEnd && (editEnd > positionEnd)) ||
-			(fOffset >= fPosition.offset && fOffset <= positionEnd) ||
-			(editEnd >= fPosition.offset && editEnd <= positionEnd)) {
-
-			fPosition.delete();
-
-			try {
-				fDocument.removePosition(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY, fPosition);
-			} catch (BadPositionCategoryException x) {
-			}
-
-			return false;
-		}
-
-		return true;
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IConsoleHelpContextIds.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IConsoleHelpContextIds.java
deleted file mode 100644
index 85a4e69..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IConsoleHelpContextIds.java
+++ /dev/null
@@ -1,46 +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.console;
-
-import org.eclipse.ui.console.IConsoleConstants;
-
-/**
- * Help context ids for the console plugin.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-public interface IConsoleHelpContextIds {
-	
-	public static final String PREFIX = IConsoleConstants.PLUGIN_ID + "."; //$NON-NLS-1$
-	
-	// Actions
-	public static final String CLEAR_CONSOLE_ACTION = PREFIX + "clear_console_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_SCROLL_LOCK_ACTION = PREFIX + "console_scroll_lock_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_SELECT_ALL_ACTION = PREFIX + "console_select_all_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_COPY_ACTION = PREFIX + "copy_to_clipboard_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_CUT_ACTION = PREFIX + "console_cut_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_PASTE_ACTION = PREFIX + "console_paste_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_FIND_REPLACE_ACTION = PREFIX + "console_find_replace_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_OPEN_LINK_ACTION = PREFIX + "console_open_link_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_OPEN_CONSOLE_ACTION = PREFIX + "console_open_console_action_context"; //$NON-NLS-1$
-	public static final String CONSOLE_DISPLAY_CONSOLE_ACTION = PREFIX + "console_display_console_action"; //$NON-NLS-1$
-	public static final String CONSOLE_PIN_CONSOLE_ACITON = PREFIX + "console_pin_console_action"; //$NON-NLS-1$
-	
-	// Views
-	public static final String CONSOLE_VIEW = PREFIX + "console_view_context"; //$NON-NLS-1$
-
-	// Preference pages
-	public static final String CONSOLE_PREFERENCE_PAGE = PREFIX + "console_preference_page_context"; //$NON-NLS-1$
-}
-
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IInternalConsoleConstants.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IInternalConsoleConstants.java
deleted file mode 100644
index 00f5cbc..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IInternalConsoleConstants.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.console;
-
-public interface IInternalConsoleConstants {
-    
-	// tool images
-	public static final String IMG_LCL_PIN = "IMG_LCL_PIN"; //$NON-NLS-1$
-	public static final String IMG_LCL_LOCK = "IMG_LCL_LOCK"; //$NON-NLS-1$
-	
-	// disabled local tool images
-	public static final String IMG_DLCL_PIN = "IMG_DLCL_PIN"; //$NON-NLS-1$
-	public static final String IMG_DLCL_CLEAR= "IMG_DLCL_CLEAR"; //$NON-NLS-1$
-	public static final String IMG_DLCL_LOCK = "IMG_DLCL_LOCK"; //$NON-NLS-1$
-	public static final String IMG_DLCL_CLOSE = "IMG_DLCL_CLOSE"; //$NON-NLS-1$
-	
-	// enabled local tool images	
-	public static final String IMG_ELCL_PIN = "IMG_ELCL_PIN"; //$NON-NLS-1$
-	public static final String IMG_ELCL_CLEAR= "IMG_ELCL_CLEAR"; //$NON-NLS-1$
-	public static final String IMG_ELCL_LOCK = "IMG_ELCL_LOCK"; //$NON-NLS-1$
-	public static final String IMG_ELCL_CLOSE = "IMG_ELCL_CLOSE"; //$NON-NLS-1$
-    public static final String IMG_ELCL_NEW_CON = "IMG_ELCL_NEW_CON"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePage.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePage.java
deleted file mode 100644
index 3f8d72f..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePage.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsoleView;
-import org.eclipse.ui.console.TextConsole;
-import org.eclipse.ui.console.TextConsolePage;
-import org.eclipse.ui.console.TextConsoleViewer;
-
-/**
- * A page for an IOConsole
- * 
- * @since 3.1
- *  
- */
-public class IOConsolePage extends TextConsolePage {
-
-    private ScrollLockAction fScrollLockAction;
-
-    private boolean fReadOnly;
-
-    private IPropertyChangeListener fPropertyChangeListener;
-
-    public IOConsolePage(TextConsole console, IConsoleView view) {
-        super(console, view);
-
-        fPropertyChangeListener = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                String property = event.getProperty();
-                if (property.equals(IConsoleConstants.P_CONSOLE_OUTPUT_COMPLETE)) {
-                    setReadOnly();
-                }
-            }
-        };
-        console.addPropertyChangeListener(fPropertyChangeListener);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        if (fReadOnly) {
-            IOConsoleViewer viewer = (IOConsoleViewer) getViewer();
-            viewer.setReadOnly();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.console.TextConsolePage#createViewer(org.eclipse.swt.widgets.Composite,
-     *      org.eclipse.ui.console.TextConsole)
-     */
-    protected TextConsoleViewer createViewer(Composite parent) {
-        return new IOConsoleViewer(parent, (TextConsole)getConsole());
-    }
-
-    public void setAutoScroll(boolean scroll) {
-        IOConsoleViewer viewer = (IOConsoleViewer) getViewer();
-        if (viewer != null) {
-            viewer.setAutoScroll(scroll);
-            fScrollLockAction.setChecked(!scroll);
-        }
-    }
-
-    /**
-     * Informs the viewer that it's text widget should not be editable.
-     */
-    public void setReadOnly() {
-        fReadOnly = true;
-        IOConsoleViewer viewer = (IOConsoleViewer) getViewer();
-        if (viewer != null) {
-            viewer.setReadOnly();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.TextConsolePage#createActions()
-     */
-    protected void createActions() {
-        super.createActions();
-        fScrollLockAction = new ScrollLockAction(getConsoleView());
-        setAutoScroll(!fScrollLockAction.isChecked());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.TextConsolePage#contextMenuAboutToShow(org.eclipse.jface.action.IMenuManager)
-     */
-    protected void contextMenuAboutToShow(IMenuManager menuManager) {
-        super.contextMenuAboutToShow(menuManager);
-        menuManager.add(fScrollLockAction);
-        IOConsoleViewer viewer = (IOConsoleViewer) getViewer();
-        if (!viewer.isReadOnly()) {
-            menuManager.remove(ActionFactory.CUT.getId());
-            menuManager.remove(ActionFactory.PASTE.getId());
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.console.TextConsolePage#configureToolBar(org.eclipse.jface.action.IToolBarManager)
-     */
-    protected void configureToolBar(IToolBarManager mgr) {
-        super.configureToolBar(mgr);
-        mgr.appendToGroup(IConsoleConstants.OUTPUT_GROUP, fScrollLockAction);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.IPage#dispose()
-     */
-    public void dispose() {
-        if (fScrollLockAction != null) {
-            fScrollLockAction.dispose();
-            fScrollLockAction = null;
-        }
-        getConsole().removePropertyChangeListener(fPropertyChangeListener);
-        super.dispose();
-    }
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartition.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartition.java
deleted file mode 100644
index b9d447a..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartition.java
+++ /dev/null
@@ -1,175 +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.console;
-
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IOConsoleInputStream;
-import org.eclipse.ui.console.IOConsoleOutputStream;
-
-/**
- * A region in an IOConsole's document.
- * @since 3.1
- *
- */
-public class IOConsolePartition implements ITypedRegion {
-	public static final String OUTPUT_PARTITION_TYPE = ConsolePlugin.getUniqueIdentifier() + ".io_console_output_partition_type"; //$NON-NLS-1$
-	public static final String INPUT_PARTITION_TYPE = ConsolePlugin.getUniqueIdentifier() + ".io_console_input_partition_type"; //$NON-NLS-1$
-
-	/**
-	 * The data contained by this partition.
-	 */
-	private StringBuffer buffer;
-    private String type;
-    private int offset;
-    /**
-     * Output partitions are all read only.
-     * Input partitions are read only once they have been appended to the console's input stream.
-     */
-    private boolean readOnly;
-    
-    /**
-     * Only one of inputStream or outputStream will be null depending on the partitions type.
-     */
-    private IOConsoleOutputStream outputStream;
-    private IOConsoleInputStream inputStream;
-    private int length;
-    
-    /**
-     * Creates a new partition to contain output to console.
-     */
-    public IOConsolePartition(IOConsoleOutputStream outputStream, int length) {
-        this.outputStream = outputStream;
-        this.length = length;
-        this.type = OUTPUT_PARTITION_TYPE;
-        this.readOnly = true;
-    }
-    
-    /**
-     * Creates a new partition to contain input from a console
-     */
-    public IOConsolePartition(IOConsoleInputStream inputStream, String text) {
-        this.inputStream = inputStream;
-        buffer = new StringBuffer(text);
-        length = text.length();
-        this.type = INPUT_PARTITION_TYPE;
-        this.readOnly = false;
-    }
-    
-    /**
-     * Inserts a string into this partition
-     * @param s The string to insert
-     * @param offset the offset in the partition
-     */
-    public void insert(String s, int insertOffset) {
-        buffer.insert(insertOffset, s);
-        length += s.length();
-    }
-      
-    /**
-     * Deletes data from this partition.
-     * @param delOffset
-     * @param delLength
-     */
-    public void delete(int delOffset, int delLength) {
-        buffer.delete(delOffset, delOffset+delLength);
-        length -= delLength;
-    }
-    
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.text.ITypedRegion#getType()
-     */
-    public String getType() {
-        return type;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.text.IRegion#getLength()
-     */
-    public int getLength() {
-        return length;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.text.IRegion#getOffset()
-     */
-    public int getOffset() {
-        return offset;
-    }
-    
-    /**
-     * Sets this partitions offset in the document.
-     * @param offset This partitions offset in the document.
-     */
-    public void setOffset(int offset) {
-        this.offset = offset;
-    }
-    
-    /**
-     * Sets this partitions length
-     * 
-     * @param length
-     */
-    public void setLength(int length) {
-    	this.length = length;
-    }
-    
-    /**
-     * Returns the data contained in this partition.
-     * @return The data contained in this partition.
-     */
-    public String getString() {
-        return buffer != null ? buffer.toString() : ""; //$NON-NLS-1$
-    }
-    
-    /**
-     * Returns a StyleRange object which may be used for setting the style
-     * of this partition in a viewer.
-     */
-    public StyleRange getStyleRange(int rangeOffset, int rangeLength) {
-        return new StyleRange(rangeOffset, rangeLength, getColor(), null, getFontStyle());
-    }
-
-    private int getFontStyle() {
-        if (type.equals(INPUT_PARTITION_TYPE)) {
-            return inputStream.getFontStyle();
-        } 
-        return outputStream.getFontStyle();
-    }
-
-    public Color getColor() {
-        if (type.equals(INPUT_PARTITION_TYPE)) {
-            return inputStream.getColor();
-        } 
-        return outputStream.getColor();
-    }
-
-    public boolean isReadOnly() {
-        return readOnly;
-    }
-    
-    public void setReadOnly() {
-        readOnly = true;
-    }
-
-    public void clearBuffer() {
-        buffer = null;
-    }
-    
-    IOConsoleOutputStream getStream() {
-        return outputStream;
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java
deleted file mode 100644
index 10e7744..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java
+++ /dev/null
@@ -1,691 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentPartitionerExtension;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleDocumentPartitioner;
-import org.eclipse.ui.console.IOConsole;
-import org.eclipse.ui.console.IOConsoleInputStream;
-import org.eclipse.ui.console.IOConsoleOutputStream;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Partitions an IOConsole's document
- * @since 3.1
- *
- */
-public class IOConsolePartitioner implements IConsoleDocumentPartitioner, IDocumentPartitionerExtension {
-	private PendingPartition consoleClosedPartition;
-	private IDocument document;
-	private ArrayList partitions;
-	/**
-	 * Blocks of data that have not yet been appended to the document.
-	 */
-	private ArrayList pendingPartitions;
-	/**
-	 * A list of PendingPartitions to be appended by the updateJob
-	 */
-	private ArrayList updatePartitions;
-	/**
-	 * The last partition appended to the document
-	 */
-	private IOConsolePartition lastPartition;
-	/**
-	 * Job that appends pending partitions to the document.
-	 */
-	private QueueProcessingJob queueJob;	    
-	/**
-	 * The input stream attached to this document.
-	 */
-	private IOConsoleInputStream inputStream;
-	/**
-	 * Flag to indicate that the updateJob is updating the document.
-	 */
-	private boolean updateInProgress;
-	/**
-	 * A list of partitions containing input from the console, that have
-	 * not been appended to the input stream yet.
-	 */
-	private ArrayList inputPartitions;
-	/**
-	 * offset used by updateJob
-	 */
-	private int firstOffset;
-	/**
-	 * An array of legal line delimiters
-	 */
-	private String[] lld;
-	private int highWaterMark = -1;
-	private int lowWaterMark = -1;
-    private boolean connected = false;
-
-    private IOConsole console;
-	
-	private TrimJob trimJob = new TrimJob();
-	/**
-	 * Lock for appending to and removing from the document - used
-	 * to synchronize addition of new text/partitions in the update
-	 * job and handling buffer overflow/clearing of the console. 
-	 */
-	private Object overflowLock = new Object();
-	
-    
-    private int fBuffer; 
-    
-	public IOConsolePartitioner(IOConsoleInputStream inputStream, IOConsole console) {
-		this.inputStream = inputStream;
-		this.console = console;
-		trimJob.setRule(console.getSchedulingRule());
-	}
-	
-	public IDocument getDocument() {
-		return document;
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#connect(org.eclipse.jface.text.IDocument)
-	 */
-	public void connect(IDocument doc) {
-		document = doc;
-		document.setDocumentPartitioner(this);
-		lld = document.getLegalLineDelimiters();
-		partitions = new ArrayList();
-		pendingPartitions = new ArrayList();
-		inputPartitions = new ArrayList();
-		queueJob = new QueueProcessingJob();
-		queueJob.setSystem(true);
-        queueJob.setPriority(Job.INTERACTIVE);
-		queueJob.setRule(console.getSchedulingRule());
-		connected = true;
-	}
-	
-	public int getHighWaterMark() {
-	    return highWaterMark;
-	}
-	
-	public int getLowWaterMark() {
-	    return lowWaterMark;
-	}
-	
-	public void setWaterMarks(int low, int high) {
-		lowWaterMark = low;
-		highWaterMark = high;
-		ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() {
-			public void run() {
-				checkBufferSize();
-			}
-		});
-	}
-	
-	/**
-	 * Notification from the console that all of its streams have been closed.
-	 */
-    public void streamsClosed() {
-        consoleClosedPartition = new PendingPartition(null, null);
-        synchronized (pendingPartitions) {
-            pendingPartitions.add(consoleClosedPartition);
-        }
-        queueJob.schedule(); //ensure that all pending partitions are processed.
-    }
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#disconnect()
-	 */
-	public void disconnect() {
-		synchronized (overflowLock) {    
-			document = null;
-			partitions.clear();
-			connected = false;
-			try {
-	            inputStream.close();
-	        } catch (IOException e) {
-	        }
-		}
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
-	 */
-	public void documentAboutToBeChanged(DocumentEvent event) {
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#documentChanged(org.eclipse.jface.text.DocumentEvent)
-	 */
-	public boolean documentChanged(DocumentEvent event) {
-		return documentChanged2(event) != null;
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getLegalContentTypes()
-	 */
-	public String[] getLegalContentTypes() {
-		return new String[] { IOConsolePartition.OUTPUT_PARTITION_TYPE, IOConsolePartition.INPUT_PARTITION_TYPE };
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getContentType(int)
-	 */
-	public String getContentType(int offset) {
-		return getPartition(offset).getType();
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#computePartitioning(int, int)
-	 */
-	public ITypedRegion[] computePartitioning(int offset, int length) {					
-		int rangeEnd = offset + length;
-		int left= 0;
-		int right= partitions.size() - 1;
-		int mid= 0;
-		IOConsolePartition position= null;
-		
-		if (left == right) {
-		    return new IOConsolePartition[]{(IOConsolePartition) partitions.get(0)};
-		}
-		while (left < right) {
-			
-			mid= (left + right) / 2;
-				
-			position= (IOConsolePartition) partitions.get(mid);
-			if (rangeEnd < position.getOffset()) {
-				if (left == mid)
-					right= left;
-				else
-					right= mid -1;
-			} else if (offset > (position.getOffset() + position.getLength() - 1)) {
-				if (right == mid)
-					left= right;
-				else
-					left= mid  +1;
-			} else {
-				left= right= mid;
-			}
-		}
-		
-		
-		List list = new ArrayList();
-		int index = left - 1;
-		if (index >= 0) {
-		    position= (IOConsolePartition) partitions.get(index);
-			while (index >= 0 && (position.getOffset() + position.getLength()) > offset) {
-				index--;
-				if (index >= 0) {
-					position= (IOConsolePartition) partitions.get(index);
-				}
-			}		    
-		}
-		index++;
-		position= (IOConsolePartition) partitions.get(index);
-		while (index < partitions.size() && (position.getOffset() < rangeEnd)) {
-			list.add(position);
-			index++;
-			if (index < partitions.size()) {
-				position= (IOConsolePartition) partitions.get(index);
-			}
-		}
-		
-		return (ITypedRegion[]) list.toArray(new IOConsolePartition[list.size()]);
-	}    
-
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getPartition(int)
-	 */
-	public ITypedRegion getPartition(int offset) {
-		for (int i = 0; i < partitions.size(); i++) {
-			ITypedRegion partition = (ITypedRegion) partitions.get(i);
-			int start = partition.getOffset();
-			int end = start + partition.getLength();
-			if (offset >= start && offset < end) {
-				return partition;
-			} 
-		}
-		
-		if (lastPartition == null)  {
-			synchronized(partitions) {
-				lastPartition = new IOConsolePartition(inputStream, ""); //$NON-NLS-1$
-				lastPartition.setOffset(offset);
-				partitions.add(lastPartition);
-				inputPartitions.add(lastPartition);
-			}
-		}
-		return lastPartition;
-	}
-		
-	/**
-	 * Enforces the buffer size.
-	 * When the number of lines in the document exceeds the high water mark, the 
-	 * beginning of the document is trimmed until the number of lines equals the 
-	 * low water mark.
-	 */
-	private void checkBufferSize() {
-		if (document != null && highWaterMark > 0) {
-			int length = document.getLength();
-			if (length > highWaterMark) {
-			    if (trimJob.getState() == Job.NONE) { //if the job isn't already running
-				    trimJob.setOffset(length - lowWaterMark);
-				    trimJob.schedule();
-			    }
-			}
-		}
-	}
-	
-	/**
-	 * Clears the console
-	 */
-	public void clearBuffer() {
-	    synchronized (overflowLock) {
-	        trimJob.setOffset(-1);
-		    trimJob.schedule();
-        }
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.IDocumentPartitionerExtension#documentChanged2(org.eclipse.jface.text.DocumentEvent)
-	 */
-	public IRegion documentChanged2(DocumentEvent event) {
-	    if (document == null) {
-	        return null; //another thread disconnected the partitioner
-	    }
-		if (document.getLength() == 0) { //document cleared
-			partitions.clear();
-			inputPartitions.clear();
-			pendingPartitions.clear();     
-			lastPartition = null;
-			return new Region(0, 0);
-		}
-		
-		
-		if (updateInProgress) {
-			synchronized(partitions) {
-				if (updatePartitions != null) {
-				    for (Iterator i = updatePartitions.iterator(); i.hasNext(); ) {
-				        PendingPartition pp = (PendingPartition) i.next();
-				        if (pp == consoleClosedPartition) {
-				            continue;
-				        }
-				        
-				        int ppLen = pp.text.length();
-				        if (lastPartition != null && lastPartition.getStream() == pp.stream) {
-				            int len = lastPartition.getLength();
-				            lastPartition.setLength(len + ppLen);
-				        } else {
-				            IOConsolePartition partition = new IOConsolePartition(pp.stream, ppLen);
-				            partition.setOffset(firstOffset);				        
-				            lastPartition = partition;
-				            partitions.add(partition);
-				        }
-				        firstOffset += ppLen;
-				    }
-				}
-			}
-		} else {// user input.
-			int amountDeleted = event.getLength() ;
-			
-			if (amountDeleted > 0) {
-				int offset = event.fOffset;    
-				IOConsolePartition partition = (IOConsolePartition) getPartition(offset);
-				if(partition == lastPartition) {
-					partition.delete(event.fOffset-partition.getOffset(), amountDeleted);
-				} 
-			}
-			
-			synchronized(partitions) {
-				if (lastPartition == null || lastPartition.isReadOnly()) {
-					lastPartition = new IOConsolePartition(inputStream, event.fText); 
-					lastPartition.setOffset(event.fOffset);
-					partitions.add(lastPartition);
-					inputPartitions.add(lastPartition);
-				} else {
-					lastPartition.insert(event.fText, (event.fOffset-lastPartition.getOffset()));
-				}
-				
-				int lastLineDelimiter = -1;
-				String partitionText = lastPartition.getString();
-				for (int i = 0; i < lld.length; i++) {
-					String ld = lld[i];
-					int index = partitionText.lastIndexOf(ld);
-					if (index != -1) {
-					    index += ld.length();
-					}
-					if (index > lastLineDelimiter) {
-					    lastLineDelimiter = index;
-					}
-				}
-				if (lastLineDelimiter != -1) {
-					StringBuffer input = new StringBuffer();
-					Iterator it = inputPartitions.iterator();
-					while (it.hasNext()) {
-					    IOConsolePartition partition = (IOConsolePartition) it.next();
-					    if (partition.getOffset() + partition.getLength() <= event.fOffset + lastLineDelimiter) {
-					        if (partition == lastPartition) {
-					            lastPartition = null;
-					        }
-					        input.append(partition.getString());
-							partition.clearBuffer();
-							partition.setReadOnly();
-							it.remove();
-					    } else {
-					        //create a new partition containing everything up to the line delimiter
-					        //and append that to the string buffer.
-					        String contentBefore = partitionText.substring(0, lastLineDelimiter);
-					        IOConsolePartition newPartition = new IOConsolePartition(inputStream, contentBefore);
-					        newPartition.setOffset(partition.getOffset());
-					        newPartition.setReadOnly();
-					        newPartition.clearBuffer();
-					        int index = partitions.indexOf(partition);
-						    partitions.add(index, newPartition);
-					        input.append(contentBefore);
-					        //delete everything that has been appended to the buffer.
-					        partition.delete(0, lastLineDelimiter);
-					        partition.setOffset(lastLineDelimiter + partition.getOffset());
-					        lastLineDelimiter = 0;
-					    }
-					}
-					if (input.length() > 0) {
-					    inputStream.appendData(input.toString());
-					}
-
-				}
-			}
-		}   
-		
-		return new Region(event.fOffset, event.fText.length());
-	}
-	
-	private void setUpdateInProgress(boolean b) {
-		updateInProgress = b;
-	}
-		
-	/**
-	 * A stream has been appended, add to pendingPartions list and schedule updateJob.
-	 * updateJob is scheduled with a slight delay, this allows the console to run the job
-	 * less frequently and update the document with a greater amount of data each time 
-	 * the job is run
-	 * @param stream The stream that was written to.
-	 * @param s The string that should be appended to the document.
-	 */
-	public void streamAppended(IOConsoleOutputStream stream, String s) throws IOException {
-        if (document == null) {
-            throw new IOException("Document is closed"); //$NON-NLS-1$
-        }
-		synchronized(pendingPartitions) {
-			PendingPartition last = (PendingPartition) (pendingPartitions.size() > 0 ? pendingPartitions.get(pendingPartitions.size()-1) : null);
-			if (last != null && last.stream == stream) {
-				last.append(s);
-			} else {
-				pendingPartitions.add(new PendingPartition(stream, s));
-                if (fBuffer > 1000) {
-                    queueJob.schedule();
-                } else {
-                    queueJob.schedule(50);
-                }
-			}
-            
-            if (fBuffer > 160000) { 
-                try {
-                    pendingPartitions.wait();
-                } catch (InterruptedException e) {
-                }
-            }
-		}
-	}
-	
-	/**
-	 * Holds data until updateJob can be run and the document can be updated.
-	 */
-	private class PendingPartition {
-		StringBuffer text = new StringBuffer(8192);
-		IOConsoleOutputStream stream;
-		
-		PendingPartition(IOConsoleOutputStream stream, String text) {
-			this.stream = stream;
-			if (text != null) {
-                append(text);
-            }
-		}
-		
-		void append(String moreText) {
-			text.append(moreText);
-            fBuffer += moreText.length();
-		}
-	}
-	
-	/**
-	 * Updates the document. Will append everything that is available before 
-	 * finishing.
-	 */
-	private class QueueProcessingJob extends UIJob {
-
-        QueueProcessingJob() {
-			super("IOConsole Updater"); //$NON-NLS-1$
-		}
-		
-        /*
-         *  (non-Javadoc)
-         * @see org.eclipse.core.internal.jobs.InternalJob#run(org.eclipse.core.runtime.IProgressMonitor)
-         */
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-        	synchronized (overflowLock) {
-        		ArrayList pendingCopy = new ArrayList();
-        		StringBuffer buffer = null;
-        		boolean consoleClosed = false;
-        		while (pendingPartitions.size() > 0) {
-        			synchronized(pendingPartitions) {
-        				pendingCopy.addAll(pendingPartitions);
-        				pendingPartitions.clear();
-        				fBuffer = 0;
-        				pendingPartitions.notifyAll();
-        			}
-
-        			buffer = new StringBuffer();
-        			for (Iterator i = pendingCopy.iterator(); i.hasNext(); ) {
-        				PendingPartition pp = (PendingPartition) i.next();
-        				if (pp != consoleClosedPartition) { 
-        					buffer.append(pp.text);
-        				} else {
-        					consoleClosed = true;
-        				}
-        			}
-        		}
-
-        		if (connected) {
-        			setUpdateInProgress(true);
-        			updatePartitions = pendingCopy;
-        			firstOffset = document.getLength();
-        			try {
-        				document.replace(firstOffset, 0, buffer.toString());
-        			} catch (BadLocationException e) {
-        			}
-        			updatePartitions = null;
-        			setUpdateInProgress(false);
-        		}
-        		if (consoleClosed) {
-        			console.partitionerFinished();
-        		}
-        		checkBufferSize();
-
-        	}
-
-        	return Status.OK_STATUS;
-        }        
-		
-        /* 
-         * Job will process as much as it can each time it's run, but it gets
-         * scheduled everytime a PendingPartition is added to the list, meaning
-         * that this job could get scheduled unnecessarily in cases of heavy output.
-         * Note however, that schedule() will only reschedule a running/scheduled Job
-         * once even if it's called many times.
-         */
-        public boolean shouldRun() {
-            boolean shouldRun = connected && pendingPartitions != null && pendingPartitions.size() > 0;
-            return shouldRun;
-        }
-	}
-
- 
-    
-	
-	
-
-    
-    /**
-     * Job to trim the console document, runs in the  UI thread.
-     */
-    private class TrimJob extends WorkbenchJob {
-        
-        /**
-         * trims output up to the line containing the given offset,
-         * or all output if -1.
-         */
-        private int truncateOffset;
-        
-        /**
-         * Creates a new job to trim the buffer.
-         */
-        TrimJob() {
-            super("Trim Job"); //$NON-NLS-1$
-            setSystem(true);
-        }
-        
-        /**
-         * Sets the trim offset.
-         * 
-         * @param offset trims output up to the line containing the given offset
-         */
-        public void setOffset(int offset) {
-            truncateOffset = offset;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-         */
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            IJobManager jobManager = Job.getJobManager();
-            try {
-                jobManager.join(console, monitor);
-            } catch (OperationCanceledException e1) {
-                return Status.CANCEL_STATUS;
-            } catch (InterruptedException e1) {
-                return Status.CANCEL_STATUS;
-            }
-        	if (document == null) {
-        		return Status.OK_STATUS;
-        	}
-        	
-        	int length = document.getLength();
-        	if (truncateOffset < length) {
-        		synchronized (overflowLock) {
-        			try {
-        				if (truncateOffset < 0) {
-        				    // clear
-        				    setUpdateInProgress(true);
-        					document.set(""); //$NON-NLS-1$
-        					setUpdateInProgress(false);
-        					partitions.clear();        					
-        				} else {
-        				    // overflow
-        				    int cutoffLine = document.getLineOfOffset(truncateOffset);
-        				    int cutOffset = document.getLineOffset(cutoffLine);
-
-
-        					// set the new length of the first partition
-        					IOConsolePartition partition = (IOConsolePartition) getPartition(cutOffset);
-        					partition.setLength(partition.getOffset() + partition.getLength() - cutOffset);
-        					
-        					setUpdateInProgress(true);
-        					document.replace(0, cutOffset, ""); //$NON-NLS-1$
-        					setUpdateInProgress(false);
-        					
-        					//remove partitions and reset Partition offsets
-        					int index = partitions.indexOf(partition);
-        					for (int i = 0; i < index; i++) {
-                                partitions.remove(0);
-                            }
-        					
-        					int offset = 0;
-        					for (Iterator i = partitions.iterator(); i.hasNext(); ) {
-        						IOConsolePartition p = (IOConsolePartition) i.next();
-        						p.setOffset(offset);
-        						offset += p.getLength();
-        					}
-        				}
-        			} catch (BadLocationException e) {
-        			}
-        		}
-        	}
-        	return Status.OK_STATUS;
-        }
-    }
-
-
-
-
-
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleDocumentPartitioner#isReadOnly(int)
-     */
-    public boolean isReadOnly(int offset) {
-        return ((IOConsolePartition)getPartition(offset)).isReadOnly();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IConsoleDocumentPartitioner#computeStyleRange(int, int)
-     */
-    public StyleRange[] getStyleRanges(int offset, int length) {
-    	if (!connected) {
-    		return new StyleRange[0];
-    	}
-        IOConsolePartition[] computedPartitions = (IOConsolePartition[])computePartitioning(offset, length);
-        StyleRange[] styles = new StyleRange[computedPartitions.length];        
-        for (int i = 0; i < computedPartitions.length; i++) {                
-            int rangeStart = Math.max(computedPartitions[i].getOffset(), offset);
-            int rangeLength = computedPartitions[i].getLength();
-            styles[i] = computedPartitions[i].getStyleRange(rangeStart, rangeLength);
-        }
-        return styles;
-    }
-    
-	
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsoleViewer.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsoleViewer.java
deleted file mode 100644
index e686955..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsoleViewer.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
- *******************************************************************************/
-package org.eclipse.ui.internal.console;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleDocumentPartitioner;
-import org.eclipse.ui.console.TextConsole;
-import org.eclipse.ui.console.TextConsoleViewer;
-
-/**
- * Viewer used to display an IOConsole
- * 
- * @since 3.1
- */
-public class IOConsoleViewer extends TextConsoleViewer {
-    /**
-     * will always scroll with output if value is true.
-     */
-    private boolean fAutoScroll = true;
-
-    private IDocumentListener fDocumentListener;
-    
-    public IOConsoleViewer(Composite parent, TextConsole console) {
-        super(parent, console);
-    }
-
-    public boolean isAutoScroll() {
-        return fAutoScroll;
-    }
-
-    public void setAutoScroll(boolean scroll) {
-        fAutoScroll = scroll;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.text.TextViewer#handleVerifyEvent(org.eclipse.swt.events.VerifyEvent)
-     */
-    protected void handleVerifyEvent(VerifyEvent e) {
-        IDocument doc = getDocument();
-        String[] legalLineDelimiters = doc.getLegalLineDelimiters();
-        String eventString = e.text;
-        try {
-            IConsoleDocumentPartitioner partitioner = (IConsoleDocumentPartitioner) doc.getDocumentPartitioner();
-            if (!partitioner.isReadOnly(e.start)) {
-                boolean isCarriageReturn = false;
-                for (int i = 0; i < legalLineDelimiters.length; i++) {
-                    if (e.text.equals(legalLineDelimiters[i])) {
-                        isCarriageReturn = true;
-                        break;
-                    }
-                }
-
-                if (!isCarriageReturn) {
-                    super.handleVerifyEvent(e);
-                    return;
-                }
-            }
-
-            int length = doc.getLength();
-            if (e.start == length) {
-                super.handleVerifyEvent(e);
-            } else {
-                try {
-                    doc.replace(length, 0, eventString);
-                } catch (BadLocationException e1) {
-                }
-                e.doit = false;
-            }
-        } finally {
-            StyledText text = (StyledText) e.widget;
-            text.setCaretOffset(text.getCharCount());
-        }
-    }
-
-    /**
-     * makes the associated text widget uneditable.
-     */
-    public void setReadOnly() {
-        ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() {
-            public void run() {
-                StyledText text = getTextWidget();
-                if (text != null && !text.isDisposed()) {
-                    text.setEditable(false);
-                }
-            }
-        });
-    }
-
-    /**
-     * @return <code>false</code> if text is editable
-     */
-    public boolean isReadOnly() {
-        return !getTextWidget().getEditable();
-    }
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.ITextViewer#setDocument(org.eclipse.jface.text.IDocument)
-     */
-    public void setDocument(IDocument document) {
-        IDocument oldDocument= getDocument();
-        
-        super.setDocument(document);
-        
-        if (oldDocument != null) {
-            oldDocument.removeDocumentListener(getDocumentListener());
-        }
-        if (document != null) {
-            document.addDocumentListener(getDocumentListener());
-        }
-    }
-    
-    private IDocumentListener getDocumentListener() {
-        if (fDocumentListener == null) {
-            fDocumentListener= new IDocumentListener() {
-                public void documentAboutToBeChanged(DocumentEvent event) {
-                }
-
-                public void documentChanged(DocumentEvent event) {
-                    if (fAutoScroll) {
-                        revealEndOfDocument();
-                    }
-                }
-            };
-        }
-        return fDocumentListener;
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java
deleted file mode 100644
index 0064b92..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java
+++ /dev/null
@@ -1,130 +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.console;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleFactory;
-
-/**
- * @since 3.1
- */
-public class OpenConsoleAction extends Action implements IMenuCreator {
-
-    private ConsoleFactoryExtension[] fFactoryExtensions;
-    private Menu fMenu;
-
-    public OpenConsoleAction() {
-        fFactoryExtensions = ((ConsoleManager)ConsolePlugin.getDefault().getConsoleManager()).getConsoleFactoryExtensions();
-		setText(ConsoleMessages.OpenConsoleAction_0); 
-		setToolTipText(ConsoleMessages.OpenConsoleAction_1);  
-		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_NEW_CON));
-		setMenuCreator(this);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_OPEN_CONSOLE_ACTION);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuCreator#dispose()
-     */
-    public void dispose() {
-        fFactoryExtensions = null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-     */
-    public Menu getMenu(Control parent) {
-        if (fMenu != null) {
-            fMenu.dispose();
-        }
-        
-        fMenu= new Menu(parent);
-        int accel = 1;
-        for (int i = 0; i < fFactoryExtensions.length; i++) {
-            ConsoleFactoryExtension extension = fFactoryExtensions[i];
-            if (!WorkbenchActivityHelper.filterItem(extension) && extension.isEnabled()) {
-                String label = extension.getLabel();
-                ImageDescriptor image = extension.getImageDescriptor();
-                addActionToMenu(fMenu, new ConsoleFactoryAction(label, image, extension), accel);
-                accel++;
-            }
-        }
-        return fMenu;
-    }
-    
-	private void addActionToMenu(Menu parent, Action action, int accelerator) {
-		if (accelerator < 10) {
-		    StringBuffer label= new StringBuffer();
-			//add the numerical accelerator
-			label.append('&');
-			label.append(accelerator);
-			label.append(' ');
-			label.append(action.getText());
-			action.setText(label.toString());
-		}
-		
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-     */
-    public Menu getMenu(Menu parent) {
-        return null;
-    }
-    
-    private class ConsoleFactoryAction extends Action {
-        
-        private ConsoleFactoryExtension fConfig;
-        private IConsoleFactory fFactory;
-
-        public ConsoleFactoryAction(String label, ImageDescriptor image, ConsoleFactoryExtension extension) {
-            setText(label);
-            if (image != null) {
-                setImageDescriptor(image);
-            }
-            fConfig = extension;
-        }
-        
-        
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IAction#run()
-         */
-        public void run() {
-            try {
-                if (fFactory == null) {
-                    fFactory = fConfig.createFactory();
-                }
-                
-                fFactory.openConsole();
-            } catch (CoreException e) {
-                ConsolePlugin.log(e);
-            }
-        }
-        
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event)
-         */
-        public void runWithEvent(Event event) {
-            run();
-        }
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListener.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListener.java
deleted file mode 100644
index eab7513..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListener.java
+++ /dev/null
@@ -1,71 +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.console;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.console.IPatternMatchListener;
-import org.eclipse.ui.console.IPatternMatchListenerDelegate;
-import org.eclipse.ui.console.PatternMatchEvent;
-import org.eclipse.ui.console.TextConsole;
-
-public class PatternMatchListener implements IPatternMatchListener {
-
-    private PatternMatchListenerExtension fExtension;
-    private IPatternMatchListenerDelegate fDelegate;
-    
-    public PatternMatchListener(PatternMatchListenerExtension extension) throws CoreException {
-        fExtension = extension;
-        fDelegate = fExtension.createDelegate();
-    }   
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#getPattern()
-     */
-    public String getPattern() {
-        return fExtension.getPattern();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#getCompilerFlags()
-     */
-    public int getCompilerFlags() {
-        return fExtension.getCompilerFlags();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#matchFound(org.eclipse.ui.console.PatternMatchEvent)
-     */
-    public void matchFound(PatternMatchEvent event) {
-        fDelegate.matchFound(event);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListenerDelegate#connect(org.eclipse.ui.console.TextConsole)
-     */
-    public void connect(TextConsole console) {
-        fDelegate.connect(console);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#disconnect()
-     */
-    public void disconnect() {
-        fDelegate.disconnect();
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IPatternMatchListener#getQuickPattern()
-	 */
-	public String getLineQualifier() {
-		return fExtension.getQuickPattern();
-	}
-
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListenerExtension.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListenerExtension.java
deleted file mode 100644
index b4081df..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PatternMatchListenerExtension.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.internal.console;
-
-import java.lang.reflect.Field;
-
-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.ExpressionTagNames;
-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.core.variables.VariablesPlugin;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IPatternMatchListenerDelegate;
-
-import com.ibm.icu.text.MessageFormat;
-
-public class PatternMatchListenerExtension implements IPluginContribution {
-
-    private IConfigurationElement fConfig;
-    private Expression fEnablementExpression;
-    private String fPattern;
-    private String fQualifier;
-    private int fFlags = -1;
-   
-    public PatternMatchListenerExtension(IConfigurationElement extension) {
-        fConfig = extension;
-    }    
-
-    /*
-     * returns the integer value of the flags defined in java.util.regex.Pattern.
-     * Both <code>Pattern.MULTILINE</code> and <code>MULTILINE</code> will return
-     * the same value.
-     */
-    public int parseFlags(String flagsElement) {
-        int val = 0;
-        if (flagsElement == null) {
-            return val;
-        }
-            
-        try {
-            flagsElement = flagsElement.replaceAll("Pattern.", ""); //$NON-NLS-1$ //$NON-NLS-2$
-            String[] tokens = flagsElement.split("\\s\\|\\s"); //$NON-NLS-1$
-            Class clazz = Class.forName("java.util.regex.Pattern"); //$NON-NLS-1$
-            
-            for (int i = 0; i < tokens.length; i++) {
-                Field field = clazz.getDeclaredField(tokens[i]);
-                val |= field.getInt(null);
-            }
-        } catch (ClassNotFoundException e) {
-            ConsolePlugin.log(e);
-        } catch (NoSuchFieldException e) {
-            ConsolePlugin.log(e);
-        } catch (IllegalAccessException e) {
-            ConsolePlugin.log(e);
-        }
-        return val;
-    }
-    
-    public boolean isEnabledFor(IConsole console) throws CoreException {
-        EvaluationContext context = new EvaluationContext(null, console);
-        EvaluationResult evaluationResult = getEnablementExpression().evaluate(context);
-        return evaluationResult == EvaluationResult.TRUE;
-    }
-    
-    public IPatternMatchListenerDelegate createDelegate() throws CoreException {
-        return (IPatternMatchListenerDelegate) fConfig.createExecutableExtension("class"); //$NON-NLS-1$
-    }
-    
-    public Expression getEnablementExpression() throws CoreException {
-		if (fEnablementExpression == null) {
-			IConfigurationElement[] elements = fConfig.getChildren(ExpressionTagNames.ENABLEMENT);
-            if (elements.length == 0) {
-                String message = MessageFormat.format("{0} " +getLocalId() + " {1} " + getPluginId() + " {2}", new String[] {ConsoleMessages.PatternMatchListenerExtension_3,ConsoleMessages.PatternMatchListenerExtension_4,ConsoleMessages.PatternMatchListenerExtension_5}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                ConsolePlugin.log(new Status(IStatus.WARNING, ConsolePlugin.getUniqueIdentifier(), IStatus.OK, message, null));
-            }
-			IConfigurationElement enablement = elements.length > 0 ? elements[0] : null; 
-
-			if (enablement != null) {
-			    fEnablementExpression = ExpressionConverter.getDefault().perform(enablement);
-			}
-		}
-		return fEnablementExpression;
-    }
-    
-    /*
-     * returns the regular expression to be matched.
-     */
-    public String getPattern() {
-        if (fPattern == null) {
-            fPattern = fConfig.getAttribute("regex"); //$NON-NLS-1$
-            try {
-            	fPattern = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(fPattern, false);
-            } catch (CoreException e) {
-            	ConsolePlugin.log(e);
-            }
-        }
-        return fPattern;
-    }
-
-    /*
-     * returns the flags to be used by <code>Pattern.compile(pattern, flags)</code>
-     */
-    public int getCompilerFlags() {
-        if(fFlags < 0) {
-            String flagsAttribute = fConfig.getAttribute("flags"); //$NON-NLS-1$
-            fFlags = parseFlags(flagsAttribute);
-        }
-        return fFlags;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPluginContribution#getLocalId()
-     */
-    public String getLocalId() {
-        return fConfig.getAttribute("id"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPluginContribution#getPluginId()
-     */
-    public String getPluginId() {
-        return fConfig.getContributor().getName();
-    }
-
-    public String getQuickPattern() {
-    	if (fQualifier == null) {
-    		fQualifier = fConfig.getAttribute("qualifier"); //$NON-NLS-1$
-    		try {
-    			if (fQualifier != null) {
-    				fQualifier = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(fQualifier, false);
-    			}
-			} catch (CoreException e) {
-				ConsolePlugin.log(e);
-			}
-    	}
-    	return fQualifier;
-    }
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PinConsoleAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PinConsoleAction.java
deleted file mode 100644
index 61d3074..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/PinConsoleAction.java
+++ /dev/null
@@ -1,54 +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.console;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IConsoleView;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * Pins the currently visible console in a console view.
- */
-public class PinConsoleAction extends Action implements IUpdate {
-	
-	private IConsoleView fView = null;
-
-	/**
-	 * Constructs a 'pin console' action
-	 */
-	public PinConsoleAction(IConsoleView view) {
-		super(ConsoleMessages.PinConsoleAction_0, IAction.AS_CHECK_BOX); 
-		setToolTipText(ConsoleMessages.PinConsoleAction_1); 
-		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_PIN));
-		setDisabledImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_DLCL_PIN));
-		setHoverImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_LCL_PIN));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_PIN_CONSOLE_ACITON);
-		fView = view;
-		update();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-        fView.setPinned(isChecked());
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		setEnabled(fView.getConsole() != null);
-		setChecked(fView.isPinned());
-	}
-}
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ScrollLockAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ScrollLockAction.java
deleted file mode 100644
index e0b2ad2..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ScrollLockAction.java
+++ /dev/null
@@ -1,51 +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.console;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IConsoleView;
-
-/**
- * Toggles console auto-scroll
- * 
- * @since 3.1
- */
-public class ScrollLockAction extends Action {
-
-    private IConsoleView fConsoleView;
-	
-	public ScrollLockAction(IConsoleView consoleView) {
-		super(ConsoleMessages.ScrollLockAction_0); 
-        fConsoleView = consoleView;
-		
-		setToolTipText(ConsoleMessages.ScrollLockAction_1);  
-		setHoverImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_LCL_LOCK));		
-		setDisabledImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_DLCL_LOCK));
-		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_LOCK));
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_SCROLL_LOCK_ACTION);
-		boolean checked = fConsoleView.getScrollLock();  
-		setChecked(checked);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-        fConsoleView.setScrollLock(isChecked());
-	}
-	
-	public void dispose() {
-        fConsoleView = null;
-	}
-
-}
-
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ShowConsoleAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ShowConsoleAction.java
deleted file mode 100644
index 54e0014..0000000
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ShowConsoleAction.java
+++ /dev/null
@@ -1,53 +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.console;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleView;
-
-/**
- * Shows a specific console in the console view
- */
-public class ShowConsoleAction extends Action {
-	
-	private IConsole fConsole;
-	private IConsoleView fView;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (!fConsole.equals(fView.getConsole())) {
-            boolean pinned = fView.isPinned();
-            if (pinned) {
-                fView.setPinned(false);
-            }
-		    fView.display(fConsole);
-            if (pinned) {
-               fView.setPinned(true); 
-            }
-		}
-	}
-
-	/**
-	 * Constructs an action to display the given console.
-	 * 
-	 * @param view the console view in which the given console is contained
-	 * @param console the console
-	 */
-	public ShowConsoleAction(IConsoleView view, IConsole console) {
-		super(console.getName(), AS_RADIO_BUTTON);
-		fConsole = console;
-		fView = view;
-		setImageDescriptor(console.getImageDescriptor());
-	}
-}
